@atlaskit/editor-plugin-block-controls 3.0.1 → 3.1.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 (31) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cjs/blockControlsPlugin.js +27 -14
  3. package/dist/cjs/editor-commands/move-node.js +15 -18
  4. package/dist/cjs/pm-plugins/main.js +94 -37
  5. package/dist/cjs/pm-plugins/utils/getSelection.js +1 -1
  6. package/dist/cjs/pm-plugins/utils/selection.js +34 -4
  7. package/dist/cjs/ui/consts.js +9 -1
  8. package/dist/cjs/ui/drag-handle.js +68 -35
  9. package/dist/es2019/blockControlsPlugin.js +27 -14
  10. package/dist/es2019/editor-commands/move-node.js +17 -20
  11. package/dist/es2019/pm-plugins/main.js +91 -26
  12. package/dist/es2019/pm-plugins/utils/getSelection.js +1 -1
  13. package/dist/es2019/pm-plugins/utils/selection.js +33 -3
  14. package/dist/es2019/ui/consts.js +8 -0
  15. package/dist/es2019/ui/drag-handle.js +58 -29
  16. package/dist/esm/blockControlsPlugin.js +27 -14
  17. package/dist/esm/editor-commands/move-node.js +16 -19
  18. package/dist/esm/pm-plugins/main.js +92 -35
  19. package/dist/esm/pm-plugins/utils/getSelection.js +1 -1
  20. package/dist/esm/pm-plugins/utils/selection.js +33 -3
  21. package/dist/esm/ui/consts.js +8 -0
  22. package/dist/esm/ui/drag-handle.js +69 -36
  23. package/dist/types/blockControlsPluginType.d.ts +2 -0
  24. package/dist/types/pm-plugins/main.d.ts +2 -1
  25. package/dist/types/pm-plugins/utils/selection.d.ts +13 -1
  26. package/dist/types/ui/consts.d.ts +7 -0
  27. package/dist/types-ts4.5/blockControlsPluginType.d.ts +2 -0
  28. package/dist/types-ts4.5/pm-plugins/main.d.ts +2 -1
  29. package/dist/types-ts4.5/pm-plugins/utils/selection.d.ts +13 -1
  30. package/dist/types-ts4.5/ui/consts.d.ts +7 -0
  31. package/package.json +5 -5
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/editor-plugin-block-controls
2
2
 
3
+ ## 3.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [#117391](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/117391)
8
+ [`1655b74fcb544`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/1655b74fcb544) -
9
+ Fix drop table on table trigger native dnd
10
+
11
+ ## 3.1.0
12
+
13
+ ### Minor Changes
14
+
15
+ - [#117917](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/117917)
16
+ [`9d7669d4f5295`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/9d7669d4f5295) -
17
+ [ux] Add shift-select functionality to DnD
18
+
19
+ ### Patch Changes
20
+
21
+ - Updated dependencies
22
+
3
23
  ## 3.0.1
4
24
 
5
25
  ### Patch Changes
@@ -13,6 +13,7 @@ var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
13
13
  var _moveNode = require("./editor-commands/move-node");
14
14
  var _moveToLayout = require("./editor-commands/move-to-layout");
15
15
  var _main = require("./pm-plugins/main");
16
+ var _getSelection = require("./pm-plugins/utils/getSelection");
16
17
  var _blockMenu = _interopRequireDefault(require("./ui/block-menu"));
17
18
  var _dragHandleMenu = require("./ui/drag-handle-menu");
18
19
  var _globalStyles = require("./ui/global-styles");
@@ -88,29 +89,40 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
88
89
  },
89
90
  setMultiSelectPositions: function setMultiSelectPositions(anchor, head) {
90
91
  return function (_ref6) {
91
- var _api$selection;
92
+ var _api$selection, _$to$nodeBefore, _$from$nodeAfter;
92
93
  var tr = _ref6.tr;
93
94
  var _tr$selection = tr.selection,
94
95
  userAnchor = _tr$selection.anchor,
95
96
  userHead = _tr$selection.head;
96
- var expandedAnchor, expandedHead;
97
+ var $expandedAnchor, $expandedHead;
97
98
  if (anchor !== undefined && head !== undefined) {
98
- expandedAnchor = tr.doc.resolve(anchor);
99
- expandedHead = tr.doc.resolve(head);
99
+ $expandedAnchor = tr.doc.resolve(anchor);
100
+ $expandedHead = tr.doc.resolve(head);
100
101
  } else {
101
102
  var expandedSelection = (0, _selection.expandSelectionBounds)(tr.selection.$anchor, tr.selection.$head);
102
- expandedAnchor = expandedSelection.$anchor;
103
- expandedHead = expandedSelection.$head;
103
+ $expandedAnchor = expandedSelection.$anchor;
104
+ $expandedHead = expandedSelection.$head;
104
105
  }
105
- api === null || api === void 0 || (_api$selection = api.selection) === null || _api$selection === void 0 || _api$selection.commands.setManualSelection(expandedAnchor.pos, expandedHead.pos)({
106
+ api === null || api === void 0 || (_api$selection = api.selection) === null || _api$selection === void 0 || _api$selection.commands.setManualSelection($expandedAnchor.pos, $expandedHead.pos)({
106
107
  tr: tr
107
108
  });
108
- // this is to normalise the selection's boundaries to inline positions, preventing it from collapsing
109
- var expandedNormalisedSel = _state.TextSelection.between(expandedAnchor, expandedHead);
110
- tr.setSelection(expandedNormalisedSel);
109
+ var $from = $expandedAnchor.min($expandedHead);
110
+ var $to = $expandedAnchor.max($expandedHead);
111
+ var expandedNormalisedSel;
112
+ if ($from.nodeAfter === $to.nodeBefore) {
113
+ (0, _getSelection.selectNode)(tr, $from.pos, $expandedAnchor.node().type.name);
114
+ expandedNormalisedSel = tr.selection;
115
+ } else if (((_$to$nodeBefore = $to.nodeBefore) === null || _$to$nodeBefore === void 0 ? void 0 : _$to$nodeBefore.type.name) === 'mediaSingle' || ((_$from$nodeAfter = $from.nodeAfter) === null || _$from$nodeAfter === void 0 ? void 0 : _$from$nodeAfter.type.name) === 'mediaSingle') {
116
+ expandedNormalisedSel = new _state.TextSelection($expandedAnchor, $expandedHead);
117
+ tr.setSelection(expandedNormalisedSel);
118
+ } else {
119
+ // this is to normalise the selection's boundaries to inline positions, preventing it from collapsing
120
+ expandedNormalisedSel = _state.TextSelection.between($expandedAnchor, $expandedHead);
121
+ tr.setSelection(expandedNormalisedSel);
122
+ }
111
123
  var multiSelectDnD = {
112
- anchor: expandedAnchor.pos,
113
- head: expandedHead.pos,
124
+ anchor: $expandedAnchor.pos,
125
+ head: $expandedHead.pos,
114
126
  textAnchor: expandedNormalisedSel.anchor,
115
127
  textHead: expandedNormalisedSel.head,
116
128
  userAnchor: userAnchor,
@@ -125,7 +137,7 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
125
137
  }
126
138
  },
127
139
  getSharedState: function getSharedState(editorState) {
128
- var _key$getState$isMenuO, _key$getState, _key$getState$activeN, _key$getState2, _key$getState$isDragg, _key$getState3, _key$getState$isPMDra, _key$getState4, _key$getState$multiSe, _key$getState5;
140
+ var _key$getState$isMenuO, _key$getState, _key$getState$activeN, _key$getState2, _key$getState$isDragg, _key$getState3, _key$getState$isPMDra, _key$getState4, _key$getState$multiSe, _key$getState5, _key$getState$isShift, _key$getState6;
129
141
  if (!editorState) {
130
142
  return undefined;
131
143
  }
@@ -134,7 +146,8 @@ var blockControlsPlugin = exports.blockControlsPlugin = function blockControlsPl
134
146
  activeNode: (_key$getState$activeN = (_key$getState2 = _main.key.getState(editorState)) === null || _key$getState2 === void 0 ? void 0 : _key$getState2.activeNode) !== null && _key$getState$activeN !== void 0 ? _key$getState$activeN : undefined,
135
147
  isDragging: (_key$getState$isDragg = (_key$getState3 = _main.key.getState(editorState)) === null || _key$getState3 === void 0 ? void 0 : _key$getState3.isDragging) !== null && _key$getState$isDragg !== void 0 ? _key$getState$isDragg : false,
136
148
  isPMDragging: (_key$getState$isPMDra = (_key$getState4 = _main.key.getState(editorState)) === null || _key$getState4 === void 0 ? void 0 : _key$getState4.isPMDragging) !== null && _key$getState$isPMDra !== void 0 ? _key$getState$isPMDra : false,
137
- multiSelectDnD: (_key$getState$multiSe = (_key$getState5 = _main.key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined
149
+ multiSelectDnD: (_key$getState$multiSe = (_key$getState5 = _main.key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined,
150
+ isShiftDown: (_key$getState$isShift = (_key$getState6 = _main.key.getState(editorState)) === null || _key$getState6 === void 0 ? void 0 : _key$getState6.isShiftDown) !== null && _key$getState$isShift !== void 0 ? _key$getState$isShift : undefined
138
151
  };
139
152
  },
140
153
  contentComponent: function contentComponent(_ref7) {
@@ -60,16 +60,14 @@ var isDragLayoutColumnToTopLevel = function isDragLayoutColumnToTopLevel($from,
60
60
  * @returns the start position of a node if the node can be moved, otherwise -1
61
61
  */
62
62
  var getCurrentNodePos = function getCurrentNodePos(state) {
63
- var _activeNode$handleOpt;
64
63
  var selection = state.selection;
65
- var _ref = _main.key.getState(state) || {},
66
- activeNode = _ref.activeNode;
67
64
  var currentNodePos = -1;
68
65
 
69
66
  // There are 3 cases when a node can be moved
70
- if (activeNode && (_activeNode$handleOpt = activeNode.handleOptions) !== null && _activeNode$handleOpt !== void 0 && _activeNode$handleOpt.isFocused) {
67
+ var focusedHandle = getFocusedHandle(state);
68
+ if (focusedHandle) {
71
69
  // 1. drag handle of the node is focused
72
- currentNodePos = activeNode.pos;
70
+ currentNodePos = focusedHandle.pos;
73
71
  } else if ((0, _utils3.isInTable)(state)) {
74
72
  if ((0, _utils3.isTableSelected)(selection)) {
75
73
  var _findTable$pos, _findTable;
@@ -87,6 +85,12 @@ var getCurrentNodePos = function getCurrentNodePos(state) {
87
85
  }
88
86
  return currentNodePos;
89
87
  };
88
+ var getFocusedHandle = function getFocusedHandle(state) {
89
+ var _activeNode$handleOpt;
90
+ var _ref = _main.key.getState(state) || {},
91
+ activeNode = _ref.activeNode;
92
+ return activeNode && (_activeNode$handleOpt = activeNode.handleOptions) !== null && _activeNode$handleOpt !== void 0 && _activeNode$handleOpt.isFocused ? activeNode : undefined;
93
+ };
90
94
  var moveNodeViaShortcut = exports.moveNodeViaShortcut = function moveNodeViaShortcut(api, direction, formatMessage) {
91
95
  return function (state) {
92
96
  var isParentNodeOfTypeLayout;
@@ -96,20 +100,14 @@ var moveNodeViaShortcut = exports.moveNodeViaShortcut = function moveNodeViaShor
96
100
  isParentNodeOfTypeLayout = !!(0, _utils2.findParentNodeOfType)([state.schema.nodes.layoutSection])(state.selection);
97
101
  }
98
102
  var isMultiSelectEnabled = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true);
99
- var expandedAnchor, expandedHead;
100
- var pluginState = api === null || api === void 0 ? void 0 : api.blockControls.sharedState.currentState();
101
- if (pluginState !== null && pluginState !== void 0 && pluginState.multiSelectDnD) {
102
- expandedAnchor = pluginState.multiSelectDnD.anchor;
103
- expandedHead = pluginState.multiSelectDnD.head;
104
- } else {
105
- var expandedSelection = (0, _selection.expandSelectionBounds)(selection.$anchor, selection.$head);
106
- expandedAnchor = expandedSelection.$anchor.pos;
107
- expandedHead = expandedSelection.$head.pos;
108
- }
109
- var currentNodePos = isMultiSelectEnabled ? Math.min(expandedAnchor, expandedHead) : getCurrentNodePos(state);
103
+ var expandedSelection = (0, _selection.expandSelectionBounds)(selection.$anchor, selection.$head);
104
+ var expandedAnchor = expandedSelection.$anchor.pos;
105
+ var expandedHead = expandedSelection.$head.pos;
106
+ var currentNodePos = isMultiSelectEnabled && !getFocusedHandle(state) ? Math.min(expandedAnchor, expandedHead) : getCurrentNodePos(state);
110
107
  if (currentNodePos > -1) {
111
108
  var _state$doc$nodeAt;
112
109
  var $pos = state.doc.resolve(currentNodePos);
110
+ var nodeAfterPos = isMultiSelectEnabled && !getFocusedHandle(state) ? Math.max(expandedAnchor, expandedHead) : $pos.posAtIndex($pos.index() + 1);
113
111
  var isTopLevelNode = $pos.depth === 0;
114
112
  var moveToPos = -1;
115
113
  var nodeIndex = $pos.index();
@@ -217,7 +215,6 @@ var moveNodeViaShortcut = exports.moveNodeViaShortcut = function moveNodeViaShor
217
215
  }
218
216
  } else {
219
217
  var _endOfDoc = $pos.end();
220
- var nodeAfterPos = isMultiSelectEnabled ? Math.max(expandedAnchor, expandedHead) : $pos.posAtIndex($pos.index() + 1);
221
218
  if (nodeAfterPos > _endOfDoc) {
222
219
  return false;
223
220
  }
@@ -296,8 +293,8 @@ var moveNode = exports.moveNode = function moveNode(api) {
296
293
  var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true, {
297
294
  exposure: true
298
295
  });
296
+ var slicePosition = (0, _selection2.getSelectedSlicePosition)(start, tr, api);
299
297
  if (isMultiSelect) {
300
- var slicePosition = (0, _selection2.getSelectedSlicePosition)(start, tr, api);
301
298
  sliceFrom = slicePosition.from;
302
299
  sliceTo = slicePosition.to;
303
300
  var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, sliceFrom, sliceTo);
@@ -13,9 +13,11 @@ var _analytics = require("@atlaskit/editor-common/analytics");
13
13
  var _browser = require("@atlaskit/editor-common/browser");
14
14
  var _performanceMeasures = require("@atlaskit/editor-common/performance-measures");
15
15
  var _safePlugin = require("@atlaskit/editor-common/safe-plugin");
16
+ var _selection2 = require("@atlaskit/editor-common/selection");
16
17
  var _utils = require("@atlaskit/editor-common/utils");
17
18
  var _state = require("@atlaskit/editor-prosemirror/state");
18
19
  var _view2 = require("@atlaskit/editor-prosemirror/view");
20
+ var _editorTables = require("@atlaskit/editor-tables");
19
21
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
20
22
  var _element = require("@atlaskit/pragmatic-drag-and-drop-auto-scroll/element");
21
23
  var _combine = require("@atlaskit/pragmatic-drag-and-drop/combine");
@@ -29,7 +31,7 @@ var _keymap = require("./keymap");
29
31
  var _activeAnchorTracker = require("./utils/active-anchor-tracker");
30
32
  var _analytics2 = require("./utils/analytics");
31
33
  var _anchorUtils = require("./utils/anchor-utils");
32
- var _selection = require("./utils/selection");
34
+ var _selection3 = require("./utils/selection");
33
35
  var _transactions = require("./utils/transactions");
34
36
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
35
37
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
@@ -107,7 +109,7 @@ var destroyFn = function destroyFn(api, editorView) {
107
109
  var _api$analytics2;
108
110
  var nodeTypes, hasSelectedMultipleNodes;
109
111
  if (isMultiSelect && api) {
110
- var position = (0, _selection.getSelectedSlicePosition)(start, tr, api);
112
+ var position = (0, _selection3.getSelectedSlicePosition)(start, tr, api);
111
113
  var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, position.from, position.to);
112
114
  nodeTypes = attributes.nodeTypes;
113
115
  hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
@@ -128,10 +130,10 @@ var destroyFn = function destroyFn(api, editorView) {
128
130
  })
129
131
  })(tr);
130
132
  }
131
- return tr.setMeta(key, {
133
+ return tr.setMeta(key, _objectSpread(_objectSpread({}, tr.getMeta(key)), {}, {
132
134
  isDragging: false,
133
135
  isPMDragging: false
134
- });
136
+ }));
135
137
  });
136
138
  }
137
139
  }));
@@ -155,7 +157,7 @@ var getDecorations = exports.getDecorations = function getDecorations(state) {
155
157
  return (_key$getState = key.getState(state)) === null || _key$getState === void 0 ? void 0 : _key$getState.decorations;
156
158
  };
157
159
  var newApply = exports.newApply = function newApply(api, formatMessage, tr, currentState, newState, flags, nodeViewPortalProviderAPI, anchorRectCache) {
158
- var _meta$activeNode, _activeNode, _activeNode2, _meta$activeNode$hand, _meta$isDragging, _meta$isDragging2, _meta$editorHeight, _meta$editorWidthLeft, _meta$editorWidthRigh, _meta$isPMDragging, _meta$multiSelectDnD;
160
+ var _meta$multiSelectDnD, _meta$activeNode, _activeNode, _activeNode2, _meta$activeNode$hand, _meta$isDragging, _meta$isDragging2, _meta$editorHeight, _meta$editorWidthLeft, _meta$editorWidthRigh, _meta$isPMDragging, _meta$isShiftDown;
159
161
  var activeNode = currentState.activeNode,
160
162
  decorations = currentState.decorations,
161
163
  isResizerResizing = currentState.isResizerResizing,
@@ -165,7 +167,8 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
165
167
  editorWidthRight = currentState.editorWidthRight,
166
168
  isDragging = currentState.isDragging,
167
169
  isMenuOpen = currentState.isMenuOpen,
168
- isPMDragging = currentState.isPMDragging;
170
+ isPMDragging = currentState.isPMDragging,
171
+ isShiftDown = currentState.isShiftDown;
169
172
  var isActiveNodeDeleted = false;
170
173
 
171
174
  // When steps exist, remap existing decorations, activeNode and multi select positions
@@ -188,10 +191,9 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
188
191
  var meta = tr.getMeta(key);
189
192
  var resizerMeta = tr.getMeta('is-resizer-resizing');
190
193
  isResizerResizing = resizerMeta !== null && resizerMeta !== void 0 ? resizerMeta : isResizerResizing;
194
+ multiSelectDnD = (_meta$multiSelectDnD = meta === null || meta === void 0 ? void 0 : meta.multiSelectDnD) !== null && _meta$multiSelectDnD !== void 0 ? _meta$multiSelectDnD : multiSelectDnD;
191
195
  if (multiSelectDnD && flags.isMultiSelectEnabled) {
192
- multiSelectDnD = (meta === null || meta === void 0 ? void 0 : meta.isDragging) === false ||
193
- // For move node with shortcut, only reset when the selection changes
194
- tr.selection.anchor !== multiSelectDnD.textAnchor || tr.selection.head !== multiSelectDnD.textHead ? undefined : multiSelectDnD;
196
+ multiSelectDnD = (meta === null || meta === void 0 ? void 0 : meta.isDragging) === false || tr.selection.empty ? undefined : multiSelectDnD;
195
197
  }
196
198
  var _getTrMetadata = (0, _transactions.getTrMetadata)(tr),
197
199
  from = _getTrMetadata.from,
@@ -294,7 +296,8 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
294
296
  isResizerResizing: isResizerResizing,
295
297
  isDocSizeLimitEnabled: initialState.isDocSizeLimitEnabled,
296
298
  isPMDragging: (_meta$isPMDragging = meta === null || meta === void 0 ? void 0 : meta.isPMDragging) !== null && _meta$isPMDragging !== void 0 ? _meta$isPMDragging : isPMDragging,
297
- multiSelectDnD: (_meta$multiSelectDnD = meta === null || meta === void 0 ? void 0 : meta.multiSelectDnD) !== null && _meta$multiSelectDnD !== void 0 ? _meta$multiSelectDnD : multiSelectDnD
299
+ multiSelectDnD: multiSelectDnD,
300
+ isShiftDown: (_meta$isShiftDown = meta === null || meta === void 0 ? void 0 : meta.isShiftDown) !== null && _meta$isShiftDown !== void 0 ? _meta$isShiftDown : isShiftDown
298
301
  };
299
302
  };
300
303
  var oldApply = exports.oldApply = function oldApply(api, formatMessage, tr, currentState, oldState, newState, flags, nodeViewPortalProviderAPI, anchorRectCache) {
@@ -510,9 +513,9 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
510
513
  dragging = view.dragging;
511
514
  var pluginState = key.getState(state);
512
515
  if (pluginState !== null && pluginState !== void 0 && pluginState.isPMDragging) {
513
- dispatch(state.tr.setMeta(key, {
516
+ dispatch(state.tr.setMeta(key, _objectSpread(_objectSpread({}, state.tr.getMeta(key)), {}, {
514
517
  isPMDragging: false
515
- }));
518
+ })));
516
519
  }
517
520
  if (!(event.target instanceof HTMLElement) || !(pluginState !== null && pluginState !== void 0 && pluginState.activeNode)) {
518
521
  return false;
@@ -534,10 +537,26 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
534
537
  var domPos = Math.max(view.posAtDOM(nodeElement, 0) - 1, 0);
535
538
  var nodeTarget = state.doc.nodeAt(domPos);
536
539
  var isSameNode = !!(nodeTarget && draggable !== null && draggable !== void 0 && draggable.eq(nodeTarget));
537
- var isInSelection = domPos >= state.selection.$from.pos && domPos < state.selection.$to.pos;
538
540
 
539
- // Prevent the default drop behavior if the position is within the activeNode or Editor selection
540
- if (isSameNode || isInSelection && isMultiSelectEnabled) {
541
+ // CellSelection doesn't expose true from/to positions, we need to query the ranges
542
+ var selectionRange = state.selection instanceof _editorTables.CellSelection ? state.selection.ranges.reduce(function (previousValue, currentValue, _currentIndex, _array) {
543
+ return {
544
+ $from: currentValue.$from.min(previousValue.$from),
545
+ $to: currentValue.$to.max(previousValue.$to)
546
+ };
547
+ }) : {
548
+ $from: state.selection.$from,
549
+ $to: state.selection.$to
550
+ };
551
+ var expandedSelection = (0, _selection2.expandSelectionBounds)(selectionRange.$from, selectionRange.$to);
552
+ var expandedAnchor = expandedSelection.$anchor;
553
+ var expandedHead = expandedSelection.$head;
554
+ var expandedSelectionFrom = Math.min(expandedAnchor.pos, expandedHead.pos);
555
+ var expandedSelectionTo = Math.max(expandedAnchor.pos, expandedHead.pos);
556
+ var isInExpandedSelection = domPos >= expandedSelectionFrom && domPos < expandedSelectionTo;
557
+
558
+ // Prevent the default drop behavior if the position is within the activeNode or within the expanded selection when multiselect is on
559
+ if (isSameNode || isInExpandedSelection && isMultiSelectEnabled) {
541
560
  event.preventDefault();
542
561
  return true;
543
562
  }
@@ -565,18 +584,18 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
565
584
  _activeAnchorTracker.defaultActiveAnchorTracker.reset();
566
585
  }
567
586
  (_anchorRectCache = anchorRectCache) === null || _anchorRectCache === void 0 || _anchorRectCache.setEditorView(view);
568
- view.dispatch(view.state.tr.setMeta(key, {
587
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
569
588
  isPMDragging: true
570
- }));
589
+ })));
571
590
  },
572
591
  dragend: function dragend(view) {
573
592
  var _key$getState3;
574
593
  var state = view.state,
575
594
  dispatch = view.dispatch;
576
595
  if ((_key$getState3 = key.getState(state)) !== null && _key$getState3 !== void 0 && _key$getState3.isPMDragging) {
577
- dispatch(state.tr.setMeta(key, {
596
+ dispatch(state.tr.setMeta(key, _objectSpread(_objectSpread({}, state.tr.getMeta(key)), {}, {
578
597
  isPMDragging: false
579
- }));
598
+ })));
580
599
  }
581
600
  },
582
601
  mouseover: function mouseover(view, event) {
@@ -584,27 +603,65 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
584
603
  return false;
585
604
  },
586
605
  keydown: function keydown(view, event) {
587
- // Command + Shift + ArrowUp to select was broken with the plugin enabled so this manually sets the selection
588
- var _view$state = view.state,
589
- selection = _view$state.selection,
590
- doc = _view$state.doc,
591
- tr = _view$state.tr;
592
- var metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
593
- if (event.key === 'ArrowUp' && event.shiftKey && metaKey) {
594
- if (selection instanceof _state.TextSelection || selection instanceof _state.NodeSelection) {
595
- var newSelection = _state.TextSelection.create(doc, selection.head, 1);
596
- view.dispatch(tr.setSelection(newSelection));
597
- return true;
606
+ if (isMultiSelectEnabled) {
607
+ if (event.shiftKey && event.ctrlKey) {
608
+ //prevent holding down key combo from firing repeatedly
609
+ if (!event.repeat && (0, _keymap.boundKeydownHandler)(api, formatMessage)(view, event)) {
610
+ event.preventDefault();
611
+ return true;
612
+ }
598
613
  }
599
- }
600
- if (event.shiftKey && event.ctrlKey) {
601
- //prevent holding down key combo from firing repeatedly
602
- if (!event.repeat && (0, _keymap.boundKeydownHandler)(api, formatMessage)(view, event)) {
603
- event.preventDefault();
614
+
615
+ // Command + Shift + ArrowUp to select was broken with the plugin enabled so this manually sets the selection
616
+ var _view$state = view.state,
617
+ selection = _view$state.selection,
618
+ doc = _view$state.doc,
619
+ tr = _view$state.tr;
620
+ var metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
621
+ if (event.key === 'ArrowUp' && event.shiftKey && metaKey) {
622
+ if (selection instanceof _state.TextSelection || selection instanceof _state.NodeSelection) {
623
+ var newSelection = _state.TextSelection.create(doc, selection.head, 1);
624
+ view.dispatch(tr.setSelection(newSelection));
625
+ return true;
626
+ }
627
+ }
628
+ if (!event.repeat && event.shiftKey) {
629
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
630
+ isShiftDown: true
631
+ })));
604
632
  return true;
605
633
  }
634
+ return false;
635
+ } else {
636
+ // Command + Shift + ArrowUp to select was broken with the plugin enabled so this manually sets the selection
637
+ var _view$state2 = view.state,
638
+ _selection = _view$state2.selection,
639
+ _doc = _view$state2.doc,
640
+ _tr = _view$state2.tr;
641
+ var _metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
642
+ if (event.key === 'ArrowUp' && event.shiftKey && _metaKey) {
643
+ if (_selection instanceof _state.TextSelection || _selection instanceof _state.NodeSelection) {
644
+ var _newSelection = _state.TextSelection.create(_doc, _selection.head, 1);
645
+ view.dispatch(_tr.setSelection(_newSelection));
646
+ return true;
647
+ }
648
+ }
649
+ if (event.shiftKey && event.ctrlKey) {
650
+ //prevent holding down key combo from firing repeatedly
651
+ if (!event.repeat && (0, _keymap.boundKeydownHandler)(api, formatMessage)(view, event)) {
652
+ event.preventDefault();
653
+ return true;
654
+ }
655
+ }
606
656
  }
607
657
  return false;
658
+ },
659
+ keyup: function keyup(view, event) {
660
+ if (!event.repeat && event.key === 'Shift') {
661
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
662
+ isShiftDown: false
663
+ })));
664
+ }
608
665
  }
609
666
  }
610
667
  },
@@ -629,10 +686,10 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
629
686
  // Ignored via go/ees005
630
687
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
631
688
  var editorWidthLeft = _editorContentArea.getBoundingClientRect().left;
632
- transaction.setMeta(key, {
689
+ transaction.setMeta(key, _objectSpread(_objectSpread({}, transaction.getMeta(key)), {}, {
633
690
  editorWidthLeft: editorWidthLeft,
634
691
  editorWidthRight: editorWidthRight
635
- });
692
+ }));
636
693
  }
637
694
  editorView.dispatch(transaction);
638
695
  }
@@ -63,7 +63,7 @@ var getSelection = exports.getSelection = function getSelection(tr, start) {
63
63
  var _getInlineNodePos = getInlineNodePos(tr, start, nodeSize),
64
64
  inlineNodePos = _getInlineNodePos.inlineNodePos,
65
65
  inlineNodeEndPos = _getInlineNodePos.inlineNodeEndPos;
66
- return new _state.TextSelection(tr.doc.resolve(inlineNodeEndPos), tr.doc.resolve(inlineNodePos));
66
+ return new _state.TextSelection(tr.doc.resolve(inlineNodePos), tr.doc.resolve(inlineNodeEndPos));
67
67
  }
68
68
  };
69
69
  var selectNode = exports.selectNode = function selectNode(tr, start, nodeType) {
@@ -3,7 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getSelectedSlicePosition = exports.getMultiSelectionIfPosInside = void 0;
6
+ exports.getSelectedSlicePosition = exports.getMultiSelectionIfPosInside = exports.expandSelectionHeadToNodeAtPos = exports.alignAnchorHeadInDirectionOfPos = void 0;
7
+ var _state = require("@atlaskit/editor-prosemirror/state");
7
8
  var _main = require("../main");
8
9
  var getMultiSelectionIfPosInside = exports.getMultiSelectionIfPosInside = function getMultiSelectionIfPosInside(api, pos, tr) {
9
10
  var _api$blockControls, _pluginState$multiSel, _tr$getMeta;
@@ -16,7 +17,7 @@ var getMultiSelectionIfPosInside = exports.getMultiSelectionIfPosInside = functi
16
17
  var multiTo = Math.max(multiSelectDnD.anchor, multiSelectDnD.head);
17
18
 
18
19
  // We subtract one as the handle position is before the node
19
- return pos >= multiFrom - 1 && pos <= multiTo ? {
20
+ return pos >= multiFrom - 1 && pos < multiTo ? {
20
21
  anchor: multiSelectDnD.anchor,
21
22
  head: multiSelectDnD.head
22
23
  } : {};
@@ -34,12 +35,41 @@ var getSelectedSlicePosition = exports.getSelectedSlicePosition = function getSe
34
35
  anchor = _getMultiSelectionIfP.anchor,
35
36
  head = _getMultiSelectionIfP.head;
36
37
  var inSelection = anchor !== undefined && head !== undefined;
37
- var from = inSelection ? Math.min(anchor, head) : handlePos;
38
+ var from = inSelection ? Math.min(anchor || 0, head || 0) : handlePos;
38
39
  var activeNode = tr.doc.nodeAt(handlePos);
39
40
  var activeNodeEndPos = handlePos + ((_activeNode$nodeSize = activeNode === null || activeNode === void 0 ? void 0 : activeNode.nodeSize) !== null && _activeNode$nodeSize !== void 0 ? _activeNode$nodeSize : 1);
40
- var to = inSelection ? Math.max(anchor, head) : activeNodeEndPos;
41
+ var to = inSelection ? Math.max(anchor || 0, head || 0) : activeNodeEndPos;
41
42
  return {
42
43
  from: from,
43
44
  to: to
44
45
  };
46
+ };
47
+
48
+ /**
49
+ * Takes a position and expands the selection to encompass the node at that position. Ignores empty or out of range selections.
50
+ * Ignores positions that are in text blocks (i.e. not start of a node)
51
+ * @returns TextSelection if expanded, otherwise returns Selection that was passed in.
52
+ */
53
+ var expandSelectionHeadToNodeAtPos = exports.expandSelectionHeadToNodeAtPos = function expandSelectionHeadToNodeAtPos(selection, nodePos) {
54
+ var doc = selection.$anchor.doc;
55
+ if (nodePos < 0 || nodePos > doc.nodeSize - 2 || selection.empty) {
56
+ return selection;
57
+ }
58
+ var $pos = doc.resolve(nodePos);
59
+ var node = $pos.nodeAfter;
60
+ if ($pos.node().isTextblock || !node) {
61
+ return selection;
62
+ }
63
+ var $newHead = nodePos < selection.anchor ? $pos : doc.resolve(node.nodeSize + nodePos);
64
+ var textSelection = new _state.TextSelection(selection.$anchor, $newHead);
65
+ return textSelection;
66
+ };
67
+
68
+ /**
69
+ * This swaps the anchor/head for NodeSelections when its anchor > pos.
70
+ * This is because NodeSelection always has an anchor at the start of the node,
71
+ * which may not align with the existing selection.
72
+ */
73
+ var alignAnchorHeadInDirectionOfPos = exports.alignAnchorHeadInDirectionOfPos = function alignAnchorHeadInDirectionOfPos(selection, pos) {
74
+ return selection instanceof _state.NodeSelection && Math.max(pos, selection.anchor) === selection.anchor ? new _state.TextSelection(selection.$head, selection.$anchor) : selection;
45
75
  };
@@ -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.topPositionAdjustment = exports.spacingBetweenNodesForPreview = exports.spaceLookupMap = exports.nodeMargins = exports.getNestedNodeLeftPaddingMargin = exports.dropTargetMarginMap = exports.dragHandleGap = exports.DRAG_HANDLE_ZINDEX = exports.DRAG_HANDLE_WIDTH = exports.DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT = exports.DRAG_HANDLE_NARROW_GAP = exports.DRAG_HANDLE_MAX_WIDTH_PLUS_GAP = exports.DRAG_HANDLE_MAX_GAP = exports.DRAG_HANDLE_LAYOUT_SECTION_TOP_ADJUSTMENT = exports.DRAG_HANDLE_HEIGHT = exports.DRAG_HANDLE_H6_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H5_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H4_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H3_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H2_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H1_TOP_ADJUSTMENT = exports.DRAG_HANDLE_DIVIDER_TOP_ADJUSTMENT = exports.DRAG_HANDLE_DEFAULT_GAP = exports.DRAG_HANDLE_BORDER_RADIUS = exports.DEFAULT_COLUMN_DISTRIBUTIONS = exports.BLOCK_MENU_WIDTH = void 0;
7
+ exports.topPositionAdjustment = exports.spacingBetweenNodesForPreview = exports.spaceLookupMap = exports.nodeMargins = exports.getNestedNodeLeftPaddingMargin = exports.dropTargetMarginMap = exports.dragHandleGap = exports.DRAG_HANDLE_ZINDEX = exports.DRAG_HANDLE_WIDTH = exports.DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT = exports.DRAG_HANDLE_NARROW_GAP = exports.DRAG_HANDLE_MAX_WIDTH_PLUS_GAP = exports.DRAG_HANDLE_MAX_SHIFT_CLICK_DEPTH = exports.DRAG_HANDLE_MAX_GAP = exports.DRAG_HANDLE_LAYOUT_SECTION_TOP_ADJUSTMENT = exports.DRAG_HANDLE_HEIGHT = exports.DRAG_HANDLE_H6_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H5_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H4_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H3_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H2_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H1_TOP_ADJUSTMENT = exports.DRAG_HANDLE_DIVIDER_TOP_ADJUSTMENT = exports.DRAG_HANDLE_DEFAULT_GAP = exports.DRAG_HANDLE_BORDER_RADIUS = exports.DEFAULT_COLUMN_DISTRIBUTIONS = exports.BLOCK_MENU_WIDTH = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _editorSharedStyles = require("@atlaskit/editor-shared-styles");
10
10
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
@@ -27,6 +27,14 @@ var DRAG_HANDLE_H5_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H5_TOP_ADJUSTMENT = 3;
27
27
  var DRAG_HANDLE_H6_TOP_ADJUSTMENT = exports.DRAG_HANDLE_H6_TOP_ADJUSTMENT = 3;
28
28
  var DRAG_HANDLE_LAYOUT_SECTION_TOP_ADJUSTMENT = exports.DRAG_HANDLE_LAYOUT_SECTION_TOP_ADJUSTMENT = 8;
29
29
  var DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT = exports.DRAG_HANDLE_PARAGRAPH_TOP_ADJUSTMENT = 2;
30
+
31
+ /** We only want to shift-select nodes that are at the top level of a document.
32
+ * This is because funky things happen when selecting inside of tableCells, but we
33
+ * also want to avoid heavily nested cases to descope potential corner cases.
34
+ * Various top level nodes have their selection 'from' at depths other than 0,
35
+ * so we allow for some leniency to capture them all. e.g. Table is depth 3.
36
+ */
37
+ var DRAG_HANDLE_MAX_SHIFT_CLICK_DEPTH = exports.DRAG_HANDLE_MAX_SHIFT_CLICK_DEPTH = 3;
30
38
  var nodeTypeExcludeList = ['embedCard', 'mediaSingle', 'table'];
31
39
  var dragHandleGap = exports.dragHandleGap = function dragHandleGap(nodeType, parentNodeType) {
32
40
  if (nodeType === 'layoutSection' && (0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_post_fix_patch_2')) {