@plait/mind 0.27.0-next.4 → 0.27.0-next.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/esm2022/interfaces/options.mjs +1 -1
- package/esm2022/mind-node.component.mjs +3 -3
- package/esm2022/plugins/with-mind-fragment.mjs +90 -0
- package/esm2022/plugins/with-mind-hotkey.mjs +13 -55
- package/esm2022/plugins/with-mind.mjs +6 -35
- package/esm2022/plugins/with-node-dnd.mjs +3 -3
- package/esm2022/transforms/index.mjs +2 -3
- package/esm2022/transforms/node.mjs +1 -17
- package/fesm2022/plait-mind.mjs +194 -199
- package/fesm2022/plait-mind.mjs.map +1 -1
- package/interfaces/options.d.ts +0 -2
- package/package.json +1 -1
- package/plugins/with-mind-fragment.d.ts +5 -0
- package/plugins/with-mind-hotkey.d.ts +0 -2
- package/transforms/index.d.ts +0 -1
- package/transforms/node.d.ts +0 -1
package/fesm2022/plait-mind.mjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { Component, ChangeDetectionStrategy, NgModule, NgZone, Directive, Input, HostListener } from '@angular/core';
|
|
3
3
|
import * as i2 from '@plait/core';
|
|
4
|
-
import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, getSelectedElements, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitBoard, Path, PlaitNode, PlaitContextService, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, setStrokeLinecap, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint,
|
|
4
|
+
import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, getSelectedElements, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitBoard, Path, PlaitNode, PlaitContextService, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, setStrokeLinecap, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CoreTransforms, BOARD_TO_HOST, BoardTransforms, throttleRAF, removeSelectedElement, PlaitHistoryBoard, hotkeys, setClipboardDataByMedia, getClipboardDataByMedia, ResizeCursorClass, preventTouchMove, PRESS_AND_MOVE_BUFFER, MERGING, setClipboardData, setClipboardDataByText, getDataFromClipboard } from '@plait/core';
|
|
5
5
|
import { MindLayoutType, isIndentedLayout, isHorizontalLayout, isHorizontalLogicLayout, ConnectingPosition, AbstractNode, isStandardLayout, isVerticalLogicLayout, getNonAbstractChildren, isLeftLayout, isRightLayout, isTopLayout, isBottomLayout, getCorrectStartEnd, getAbstractLayout, GlobalLayout } from '@plait/layouts';
|
|
6
6
|
import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
|
|
7
7
|
import { fromEvent, Subject } from 'rxjs';
|
|
8
|
-
import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isSpaceHotkey, MediaKeys, ResizeHandle, withResize, ActiveGenerator } from '@plait/common';
|
|
8
|
+
import { RESIZE_HANDLE_DIAMETER, getRectangleResizeHandleRefs, WithTextPluginKey, isDrawingMode, isDndMode, setCreationMode, BoardCreationMode, isExpandHotkey, isTabHotkey, isEnterHotkey, isVirtualKey, isDelete, isSpaceHotkey, MediaKeys, ResizeHandle, withResize, ActiveGenerator } from '@plait/common';
|
|
9
9
|
import { Node as Node$1, Path as Path$1 } from 'slate';
|
|
10
10
|
import { pointsOnBezierCurves } from 'points-on-curve';
|
|
11
11
|
import { take, filter } from 'rxjs/operators';
|
|
@@ -1107,21 +1107,6 @@ const setTopicSize = (board, element, width, height) => {
|
|
|
1107
1107
|
Transforms.setNode(board, newElement, path);
|
|
1108
1108
|
}
|
|
1109
1109
|
};
|
|
1110
|
-
const removeElements = (board, elements) => {
|
|
1111
|
-
const deletableElements = getFirstLevelElement(elements);
|
|
1112
|
-
deletableElements
|
|
1113
|
-
.map(element => {
|
|
1114
|
-
const path = PlaitBoard.findPath(board, element);
|
|
1115
|
-
const ref = board.pathRef(path);
|
|
1116
|
-
return () => {
|
|
1117
|
-
Transforms.removeNode(board, ref.current);
|
|
1118
|
-
ref.unref();
|
|
1119
|
-
};
|
|
1120
|
-
})
|
|
1121
|
-
.forEach(action => {
|
|
1122
|
-
action();
|
|
1123
|
-
});
|
|
1124
|
-
};
|
|
1125
1110
|
const insertNodes = (board, elements, path) => {
|
|
1126
1111
|
const pathRef = board.pathRef(path);
|
|
1127
1112
|
elements.forEach(element => {
|
|
@@ -1245,7 +1230,6 @@ const MindTransforms = {
|
|
|
1245
1230
|
insertAbstract,
|
|
1246
1231
|
setAbstractsByRefs,
|
|
1247
1232
|
setAbstractByStandardLayout,
|
|
1248
|
-
removeElements,
|
|
1249
1233
|
insertNodes,
|
|
1250
1234
|
insertAbstractNodes,
|
|
1251
1235
|
setRightNodeCountByRefs,
|
|
@@ -3063,7 +3047,7 @@ class MindNodeComponent extends PlaitPluginElementComponent {
|
|
|
3063
3047
|
this.activeDrawer = new NodeActiveDrawer(this.board);
|
|
3064
3048
|
this.collapseDrawer = new CollapseDrawer(this.board);
|
|
3065
3049
|
this.imageDrawer = new NodeImageDrawer(this.board, this.viewContainerRef);
|
|
3066
|
-
const plugins = this.board.getPluginOptions(
|
|
3050
|
+
const plugins = this.board.getPluginOptions(WithTextPluginKey).textPlugins;
|
|
3067
3051
|
this.textManage = new TextManage(this.board, this.viewContainerRef, {
|
|
3068
3052
|
getRectangle: () => {
|
|
3069
3053
|
const rect = getTopicRectangleByNode(this.board, this.node);
|
|
@@ -3432,7 +3416,7 @@ const withNodeDnd = (board) => {
|
|
|
3432
3416
|
refs = insertElementHandleRightNodeCount(board, targetElementPathRef.current.slice(0, 1), normalElements.length, refs);
|
|
3433
3417
|
}
|
|
3434
3418
|
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3435
|
-
|
|
3419
|
+
CoreTransforms.removeElements(board, firstLevelElements);
|
|
3436
3420
|
let insertPath = targetPathRef.current;
|
|
3437
3421
|
const parentPath = Path.parent(targetPathRef.current || targetPath);
|
|
3438
3422
|
if (!insertPath) {
|
|
@@ -3481,108 +3465,6 @@ const withNodeDnd = (board) => {
|
|
|
3481
3465
|
return board;
|
|
3482
3466
|
};
|
|
3483
3467
|
|
|
3484
|
-
const buildClipboardData = (board, selectedElements, startPoint) => {
|
|
3485
|
-
let result = [];
|
|
3486
|
-
// get overall abstract
|
|
3487
|
-
const overallAbstracts = getOverallAbstracts(board, selectedElements);
|
|
3488
|
-
// get valid abstract refs
|
|
3489
|
-
const validAbstractRefs = getValidAbstractRefs(board, [...selectedElements, ...overallAbstracts]);
|
|
3490
|
-
// keep correct order
|
|
3491
|
-
const newSelectedElements = selectedElements.filter(value => !validAbstractRefs.find(ref => ref.abstract === value));
|
|
3492
|
-
newSelectedElements.push(...validAbstractRefs.map(value => value.abstract));
|
|
3493
|
-
const selectedMindNodes = newSelectedElements.map(value => MindElement.getNode(value));
|
|
3494
|
-
newSelectedElements.forEach((element, index) => {
|
|
3495
|
-
// handle relative location
|
|
3496
|
-
const nodeRectangle = getRectangleByNode(selectedMindNodes[index]);
|
|
3497
|
-
const points = [[nodeRectangle.x - startPoint[0], nodeRectangle.y - startPoint[1]]];
|
|
3498
|
-
// handle invalid abstract
|
|
3499
|
-
const abstractRef = validAbstractRefs.find(ref => ref.abstract === element);
|
|
3500
|
-
if (AbstractNode.isAbstract(element) && abstractRef) {
|
|
3501
|
-
const { start, end } = getRelativeStartEndByAbstractRef(abstractRef, newSelectedElements);
|
|
3502
|
-
result.push({
|
|
3503
|
-
...element,
|
|
3504
|
-
points,
|
|
3505
|
-
start,
|
|
3506
|
-
end
|
|
3507
|
-
});
|
|
3508
|
-
}
|
|
3509
|
-
else {
|
|
3510
|
-
if (AbstractNode.isAbstract(element)) {
|
|
3511
|
-
let newElement = { ...element, points };
|
|
3512
|
-
delete newElement.start;
|
|
3513
|
-
delete newElement.end;
|
|
3514
|
-
result.push(newElement);
|
|
3515
|
-
}
|
|
3516
|
-
else {
|
|
3517
|
-
result.push({
|
|
3518
|
-
...element,
|
|
3519
|
-
points: points
|
|
3520
|
-
});
|
|
3521
|
-
}
|
|
3522
|
-
}
|
|
3523
|
-
});
|
|
3524
|
-
return result;
|
|
3525
|
-
};
|
|
3526
|
-
const setMindClipboardData = (data, elements) => {
|
|
3527
|
-
const text = elements.reduce((string, currentNode) => {
|
|
3528
|
-
return string + extractNodesText(currentNode);
|
|
3529
|
-
}, '');
|
|
3530
|
-
setClipboardData(data, elements);
|
|
3531
|
-
setClipboardDataByText(data, text);
|
|
3532
|
-
};
|
|
3533
|
-
const insertClipboardData = (board, elements, targetPoint) => {
|
|
3534
|
-
let newElement, path;
|
|
3535
|
-
const selectedElements = getSelectedElements(board);
|
|
3536
|
-
let newELements = [];
|
|
3537
|
-
const hasTargetParent = selectedElements.length === 1;
|
|
3538
|
-
const targetParent = selectedElements[0];
|
|
3539
|
-
const targetParentPath = targetParent && PlaitBoard.findPath(board, targetParent);
|
|
3540
|
-
const nonAbstractChildrenLength = targetParent && getNonAbstractChildren(targetParent).length;
|
|
3541
|
-
elements.forEach((item, index) => {
|
|
3542
|
-
newElement = copyNewNode(item);
|
|
3543
|
-
if (hasTargetParent) {
|
|
3544
|
-
if (item.isRoot) {
|
|
3545
|
-
newElement = adjustRootToNode(board, newElement);
|
|
3546
|
-
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
3547
|
-
const { width, height } = getTextSize(board, newElement.data.topic, TOPIC_DEFAULT_MAX_WORD_COUNT, {
|
|
3548
|
-
...styles,
|
|
3549
|
-
width: newElement.manualWidth ? newElement.manualWidth : undefined
|
|
3550
|
-
});
|
|
3551
|
-
newElement.width = Math.max(width, getNodeDefaultFontSize());
|
|
3552
|
-
newElement.height = height;
|
|
3553
|
-
}
|
|
3554
|
-
// handle abstract start and end
|
|
3555
|
-
if (AbstractNode.isAbstract(newElement)) {
|
|
3556
|
-
newElement.start = newElement.start + nonAbstractChildrenLength;
|
|
3557
|
-
newElement.end = newElement.end + nonAbstractChildrenLength;
|
|
3558
|
-
}
|
|
3559
|
-
path = [...targetParentPath, nonAbstractChildrenLength + index];
|
|
3560
|
-
}
|
|
3561
|
-
else {
|
|
3562
|
-
const point = [targetPoint[0] + item.points[0][0], targetPoint[1] + item.points[0][1]];
|
|
3563
|
-
newElement.points = [point];
|
|
3564
|
-
if (AbstractNode.isAbstract(item)) {
|
|
3565
|
-
newElement = adjustAbstractToNode(newElement);
|
|
3566
|
-
}
|
|
3567
|
-
if (!item.isRoot) {
|
|
3568
|
-
newElement = adjustNodeToRoot(board, newElement);
|
|
3569
|
-
}
|
|
3570
|
-
path = [board.children.length];
|
|
3571
|
-
}
|
|
3572
|
-
newELements.push(newElement);
|
|
3573
|
-
Transforms.insertNode(board, newElement, path);
|
|
3574
|
-
return;
|
|
3575
|
-
});
|
|
3576
|
-
Transforms.setSelectionWithTemporaryElements(board, newELements);
|
|
3577
|
-
};
|
|
3578
|
-
const insertClipboardText = (board, targetParent, text) => {
|
|
3579
|
-
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
3580
|
-
const { width, height } = getTextSize(board, text, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
|
|
3581
|
-
const newElement = createMindElement(text, Math.max(width, getFontSizeBySlateElement(text)), height, {});
|
|
3582
|
-
Transforms.insertNode(board, newElement, findNewChildNodePath(board, targetParent));
|
|
3583
|
-
return;
|
|
3584
|
-
};
|
|
3585
|
-
|
|
3586
3468
|
const withAbstract = (board) => {
|
|
3587
3469
|
const newBoard = board;
|
|
3588
3470
|
const { mousedown, mousemove, mouseup } = board;
|
|
@@ -3803,7 +3685,7 @@ const withCreateMind = (board) => {
|
|
|
3803
3685
|
|
|
3804
3686
|
const withMindHotkey = (baseBoard) => {
|
|
3805
3687
|
const board = baseBoard;
|
|
3806
|
-
const { keydown
|
|
3688
|
+
const { keydown } = board;
|
|
3807
3689
|
board.keydown = (event) => {
|
|
3808
3690
|
const selectedElements = getSelectedElements(board);
|
|
3809
3691
|
const isSingleSelection = selectedElements.length === 1;
|
|
@@ -3843,7 +3725,11 @@ const withMindHotkey = (baseBoard) => {
|
|
|
3843
3725
|
insertMindElement(board, targetElement, findNewSiblingNodePath(board, targetElement));
|
|
3844
3726
|
return;
|
|
3845
3727
|
}
|
|
3846
|
-
if (!isVirtualKey(event) &&
|
|
3728
|
+
if (!isVirtualKey(event) &&
|
|
3729
|
+
!isDelete(event) &&
|
|
3730
|
+
!isSpaceHotkey(event) &&
|
|
3731
|
+
isSingleSelection &&
|
|
3732
|
+
MindElement.isMindElement(board, targetElement)) {
|
|
3847
3733
|
event.preventDefault();
|
|
3848
3734
|
editTopic(targetElement);
|
|
3849
3735
|
return;
|
|
@@ -3851,54 +3737,8 @@ const withMindHotkey = (baseBoard) => {
|
|
|
3851
3737
|
}
|
|
3852
3738
|
keydown(event);
|
|
3853
3739
|
};
|
|
3854
|
-
board.deleteFragment = (data) => {
|
|
3855
|
-
const targetMindElements = getSelectedMindElements(board);
|
|
3856
|
-
if (targetMindElements.length) {
|
|
3857
|
-
const firstLevelElements = getFirstLevelElement(targetMindElements).reverse();
|
|
3858
|
-
const abstractRefs = deleteElementHandleAbstract(board, firstLevelElements);
|
|
3859
|
-
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
3860
|
-
const refs = deleteElementsHandleRightNodeCount(board, targetMindElements);
|
|
3861
|
-
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
3862
|
-
MindTransforms.removeElements(board, targetMindElements);
|
|
3863
|
-
const nextSelected = getNextSelectedElement(board, firstLevelElements);
|
|
3864
|
-
if (nextSelected) {
|
|
3865
|
-
addSelectedElement(board, nextSelected);
|
|
3866
|
-
}
|
|
3867
|
-
}
|
|
3868
|
-
deleteFragment(data);
|
|
3869
|
-
};
|
|
3870
3740
|
return board;
|
|
3871
3741
|
};
|
|
3872
|
-
const getNextSelectedElement = (board, firstLevelElements) => {
|
|
3873
|
-
let activeElement;
|
|
3874
|
-
const firstLevelElement = firstLevelElements[0];
|
|
3875
|
-
const firstLevelElementPath = PlaitBoard.findPath(board, firstLevelElement);
|
|
3876
|
-
let nextSelectedPath = firstLevelElementPath;
|
|
3877
|
-
if (Path.hasPrevious(firstLevelElementPath)) {
|
|
3878
|
-
nextSelectedPath = Path.previous(firstLevelElementPath);
|
|
3879
|
-
}
|
|
3880
|
-
if (AbstractNode.isAbstract(firstLevelElement)) {
|
|
3881
|
-
const parent = MindElement.getParent(firstLevelElement);
|
|
3882
|
-
if (!firstLevelElements.includes(parent.children[firstLevelElement.start])) {
|
|
3883
|
-
activeElement = parent.children[firstLevelElement.start];
|
|
3884
|
-
}
|
|
3885
|
-
}
|
|
3886
|
-
try {
|
|
3887
|
-
if (!activeElement) {
|
|
3888
|
-
activeElement = PlaitNode.get(board, nextSelectedPath);
|
|
3889
|
-
}
|
|
3890
|
-
}
|
|
3891
|
-
catch (error) { }
|
|
3892
|
-
const firstElement = firstLevelElements[0];
|
|
3893
|
-
const firstElementParent = MindElement.findParent(firstElement);
|
|
3894
|
-
const hasSameParent = firstLevelElements.every(element => {
|
|
3895
|
-
return MindElement.findParent(element) === firstElementParent;
|
|
3896
|
-
});
|
|
3897
|
-
if (firstElementParent && hasSameParent && !activeElement) {
|
|
3898
|
-
activeElement = firstElementParent;
|
|
3899
|
-
}
|
|
3900
|
-
return activeElement;
|
|
3901
|
-
};
|
|
3902
3742
|
|
|
3903
3743
|
const mouseMoveHandle = (board, event, nodeHoveredExtendRef) => {
|
|
3904
3744
|
let target = null;
|
|
@@ -4224,9 +4064,191 @@ const withNodeImageResize = (board) => {
|
|
|
4224
4064
|
return board;
|
|
4225
4065
|
};
|
|
4226
4066
|
|
|
4067
|
+
const buildClipboardData = (board, selectedElements, startPoint) => {
|
|
4068
|
+
let result = [];
|
|
4069
|
+
// get overall abstract
|
|
4070
|
+
const overallAbstracts = getOverallAbstracts(board, selectedElements);
|
|
4071
|
+
// get valid abstract refs
|
|
4072
|
+
const validAbstractRefs = getValidAbstractRefs(board, [...selectedElements, ...overallAbstracts]);
|
|
4073
|
+
// keep correct order
|
|
4074
|
+
const newSelectedElements = selectedElements.filter(value => !validAbstractRefs.find(ref => ref.abstract === value));
|
|
4075
|
+
newSelectedElements.push(...validAbstractRefs.map(value => value.abstract));
|
|
4076
|
+
const selectedMindNodes = newSelectedElements.map(value => MindElement.getNode(value));
|
|
4077
|
+
newSelectedElements.forEach((element, index) => {
|
|
4078
|
+
// handle relative location
|
|
4079
|
+
const nodeRectangle = getRectangleByNode(selectedMindNodes[index]);
|
|
4080
|
+
const points = [[nodeRectangle.x - startPoint[0], nodeRectangle.y - startPoint[1]]];
|
|
4081
|
+
// handle invalid abstract
|
|
4082
|
+
const abstractRef = validAbstractRefs.find(ref => ref.abstract === element);
|
|
4083
|
+
if (AbstractNode.isAbstract(element) && abstractRef) {
|
|
4084
|
+
const { start, end } = getRelativeStartEndByAbstractRef(abstractRef, newSelectedElements);
|
|
4085
|
+
result.push({
|
|
4086
|
+
...element,
|
|
4087
|
+
points,
|
|
4088
|
+
start,
|
|
4089
|
+
end
|
|
4090
|
+
});
|
|
4091
|
+
}
|
|
4092
|
+
else {
|
|
4093
|
+
if (AbstractNode.isAbstract(element)) {
|
|
4094
|
+
let newElement = { ...element, points };
|
|
4095
|
+
delete newElement.start;
|
|
4096
|
+
delete newElement.end;
|
|
4097
|
+
result.push(newElement);
|
|
4098
|
+
}
|
|
4099
|
+
else {
|
|
4100
|
+
result.push({
|
|
4101
|
+
...element,
|
|
4102
|
+
points: points
|
|
4103
|
+
});
|
|
4104
|
+
}
|
|
4105
|
+
}
|
|
4106
|
+
});
|
|
4107
|
+
return result;
|
|
4108
|
+
};
|
|
4109
|
+
const setMindClipboardData = (data, elements) => {
|
|
4110
|
+
const text = elements.reduce((string, currentNode) => {
|
|
4111
|
+
return string + extractNodesText(currentNode);
|
|
4112
|
+
}, '');
|
|
4113
|
+
setClipboardData(data, elements);
|
|
4114
|
+
setClipboardDataByText(data, text);
|
|
4115
|
+
};
|
|
4116
|
+
const insertClipboardData = (board, elements, targetPoint) => {
|
|
4117
|
+
let newElement, path;
|
|
4118
|
+
const selectedElements = getSelectedElements(board);
|
|
4119
|
+
let newELements = [];
|
|
4120
|
+
const hasTargetParent = selectedElements.length === 1;
|
|
4121
|
+
const targetParent = selectedElements[0];
|
|
4122
|
+
const targetParentPath = targetParent && PlaitBoard.findPath(board, targetParent);
|
|
4123
|
+
const nonAbstractChildrenLength = targetParent && getNonAbstractChildren(targetParent).length;
|
|
4124
|
+
elements.forEach((item, index) => {
|
|
4125
|
+
newElement = copyNewNode(item);
|
|
4126
|
+
if (hasTargetParent) {
|
|
4127
|
+
if (item.isRoot) {
|
|
4128
|
+
newElement = adjustRootToNode(board, newElement);
|
|
4129
|
+
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
4130
|
+
const { width, height } = getTextSize(board, newElement.data.topic, TOPIC_DEFAULT_MAX_WORD_COUNT, {
|
|
4131
|
+
...styles,
|
|
4132
|
+
width: newElement.manualWidth ? newElement.manualWidth : undefined
|
|
4133
|
+
});
|
|
4134
|
+
newElement.width = Math.max(width, getNodeDefaultFontSize());
|
|
4135
|
+
newElement.height = height;
|
|
4136
|
+
}
|
|
4137
|
+
// handle abstract start and end
|
|
4138
|
+
if (AbstractNode.isAbstract(newElement)) {
|
|
4139
|
+
newElement.start = newElement.start + nonAbstractChildrenLength;
|
|
4140
|
+
newElement.end = newElement.end + nonAbstractChildrenLength;
|
|
4141
|
+
}
|
|
4142
|
+
path = [...targetParentPath, nonAbstractChildrenLength + index];
|
|
4143
|
+
}
|
|
4144
|
+
else {
|
|
4145
|
+
const point = [targetPoint[0] + item.points[0][0], targetPoint[1] + item.points[0][1]];
|
|
4146
|
+
newElement.points = [point];
|
|
4147
|
+
if (AbstractNode.isAbstract(item)) {
|
|
4148
|
+
newElement = adjustAbstractToNode(newElement);
|
|
4149
|
+
}
|
|
4150
|
+
if (!item.isRoot) {
|
|
4151
|
+
newElement = adjustNodeToRoot(board, newElement);
|
|
4152
|
+
}
|
|
4153
|
+
path = [board.children.length];
|
|
4154
|
+
}
|
|
4155
|
+
newELements.push(newElement);
|
|
4156
|
+
Transforms.insertNode(board, newElement, path);
|
|
4157
|
+
return;
|
|
4158
|
+
});
|
|
4159
|
+
Transforms.setSelectionWithTemporaryElements(board, newELements);
|
|
4160
|
+
};
|
|
4161
|
+
const insertClipboardText = (board, targetParent, text) => {
|
|
4162
|
+
const styles = PlaitMind.isMind(targetParent) ? { fontFamily: BRANCH_FONT_FAMILY } : { fontFamily: DEFAULT_FONT_FAMILY };
|
|
4163
|
+
const { width, height } = getTextSize(board, text, TOPIC_DEFAULT_MAX_WORD_COUNT, styles);
|
|
4164
|
+
const newElement = createMindElement(text, Math.max(width, getFontSizeBySlateElement(text)), height, {});
|
|
4165
|
+
Transforms.insertNode(board, newElement, findNewChildNodePath(board, targetParent));
|
|
4166
|
+
return;
|
|
4167
|
+
};
|
|
4168
|
+
|
|
4169
|
+
const withMindFragment = (baseBoard) => {
|
|
4170
|
+
const board = baseBoard;
|
|
4171
|
+
const { getDeletedFragment, insertFragment, setFragment } = board;
|
|
4172
|
+
board.getDeletedFragment = (data) => {
|
|
4173
|
+
const targetMindElements = getSelectedMindElements(board);
|
|
4174
|
+
if (targetMindElements.length) {
|
|
4175
|
+
const firstLevelElements = getFirstLevelElement(targetMindElements).reverse();
|
|
4176
|
+
const abstractRefs = deleteElementHandleAbstract(board, firstLevelElements);
|
|
4177
|
+
MindTransforms.setAbstractsByRefs(board, abstractRefs);
|
|
4178
|
+
const refs = deleteElementsHandleRightNodeCount(board, targetMindElements);
|
|
4179
|
+
MindTransforms.setRightNodeCountByRefs(board, refs);
|
|
4180
|
+
const deletableElements = getFirstLevelElement(targetMindElements);
|
|
4181
|
+
data.push(...deletableElements);
|
|
4182
|
+
const nextSelected = getNextSelectedElement(board, firstLevelElements);
|
|
4183
|
+
if (nextSelected) {
|
|
4184
|
+
addSelectedElement(board, nextSelected);
|
|
4185
|
+
}
|
|
4186
|
+
}
|
|
4187
|
+
return getDeletedFragment(data);
|
|
4188
|
+
};
|
|
4189
|
+
board.setFragment = (data, rectangle) => {
|
|
4190
|
+
const targetMindElements = getSelectedMindElements(board);
|
|
4191
|
+
const firstLevelElements = getFirstLevelElement(targetMindElements);
|
|
4192
|
+
if (firstLevelElements.length) {
|
|
4193
|
+
const elements = buildClipboardData(board, firstLevelElements, rectangle ? [rectangle.x, rectangle.y] : [0, 0]);
|
|
4194
|
+
setMindClipboardData(data, elements);
|
|
4195
|
+
}
|
|
4196
|
+
setFragment(data, rectangle);
|
|
4197
|
+
};
|
|
4198
|
+
board.insertFragment = (data, targetPoint) => {
|
|
4199
|
+
const elements = getDataFromClipboard(data);
|
|
4200
|
+
const mindElements = elements.filter(value => MindElement.isMindElement(board, value));
|
|
4201
|
+
if (elements.length > 0 && mindElements.length > 0) {
|
|
4202
|
+
insertClipboardData(board, mindElements, targetPoint);
|
|
4203
|
+
}
|
|
4204
|
+
else if (elements.length === 0) {
|
|
4205
|
+
const mindElements = getSelectedMindElements(board);
|
|
4206
|
+
if (mindElements.length === 1) {
|
|
4207
|
+
const text = getTextFromClipboard(data);
|
|
4208
|
+
if (text) {
|
|
4209
|
+
insertClipboardText(board, mindElements[0], buildText(text));
|
|
4210
|
+
return;
|
|
4211
|
+
}
|
|
4212
|
+
}
|
|
4213
|
+
}
|
|
4214
|
+
insertFragment(data, targetPoint);
|
|
4215
|
+
};
|
|
4216
|
+
return board;
|
|
4217
|
+
};
|
|
4218
|
+
const getNextSelectedElement = (board, firstLevelElements) => {
|
|
4219
|
+
let activeElement;
|
|
4220
|
+
const firstLevelElement = firstLevelElements[0];
|
|
4221
|
+
const firstLevelElementPath = PlaitBoard.findPath(board, firstLevelElement);
|
|
4222
|
+
let nextSelectedPath = firstLevelElementPath;
|
|
4223
|
+
if (Path.hasPrevious(firstLevelElementPath)) {
|
|
4224
|
+
nextSelectedPath = Path.previous(firstLevelElementPath);
|
|
4225
|
+
}
|
|
4226
|
+
if (AbstractNode.isAbstract(firstLevelElement)) {
|
|
4227
|
+
const parent = MindElement.getParent(firstLevelElement);
|
|
4228
|
+
if (!firstLevelElements.includes(parent.children[firstLevelElement.start])) {
|
|
4229
|
+
activeElement = parent.children[firstLevelElement.start];
|
|
4230
|
+
}
|
|
4231
|
+
}
|
|
4232
|
+
try {
|
|
4233
|
+
if (!activeElement) {
|
|
4234
|
+
activeElement = PlaitNode.get(board, nextSelectedPath);
|
|
4235
|
+
}
|
|
4236
|
+
}
|
|
4237
|
+
catch (error) { }
|
|
4238
|
+
const firstElement = firstLevelElements[0];
|
|
4239
|
+
const firstElementParent = MindElement.findParent(firstElement);
|
|
4240
|
+
const hasSameParent = firstLevelElements.every(element => {
|
|
4241
|
+
return MindElement.findParent(element) === firstElementParent;
|
|
4242
|
+
});
|
|
4243
|
+
if (firstElementParent && hasSameParent && !activeElement) {
|
|
4244
|
+
activeElement = firstElementParent;
|
|
4245
|
+
}
|
|
4246
|
+
return activeElement;
|
|
4247
|
+
};
|
|
4248
|
+
|
|
4227
4249
|
const withMind = (baseBoard) => {
|
|
4228
4250
|
const board = baseBoard;
|
|
4229
|
-
const { drawElement, dblclick,
|
|
4251
|
+
const { drawElement, dblclick, isHitSelection, getRectangle, isMovable, isRecursion } = board;
|
|
4230
4252
|
board.drawElement = (context) => {
|
|
4231
4253
|
if (PlaitMind.isMind(context.element)) {
|
|
4232
4254
|
return PlaitMindComponent;
|
|
@@ -4290,34 +4312,7 @@ const withMind = (baseBoard) => {
|
|
|
4290
4312
|
}
|
|
4291
4313
|
dblclick(event);
|
|
4292
4314
|
};
|
|
4293
|
-
|
|
4294
|
-
const targetMindElements = getSelectedMindElements(board);
|
|
4295
|
-
const firstLevelElements = getFirstLevelElement(targetMindElements);
|
|
4296
|
-
if (firstLevelElements.length) {
|
|
4297
|
-
const elements = buildClipboardData(board, firstLevelElements, rectangle ? [rectangle.x, rectangle.y] : [0, 0]);
|
|
4298
|
-
setMindClipboardData(data, elements);
|
|
4299
|
-
}
|
|
4300
|
-
setFragment(data, rectangle);
|
|
4301
|
-
};
|
|
4302
|
-
board.insertFragment = (data, targetPoint) => {
|
|
4303
|
-
const elements = getDataFromClipboard(data);
|
|
4304
|
-
const mindElements = elements.filter(value => MindElement.isMindElement(board, value));
|
|
4305
|
-
if (elements.length > 0 && mindElements.length > 0) {
|
|
4306
|
-
insertClipboardData(board, mindElements, targetPoint);
|
|
4307
|
-
}
|
|
4308
|
-
else if (elements.length === 0) {
|
|
4309
|
-
const mindElements = getSelectedMindElements(board);
|
|
4310
|
-
if (mindElements.length === 1) {
|
|
4311
|
-
const text = getTextFromClipboard(data);
|
|
4312
|
-
if (text) {
|
|
4313
|
-
insertClipboardText(board, mindElements[0], buildText(text));
|
|
4314
|
-
return;
|
|
4315
|
-
}
|
|
4316
|
-
}
|
|
4317
|
-
}
|
|
4318
|
-
insertFragment(data, targetPoint);
|
|
4319
|
-
};
|
|
4320
|
-
return withNodeResize(withNodeImageResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board)))))))));
|
|
4315
|
+
return withNodeResize(withNodeImageResize(withNodeImage(withNodeHoverDetect(withMindFragment(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))))));
|
|
4321
4316
|
};
|
|
4322
4317
|
|
|
4323
4318
|
class MindEmojiBaseComponent {
|