@plait/mind 0.12.2 → 0.13.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.
- package/esm2020/node.component.mjs +1 -2
- package/esm2020/plugins/with-mind-hotkey.mjs +101 -16
- package/esm2020/plugins/with-mind.mjs +3 -91
- package/esm2020/utils/mind.mjs +1 -2
- package/esm2020/utils/node/common.mjs +2 -2
- package/esm2020/utils/position/topic.mjs +5 -2
- package/fesm2015/plait-mind.mjs +96 -104
- package/fesm2015/plait-mind.mjs.map +1 -1
- package/fesm2020/plait-mind.mjs +96 -104
- package/fesm2020/plait-mind.mjs.map +1 -1
- package/package.json +1 -1
- package/plugins/with-mind-hotkey.d.ts +4 -1
- package/styles/styles.scss +32 -30
package/fesm2020/plait-mind.mjs
CHANGED
|
@@ -310,7 +310,10 @@ const isHitEmojis = (board, element, point) => {
|
|
|
310
310
|
|
|
311
311
|
function getTopicRectangleByNode(board, node) {
|
|
312
312
|
let nodeRectangle = getRectangleByNode(node);
|
|
313
|
-
|
|
313
|
+
const result = getTopicRectangleByElement(board, nodeRectangle, node.origin);
|
|
314
|
+
// add buffer width to avoid unexpected text breaks in different scene
|
|
315
|
+
result.width = result.width + 4;
|
|
316
|
+
return result;
|
|
314
317
|
}
|
|
315
318
|
function getTopicRectangleByElement(board, nodeRectangle, element) {
|
|
316
319
|
const x = nodeRectangle.x + NodeSpace.getTextLeftSpace(board, element);
|
|
@@ -324,7 +327,7 @@ const NODE_MIN_WIDTH = 18;
|
|
|
324
327
|
|
|
325
328
|
function editTopic(element) {
|
|
326
329
|
const component = PlaitElement.getComponent(element);
|
|
327
|
-
component
|
|
330
|
+
component?.editTopic();
|
|
328
331
|
}
|
|
329
332
|
|
|
330
333
|
const TOPIC_COLOR = '#333';
|
|
@@ -476,7 +479,6 @@ const extractNodesText = (node) => {
|
|
|
476
479
|
}
|
|
477
480
|
return str;
|
|
478
481
|
};
|
|
479
|
-
// layoutLevel 用来表示插入兄弟节点还是子节点
|
|
480
482
|
const insertMindElement = (board, inheritNode, path) => {
|
|
481
483
|
const newNode = {};
|
|
482
484
|
if (!inheritNode.isRoot) {
|
|
@@ -2647,7 +2649,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
|
|
|
2647
2649
|
const plugins = this.board.getMindOptions().textPlugins;
|
|
2648
2650
|
this.textManage = new TextManage(this.board, this.viewContainerRef, () => {
|
|
2649
2651
|
const rect = getTopicRectangleByNode(this.board, this.node);
|
|
2650
|
-
rect.width = rect.width + WIDTH_BUFFER;
|
|
2651
2652
|
return rect;
|
|
2652
2653
|
}, (point) => {
|
|
2653
2654
|
return isHitMindElement(this.board, point, this.element);
|
|
@@ -3430,27 +3431,104 @@ const withCreateMind = (board) => {
|
|
|
3430
3431
|
|
|
3431
3432
|
const withMindHotkey = (board) => {
|
|
3432
3433
|
const { keydown } = board;
|
|
3433
|
-
board.keydown = (
|
|
3434
|
-
|
|
3435
|
-
|
|
3434
|
+
board.keydown = (event) => {
|
|
3435
|
+
const selectedElements = getSelectedElements(board);
|
|
3436
|
+
const isSingleSelection = selectedElements.length === 1;
|
|
3437
|
+
const isSingleMindElement = selectedElements.length === 1 && MindElement.isMindElement(board, selectedElements[0]);
|
|
3438
|
+
const targetElement = selectedElements[0];
|
|
3439
|
+
if (isExpandHotkey(event) && isSingleMindElement && !PlaitMind.isMind(targetElement)) {
|
|
3440
|
+
if (targetElement.children && targetElement.children.length > 0) {
|
|
3441
|
+
Transforms.setNode(board, { isCollapsed: targetElement.isCollapsed ? false : true }, PlaitBoard.findPath(board, targetElement));
|
|
3442
|
+
return;
|
|
3443
|
+
}
|
|
3436
3444
|
}
|
|
3437
|
-
if (
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
|
|
3441
|
-
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3445
|
+
if (!PlaitBoard.isReadonly(board)) {
|
|
3446
|
+
if (isTabHotkey(event) && isSingleMindElement) {
|
|
3447
|
+
event.preventDefault();
|
|
3448
|
+
removeSelectedElement(board, targetElement);
|
|
3449
|
+
const targetElementPath = PlaitBoard.findPath(board, targetElement);
|
|
3450
|
+
if (targetElement.isCollapsed) {
|
|
3451
|
+
const newElement = { isCollapsed: false };
|
|
3452
|
+
PlaitHistoryBoard.withoutSaving(board, () => {
|
|
3453
|
+
Transforms.setNode(board, newElement, targetElementPath);
|
|
3454
|
+
});
|
|
3455
|
+
}
|
|
3456
|
+
insertMindElement(board, targetElement, findNewChildNodePath(board, targetElement));
|
|
3457
|
+
return;
|
|
3458
|
+
}
|
|
3459
|
+
if (isEnterHotkey(event) &&
|
|
3460
|
+
isSingleMindElement &&
|
|
3461
|
+
!PlaitMind.isMind(targetElement) &&
|
|
3462
|
+
!AbstractNode.isAbstract(targetElement)) {
|
|
3463
|
+
const targetElementPath = PlaitBoard.findPath(board, targetElement);
|
|
3464
|
+
if (isInRightBranchOfStandardLayout(targetElement)) {
|
|
3465
|
+
const refs = insertElementHandleRightNodeCount(board, targetElementPath.slice(0, 1), 1);
|
|
3466
|
+
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3467
|
+
}
|
|
3468
|
+
const abstractRefs = insertElementHandleAbstract(board, Path.next(targetElementPath));
|
|
3469
|
+
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
3470
|
+
insertMindElement(board, targetElement, findNewSiblingNodePath(board, targetElement));
|
|
3471
|
+
return;
|
|
3472
|
+
}
|
|
3473
|
+
if (selectedElements.length > 0 && (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event))) {
|
|
3474
|
+
event.preventDefault();
|
|
3475
|
+
const targetMindElements = selectedElements.filter(el => MindElement.isMindElement(board, el));
|
|
3476
|
+
const firstLevelElements = getFirstLevelElement(targetMindElements);
|
|
3477
|
+
const deletableElements = firstLevelElements.reverse();
|
|
3478
|
+
const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
|
|
3479
|
+
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
3480
|
+
const refs = deleteElementsHandleRightNodeCount(board, targetMindElements);
|
|
3481
|
+
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3482
|
+
MindTransforms.removeElements(board, targetMindElements);
|
|
3483
|
+
let activeElement;
|
|
3484
|
+
if (AbstractNode.isAbstract(firstLevelElements[0])) {
|
|
3485
|
+
const parent = MindElement.getParent(firstLevelElements[0]);
|
|
3486
|
+
activeElement = parent.children[firstLevelElements[0].start];
|
|
3487
|
+
}
|
|
3488
|
+
const firstElement = firstLevelElements[0];
|
|
3489
|
+
const firstElementParent = MindElement.findParent(firstElement);
|
|
3490
|
+
const hasSameParent = firstLevelElements.every(element => {
|
|
3491
|
+
return MindElement.findParent(element) === firstElementParent;
|
|
3492
|
+
});
|
|
3493
|
+
if (firstElementParent && hasSameParent && !activeElement) {
|
|
3494
|
+
const firstElementIndex = firstElementParent.children.indexOf(firstElement);
|
|
3495
|
+
const childrenCount = firstElementParent.children.length;
|
|
3496
|
+
// active parent element
|
|
3497
|
+
if (childrenCount === firstLevelElements.length) {
|
|
3498
|
+
activeElement = firstElementParent;
|
|
3499
|
+
}
|
|
3500
|
+
else {
|
|
3501
|
+
if (firstElementIndex > 0) {
|
|
3502
|
+
activeElement = firstElementParent.children[firstElementIndex - 1];
|
|
3503
|
+
}
|
|
3504
|
+
}
|
|
3505
|
+
}
|
|
3506
|
+
if (activeElement) {
|
|
3507
|
+
addSelectedElement(board, activeElement);
|
|
3508
|
+
}
|
|
3509
|
+
return;
|
|
3510
|
+
}
|
|
3511
|
+
if (!isVirtualKey(event) && !isSpaceHotkey(event) && isSingleSelection) {
|
|
3512
|
+
event.preventDefault();
|
|
3513
|
+
editTopic(targetElement);
|
|
3445
3514
|
return;
|
|
3446
3515
|
}
|
|
3447
3516
|
}
|
|
3448
|
-
keydown(
|
|
3517
|
+
keydown(event);
|
|
3449
3518
|
};
|
|
3450
3519
|
return board;
|
|
3451
3520
|
};
|
|
3452
|
-
const isExpandHotkey = (
|
|
3453
|
-
return isKeyHotkey('mod+/',
|
|
3521
|
+
const isExpandHotkey = (event) => {
|
|
3522
|
+
return isKeyHotkey('mod+/', event);
|
|
3523
|
+
};
|
|
3524
|
+
const isTabHotkey = (event) => {
|
|
3525
|
+
return event.key === 'Tab';
|
|
3526
|
+
};
|
|
3527
|
+
const isEnterHotkey = (event) => {
|
|
3528
|
+
return event.key === 'Enter';
|
|
3529
|
+
};
|
|
3530
|
+
const isSpaceHotkey = (event) => {
|
|
3531
|
+
return event.code === 'Space';
|
|
3454
3532
|
};
|
|
3455
3533
|
|
|
3456
3534
|
const withNodeHover = (board) => {
|
|
@@ -3566,92 +3644,6 @@ const withMind = (board) => {
|
|
|
3566
3644
|
}
|
|
3567
3645
|
return isMovable(element);
|
|
3568
3646
|
};
|
|
3569
|
-
board.keydown = (event) => {
|
|
3570
|
-
if (PlaitBoard.isReadonly(board)) {
|
|
3571
|
-
keydown(event);
|
|
3572
|
-
return;
|
|
3573
|
-
}
|
|
3574
|
-
const selectedElements = getSelectedElements(board);
|
|
3575
|
-
if (selectedElements.length) {
|
|
3576
|
-
if (selectedElements.length === 1 &&
|
|
3577
|
-
(event.key === 'Tab' ||
|
|
3578
|
-
(event.key === 'Enter' && !selectedElements[0].isRoot && !AbstractNode.isAbstract(selectedElements[0])))) {
|
|
3579
|
-
event.preventDefault();
|
|
3580
|
-
const selectedElement = selectedElements[0];
|
|
3581
|
-
removeSelectedElement(board, selectedElement);
|
|
3582
|
-
const selectedElementPath = PlaitBoard.findPath(board, selectedElement);
|
|
3583
|
-
if (event.key === 'Tab') {
|
|
3584
|
-
if (selectedElement.isCollapsed) {
|
|
3585
|
-
const newElement = { isCollapsed: false };
|
|
3586
|
-
PlaitHistoryBoard.withoutSaving(board, () => {
|
|
3587
|
-
Transforms.setNode(board, newElement, selectedElementPath);
|
|
3588
|
-
});
|
|
3589
|
-
}
|
|
3590
|
-
insertMindElement(board, selectedElement, findNewChildNodePath(board, selectedElement));
|
|
3591
|
-
}
|
|
3592
|
-
else {
|
|
3593
|
-
if (isInRightBranchOfStandardLayout(selectedElement)) {
|
|
3594
|
-
const refs = insertElementHandleRightNodeCount(board, selectedElementPath.slice(0, 1), 1);
|
|
3595
|
-
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3596
|
-
}
|
|
3597
|
-
const abstractRefs = insertElementHandleAbstract(board, Path.next(selectedElementPath));
|
|
3598
|
-
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
3599
|
-
insertMindElement(board, selectedElement, findNewSiblingNodePath(board, selectedElement));
|
|
3600
|
-
}
|
|
3601
|
-
return;
|
|
3602
|
-
}
|
|
3603
|
-
if (hotkeys.isDeleteBackward(event) || hotkeys.isDeleteForward(event)) {
|
|
3604
|
-
event.preventDefault();
|
|
3605
|
-
const deletableElements = getFirstLevelElement(selectedElements).reverse();
|
|
3606
|
-
const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
|
|
3607
|
-
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
3608
|
-
const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
|
|
3609
|
-
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3610
|
-
MindTransforms.removeElements(board, selectedElements);
|
|
3611
|
-
let activeElement;
|
|
3612
|
-
const firstLevelElements = getFirstLevelElement(selectedElements);
|
|
3613
|
-
if (AbstractNode.isAbstract(firstLevelElements[0])) {
|
|
3614
|
-
const parent = MindElement.getParent(firstLevelElements[0]);
|
|
3615
|
-
activeElement = parent.children[firstLevelElements[0].start];
|
|
3616
|
-
}
|
|
3617
|
-
const firstElement = firstLevelElements[0];
|
|
3618
|
-
const firstElementParent = MindElement.findParent(firstElement);
|
|
3619
|
-
const hasSameParent = firstLevelElements.every(element => {
|
|
3620
|
-
return MindElement.findParent(element) === firstElementParent;
|
|
3621
|
-
});
|
|
3622
|
-
if (firstElementParent && hasSameParent && !activeElement) {
|
|
3623
|
-
const firstElementIndex = firstElementParent.children.indexOf(firstElement);
|
|
3624
|
-
const childrenCount = firstElementParent.children.length;
|
|
3625
|
-
// active parent element
|
|
3626
|
-
if (childrenCount === firstLevelElements.length) {
|
|
3627
|
-
activeElement = firstElementParent;
|
|
3628
|
-
}
|
|
3629
|
-
else {
|
|
3630
|
-
if (firstElementIndex > 0) {
|
|
3631
|
-
activeElement = firstElementParent.children[firstElementIndex - 1];
|
|
3632
|
-
}
|
|
3633
|
-
}
|
|
3634
|
-
}
|
|
3635
|
-
if (activeElement) {
|
|
3636
|
-
addSelectedElement(board, activeElement);
|
|
3637
|
-
}
|
|
3638
|
-
return;
|
|
3639
|
-
}
|
|
3640
|
-
// auto enter edit status
|
|
3641
|
-
if (!isVirtualKey(event)) {
|
|
3642
|
-
event.preventDefault();
|
|
3643
|
-
const selectedElement = selectedElements[0];
|
|
3644
|
-
editTopic(selectedElement);
|
|
3645
|
-
return;
|
|
3646
|
-
}
|
|
3647
|
-
}
|
|
3648
|
-
if (board.selection && event.code === 'Space') {
|
|
3649
|
-
if (selectedElements?.length) {
|
|
3650
|
-
return;
|
|
3651
|
-
}
|
|
3652
|
-
}
|
|
3653
|
-
keydown(event);
|
|
3654
|
-
};
|
|
3655
3647
|
board.dblclick = (event) => {
|
|
3656
3648
|
if (PlaitBoard.isReadonly(board)) {
|
|
3657
3649
|
dblclick(event);
|