@atlaskit/editor-plugin-block-controls 2.26.0 → 2.26.2

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 (52) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/editor-commands/move-node.js +79 -43
  3. package/dist/cjs/editor-commands/move-to-layout.js +23 -11
  4. package/dist/cjs/editor-commands/show-drag-handle.js +89 -3
  5. package/dist/cjs/pm-plugins/decorations-anchor.js +5 -10
  6. package/dist/cjs/pm-plugins/decorations-common.js +8 -10
  7. package/dist/cjs/pm-plugins/decorations-drag-handle.js +4 -19
  8. package/dist/cjs/pm-plugins/decorations-drop-target.js +8 -25
  9. package/dist/cjs/pm-plugins/main.js +28 -8
  10. package/dist/cjs/pm-plugins/utils/analytics.js +66 -0
  11. package/dist/cjs/pm-plugins/utils/selection.js +22 -2
  12. package/dist/cjs/ui/drag-handle.js +38 -10
  13. package/dist/es2019/editor-commands/move-node.js +76 -40
  14. package/dist/es2019/editor-commands/move-to-layout.js +23 -11
  15. package/dist/es2019/editor-commands/show-drag-handle.js +88 -3
  16. package/dist/es2019/pm-plugins/decorations-anchor.js +6 -11
  17. package/dist/es2019/pm-plugins/decorations-common.js +7 -9
  18. package/dist/es2019/pm-plugins/decorations-drag-handle.js +10 -25
  19. package/dist/es2019/pm-plugins/decorations-drop-target.js +11 -30
  20. package/dist/es2019/pm-plugins/main.js +24 -6
  21. package/dist/es2019/pm-plugins/utils/{fire-analytics.js → analytics.js} +31 -3
  22. package/dist/es2019/pm-plugins/utils/selection.js +22 -1
  23. package/dist/es2019/ui/drag-handle.js +34 -4
  24. package/dist/esm/editor-commands/move-node.js +80 -44
  25. package/dist/esm/editor-commands/move-to-layout.js +23 -11
  26. package/dist/esm/editor-commands/show-drag-handle.js +88 -2
  27. package/dist/esm/pm-plugins/decorations-anchor.js +6 -11
  28. package/dist/esm/pm-plugins/decorations-common.js +7 -9
  29. package/dist/esm/pm-plugins/decorations-drag-handle.js +4 -19
  30. package/dist/esm/pm-plugins/decorations-drop-target.js +8 -25
  31. package/dist/esm/pm-plugins/main.js +27 -7
  32. package/dist/esm/pm-plugins/utils/{fire-analytics.js → analytics.js} +32 -3
  33. package/dist/esm/pm-plugins/utils/selection.js +21 -1
  34. package/dist/esm/ui/drag-handle.js +37 -5
  35. package/dist/types/blockControlsPluginType.d.ts +1 -0
  36. package/dist/types/editor-commands/move-to-layout.d.ts +1 -0
  37. package/dist/types/editor-commands/show-drag-handle.d.ts +1 -1
  38. package/dist/types/pm-plugins/decorations-common.d.ts +1 -0
  39. package/dist/types/pm-plugins/main.d.ts +1 -0
  40. package/dist/types/pm-plugins/utils/analytics.d.ts +12 -0
  41. package/dist/types/pm-plugins/utils/selection.d.ts +9 -0
  42. package/dist/types-ts4.5/blockControlsPluginType.d.ts +1 -0
  43. package/dist/types-ts4.5/editor-commands/move-to-layout.d.ts +1 -0
  44. package/dist/types-ts4.5/editor-commands/show-drag-handle.d.ts +1 -1
  45. package/dist/types-ts4.5/pm-plugins/decorations-common.d.ts +1 -0
  46. package/dist/types-ts4.5/pm-plugins/main.d.ts +1 -0
  47. package/dist/types-ts4.5/pm-plugins/utils/analytics.d.ts +12 -0
  48. package/dist/types-ts4.5/pm-plugins/utils/selection.d.ts +9 -0
  49. package/package.json +10 -7
  50. package/dist/cjs/pm-plugins/utils/fire-analytics.js +0 -36
  51. package/dist/types/pm-plugins/utils/fire-analytics.d.ts +0 -5
  52. package/dist/types-ts4.5/pm-plugins/utils/fire-analytics.d.ts +0 -5
@@ -7,11 +7,9 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.findDropTargetDecs = exports.dropTargetDecorations = exports.createLayoutDropTargetDecoration = exports.createDropTargetDecoration = void 0;
8
8
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
9
  var _react = require("react");
10
- var _reactDom = _interopRequireDefault(require("react-dom"));
11
10
  var _uuid = _interopRequireDefault(require("uuid"));
12
11
  var _utils = require("@atlaskit/editor-common/utils");
13
12
  var _view = require("@atlaskit/editor-prosemirror/view");
14
- var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
15
13
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
16
14
  var _consts = require("../ui/consts");
17
15
  var _dropTarget = require("../ui/drop-target");
@@ -103,21 +101,13 @@ var createDropTargetDecoration = exports.createDropTargetDecoration = function c
103
101
  element.style.setProperty(_dropTarget.EDITOR_BLOCK_CONTROLS_DROP_INDICATOR_OFFSET, "".concat(offset, "px"));
104
102
  element.style.setProperty(_dropTarget.EDITOR_BLOCK_CONTROLS_DROP_INDICATOR_GAP, "".concat(gap, "px"));
105
103
  element.style.setProperty('display', 'block');
106
- if ((0, _platformFeatureFlags.fg)('platform_editor_react18_plugin_portalprovider')) {
107
- nodeViewPortalProviderAPI.render(function () {
108
- return /*#__PURE__*/(0, _react.createElement)(_dropTarget.DropTarget, _objectSpread(_objectSpread({}, props), {}, {
109
- getPos: getPos,
110
- anchorRectCache: anchorRectCache,
111
- isSameLayout: isSameLayout
112
- }));
113
- }, element, key);
114
- } else {
115
- _reactDom.default.render( /*#__PURE__*/(0, _react.createElement)(_dropTarget.DropTarget, _objectSpread(_objectSpread({}, props), {}, {
104
+ nodeViewPortalProviderAPI.render(function () {
105
+ return /*#__PURE__*/(0, _react.createElement)(_dropTarget.DropTarget, _objectSpread(_objectSpread({}, props), {}, {
116
106
  getPos: getPos,
117
107
  anchorRectCache: anchorRectCache,
118
108
  isSameLayout: isSameLayout
119
- })), element);
120
- }
109
+ }));
110
+ }, element, key);
121
111
  return element;
122
112
  }, {
123
113
  type: _decorationsCommon.TYPE_DROP_TARGET_DEC,
@@ -138,19 +128,12 @@ var createLayoutDropTargetDecoration = exports.createLayoutDropTargetDecoration
138
128
  element.setAttribute('data-blocks-drop-target-container', 'true');
139
129
  element.setAttribute('data-blocks-drop-target-key', key);
140
130
  element.style.clear = 'unset';
141
- if ((0, _platformFeatureFlags.fg)('platform_editor_react18_plugin_portalprovider')) {
142
- nodeViewPortalProviderAPI.render(function () {
143
- return /*#__PURE__*/(0, _react.createElement)(_dropTargetLayout.DropTargetLayout, _objectSpread(_objectSpread({}, props), {}, {
144
- getPos: getPos,
145
- anchorRectCache: anchorRectCache
146
- }));
147
- }, element, key);
148
- } else {
149
- _reactDom.default.render( /*#__PURE__*/(0, _react.createElement)(_dropTargetLayout.DropTargetLayout, _objectSpread(_objectSpread({}, props), {}, {
131
+ nodeViewPortalProviderAPI.render(function () {
132
+ return /*#__PURE__*/(0, _react.createElement)(_dropTargetLayout.DropTargetLayout, _objectSpread(_objectSpread({}, props), {}, {
150
133
  getPos: getPos,
151
134
  anchorRectCache: anchorRectCache
152
- })), element);
153
- }
135
+ }));
136
+ }, element, key);
154
137
  return element;
155
138
  }, {
156
139
  type: _decorationsCommon.TYPE_DROP_TARGET_DEC
@@ -4,8 +4,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.oldApply = exports.newApply = exports.key = exports.createPlugin = void 0;
7
+ exports.oldApply = exports.newApply = exports.key = exports.getDecorations = exports.createPlugin = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _rafSchd = _interopRequireDefault(require("raf-schd"));
10
11
  var _steps = require("@atlaskit/adf-schema/steps");
11
12
  var _analytics = require("@atlaskit/editor-common/analytics");
@@ -26,8 +27,12 @@ var _decorationsDropTarget = require("./decorations-drop-target");
26
27
  var _handleMouseOver = require("./handle-mouse-over");
27
28
  var _keymap = require("./keymap");
28
29
  var _activeAnchorTracker = require("./utils/active-anchor-tracker");
30
+ var _analytics2 = require("./utils/analytics");
29
31
  var _anchorUtils = require("./utils/anchor-utils");
32
+ var _selection = require("./utils/selection");
30
33
  var _transactions = require("./utils/transactions");
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
+ 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; }
31
36
  var key = exports.key = new _state.PluginKey('blockControls');
32
37
  var EDITOR_BLOCKS_DRAG_INIT = 'Editor Blocks Drag Initialization Time';
33
38
  var isHTMLElement = function isHTMLElement(element) {
@@ -78,7 +83,8 @@ var destroyFn = function destroyFn(api, editorView) {
78
83
  }
79
84
  api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.execute(function (_ref3) {
80
85
  var tr = _ref3.tr;
81
- if ((0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true)) {
86
+ var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true);
87
+ if (isMultiSelect) {
82
88
  var _api$blockControls, _api$selection;
83
89
  var _ref4 = (api === null || api === void 0 || (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : _api$blockControls.sharedState.currentState()) || {},
84
90
  multiSelectDnD = _ref4.multiSelectDnD;
@@ -99,6 +105,13 @@ var destroyFn = function destroyFn(api, editorView) {
99
105
  // if no drop targets are rendered, assume that drop is invalid
100
106
  if (location.current.dropTargets.length === 0) {
101
107
  var _api$analytics2;
108
+ var nodeTypes, hasSelectedMultipleNodes;
109
+ if (isMultiSelect && api) {
110
+ var position = (0, _selection.getSelectedSlicePosition)(start, tr, api);
111
+ var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, position.from, position.to);
112
+ nodeTypes = attributes.nodeTypes;
113
+ hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
114
+ }
102
115
  var resolvedMovingNode = tr.doc.resolve(start);
103
116
  var maybeNode = resolvedMovingNode.nodeAfter;
104
117
  api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || _api$analytics2.actions.attachAnalyticsEvent({
@@ -106,10 +119,13 @@ var destroyFn = function destroyFn(api, editorView) {
106
119
  action: _analytics.ACTION.CANCELLED,
107
120
  actionSubject: _analytics.ACTION_SUBJECT.DRAG,
108
121
  actionSubjectId: _analytics.ACTION_SUBJECT_ID.ELEMENT_DRAG_HANDLE,
109
- attributes: {
122
+ attributes: _objectSpread({
110
123
  nodeDepth: resolvedMovingNode.depth,
111
124
  nodeType: (maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.type.name) || ''
112
- }
125
+ }, isMultiSelect && {
126
+ nodeTypes: nodeTypes,
127
+ hasSelectedMultipleNodes: hasSelectedMultipleNodes
128
+ })
113
129
  })(tr);
114
130
  }
115
131
  return tr.setMeta(key, {
@@ -134,6 +150,10 @@ var initialState = {
134
150
  isPMDragging: false,
135
151
  multiSelectDnD: undefined
136
152
  };
153
+ var getDecorations = exports.getDecorations = function getDecorations(state) {
154
+ var _key$getState;
155
+ return (_key$getState = key.getState(state)) === null || _key$getState === void 0 ? void 0 : _key$getState.decorations;
156
+ };
137
157
  var newApply = exports.newApply = function newApply(api, formatMessage, tr, currentState, newState, flags, nodeViewPortalProviderAPI, anchorRectCache) {
138
158
  var _meta$activeNode, _activeNode, _activeNode2, _meta$activeNode$hand, _meta$isDragging, _meta$isDragging2, _meta$editorHeight, _meta$editorWidthLeft, _meta$editorWidthRigh, _meta$isPMDragging, _meta$multiSelectDnD;
139
159
  var activeNode = currentState.activeNode,
@@ -469,12 +489,12 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
469
489
  },
470
490
  props: {
471
491
  decorations: function decorations(state) {
472
- var _api$editorDisabled, _key$getState;
492
+ var _api$editorDisabled, _key$getState2;
473
493
  var isDisabled = api === null || api === void 0 || (_api$editorDisabled = api.editorDisabled) === null || _api$editorDisabled === void 0 || (_api$editorDisabled = _api$editorDisabled.sharedState.currentState()) === null || _api$editorDisabled === void 0 ? void 0 : _api$editorDisabled.editorDisabled;
474
494
  if (isDisabled) {
475
495
  return;
476
496
  }
477
- return (_key$getState = key.getState(state)) === null || _key$getState === void 0 ? void 0 : _key$getState.decorations;
497
+ return (_key$getState2 = key.getState(state)) === null || _key$getState2 === void 0 ? void 0 : _key$getState2.decorations;
478
498
  },
479
499
  handleDOMEvents: {
480
500
  drop: function drop(view, event) {
@@ -547,10 +567,10 @@ var createPlugin = exports.createPlugin = function createPlugin(api, getIntl, no
547
567
  }));
548
568
  },
549
569
  dragend: function dragend(view) {
550
- var _key$getState2;
570
+ var _key$getState3;
551
571
  var state = view.state,
552
572
  dispatch = view.dispatch;
553
- if ((_key$getState2 = key.getState(state)) !== null && _key$getState2 !== void 0 && _key$getState2.isPMDragging) {
573
+ if ((_key$getState3 = key.getState(state)) !== null && _key$getState3 !== void 0 && _key$getState3.isPMDragging) {
554
574
  dispatch(state.tr.setMeta(key, {
555
575
  isPMDragging: false
556
576
  }));
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getMultiSelectAnalyticsAttributes = exports.fireInsertLayoutAnalytics = exports.attachMoveNodeAnalytics = void 0;
8
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _analytics = require("@atlaskit/editor-common/analytics");
10
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
+ var attachMoveNodeAnalytics = exports.attachMoveNodeAnalytics = function attachMoveNodeAnalytics(tr, inputMethod, fromDepth, fromNodeType, toDepth, toNodeType, isSameParent, api, fromNodeTypes, hasSelectedMultipleNodes) {
12
+ var _api$analytics;
13
+ return api === null || api === void 0 || (_api$analytics = api.analytics) === null || _api$analytics === void 0 || (_api$analytics = _api$analytics.actions) === null || _api$analytics === void 0 ? void 0 : _api$analytics.attachAnalyticsEvent({
14
+ eventType: _analytics.EVENT_TYPE.TRACK,
15
+ action: _analytics.ACTION.MOVED,
16
+ actionSubject: _analytics.ACTION_SUBJECT.ELEMENT,
17
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.ELEMENT_DRAG_HANDLE,
18
+ attributes: {
19
+ nodeDepth: fromDepth,
20
+ nodeType: fromNodeType,
21
+ nodeTypes: fromNodeTypes,
22
+ hasSelectedMultipleNodes: hasSelectedMultipleNodes,
23
+ destinationNodeDepth: toDepth,
24
+ destinationNodeType: toNodeType,
25
+ isSameParent: isSameParent,
26
+ inputMethod: inputMethod
27
+ }
28
+ })(tr);
29
+ };
30
+ var fireInsertLayoutAnalytics = exports.fireInsertLayoutAnalytics = function fireInsertLayoutAnalytics(tr, api, nodeTypes, hasSelectedMultipleNodes) {
31
+ var _api$analytics2;
32
+ api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 || (_api$analytics2 = _api$analytics2.actions) === null || _api$analytics2 === void 0 || _api$analytics2.attachAnalyticsEvent({
33
+ action: _analytics.ACTION.INSERTED,
34
+ actionSubject: _analytics.ACTION_SUBJECT.DOCUMENT,
35
+ actionSubjectId: _analytics.ACTION_SUBJECT_ID.LAYOUT,
36
+ attributes: {
37
+ inputMethod: _analytics.INPUT_METHOD.DRAG_AND_DROP,
38
+ nodeTypes: nodeTypes,
39
+ hasSelectedMultipleNodes: hasSelectedMultipleNodes
40
+ },
41
+ eventType: _analytics.EVENT_TYPE.TRACK
42
+ })(tr);
43
+ };
44
+
45
+ /**
46
+ * Given a range, return distinctive types of node and whether there are multiple nodes in the range
47
+ */
48
+ var getMultiSelectAnalyticsAttributes = exports.getMultiSelectAnalyticsAttributes = function getMultiSelectAnalyticsAttributes(tr, anchor, head) {
49
+ var nodeTypes = [];
50
+ var from = Math.min(anchor, head);
51
+ var to = Math.max(anchor, head);
52
+ tr.doc.nodesBetween(from, to, function (node, pos) {
53
+ if (pos < from) {
54
+ // ignore parent node
55
+ return true;
56
+ }
57
+ nodeTypes.push(node.type.name);
58
+
59
+ // only care about the top level (relatively in the range) nodes
60
+ return false;
61
+ });
62
+ return {
63
+ nodeTypes: (0, _platformFeatureFlags.fg)('platform_editor_track_node_types') ? (0, _toConsumableArray2.default)(new Set(nodeTypes)).sort().join(',') : undefined,
64
+ hasSelectedMultipleNodes: nodeTypes.length > 1
65
+ };
66
+ };
@@ -3,10 +3,10 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.getMultiSelectionIfPosInside = void 0;
6
+ exports.getSelectedSlicePosition = exports.getMultiSelectionIfPosInside = void 0;
7
7
  var getMultiSelectionIfPosInside = exports.getMultiSelectionIfPosInside = function getMultiSelectionIfPosInside(api, pos) {
8
8
  var _api$blockControls;
9
- var _ref = (api === null || api === void 0 || (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : _api$blockControls.sharedState.currentState()) || {},
9
+ var _ref = ((_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : _api$blockControls.sharedState.currentState()) || {},
10
10
  multiSelectDnD = _ref.multiSelectDnD;
11
11
  if (multiSelectDnD && multiSelectDnD.anchor >= 0 && multiSelectDnD.head >= 0) {
12
12
  var multiFrom = Math.min(multiSelectDnD.anchor, multiSelectDnD.head);
@@ -19,4 +19,24 @@ var getMultiSelectionIfPosInside = exports.getMultiSelectionIfPosInside = functi
19
19
  } : {};
20
20
  }
21
21
  return {};
22
+ };
23
+
24
+ /**
25
+ *
26
+ * @returns from and to positions of the selected content (after expansion)
27
+ */
28
+ var getSelectedSlicePosition = exports.getSelectedSlicePosition = function getSelectedSlicePosition(handlePos, tr, api) {
29
+ var _activeNode$nodeSize;
30
+ var _getMultiSelectionIfP = getMultiSelectionIfPosInside(api, handlePos),
31
+ anchor = _getMultiSelectionIfP.anchor,
32
+ head = _getMultiSelectionIfP.head;
33
+ var inSelection = anchor !== undefined && head !== undefined;
34
+ var from = inSelection ? Math.min(anchor, head) : handlePos;
35
+ var activeNode = tr.doc.nodeAt(handlePos);
36
+ var activeNodeEndPos = handlePos + ((_activeNode$nodeSize = activeNode === null || activeNode === void 0 ? void 0 : activeNode.nodeSize) !== null && _activeNode$nodeSize !== void 0 ? _activeNode$nodeSize : 1);
37
+ var to = inSelection ? Math.max(anchor, head) : activeNodeEndPos;
38
+ return {
39
+ from: from,
40
+ to: to
41
+ };
22
42
  };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.DragHandle = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
11
  var _react = require("react");
11
12
  var _react2 = require("@emotion/react");
@@ -25,18 +26,17 @@ var _primitives = require("@atlaskit/primitives");
25
26
  var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
26
27
  var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
27
28
  var _main = require("../pm-plugins/main");
29
+ var _analytics2 = require("../pm-plugins/utils/analytics");
28
30
  var _dragHandlePositions = require("../pm-plugins/utils/drag-handle-positions");
29
31
  var _getNestedNodePosition = require("../pm-plugins/utils/getNestedNodePosition");
30
32
  var _getSelection = require("../pm-plugins/utils/getSelection");
31
33
  var _consts = require("./consts");
32
34
  var _dragPreview = require("./drag-preview");
33
- /**
35
+ 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; }
36
+ 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; } /**
34
37
  * @jsxRuntime classic
35
38
  * @jsx jsx
36
- */
37
-
38
- // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
39
-
39
+ */ // eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
40
40
  var iconWrapperStyles = (0, _primitives.xcss)({
41
41
  display: 'flex',
42
42
  justifyContent: 'center',
@@ -263,7 +263,11 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
263
263
  var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true, {
264
264
  exposure: true
265
265
  });
266
+ var nodeTypes, hasSelectedMultipleNodes;
267
+ var resolvedMovingNode = tr.doc.resolve(start);
268
+ var maybeNode = resolvedMovingNode.nodeAfter;
266
269
  if (isMultiSelect) {
270
+ var _tr$getMeta;
267
271
  var handlePos = getPos();
268
272
  if (typeof handlePos !== 'number') {
269
273
  return tr;
@@ -274,22 +278,32 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
274
278
  tr: tr
275
279
  });
276
280
  }
281
+ var multiSelectDnD = (_tr$getMeta = tr.getMeta(_main.key)) === null || _tr$getMeta === void 0 ? void 0 : _tr$getMeta.multiSelectDnD;
282
+ if (multiSelectDnD) {
283
+ var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, multiSelectDnD.anchor, multiSelectDnD.head);
284
+ nodeTypes = attributes.nodeTypes;
285
+ hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
286
+ } else {
287
+ nodeTypes = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.type.name;
288
+ hasSelectedMultipleNodes = false;
289
+ }
277
290
  }
278
291
  api === null || api === void 0 || (_api$blockControls2 = api.blockControls) === null || _api$blockControls2 === void 0 || _api$blockControls2.commands.setNodeDragged(getPos, anchorName, nodeType)({
279
292
  tr: tr
280
293
  });
281
- var resolvedMovingNode = tr.doc.resolve(start);
282
- var maybeNode = resolvedMovingNode.nodeAfter;
283
294
  tr.setMeta('scrollIntoView', false);
284
295
  api === null || api === void 0 || (_api$analytics3 = api.analytics) === null || _api$analytics3 === void 0 || _api$analytics3.actions.attachAnalyticsEvent({
285
296
  eventType: _analytics.EVENT_TYPE.UI,
286
297
  action: _analytics.ACTION.DRAGGED,
287
298
  actionSubject: _analytics.ACTION_SUBJECT.ELEMENT,
288
299
  actionSubjectId: _analytics.ACTION_SUBJECT_ID.ELEMENT_DRAG_HANDLE,
289
- attributes: {
300
+ attributes: _objectSpread({
290
301
  nodeDepth: resolvedMovingNode.depth,
291
302
  nodeType: (maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.type.name) || ''
292
- }
303
+ }, isMultiSelect && {
304
+ nodeTypes: nodeTypes,
305
+ hasSelectedMultipleNodes: hasSelectedMultipleNodes
306
+ })
293
307
  })(tr);
294
308
  return tr;
295
309
  });
@@ -389,7 +403,21 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
389
403
  }
390
404
  setDragHandleSelected((0, _getSelection.isHandleInSelection)(view.state, selection, start));
391
405
  }, [start, selection, view.state]);
392
- var helpDescriptors = [{
406
+ var helpDescriptors = isTopLevelNode && (0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_accessibility') ? [{
407
+ description: formatMessage(_messages.blockControlsMessages.dragToMove)
408
+ }, {
409
+ description: formatMessage(_messages.blockControlsMessages.moveUp),
410
+ keymap: _keymaps.dragToMoveUp
411
+ }, {
412
+ description: formatMessage(_messages.blockControlsMessages.moveDown),
413
+ keymap: _keymaps.dragToMoveDown
414
+ }, {
415
+ description: formatMessage(_messages.blockControlsMessages.moveLeft),
416
+ keymap: _keymaps.dragToMoveLeft
417
+ }, {
418
+ description: formatMessage(_messages.blockControlsMessages.moveRight),
419
+ keymap: _keymaps.dragToMoveRight
420
+ }] : [{
393
421
  description: formatMessage(_messages.blockControlsMessages.dragToMove)
394
422
  }, {
395
423
  description: formatMessage(_messages.blockControlsMessages.moveUp),
@@ -11,12 +11,13 @@ import { findTable, isInTable, isTableSelected } from '@atlaskit/editor-tables/u
11
11
  import { fg } from '@atlaskit/platform-feature-flags';
12
12
  import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
13
13
  import { key } from '../pm-plugins/main';
14
+ import { attachMoveNodeAnalytics, getMultiSelectAnalyticsAttributes } from '../pm-plugins/utils/analytics';
14
15
  import { DIRECTION } from '../pm-plugins/utils/consts';
15
- import { attachMoveNodeAnalytics } from '../pm-plugins/utils/fire-analytics';
16
16
  import { getNestedNodePosition } from '../pm-plugins/utils/getNestedNodePosition';
17
17
  import { selectNode, setCursorPositionAtMovedNode } from '../pm-plugins/utils/getSelection';
18
18
  import { removeFromSource } from '../pm-plugins/utils/remove-from-source';
19
- import { getMultiSelectionIfPosInside } from '../pm-plugins/utils/selection';
19
+ import { getSelectedSlicePosition } from '../pm-plugins/utils/selection';
20
+ import { getInsertLayoutStep, updateSelection } from '../pm-plugins/utils/update-selection';
20
21
  import { canMoveNodeToIndex, isInsideTable, transformSliceExpandToNestedExpand } from '../pm-plugins/utils/validation';
21
22
 
22
23
  /**
@@ -50,7 +51,7 @@ const isDragLayoutColumnToTopLevel = ($from, $to) => {
50
51
  *
51
52
  * @returns the start position of a node if the node can be moved, otherwise -1
52
53
  */
53
- const getCurrentNodePos = (state, isParentNodeOfTypeLayout) => {
54
+ const getCurrentNodePos = state => {
54
55
  var _activeNode$handleOpt;
55
56
  const {
56
57
  selection
@@ -91,28 +92,47 @@ export const moveNodeViaShortcut = (api, direction, formatMessage) => {
91
92
  if (shouldEnableNestedDndA11y) {
92
93
  isParentNodeOfTypeLayout = !!findParentNodeOfType([state.schema.nodes.layoutSection])(state.selection);
93
94
  }
94
- const currentNodePos = getCurrentNodePos(state, isParentNodeOfTypeLayout);
95
+ const currentNodePos = getCurrentNodePos(state);
95
96
  if (currentNodePos > -1) {
96
97
  var _state$doc$nodeAt;
97
98
  const $pos = state.doc.resolve(currentNodePos);
99
+ const isTopLevelNode = $pos.depth === 0;
98
100
  let moveToPos = -1;
99
101
  const nodeIndex = $pos.index();
100
102
  const isLayoutColumnSelected = selection instanceof NodeSelection && selection.node.type.name === 'layoutColumn';
101
103
  if (direction === DIRECTION.LEFT && shouldEnableNestedDndA11y) {
102
- if (isLayoutColumnSelected && fg('platform_editor_advanced_layouts_accessibility')) {
103
- var _$pos$nodeBefore, _api$core;
104
- moveToPos = selection.from - (((_$pos$nodeBefore = $pos.nodeBefore) === null || _$pos$nodeBefore === void 0 ? void 0 : _$pos$nodeBefore.nodeSize) || 1);
104
+ if (isTopLevelNode && editorExperiment('advanced_layouts', true) && fg('platform_editor_advanced_layouts_accessibility')) {
105
+ var _api$core, _api$core2;
106
+ const nodeBefore = $pos.nodeBefore;
107
+ if (nodeBefore) {
108
+ moveToPos = currentNodePos - nodeBefore.nodeSize;
109
+ }
110
+ if (moveToPos < 0) {
111
+ return false;
112
+ }
105
113
  api === null || api === void 0 ? void 0 : (_api$core = api.core) === null || _api$core === void 0 ? void 0 : _api$core.actions.execute(({
106
114
  tr
107
115
  }) => {
108
116
  var _api$blockControls, _api$blockControls$co;
109
117
  api === null || api === void 0 ? void 0 : (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 ? void 0 : (_api$blockControls$co = _api$blockControls.commands) === null || _api$blockControls$co === void 0 ? void 0 : _api$blockControls$co.moveToLayout(currentNodePos, moveToPos, {
110
- selectMovedNode: true
118
+ moveToEnd: true,
119
+ moveNodeAtCursorPos: true
111
120
  })({
112
121
  tr
113
122
  });
123
+ const insertColumnStep = getInsertLayoutStep(tr);
124
+ const mappedTo = insertColumnStep === null || insertColumnStep === void 0 ? void 0 : insertColumnStep.from;
125
+ updateSelection(tr, mappedTo, true);
114
126
  return tr;
115
127
  });
128
+ api === null || api === void 0 ? void 0 : (_api$core2 = api.core) === null || _api$core2 === void 0 ? void 0 : _api$core2.actions.focus();
129
+ return true;
130
+ } else if (isLayoutColumnSelected && fg('platform_editor_advanced_layouts_accessibility')) {
131
+ var _$pos$nodeBefore, _api$core3, _api$blockControls2, _api$blockControls2$c;
132
+ moveToPos = selection.from - (((_$pos$nodeBefore = $pos.nodeBefore) === null || _$pos$nodeBefore === void 0 ? void 0 : _$pos$nodeBefore.nodeSize) || 1);
133
+ api === null || api === void 0 ? void 0 : (_api$core3 = api.core) === null || _api$core3 === void 0 ? void 0 : _api$core3.actions.execute(api === null || api === void 0 ? void 0 : (_api$blockControls2 = api.blockControls) === null || _api$blockControls2 === void 0 ? void 0 : (_api$blockControls2$c = _api$blockControls2.commands) === null || _api$blockControls2$c === void 0 ? void 0 : _api$blockControls2$c.moveToLayout(currentNodePos, moveToPos, {
134
+ selectMovedNode: true
135
+ }));
116
136
  return true;
117
137
  } else {
118
138
  if ($pos.depth < 2 || !isParentNodeOfTypeLayout) {
@@ -126,8 +146,31 @@ export const moveNodeViaShortcut = (api, direction, formatMessage) => {
126
146
  moveToPos = $pos.start() - ((previousNode === null || previousNode === void 0 ? void 0 : previousNode.nodeSize) || 1);
127
147
  }
128
148
  } else if (direction === DIRECTION.RIGHT && shouldEnableNestedDndA11y) {
129
- if (isLayoutColumnSelected && fg('platform_editor_advanced_layouts_accessibility')) {
130
- var _api$core2;
149
+ if (isTopLevelNode && editorExperiment('advanced_layouts', true) && fg('platform_editor_advanced_layouts_accessibility')) {
150
+ var _api$core4, _api$core5;
151
+ const endOfDoc = $pos.end();
152
+ moveToPos = $pos.posAtIndex($pos.index() + 1);
153
+ if (moveToPos >= endOfDoc) {
154
+ return false;
155
+ }
156
+ api === null || api === void 0 ? void 0 : (_api$core4 = api.core) === null || _api$core4 === void 0 ? void 0 : _api$core4.actions.execute(({
157
+ tr
158
+ }) => {
159
+ var _api$blockControls3, _api$blockControls3$c;
160
+ api === null || api === void 0 ? void 0 : (_api$blockControls3 = api.blockControls) === null || _api$blockControls3 === void 0 ? void 0 : (_api$blockControls3$c = _api$blockControls3.commands) === null || _api$blockControls3$c === void 0 ? void 0 : _api$blockControls3$c.moveToLayout(currentNodePos, moveToPos, {
161
+ moveNodeAtCursorPos: true
162
+ })({
163
+ tr
164
+ });
165
+ const insertColumnStep = getInsertLayoutStep(tr);
166
+ const mappedTo = insertColumnStep === null || insertColumnStep === void 0 ? void 0 : insertColumnStep.from;
167
+ updateSelection(tr, mappedTo);
168
+ return tr;
169
+ });
170
+ api === null || api === void 0 ? void 0 : (_api$core5 = api.core) === null || _api$core5 === void 0 ? void 0 : _api$core5.actions.focus();
171
+ return true;
172
+ } else if (isLayoutColumnSelected && fg('platform_editor_advanced_layouts_accessibility')) {
173
+ var _api$core6, _api$blockControls4, _api$blockControls4$c;
131
174
  const index = $pos.index($pos.depth);
132
175
  const parent = $pos.node($pos.depth);
133
176
  // get the next layoutColumn node
@@ -140,18 +183,10 @@ export const moveNodeViaShortcut = (api, direction, formatMessage) => {
140
183
  }
141
184
  const moveToEnd = index === parent.childCount - 2;
142
185
  moveToPos = moveToEnd ? $pos.before() : selection.to + ((nextNode === null || nextNode === void 0 ? void 0 : nextNode.nodeSize) || 1);
143
- api === null || api === void 0 ? void 0 : (_api$core2 = api.core) === null || _api$core2 === void 0 ? void 0 : _api$core2.actions.execute(({
144
- tr
145
- }) => {
146
- var _api$blockControls2, _api$blockControls2$c;
147
- api === null || api === void 0 ? void 0 : (_api$blockControls2 = api.blockControls) === null || _api$blockControls2 === void 0 ? void 0 : (_api$blockControls2$c = _api$blockControls2.commands) === null || _api$blockControls2$c === void 0 ? void 0 : _api$blockControls2$c.moveToLayout(currentNodePos, moveToPos, {
148
- moveToEnd,
149
- selectMovedNode: true
150
- })({
151
- tr
152
- });
153
- return tr;
154
- });
186
+ api === null || api === void 0 ? void 0 : (_api$core6 = api.core) === null || _api$core6 === void 0 ? void 0 : _api$core6.actions.execute(api === null || api === void 0 ? void 0 : (_api$blockControls4 = api.blockControls) === null || _api$blockControls4 === void 0 ? void 0 : (_api$blockControls4$c = _api$blockControls4.commands) === null || _api$blockControls4$c === void 0 ? void 0 : _api$blockControls4$c.moveToLayout(currentNodePos, moveToPos, {
187
+ moveToEnd,
188
+ selectMovedNode: true
189
+ }));
155
190
  return true;
156
191
  } else {
157
192
  if ($pos.depth < 2 || !isParentNodeOfTypeLayout) {
@@ -189,8 +224,8 @@ export const moveNodeViaShortcut = (api, direction, formatMessage) => {
189
224
  // only move the node if the destination is at the same depth, not support moving a nested node to a parent node
190
225
  const shouldMoveNode = (shouldEnableNestedDndA11y ? moveToPos > -1 && $pos.depth === state.doc.resolve(moveToPos).depth || nodeType === 'layoutColumn' : moveToPos > -1) || nodeType === 'layoutColumn' && fg('platform_editor_advanced_layouts_accessibility');
191
226
  if (shouldMoveNode) {
192
- var _api$core3;
193
- api === null || api === void 0 ? void 0 : (_api$core3 = api.core) === null || _api$core3 === void 0 ? void 0 : _api$core3.actions.execute(({
227
+ var _api$core7;
228
+ api === null || api === void 0 ? void 0 : (_api$core7 = api.core) === null || _api$core7 === void 0 ? void 0 : _api$core7.actions.execute(({
194
229
  tr
195
230
  }) => {
196
231
  moveNode(api)(currentNodePos, moveToPos, INPUT_METHOD.SHORTCUT, formatMessage)({
@@ -201,9 +236,9 @@ export const moveNodeViaShortcut = (api, direction, formatMessage) => {
201
236
  });
202
237
  return true;
203
238
  } else if (nodeType) {
204
- var _api$core4;
239
+ var _api$core8;
205
240
  // If the node is first/last one, only select the node
206
- api === null || api === void 0 ? void 0 : (_api$core4 = api.core) === null || _api$core4 === void 0 ? void 0 : _api$core4.actions.execute(({
241
+ api === null || api === void 0 ? void 0 : (_api$core8 = api.core) === null || _api$core8 === void 0 ? void 0 : _api$core8.actions.execute(({
207
242
  tr
208
243
  }) => {
209
244
  selectNode(tr, currentNodePos, nodeType);
@@ -228,23 +263,21 @@ export const moveNode = api => (start, to, inputMethod = INPUT_METHOD.DRAG_AND_D
228
263
  }
229
264
  let sliceFrom = start;
230
265
  let sliceTo;
266
+ let mappedTo;
267
+ let sourceNodeTypes, hasSelectedMultipleNodes;
231
268
  const isMultiSelect = editorExperiment('platform_editor_element_drag_and_drop_multiselect', true, {
232
269
  exposure: true
233
270
  });
234
271
  if (isMultiSelect) {
235
- var _handleNode$nodeSize;
236
- const {
237
- anchor,
238
- head
239
- } = getMultiSelectionIfPosInside(api, start);
240
- const inSelection = anchor !== undefined && head !== undefined;
241
- sliceFrom = inSelection ? Math.min(anchor, head) : start;
242
- const handleSize = (_handleNode$nodeSize = handleNode === null || handleNode === void 0 ? void 0 : handleNode.nodeSize) !== null && _handleNode$nodeSize !== void 0 ? _handleNode$nodeSize : 1;
243
- const handleEnd = sliceFrom + handleSize;
244
- sliceTo = inSelection ? Math.max(anchor, head) : handleEnd;
272
+ const slicePosition = getSelectedSlicePosition(start, tr, api);
273
+ sliceFrom = slicePosition.from;
274
+ sliceTo = slicePosition.to;
275
+ const attributes = getMultiSelectAnalyticsAttributes(tr, sliceFrom, sliceTo);
276
+ hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
277
+ sourceNodeTypes = attributes.nodeTypes;
245
278
  } else {
246
- var _handleNode$nodeSize2;
247
- const size = (_handleNode$nodeSize2 = handleNode === null || handleNode === void 0 ? void 0 : handleNode.nodeSize) !== null && _handleNode$nodeSize2 !== void 0 ? _handleNode$nodeSize2 : 1;
279
+ var _handleNode$nodeSize;
280
+ const size = (_handleNode$nodeSize = handleNode === null || handleNode === void 0 ? void 0 : handleNode.nodeSize) !== null && _handleNode$nodeSize !== void 0 ? _handleNode$nodeSize : 1;
248
281
  sliceTo = sliceFrom + size;
249
282
  }
250
283
  const {
@@ -253,7 +286,6 @@ export const moveNode = api => (start, to, inputMethod = INPUT_METHOD.DRAG_AND_D
253
286
  } = tr.doc.type.schema.nodes;
254
287
  const $to = tr.doc.resolve(to);
255
288
  const $handlePos = tr.doc.resolve(start);
256
- let mappedTo;
257
289
  if (editorExperiment('nested-dnd', true)) {
258
290
  const nodeCopy = tr.doc.slice(sliceFrom, sliceTo, false); // cut the content
259
291
  const destType = $to.node().type;
@@ -309,7 +341,7 @@ export const moveNode = api => (start, to, inputMethod = INPUT_METHOD.DRAG_AND_D
309
341
  }
310
342
  }
311
343
  if (editorExperiment('advanced_layouts', true)) {
312
- attachMoveNodeAnalytics(tr, inputMethod, $handlePos.depth, handleNode.type.name, $mappedTo === null || $mappedTo === void 0 ? void 0 : $mappedTo.depth, $mappedTo === null || $mappedTo === void 0 ? void 0 : $mappedTo.parent.type.name, $handlePos.sameParent($mappedTo), api);
344
+ attachMoveNodeAnalytics(tr, inputMethod, $handlePos.depth, handleNode.type.name, $mappedTo === null || $mappedTo === void 0 ? void 0 : $mappedTo.depth, $mappedTo === null || $mappedTo === void 0 ? void 0 : $mappedTo.parent.type.name, $handlePos.sameParent($mappedTo), api, sourceNodeTypes, hasSelectedMultipleNodes);
313
345
  } else {
314
346
  var _api$analytics;
315
347
  api === null || api === void 0 ? void 0 : (_api$analytics = api.analytics) === null || _api$analytics === void 0 ? void 0 : _api$analytics.actions.attachAnalyticsEvent({
@@ -324,6 +356,10 @@ export const moveNode = api => (start, to, inputMethod = INPUT_METHOD.DRAG_AND_D
324
356
  destinationNodeType: $mappedTo === null || $mappedTo === void 0 ? void 0 : $mappedTo.parent.type.name,
325
357
  ...(fg('platform_editor_element_drag_and_drop_ed_23873') && {
326
358
  inputMethod
359
+ }),
360
+ ...(isMultiSelect && {
361
+ sourceNodeTypes,
362
+ hasSelectedMultipleNodes
327
363
  })
328
364
  }
329
365
  })(tr);