@atlaskit/editor-plugin-block-controls 2.27.1 → 2.27.5
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.
- package/CHANGELOG.md +38 -0
- package/dist/cjs/blockControlsPlugin.js +35 -6
- package/dist/cjs/pm-plugins/decorations-drop-target.js +1 -1
- package/dist/cjs/pm-plugins/main.js +2 -1
- package/dist/cjs/pm-plugins/utils/validation.js +6 -1
- package/dist/cjs/ui/block-menu-items.js +103 -0
- package/dist/cjs/ui/block-menu.js +77 -0
- package/dist/cjs/ui/consts.js +101 -2
- package/dist/cjs/ui/drag-handle.js +146 -40
- package/dist/cjs/ui/drag-preview.js +83 -34
- package/dist/es2019/blockControlsPlugin.js +34 -3
- package/dist/es2019/pm-plugins/decorations-drop-target.js +1 -1
- package/dist/es2019/pm-plugins/main.js +2 -1
- package/dist/es2019/pm-plugins/utils/validation.js +6 -1
- package/dist/es2019/ui/block-menu-items.js +92 -0
- package/dist/es2019/ui/block-menu.js +75 -0
- package/dist/es2019/ui/consts.js +100 -1
- package/dist/es2019/ui/drag-handle.js +150 -38
- package/dist/es2019/ui/drag-preview.js +83 -34
- package/dist/esm/blockControlsPlugin.js +35 -6
- package/dist/esm/pm-plugins/decorations-drop-target.js +1 -1
- package/dist/esm/pm-plugins/main.js +2 -1
- package/dist/esm/pm-plugins/utils/validation.js +6 -1
- package/dist/esm/ui/block-menu-items.js +92 -0
- package/dist/esm/ui/block-menu.js +70 -0
- package/dist/esm/ui/consts.js +100 -1
- package/dist/esm/ui/drag-handle.js +147 -41
- package/dist/esm/ui/drag-preview.js +82 -34
- package/dist/types/blockControlsPluginType.d.ts +3 -0
- package/dist/types/pm-plugins/utils/getSelection.d.ts +2 -2
- package/dist/types/pm-plugins/utils/validation.d.ts +1 -1
- package/dist/types/ui/block-menu-items.d.ts +17 -0
- package/dist/types/ui/block-menu.d.ts +16 -0
- package/dist/types/ui/consts.d.ts +7 -0
- package/dist/types/ui/drag-preview.d.ts +9 -1
- package/dist/types-ts4.5/blockControlsPluginType.d.ts +3 -0
- package/dist/types-ts4.5/pm-plugins/utils/getSelection.d.ts +2 -2
- package/dist/types-ts4.5/pm-plugins/utils/validation.d.ts +1 -1
- package/dist/types-ts4.5/ui/block-menu-items.d.ts +17 -0
- package/dist/types-ts4.5/ui/block-menu.d.ts +16 -0
- package/dist/types-ts4.5/ui/consts.d.ts +7 -0
- package/dist/types-ts4.5/ui/drag-preview.d.ts +9 -1
- package/package.json +9 -9
|
@@ -18,6 +18,7 @@ var _keymaps = require("@atlaskit/editor-common/keymaps");
|
|
|
18
18
|
var _messages = require("@atlaskit/editor-common/messages");
|
|
19
19
|
var _useSharedPluginStateSelector = require("@atlaskit/editor-common/use-shared-plugin-state-selector");
|
|
20
20
|
var _state = require("@atlaskit/editor-prosemirror/state");
|
|
21
|
+
var _utils = require("@atlaskit/editor-prosemirror/utils");
|
|
21
22
|
var _dragHandler = _interopRequireDefault(require("@atlaskit/icon/glyph/drag-handler"));
|
|
22
23
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
23
24
|
var _adapter = require("@atlaskit/pragmatic-drag-and-drop/element/adapter");
|
|
@@ -28,7 +29,6 @@ var _tooltip = _interopRequireDefault(require("@atlaskit/tooltip"));
|
|
|
28
29
|
var _main = require("../pm-plugins/main");
|
|
29
30
|
var _analytics2 = require("../pm-plugins/utils/analytics");
|
|
30
31
|
var _dragHandlePositions = require("../pm-plugins/utils/drag-handle-positions");
|
|
31
|
-
var _getNestedNodePosition = require("../pm-plugins/utils/getNestedNodePosition");
|
|
32
32
|
var _getSelection = require("../pm-plugins/utils/getSelection");
|
|
33
33
|
var _consts = require("./consts");
|
|
34
34
|
var _dragPreview = require("./drag-preview");
|
|
@@ -106,6 +106,16 @@ var handleIconDragStart = function handleIconDragStart(e) {
|
|
|
106
106
|
(_e$target$closest = e.target.closest('button')) === null || _e$target$closest === void 0 || _e$target$closest.dispatchEvent(dragEvent);
|
|
107
107
|
}
|
|
108
108
|
};
|
|
109
|
+
var getNodeSpacingForPreview = function getNodeSpacingForPreview(node) {
|
|
110
|
+
if (!node) {
|
|
111
|
+
return _consts.spacingBetweenNodesForPreview['default'];
|
|
112
|
+
}
|
|
113
|
+
var nodeTypeName = node.type.name;
|
|
114
|
+
if (nodeTypeName === 'heading') {
|
|
115
|
+
return _consts.spacingBetweenNodesForPreview["heading".concat(node.attrs.level)] || _consts.spacingBetweenNodesForPreview['default'];
|
|
116
|
+
}
|
|
117
|
+
return _consts.spacingBetweenNodesForPreview[nodeTypeName] || _consts.spacingBetweenNodesForPreview['default'];
|
|
118
|
+
};
|
|
109
119
|
var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
110
120
|
var _api$core2, _api$analytics2, _api$core4;
|
|
111
121
|
var view = _ref.view,
|
|
@@ -131,6 +141,9 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
131
141
|
featureFlagsState = _useSharedPluginState.featureFlagsState;
|
|
132
142
|
var selection = (0, _useSharedPluginStateSelector.useSharedPluginStateSelector)(api, 'selection.selection');
|
|
133
143
|
var isLayoutColumn = nodeType === 'layoutColumn';
|
|
144
|
+
var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true, {
|
|
145
|
+
exposure: true
|
|
146
|
+
});
|
|
134
147
|
(0, _react.useEffect)(function () {
|
|
135
148
|
// blockCard/datasource width is rendered correctly after this decoraton does. We need to observe for changes.
|
|
136
149
|
if (nodeType === 'blockCard') {
|
|
@@ -175,7 +188,14 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
175
188
|
return tr;
|
|
176
189
|
});
|
|
177
190
|
view.focus();
|
|
178
|
-
|
|
191
|
+
if ((0, _experiments.editorExperiment)('platform_editor_controls', 'variant1')) {
|
|
192
|
+
var startPos = getPos();
|
|
193
|
+
if (startPos === undefined) {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
api === null || api === void 0 || api.core.actions.execute(api.blockControls.commands.toggleBlockMenu());
|
|
197
|
+
}
|
|
198
|
+
}, [dragHandleSelected, api === null || api === void 0 || (_api$core2 = api.core) === null || _api$core2 === void 0 ? void 0 : _api$core2.actions, api === null || api === void 0 || (_api$analytics2 = api.analytics) === null || _api$analytics2 === void 0 ? void 0 : _api$analytics2.actions, api === null || api === void 0 ? void 0 : api.blockControls.commands, view, getPos, nodeType]);
|
|
179
199
|
|
|
180
200
|
// TODO - This needs to be investigated further. Drag preview generation is not always working
|
|
181
201
|
// as expected with a node selection. This workaround sets the selection to the node on mouseDown,
|
|
@@ -239,56 +259,140 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
239
259
|
};
|
|
240
260
|
},
|
|
241
261
|
onGenerateDragPreview: function onGenerateDragPreview(_ref4) {
|
|
262
|
+
var _api$blockControls2;
|
|
242
263
|
var nativeSetDragImage = _ref4.nativeSetDragImage;
|
|
264
|
+
if (isMultiSelect) {
|
|
265
|
+
var _api$core5;
|
|
266
|
+
api === null || api === void 0 || (_api$core5 = api.core) === null || _api$core5 === void 0 || _api$core5.actions.execute(function (_ref5) {
|
|
267
|
+
var tr = _ref5.tr;
|
|
268
|
+
var handlePos = getPos();
|
|
269
|
+
if (typeof handlePos !== 'number') {
|
|
270
|
+
return tr;
|
|
271
|
+
}
|
|
272
|
+
if (!tr.selection.empty && handlePos >= tr.selection.$from.start() - 1 && handlePos <= tr.selection.to) {
|
|
273
|
+
var _api$blockControls;
|
|
274
|
+
api === null || api === void 0 || (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 || _api$blockControls.commands.setMultiSelectPositions()({
|
|
275
|
+
tr: tr
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
return tr;
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
var startPos = getPos();
|
|
282
|
+
var state = view.state;
|
|
283
|
+
var doc = state.doc,
|
|
284
|
+
selection = state.selection;
|
|
285
|
+
var _ref6 = (api === null || api === void 0 || (_api$blockControls2 = api.blockControls) === null || _api$blockControls2 === void 0 ? void 0 : _api$blockControls2.sharedState.currentState()) || {},
|
|
286
|
+
multiSelectDnD = _ref6.multiSelectDnD;
|
|
287
|
+
var sliceFrom = selection.from;
|
|
288
|
+
var sliceTo = selection.to;
|
|
289
|
+
if (multiSelectDnD) {
|
|
290
|
+
var anchor = multiSelectDnD.anchor,
|
|
291
|
+
head = multiSelectDnD.head;
|
|
292
|
+
sliceFrom = Math.min(anchor, head);
|
|
293
|
+
sliceTo = Math.max(anchor, head);
|
|
294
|
+
}
|
|
295
|
+
var expandedSlice = doc.slice(sliceFrom, sliceTo);
|
|
296
|
+
var isDraggingMultiLine = isMultiSelect && startPos !== undefined && startPos >= sliceFrom && startPos <= sliceTo && expandedSlice.content.childCount > 1;
|
|
243
297
|
(0, _setCustomNativeDragPreview.setCustomNativeDragPreview)({
|
|
244
|
-
|
|
245
|
-
|
|
298
|
+
getOffset: function getOffset() {
|
|
299
|
+
if (!isDraggingMultiLine) {
|
|
300
|
+
return {
|
|
301
|
+
x: 0,
|
|
302
|
+
y: 0
|
|
303
|
+
};
|
|
304
|
+
} else {
|
|
305
|
+
// Calculate the offset of the preview container,
|
|
306
|
+
// So when drag multiple nodes, the preview align with the position of the selected nodes
|
|
307
|
+
var domAtPos = view.domAtPos.bind(view);
|
|
308
|
+
var domElementsHeightBeforeHandle = 0;
|
|
309
|
+
var nodesStartPos = [];
|
|
310
|
+
var nodesEndPos = [];
|
|
311
|
+
var activeNodeMarginTop = 0;
|
|
312
|
+
for (var i = 0; i < expandedSlice.content.childCount; i++) {
|
|
313
|
+
if (i === 0) {
|
|
314
|
+
var _expandedSlice$conten;
|
|
315
|
+
nodesStartPos[i] = sliceFrom;
|
|
316
|
+
nodesEndPos[i] = sliceFrom + (((_expandedSlice$conten = expandedSlice.content.maybeChild(i)) === null || _expandedSlice$conten === void 0 ? void 0 : _expandedSlice$conten.nodeSize) || 0);
|
|
317
|
+
} else {
|
|
318
|
+
var _expandedSlice$conten2;
|
|
319
|
+
nodesStartPos[i] = nodesEndPos[i - 1];
|
|
320
|
+
nodesEndPos[i] = nodesStartPos[i] + (((_expandedSlice$conten2 = expandedSlice.content.maybeChild(i)) === null || _expandedSlice$conten2 === void 0 ? void 0 : _expandedSlice$conten2.nodeSize) || 0);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// when the node is before the handle, calculate the height of the node
|
|
324
|
+
if (nodesEndPos[i] <= startPos) {
|
|
325
|
+
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
326
|
+
var currentNodeElement = (0, _utils.findDomRefAtPos)(nodesStartPos[i], domAtPos);
|
|
327
|
+
var maybeCurrentNode = expandedSlice.content.maybeChild(i);
|
|
328
|
+
var currentNodeSpacing = maybeCurrentNode ? _consts.nodeMargins[maybeCurrentNode.type.name].top + _consts.nodeMargins[maybeCurrentNode.type.name].bottom : 0;
|
|
329
|
+
domElementsHeightBeforeHandle = domElementsHeightBeforeHandle + currentNodeElement.offsetHeight + currentNodeSpacing;
|
|
330
|
+
} else {
|
|
331
|
+
// when the node is after the handle, calculate the top margin of the active node
|
|
332
|
+
var maybeNextNode = expandedSlice.content.maybeChild(i);
|
|
333
|
+
activeNodeMarginTop = maybeNextNode ? _consts.nodeMargins[maybeNextNode.type.name].top : 0;
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return {
|
|
338
|
+
x: 0,
|
|
339
|
+
y: domElementsHeightBeforeHandle + activeNodeMarginTop
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
render: function render(_ref7) {
|
|
344
|
+
var container = _ref7.container;
|
|
246
345
|
var dom = view.dom.querySelector("[data-drag-handler-anchor-name=\"".concat(anchorName, "\"]"));
|
|
247
346
|
if (!dom) {
|
|
248
347
|
return;
|
|
249
348
|
}
|
|
250
|
-
|
|
349
|
+
if (!isDraggingMultiLine) {
|
|
350
|
+
return (0, _dragPreview.dragPreview)(container, {
|
|
351
|
+
dom: dom,
|
|
352
|
+
nodeType: nodeType
|
|
353
|
+
});
|
|
354
|
+
} else {
|
|
355
|
+
var domAtPos = view.domAtPos.bind(view);
|
|
356
|
+
var previewContent = [];
|
|
357
|
+
expandedSlice.content.descendants(function (node, pos, parent, index) {
|
|
358
|
+
// Get the dom element of the node
|
|
359
|
+
//eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
360
|
+
var nodeDomElement = (0, _utils.findDomRefAtPos)(sliceFrom + pos, domAtPos);
|
|
361
|
+
var currentNodeSpacing = getNodeSpacingForPreview(node);
|
|
362
|
+
previewContent.push({
|
|
363
|
+
dom: nodeDomElement,
|
|
364
|
+
nodeType: node.type.name,
|
|
365
|
+
nodeSpacing: currentNodeSpacing
|
|
366
|
+
});
|
|
367
|
+
return false; // Only iterate through the first level of nodes
|
|
368
|
+
});
|
|
369
|
+
return (0, _dragPreview.dragPreview)(container, previewContent);
|
|
370
|
+
}
|
|
251
371
|
},
|
|
252
372
|
nativeSetDragImage: nativeSetDragImage
|
|
253
373
|
});
|
|
254
374
|
},
|
|
255
375
|
onDragStart: function onDragStart() {
|
|
256
|
-
var _api$
|
|
376
|
+
var _api$core6;
|
|
257
377
|
if (start === undefined) {
|
|
258
378
|
return;
|
|
259
379
|
}
|
|
260
|
-
api === null || api === void 0 || (_api$
|
|
261
|
-
var _api$
|
|
262
|
-
var tr =
|
|
263
|
-
var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true, {
|
|
264
|
-
exposure: true
|
|
265
|
-
});
|
|
380
|
+
api === null || api === void 0 || (_api$core6 = api.core) === null || _api$core6 === void 0 || _api$core6.actions.execute(function (_ref8) {
|
|
381
|
+
var _tr$getMeta, _api$blockControls3, _api$analytics3;
|
|
382
|
+
var tr = _ref8.tr;
|
|
266
383
|
var nodeTypes, hasSelectedMultipleNodes;
|
|
267
384
|
var resolvedMovingNode = tr.doc.resolve(start);
|
|
268
385
|
var maybeNode = resolvedMovingNode.nodeAfter;
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
var
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
api === null || api === void 0 || (_api$blockControls = api.blockControls) === null || _api$blockControls === void 0 || _api$blockControls.commands.setMultiSelectPositions()({
|
|
278
|
-
tr: tr
|
|
279
|
-
});
|
|
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
|
-
}
|
|
386
|
+
var multiSelectDnD = (_tr$getMeta = tr.getMeta(_main.key)) === null || _tr$getMeta === void 0 ? void 0 : _tr$getMeta.multiSelectDnD;
|
|
387
|
+
if (multiSelectDnD) {
|
|
388
|
+
var attributes = (0, _analytics2.getMultiSelectAnalyticsAttributes)(tr, multiSelectDnD.anchor, multiSelectDnD.head);
|
|
389
|
+
nodeTypes = attributes.nodeTypes;
|
|
390
|
+
hasSelectedMultipleNodes = attributes.hasSelectedMultipleNodes;
|
|
391
|
+
} else {
|
|
392
|
+
nodeTypes = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.type.name;
|
|
393
|
+
hasSelectedMultipleNodes = false;
|
|
290
394
|
}
|
|
291
|
-
api === null || api === void 0 || (_api$
|
|
395
|
+
api === null || api === void 0 || (_api$blockControls3 = api.blockControls) === null || _api$blockControls3 === void 0 || _api$blockControls3.commands.setNodeDragged(getPos, anchorName, nodeType)({
|
|
292
396
|
tr: tr
|
|
293
397
|
});
|
|
294
398
|
tr.setMeta('scrollIntoView', false);
|
|
@@ -310,7 +414,7 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
310
414
|
view.focus();
|
|
311
415
|
}
|
|
312
416
|
});
|
|
313
|
-
}, [anchorName, api, getPos, nodeType, start, view]);
|
|
417
|
+
}, [anchorName, api, getPos, isMultiSelect, nodeType, start, view]);
|
|
314
418
|
var macroInteractionUpdates = featureFlagsState === null || featureFlagsState === void 0 ? void 0 : featureFlagsState.macroInteractionUpdates;
|
|
315
419
|
var calculatePosition = (0, _react.useCallback)(function () {
|
|
316
420
|
var parentNodeType;
|
|
@@ -395,14 +499,11 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
395
499
|
}
|
|
396
500
|
}, [buttonRef, handleOptions === null || handleOptions === void 0 ? void 0 : handleOptions.isFocused, view]);
|
|
397
501
|
(0, _react.useEffect)(function () {
|
|
398
|
-
var isMultiSelect = (0, _experiments.editorExperiment)('platform_editor_element_drag_and_drop_multiselect', true, {
|
|
399
|
-
exposure: true
|
|
400
|
-
});
|
|
401
502
|
if (!isMultiSelect || typeof start !== 'number' || !selection) {
|
|
402
503
|
return;
|
|
403
504
|
}
|
|
404
505
|
setDragHandleSelected((0, _getSelection.isHandleCorrelatedToSelection)(view.state, selection, start));
|
|
405
|
-
}, [start, selection, view.state]);
|
|
506
|
+
}, [start, selection, view.state, isMultiSelect]);
|
|
406
507
|
var helpDescriptors = isTopLevelNode && (0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_accessibility') ? [{
|
|
407
508
|
description: formatMessage(_messages.blockControlsMessages.dragToMove)
|
|
408
509
|
}, {
|
|
@@ -428,7 +529,12 @@ var DragHandle = exports.DragHandle = function DragHandle(_ref) {
|
|
|
428
529
|
}];
|
|
429
530
|
var isParentNodeOfTypeLayout;
|
|
430
531
|
if (!isTopLevelNode && ((0, _platformFeatureFlags.fg)('platform_editor_advanced_layouts_accessibility') || handleOptions !== null && handleOptions !== void 0 && handleOptions.isFocused) && (0, _experiments.editorExperiment)('nested-dnd', true)) {
|
|
431
|
-
|
|
532
|
+
var pos = getPos();
|
|
533
|
+
if (typeof pos === 'number') {
|
|
534
|
+
var _$pos$parent;
|
|
535
|
+
var $pos = view.state.doc.resolve(pos);
|
|
536
|
+
isParentNodeOfTypeLayout = ($pos === null || $pos === void 0 || (_$pos$parent = $pos.parent) === null || _$pos$parent === void 0 ? void 0 : _$pos$parent.type.name) === 'layoutColumn';
|
|
537
|
+
}
|
|
432
538
|
if (isParentNodeOfTypeLayout) {
|
|
433
539
|
helpDescriptors = [].concat((0, _toConsumableArray2.default)(helpDescriptors), [{
|
|
434
540
|
description: formatMessage(_messages.blockControlsMessages.moveLeft),
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
Object.defineProperty(exports, "__esModule", {
|
|
4
5
|
value: true
|
|
5
6
|
});
|
|
6
7
|
exports.dragPreview = void 0;
|
|
8
|
+
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
7
9
|
var _browser = require("@atlaskit/editor-common/browser");
|
|
8
10
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
9
11
|
var _colors = require("@atlaskit/theme/colors");
|
|
@@ -21,14 +23,8 @@ var previewStyleOld = {
|
|
|
21
23
|
borderWidth: "var(--ds-border-width-outline, 2px)",
|
|
22
24
|
backgroundColor: "var(--ds-blanket-selected, #388BFF14)"
|
|
23
25
|
};
|
|
24
|
-
var
|
|
26
|
+
var getPreviewContainerDimensionsForSingle = function getPreviewContainerDimensionsForSingle(dom, nodeType) {
|
|
25
27
|
var nodeContainer = dom;
|
|
26
|
-
container.style.pointerEvents = 'none';
|
|
27
|
-
var parent = document.createElement('div');
|
|
28
|
-
// ProseMirror class is required to make sure the cloned dom is styled correctly
|
|
29
|
-
parent.classList.add('ProseMirror', 'block-ctrl-drag-preview');
|
|
30
|
-
var embedCard = dom.querySelector('.embedCardView-content-wrap');
|
|
31
|
-
var shouldBeGenericPreview = nodeType === 'embedCard' || nodeType === 'extension' || !!embedCard;
|
|
32
28
|
if ((0, _platformFeatureFlags.fg)('platform_editor_elements_drag_and_drop_ed_23189')) {
|
|
33
29
|
var iframeContainer = dom.querySelector('iframe');
|
|
34
30
|
if (nodeType === 'embedCard') {
|
|
@@ -36,41 +32,94 @@ var dragPreview = exports.dragPreview = function dragPreview(container, dom, nod
|
|
|
36
32
|
} else if (nodeType === 'extension' && iframeContainer) {
|
|
37
33
|
nodeContainer = iframeContainer;
|
|
38
34
|
}
|
|
39
|
-
shouldBeGenericPreview = nodeType === 'embedCard' || !!embedCard || nodeType === 'extension' && !!iframeContainer;
|
|
40
35
|
}
|
|
41
36
|
var nodeContainerRect = nodeContainer.getBoundingClientRect();
|
|
42
|
-
|
|
43
|
-
|
|
37
|
+
return {
|
|
38
|
+
width: nodeContainerRect.width,
|
|
39
|
+
height: nodeContainerRect.height
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
var getPreviewContainerDimensions = function getPreviewContainerDimensions(dragPreviewContent) {
|
|
43
|
+
var maxWidth = 0;
|
|
44
|
+
var heightSum = 0;
|
|
45
|
+
for (var index = 0; index < dragPreviewContent.length; index++) {
|
|
46
|
+
var element = dragPreviewContent[index];
|
|
47
|
+
var _getPreviewContainerD = getPreviewContainerDimensionsForSingle(element.dom, element.nodeType),
|
|
48
|
+
width = _getPreviewContainerD.width,
|
|
49
|
+
height = _getPreviewContainerD.height;
|
|
50
|
+
if (width > maxWidth) {
|
|
51
|
+
maxWidth = width;
|
|
52
|
+
}
|
|
53
|
+
heightSum += height;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
width: maxWidth,
|
|
57
|
+
height: heightSum
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
var createGenericPreview = function createGenericPreview() {
|
|
61
|
+
var generalPreview = document.createElement('div');
|
|
62
|
+
// ProseMirror class is required to make sure the cloned dom is styled correctly
|
|
63
|
+
generalPreview.classList.add('ProseMirror', 'block-ctrl-drag-preview');
|
|
44
64
|
var previewStyle = (0, _platformFeatureFlags.fg)('platform_editor_elements_drag_and_drop_ed_23189') ? previewStyleNew : previewStyleOld;
|
|
65
|
+
generalPreview.style.border = "".concat(previewStyle.borderWidth, " ").concat(previewStyle.borderStyle, " ").concat(previewStyle.borderColor);
|
|
66
|
+
generalPreview.style.borderRadius = previewStyle.borderRadius;
|
|
67
|
+
generalPreview.style.backgroundColor = previewStyle.backgroundColor;
|
|
68
|
+
generalPreview.style.height = '100%';
|
|
69
|
+
generalPreview.setAttribute('data-testid', 'block-ctrl-generic-drag-preview');
|
|
70
|
+
return generalPreview;
|
|
71
|
+
};
|
|
72
|
+
var createContentPreviewElement = function createContentPreviewElement(dom, nodeType, nodeSpacing) {
|
|
73
|
+
var contentPreviewOneElement = document.createElement('div');
|
|
74
|
+
contentPreviewOneElement.classList.add('ProseMirror', 'block-ctrl-drag-preview');
|
|
75
|
+
var resizer = dom.querySelector('.resizer-item');
|
|
76
|
+
var clonedDom = resizer && ['mediaSingle', 'table'].includes(nodeType) ?
|
|
77
|
+
// Ignored via go/ees005
|
|
78
|
+
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
79
|
+
resizer.cloneNode(true) :
|
|
80
|
+
// Ignored via go/ees005
|
|
81
|
+
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
82
|
+
dom.cloneNode(true);
|
|
83
|
+
clonedDom.style.marginLeft = '0';
|
|
84
|
+
clonedDom.style.marginTop = nodeSpacing ? "".concat(nodeSpacing.top) : '0';
|
|
85
|
+
clonedDom.style.marginRight = '0';
|
|
86
|
+
clonedDom.style.marginBottom = nodeSpacing ? "".concat(nodeSpacing.bottom) : '0';
|
|
87
|
+
clonedDom.style.boxShadow = 'none';
|
|
88
|
+
clonedDom.style.opacity = _browser.browser.windows ? '1' : (0, _platformFeatureFlags.fg)('platform_editor_elements_drag_and_drop_ed_23189') ? '0.31' : '0.4';
|
|
89
|
+
contentPreviewOneElement.appendChild(clonedDom);
|
|
90
|
+
return contentPreviewOneElement;
|
|
91
|
+
};
|
|
92
|
+
var isGenericPreview = function isGenericPreview(dom, nodeType) {
|
|
93
|
+
var embedCard = dom.querySelector('.embedCardView-content-wrap');
|
|
94
|
+
return (0, _platformFeatureFlags.fg)('platform_editor_elements_drag_and_drop_ed_23189') ? nodeType === 'embedCard' || !!embedCard || nodeType === 'extension' && !!dom.querySelector('iframe') : nodeType === 'embedCard' || !!embedCard || nodeType === 'extension';
|
|
95
|
+
};
|
|
96
|
+
var createPreviewForElement = function createPreviewForElement(dom, nodeType, nodeSpacing) {
|
|
97
|
+
var shouldBeGenericPreview = isGenericPreview(dom, nodeType);
|
|
45
98
|
if (shouldBeGenericPreview) {
|
|
46
|
-
|
|
47
|
-
parent.style.borderRadius = previewStyle.borderRadius;
|
|
48
|
-
parent.style.backgroundColor = previewStyle.backgroundColor;
|
|
49
|
-
parent.style.height = '100%';
|
|
50
|
-
parent.setAttribute('data-testid', 'block-ctrl-generic-drag-preview');
|
|
99
|
+
return createGenericPreview();
|
|
51
100
|
} else {
|
|
52
|
-
|
|
53
|
-
var clonedDom = resizer && ['mediaSingle', 'table'].includes(nodeType) ?
|
|
54
|
-
// Ignored via go/ees005
|
|
55
|
-
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
56
|
-
resizer.cloneNode(true) :
|
|
57
|
-
// Ignored via go/ees005
|
|
58
|
-
// eslint-disable-next-line @atlaskit/editor/no-as-casting
|
|
59
|
-
dom.cloneNode(true);
|
|
60
|
-
|
|
61
|
-
// Remove any margin from the cloned element to ensure is doesn't position incorrectly
|
|
62
|
-
clonedDom.style.marginLeft = '0';
|
|
63
|
-
clonedDom.style.marginTop = '0';
|
|
64
|
-
clonedDom.style.marginRight = '0';
|
|
65
|
-
clonedDom.style.marginBottom = '0';
|
|
66
|
-
clonedDom.style.boxShadow = 'none';
|
|
67
|
-
clonedDom.style.opacity = _browser.browser.windows ? '1' : (0, _platformFeatureFlags.fg)('platform_editor_elements_drag_and_drop_ed_23189') ? '0.31' : '0.4';
|
|
68
|
-
parent.appendChild(clonedDom);
|
|
101
|
+
return createContentPreviewElement(dom, nodeType, nodeSpacing);
|
|
69
102
|
}
|
|
70
|
-
|
|
103
|
+
};
|
|
104
|
+
var dragPreview = exports.dragPreview = function dragPreview(container, dragPreviewContent) {
|
|
105
|
+
container.style.pointerEvents = 'none';
|
|
106
|
+
if (!Array.isArray(dragPreviewContent) && (0, _typeof2.default)(dragPreviewContent) === 'object') {
|
|
107
|
+
dragPreviewContent = [dragPreviewContent];
|
|
108
|
+
}
|
|
109
|
+
var _getPreviewContainerD2 = getPreviewContainerDimensions(dragPreviewContent),
|
|
110
|
+
maxWidth = _getPreviewContainerD2.width,
|
|
111
|
+
maxHeight = _getPreviewContainerD2.height;
|
|
112
|
+
container.style.width = "".concat(maxWidth, "px");
|
|
113
|
+
container.style.height = "".concat(maxHeight, "px");
|
|
114
|
+
var previewWrapperFragment = document.createDocumentFragment();
|
|
115
|
+
for (var index = 0; index < dragPreviewContent.length; index++) {
|
|
116
|
+
var element = dragPreviewContent[index];
|
|
117
|
+
var contentPreviewOneElement = createPreviewForElement(element.dom, element.nodeType, element.nodeSpacing);
|
|
118
|
+
previewWrapperFragment.appendChild(contentPreviewOneElement);
|
|
119
|
+
}
|
|
120
|
+
container.appendChild(previewWrapperFragment);
|
|
71
121
|
var scrollParent = document.querySelector('.fabric-editor-popup-scroll-parent');
|
|
72
122
|
var scrollParentClassNames = scrollParent === null || scrollParent === void 0 ? void 0 : scrollParent.className;
|
|
73
|
-
|
|
74
123
|
// Add the scroll parent class to the container to ensure the cloned element is styled correctly
|
|
75
124
|
container.className = scrollParentClassNames || '';
|
|
76
125
|
container.classList.remove('fabric-editor-popup-scroll-parent');
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { expandSelectionBounds } from '@atlaskit/editor-common/selection';
|
|
3
3
|
import { TextSelection } from '@atlaskit/editor-prosemirror/state';
|
|
4
|
+
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
|
|
4
5
|
import { moveNode } from './editor-commands/move-node';
|
|
5
6
|
import { moveToLayout } from './editor-commands/move-to-layout';
|
|
6
7
|
import { createPlugin, key } from './pm-plugins/main';
|
|
8
|
+
import BlockMenu from './ui/block-menu';
|
|
7
9
|
import { DragHandleMenu } from './ui/drag-handle-menu';
|
|
8
10
|
import { GlobalStylesWrapper } from './ui/global-styles';
|
|
9
11
|
export const blockControlsPlugin = ({
|
|
@@ -33,7 +35,25 @@ export const blockControlsPlugin = ({
|
|
|
33
35
|
anchorName,
|
|
34
36
|
nodeType,
|
|
35
37
|
handleOptions
|
|
36
|
-
}
|
|
38
|
+
},
|
|
39
|
+
closeMenu: editorExperiment('platform_editor_controls', 'variant1') ? true : undefined
|
|
40
|
+
});
|
|
41
|
+
return tr;
|
|
42
|
+
},
|
|
43
|
+
toggleBlockMenu: options => ({
|
|
44
|
+
tr
|
|
45
|
+
}) => {
|
|
46
|
+
const currMeta = tr.getMeta(key);
|
|
47
|
+
if (options !== null && options !== void 0 && options.closeMenu) {
|
|
48
|
+
tr.setMeta(key, {
|
|
49
|
+
...currMeta,
|
|
50
|
+
closeMenu: true
|
|
51
|
+
});
|
|
52
|
+
return tr;
|
|
53
|
+
}
|
|
54
|
+
tr.setMeta(key, {
|
|
55
|
+
...currMeta,
|
|
56
|
+
toggleMenu: true
|
|
37
57
|
});
|
|
38
58
|
return tr;
|
|
39
59
|
},
|
|
@@ -108,8 +128,19 @@ export const blockControlsPlugin = ({
|
|
|
108
128
|
multiSelectDnD: (_key$getState$multiSe = (_key$getState5 = key.getState(editorState)) === null || _key$getState5 === void 0 ? void 0 : _key$getState5.multiSelectDnD) !== null && _key$getState$multiSe !== void 0 ? _key$getState$multiSe : undefined
|
|
109
129
|
};
|
|
110
130
|
},
|
|
111
|
-
contentComponent(
|
|
112
|
-
|
|
131
|
+
contentComponent({
|
|
132
|
+
editorView,
|
|
133
|
+
popupsMountPoint,
|
|
134
|
+
popupsBoundariesElement,
|
|
135
|
+
popupsScrollableElement
|
|
136
|
+
}) {
|
|
137
|
+
return /*#__PURE__*/React.createElement(React.Fragment, null, editorExperiment('platform_editor_controls', 'variant1') ? /*#__PURE__*/React.createElement(BlockMenu, {
|
|
138
|
+
editorView: editorView,
|
|
139
|
+
mountPoint: popupsMountPoint,
|
|
140
|
+
boundariesElement: popupsBoundariesElement,
|
|
141
|
+
scrollableElement: popupsScrollableElement,
|
|
142
|
+
api: api
|
|
143
|
+
}) : /*#__PURE__*/React.createElement(DragHandleMenu, {
|
|
113
144
|
api: api
|
|
114
145
|
}), /*#__PURE__*/React.createElement(GlobalStylesWrapper, null));
|
|
115
146
|
}
|
|
@@ -205,7 +205,7 @@ export const dropTargetDecorations = (newState, api, formatMessage, nodeViewPort
|
|
|
205
205
|
|
|
206
206
|
// when there is only one node in the slice, use the same logic as when multi select is not on
|
|
207
207
|
if (selectionSliceChildCount > 1 && handleInsideSelection) {
|
|
208
|
-
canDropMultipleNodes = canMoveSliceToIndex(selectionSlice, selectionFrom, parent, index, $pos);
|
|
208
|
+
canDropMultipleNodes = canMoveSliceToIndex(selectionSlice, selectionFrom, selectionTo, parent, index, $pos);
|
|
209
209
|
} else {
|
|
210
210
|
canDropSingleNode = !!(activePMNode && canMoveNodeToIndex(parent, index, activePMNode, $pos, node));
|
|
211
211
|
}
|
|
@@ -281,11 +281,12 @@ export const newApply = (api, formatMessage, tr, currentState, newState, flags,
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
const newActiveNode = isEmptyDoc || !(meta !== null && meta !== void 0 && meta.activeNode) && findHandleDec(decorations, latestActiveNode === null || latestActiveNode === void 0 ? void 0 : latestActiveNode.pos, latestActiveNode === null || latestActiveNode === void 0 ? void 0 : latestActiveNode.pos).length === 0 ? null : latestActiveNode;
|
|
284
|
+
const isMenuOpenNew = editorExperiment('platform_editor_controls', 'variant1') ? meta !== null && meta !== void 0 && meta.closeMenu ? false : meta !== null && meta !== void 0 && meta.toggleMenu ? !isMenuOpen : isMenuOpen : meta !== null && meta !== void 0 && meta.toggleMenu ? !isMenuOpen : isMenuOpen;
|
|
284
285
|
return {
|
|
285
286
|
decorations,
|
|
286
287
|
activeNode: newActiveNode,
|
|
287
288
|
isDragging: (_meta$isDragging2 = meta === null || meta === void 0 ? void 0 : meta.isDragging) !== null && _meta$isDragging2 !== void 0 ? _meta$isDragging2 : isDragging,
|
|
288
|
-
isMenuOpen:
|
|
289
|
+
isMenuOpen: isMenuOpenNew,
|
|
289
290
|
editorHeight: (_meta$editorHeight = meta === null || meta === void 0 ? void 0 : meta.editorHeight) !== null && _meta$editorHeight !== void 0 ? _meta$editorHeight : editorHeight,
|
|
290
291
|
editorWidthLeft: (_meta$editorWidthLeft = meta === null || meta === void 0 ? void 0 : meta.editorWidthLeft) !== null && _meta$editorWidthLeft !== void 0 ? _meta$editorWidthLeft : editorWidthLeft,
|
|
291
292
|
editorWidthRight: (_meta$editorWidthRigh = meta === null || meta === void 0 ? void 0 : meta.editorWidthRight) !== null && _meta$editorWidthRigh !== void 0 ? _meta$editorWidthRigh : editorWidthRight,
|
|
@@ -114,10 +114,15 @@ export function canMoveNodeToIndex(destParent, indexIntoParent, srcNode, $destNo
|
|
|
114
114
|
}
|
|
115
115
|
return destParent.canReplaceWith(indexIntoParent, indexIntoParent, srcNodeType);
|
|
116
116
|
}
|
|
117
|
-
export function canMoveSliceToIndex(slice, sliceFromPos, destParent, indexIntoParent, $destNodePos, destNode) {
|
|
117
|
+
export function canMoveSliceToIndex(slice, sliceFromPos, sliceToPos, destParent, indexIntoParent, $destNodePos, destNode) {
|
|
118
118
|
let canMoveNodes = true;
|
|
119
119
|
const doc = $destNodePos.doc;
|
|
120
120
|
const nodesPos = [];
|
|
121
|
+
|
|
122
|
+
// Drag multiple nodes to be inside themselves not allowed
|
|
123
|
+
if ($destNodePos.pos < sliceToPos && $destNodePos.pos >= sliceFromPos) {
|
|
124
|
+
return false;
|
|
125
|
+
}
|
|
121
126
|
for (let i = 0; i < slice.content.childCount; i++) {
|
|
122
127
|
const node = slice.content.maybeChild(i);
|
|
123
128
|
if (i === 0) {
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/* eslint-disable @atlaskit/design-system/prefer-primitives */
|
|
2
|
+
/**
|
|
3
|
+
* @jsxRuntime classic
|
|
4
|
+
* @jsx jsx
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
|
|
8
|
+
import { jsx } from '@emotion/react';
|
|
9
|
+
import { copy, deleteKey, dragToMoveDown, dragToMoveUp, tooltip } from '@atlaskit/editor-common/keymaps';
|
|
10
|
+
import commonMessages, { blockControlsMessages } from '@atlaskit/editor-common/messages';
|
|
11
|
+
import { shortcutStyle } from '@atlaskit/editor-shared-styles/shortcut';
|
|
12
|
+
import ArrowDownIcon from '@atlaskit/icon/core/arrow-down';
|
|
13
|
+
import ArrowUpIcon from '@atlaskit/icon/core/arrow-up';
|
|
14
|
+
import CopyIcon from '@atlaskit/icon/core/copy';
|
|
15
|
+
import DeleteIcon from '@atlaskit/icon/core/delete';
|
|
16
|
+
import { moveNodeViaShortcut } from '../editor-commands/move-node';
|
|
17
|
+
import { DIRECTION } from '../pm-plugins/utils/consts';
|
|
18
|
+
export const getBlockMenuItems = formatMessage => {
|
|
19
|
+
return [{
|
|
20
|
+
items: [{
|
|
21
|
+
content: formatMessage(blockControlsMessages.moveUp),
|
|
22
|
+
elemBefore: jsx(ArrowUpIcon, {
|
|
23
|
+
label: ""
|
|
24
|
+
}),
|
|
25
|
+
value: {
|
|
26
|
+
name: 'moveUp'
|
|
27
|
+
},
|
|
28
|
+
key: 'move_up',
|
|
29
|
+
// eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
30
|
+
elemAfter: jsx("div", {
|
|
31
|
+
css: shortcutStyle
|
|
32
|
+
}, tooltip(dragToMoveUp))
|
|
33
|
+
}, {
|
|
34
|
+
content: formatMessage(blockControlsMessages.moveDown),
|
|
35
|
+
elemBefore: jsx(ArrowDownIcon, {
|
|
36
|
+
label: ""
|
|
37
|
+
}),
|
|
38
|
+
value: {
|
|
39
|
+
name: 'moveDown'
|
|
40
|
+
},
|
|
41
|
+
key: 'move_down',
|
|
42
|
+
// eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
43
|
+
elemAfter: jsx("div", {
|
|
44
|
+
css: shortcutStyle
|
|
45
|
+
}, tooltip(dragToMoveDown))
|
|
46
|
+
}]
|
|
47
|
+
}, {
|
|
48
|
+
items: [{
|
|
49
|
+
content: formatMessage(commonMessages.copyToClipboard),
|
|
50
|
+
value: {
|
|
51
|
+
name: 'copy'
|
|
52
|
+
},
|
|
53
|
+
elemBefore: jsx(CopyIcon, {
|
|
54
|
+
label: ""
|
|
55
|
+
}),
|
|
56
|
+
key: 'copy',
|
|
57
|
+
// eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
58
|
+
elemAfter: jsx("div", {
|
|
59
|
+
css: shortcutStyle
|
|
60
|
+
}, tooltip(copy))
|
|
61
|
+
}, {
|
|
62
|
+
content: formatMessage(blockControlsMessages.delete),
|
|
63
|
+
value: {
|
|
64
|
+
name: 'delete'
|
|
65
|
+
},
|
|
66
|
+
elemBefore: jsx(DeleteIcon, {
|
|
67
|
+
label: ""
|
|
68
|
+
}),
|
|
69
|
+
key: 'delete',
|
|
70
|
+
// eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values
|
|
71
|
+
elemAfter: jsx("div", {
|
|
72
|
+
css: shortcutStyle
|
|
73
|
+
}, tooltip(deleteKey))
|
|
74
|
+
}]
|
|
75
|
+
}];
|
|
76
|
+
};
|
|
77
|
+
export const menuItemsCallback = {
|
|
78
|
+
moveUp: (api, formatMessage) => {
|
|
79
|
+
return moveNodeViaShortcut(api, DIRECTION.UP, formatMessage);
|
|
80
|
+
},
|
|
81
|
+
moveDown: (api, formatMessage) => {
|
|
82
|
+
return moveNodeViaShortcut(api, DIRECTION.DOWN, formatMessage);
|
|
83
|
+
},
|
|
84
|
+
copy: () => {
|
|
85
|
+
// TODO: implement copy
|
|
86
|
+
// console.log('copy');
|
|
87
|
+
},
|
|
88
|
+
delete: () => {
|
|
89
|
+
// TODO: implement delete
|
|
90
|
+
// console.log('delete');
|
|
91
|
+
}
|
|
92
|
+
};
|