@atlaskit/editor-plugin-block-controls 3.0.1 → 3.1.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 (31) hide show
  1. package/CHANGELOG.md +12 -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 +73 -34
  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 +70 -23
  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 +71 -32
  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 +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/editor-plugin-block-controls
2
2
 
3
+ ## 3.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#117917](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/pull-requests/117917)
8
+ [`9d7669d4f5295`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/9d7669d4f5295) -
9
+ [ux] Add shift-select functionality to DnD
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies
14
+
3
15
  ## 3.0.1
4
16
 
5
17
  ### 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);
@@ -29,7 +29,7 @@ var _keymap = require("./keymap");
29
29
  var _activeAnchorTracker = require("./utils/active-anchor-tracker");
30
30
  var _analytics2 = require("./utils/analytics");
31
31
  var _anchorUtils = require("./utils/anchor-utils");
32
- var _selection = require("./utils/selection");
32
+ var _selection2 = require("./utils/selection");
33
33
  var _transactions = require("./utils/transactions");
34
34
  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
35
  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 +107,7 @@ var destroyFn = function destroyFn(api, editorView) {
107
107
  var _api$analytics2;
108
108
  var nodeTypes, hasSelectedMultipleNodes;
109
109
  if (isMultiSelect && api) {
110
- var position = (0, _selection.getSelectedSlicePosition)(start, tr, api);
110
+ var position = (0, _selection2.getSelectedSlicePosition)(start, tr, api);
111
111
  var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, position.from, position.to);
112
112
  nodeTypes = attributes.nodeTypes;
113
113
  hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
@@ -128,10 +128,10 @@ var destroyFn = function destroyFn(api, editorView) {
128
128
  })
129
129
  })(tr);
130
130
  }
131
- return tr.setMeta(key, {
131
+ return tr.setMeta(key, _objectSpread(_objectSpread({}, tr.getMeta(key)), {}, {
132
132
  isDragging: false,
133
133
  isPMDragging: false
134
- });
134
+ }));
135
135
  });
136
136
  }
137
137
  }));
@@ -155,7 +155,7 @@ var getDecorations = exports.getDecorations = function getDecorations(state) {
155
155
  return (_key$getState = key.getState(state)) === null || _key$getState === void 0 ? void 0 : _key$getState.decorations;
156
156
  };
157
157
  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;
158
+ 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
159
  var activeNode = currentState.activeNode,
160
160
  decorations = currentState.decorations,
161
161
  isResizerResizing = currentState.isResizerResizing,
@@ -165,7 +165,8 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
165
165
  editorWidthRight = currentState.editorWidthRight,
166
166
  isDragging = currentState.isDragging,
167
167
  isMenuOpen = currentState.isMenuOpen,
168
- isPMDragging = currentState.isPMDragging;
168
+ isPMDragging = currentState.isPMDragging,
169
+ isShiftDown = currentState.isShiftDown;
169
170
  var isActiveNodeDeleted = false;
170
171
 
171
172
  // When steps exist, remap existing decorations, activeNode and multi select positions
@@ -188,10 +189,9 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
188
189
  var meta = tr.getMeta(key);
189
190
  var resizerMeta = tr.getMeta('is-resizer-resizing');
190
191
  isResizerResizing = resizerMeta !== null && resizerMeta !== void 0 ? resizerMeta : isResizerResizing;
192
+ multiSelectDnD = (_meta$multiSelectDnD = meta === null || meta === void 0 ? void 0 : meta.multiSelectDnD) !== null && _meta$multiSelectDnD !== void 0 ? _meta$multiSelectDnD : multiSelectDnD;
191
193
  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;
194
+ multiSelectDnD = (meta === null || meta === void 0 ? void 0 : meta.isDragging) === false || tr.selection.empty ? undefined : multiSelectDnD;
195
195
  }
196
196
  var _getTrMetadata = (0, _transactions.getTrMetadata)(tr),
197
197
  from = _getTrMetadata.from,
@@ -294,7 +294,8 @@ var newApply = exports.newApply = function newApply(api, formatMessage, tr, curr
294
294
  isResizerResizing: isResizerResizing,
295
295
  isDocSizeLimitEnabled: initialState.isDocSizeLimitEnabled,
296
296
  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
297
+ multiSelectDnD: multiSelectDnD,
298
+ isShiftDown: (_meta$isShiftDown = meta === null || meta === void 0 ? void 0 : meta.isShiftDown) !== null && _meta$isShiftDown !== void 0 ? _meta$isShiftDown : isShiftDown
298
299
  };
299
300
  };
300
301
  var oldApply = exports.oldApply = function oldApply(api, formatMessage, tr, currentState, oldState, newState, flags, nodeViewPortalProviderAPI, anchorRectCache) {
@@ -510,9 +511,9 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
510
511
  dragging = view.dragging;
511
512
  var pluginState = key.getState(state);
512
513
  if (pluginState !== null && pluginState !== void 0 && pluginState.isPMDragging) {
513
- dispatch(state.tr.setMeta(key, {
514
+ dispatch(state.tr.setMeta(key, _objectSpread(_objectSpread({}, state.tr.getMeta(key)), {}, {
514
515
  isPMDragging: false
515
- }));
516
+ })));
516
517
  }
517
518
  if (!(event.target instanceof HTMLElement) || !(pluginState !== null && pluginState !== void 0 && pluginState.activeNode)) {
518
519
  return false;
@@ -565,18 +566,18 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
565
566
  _activeAnchorTracker.defaultActiveAnchorTracker.reset();
566
567
  }
567
568
  (_anchorRectCache = anchorRectCache) === null || _anchorRectCache === void 0 || _anchorRectCache.setEditorView(view);
568
- view.dispatch(view.state.tr.setMeta(key, {
569
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
569
570
  isPMDragging: true
570
- }));
571
+ })));
571
572
  },
572
573
  dragend: function dragend(view) {
573
574
  var _key$getState3;
574
575
  var state = view.state,
575
576
  dispatch = view.dispatch;
576
577
  if ((_key$getState3 = key.getState(state)) !== null && _key$getState3 !== void 0 && _key$getState3.isPMDragging) {
577
- dispatch(state.tr.setMeta(key, {
578
+ dispatch(state.tr.setMeta(key, _objectSpread(_objectSpread({}, state.tr.getMeta(key)), {}, {
578
579
  isPMDragging: false
579
- }));
580
+ })));
580
581
  }
581
582
  },
582
583
  mouseover: function mouseover(view, event) {
@@ -584,27 +585,65 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
584
585
  return false;
585
586
  },
586
587
  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;
588
+ if (isMultiSelectEnabled) {
589
+ if (event.shiftKey && event.ctrlKey) {
590
+ //prevent holding down key combo from firing repeatedly
591
+ if (!event.repeat && (0, _keymap.boundKeydownHandler)(api, formatMessage)(view, event)) {
592
+ event.preventDefault();
593
+ return true;
594
+ }
598
595
  }
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();
596
+
597
+ // Command + Shift + ArrowUp to select was broken with the plugin enabled so this manually sets the selection
598
+ var _view$state = view.state,
599
+ selection = _view$state.selection,
600
+ doc = _view$state.doc,
601
+ tr = _view$state.tr;
602
+ var metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
603
+ if (event.key === 'ArrowUp' && event.shiftKey && metaKey) {
604
+ if (selection instanceof _state.TextSelection || selection instanceof _state.NodeSelection) {
605
+ var newSelection = _state.TextSelection.create(doc, selection.head, 1);
606
+ view.dispatch(tr.setSelection(newSelection));
607
+ return true;
608
+ }
609
+ }
610
+ if (!event.repeat && event.shiftKey) {
611
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
612
+ isShiftDown: true
613
+ })));
604
614
  return true;
605
615
  }
616
+ return false;
617
+ } else {
618
+ // Command + Shift + ArrowUp to select was broken with the plugin enabled so this manually sets the selection
619
+ var _view$state2 = view.state,
620
+ _selection = _view$state2.selection,
621
+ _doc = _view$state2.doc,
622
+ _tr = _view$state2.tr;
623
+ var _metaKey = _browser.browser.mac ? event.metaKey : event.ctrlKey;
624
+ if (event.key === 'ArrowUp' && event.shiftKey && _metaKey) {
625
+ if (_selection instanceof _state.TextSelection || _selection instanceof _state.NodeSelection) {
626
+ var _newSelection = _state.TextSelection.create(_doc, _selection.head, 1);
627
+ view.dispatch(_tr.setSelection(_newSelection));
628
+ return true;
629
+ }
630
+ }
631
+ if (event.shiftKey && event.ctrlKey) {
632
+ //prevent holding down key combo from firing repeatedly
633
+ if (!event.repeat && (0, _keymap.boundKeydownHandler)(api, formatMessage)(view, event)) {
634
+ event.preventDefault();
635
+ return true;
636
+ }
637
+ }
606
638
  }
607
639
  return false;
640
+ },
641
+ keyup: function keyup(view, event) {
642
+ if (!event.repeat && event.key === 'Shift') {
643
+ view.dispatch(view.state.tr.setMeta(key, _objectSpread(_objectSpread({}, view.state.tr.getMeta(key)), {}, {
644
+ isShiftDown: false
645
+ })));
646
+ }
608
647
  }
609
648
  }
610
649
  },
@@ -629,10 +668,10 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
629
668
  // Ignored via go/ees005
630
669
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
631
670
  var editorWidthLeft = _editorContentArea.getBoundingClientRect().left;
632
- transaction.setMeta(key, {
671
+ transaction.setMeta(key, _objectSpread(_objectSpread({}, transaction.getMeta(key)), {}, {
633
672
  editorWidthLeft: editorWidthLeft,
634
673
  editorWidthRight: editorWidthRight
635
- });
674
+ }));
636
675
  }
637
676
  editorView.dispatch(transaction);
638
677
  }
@@ -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')) {