@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.
@@ -310,7 +310,10 @@ const isHitEmojis = (board, element, point) => {
310
310
 
311
311
  function getTopicRectangleByNode(board, node) {
312
312
  let nodeRectangle = getRectangleByNode(node);
313
- return getTopicRectangleByElement(board, nodeRectangle, node.origin);
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.editTopic();
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 = (keyboardEvent) => {
3434
- if (!PlaitBoard.getMovingPoint(board)) {
3435
- return;
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 (isExpandHotkey(keyboardEvent)) {
3438
- const selectedMindElements = getSelectedElements(board).filter(element => MindElement.isMindElement(board, element));
3439
- if (selectedMindElements.length === 1 &&
3440
- !PlaitMind.isMind(selectedMindElements[0]) &&
3441
- selectedMindElements[0].children &&
3442
- selectedMindElements[0].children.length > 0) {
3443
- const element = selectedMindElements[0];
3444
- Transforms.setNode(board, { isCollapsed: element.isCollapsed ? false : true }, PlaitBoard.findPath(board, element));
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(keyboardEvent);
3517
+ keydown(event);
3449
3518
  };
3450
3519
  return board;
3451
3520
  };
3452
- const isExpandHotkey = (keyboardEvent) => {
3453
- return isKeyHotkey('mod+/', keyboardEvent);
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);