@plait/core 0.38.0 → 0.40.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/board/board.component.d.ts +1 -1
- package/constants/index.d.ts +1 -1
- package/esm2022/board/board.component.mjs +6 -4
- package/esm2022/constants/index.mjs +2 -2
- package/esm2022/interfaces/board.mjs +1 -1
- package/esm2022/interfaces/rectangle-client.mjs +3 -3
- package/esm2022/plugins/create-board.mjs +4 -2
- package/esm2022/plugins/with-board.mjs +10 -3
- package/esm2022/plugins/with-hand.mjs +10 -10
- package/esm2022/plugins/with-moving.mjs +7 -2
- package/esm2022/plugins/with-selection.mjs +69 -31
- package/esm2022/transforms/board.mjs +3 -1
- package/esm2022/utils/common.mjs +4 -2
- package/esm2022/utils/dom/common.mjs +21 -3
- package/esm2022/utils/math.mjs +4 -2
- package/esm2022/utils/moving-element.mjs +4 -1
- package/esm2022/utils/selected-element.mjs +19 -3
- package/esm2022/utils/to-image.mjs +6 -6
- package/esm2022/utils/viewport.mjs +14 -7
- package/esm2022/utils/weak-maps.mjs +2 -1
- package/fesm2022/plait-core.mjs +167 -65
- package/fesm2022/plait-core.mjs.map +1 -1
- package/interfaces/board.d.ts +1 -0
- package/package.json +1 -1
- package/plugins/with-selection.d.ts +2 -0
- package/utils/dom/common.d.ts +15 -2
- package/utils/math.d.ts +1 -1
- package/utils/moving-element.d.ts +1 -0
- package/utils/selected-element.d.ts +1 -1
- package/utils/viewport.d.ts +1 -0
- package/utils/weak-maps.d.ts +1 -0
package/fesm2022/plait-core.mjs
CHANGED
|
@@ -14,6 +14,7 @@ const NODE_TO_INDEX = new WeakMap();
|
|
|
14
14
|
const NODE_TO_PARENT = new WeakMap();
|
|
15
15
|
const IS_TEXT_EDITABLE = new WeakMap();
|
|
16
16
|
const BOARD_TO_ON_CHANGE = new WeakMap();
|
|
17
|
+
const BOARD_TO_AFTER_CHANGE = new WeakMap();
|
|
17
18
|
const BOARD_TO_COMPONENT = new WeakMap();
|
|
18
19
|
const BOARD_TO_ROUGH_SVG = new WeakMap();
|
|
19
20
|
const BOARD_TO_HOST = new WeakMap();
|
|
@@ -125,13 +126,29 @@ const getSelectedElements = (board) => {
|
|
|
125
126
|
return BOARD_TO_SELECTED_ELEMENT.get(board) || [];
|
|
126
127
|
};
|
|
127
128
|
const addSelectedElement = (board, element) => {
|
|
129
|
+
let elements = [];
|
|
130
|
+
if (Array.isArray(element)) {
|
|
131
|
+
elements.push(...element);
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
elements.push(element);
|
|
135
|
+
}
|
|
128
136
|
const selectedElements = getSelectedElements(board);
|
|
129
|
-
cacheSelectedElements(board, [...selectedElements,
|
|
137
|
+
cacheSelectedElements(board, [...selectedElements, ...elements]);
|
|
130
138
|
};
|
|
131
139
|
const removeSelectedElement = (board, element) => {
|
|
132
140
|
const selectedElements = getSelectedElements(board);
|
|
133
141
|
if (selectedElements.includes(element)) {
|
|
134
|
-
const
|
|
142
|
+
const targetElements = [];
|
|
143
|
+
if (board.isRecursion(element)) {
|
|
144
|
+
depthFirstRecursion(element, node => {
|
|
145
|
+
targetElements.push(node);
|
|
146
|
+
}, node => board.isRecursion(node));
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
targetElements.push(element);
|
|
150
|
+
}
|
|
151
|
+
const newSelectedElements = selectedElements.filter(value => !targetElements.includes(value));
|
|
135
152
|
cacheSelectedElements(board, newSelectedElements);
|
|
136
153
|
}
|
|
137
154
|
};
|
|
@@ -306,13 +323,30 @@ const POINTER_BUTTON = {
|
|
|
306
323
|
SECONDARY: 2,
|
|
307
324
|
TOUCH: -1
|
|
308
325
|
};
|
|
309
|
-
const PRESS_AND_MOVE_BUFFER =
|
|
326
|
+
const PRESS_AND_MOVE_BUFFER = 3;
|
|
310
327
|
|
|
311
328
|
const NS = 'http://www.w3.org/2000/svg';
|
|
312
|
-
|
|
313
|
-
|
|
329
|
+
/**
|
|
330
|
+
* Get the screen coordinates starting from the upper left corner of the svg element (based on the svg screen coordinate system)
|
|
331
|
+
* @param x screen x
|
|
332
|
+
* @param y screen x
|
|
333
|
+
* @returns
|
|
334
|
+
*/
|
|
335
|
+
function toPoint(x, y, svg) {
|
|
336
|
+
const rect = svg.getBoundingClientRect();
|
|
314
337
|
return [x - rect.x, y - rect.y];
|
|
315
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* `toPoint` reverse processing
|
|
341
|
+
* Get the screen coordinate starting from the upper left corner of the browser window (based on the screen coordinate system)
|
|
342
|
+
* @param point screen coordinates based on the upper left corner of the svg
|
|
343
|
+
* @returns
|
|
344
|
+
*/
|
|
345
|
+
function toScreenPoint(board, point) {
|
|
346
|
+
const host = PlaitBoard.getHost(board);
|
|
347
|
+
const rect = host.getBoundingClientRect();
|
|
348
|
+
return [point[0] + rect.x, point[1] + rect.y];
|
|
349
|
+
}
|
|
316
350
|
function createG() {
|
|
317
351
|
const newG = document.createElementNS(NS, 'g');
|
|
318
352
|
return newG;
|
|
@@ -552,8 +586,8 @@ const RectangleClient = {
|
|
|
552
586
|
};
|
|
553
587
|
},
|
|
554
588
|
getGapCenter(rectangle1, rectangle2, isHorizontal) {
|
|
555
|
-
const axis = isHorizontal ? '
|
|
556
|
-
const side = isHorizontal ? '
|
|
589
|
+
const axis = isHorizontal ? 'x' : 'y';
|
|
590
|
+
const side = isHorizontal ? 'width' : 'height';
|
|
557
591
|
const align = [rectangle1[axis], rectangle1[axis] + rectangle1[side], rectangle2[axis], rectangle2[axis] + rectangle2[side]];
|
|
558
592
|
const sortArr = align.sort((a, b) => a - b);
|
|
559
593
|
return (sortArr[1] + sortArr[2]) / 2;
|
|
@@ -635,12 +669,14 @@ function distanceBetweenPointAndSegments(points, point) {
|
|
|
635
669
|
}
|
|
636
670
|
return distance;
|
|
637
671
|
}
|
|
638
|
-
function getNearestPointBetweenPointAndSegments(point, points) {
|
|
672
|
+
function getNearestPointBetweenPointAndSegments(point, points, isClose = true) {
|
|
639
673
|
const len = points.length;
|
|
640
674
|
let distance = Infinity;
|
|
641
675
|
let result = point;
|
|
642
676
|
for (let i = 0; i < len; i++) {
|
|
643
677
|
const p = points[i];
|
|
678
|
+
if (i === len - 1 && !isClose)
|
|
679
|
+
continue;
|
|
644
680
|
const p2 = i === len - 1 ? points[0] : points[i + 1];
|
|
645
681
|
const currentDistance = distanceBetweenPointAndSegment(point[0], point[1], p[0], p[1], p2[0], p2[1]);
|
|
646
682
|
if (currentDistance < distance) {
|
|
@@ -1183,6 +1219,8 @@ function updateViewport(board, origination, zoom) {
|
|
|
1183
1219
|
clearViewportOrigination(board);
|
|
1184
1220
|
}
|
|
1185
1221
|
const updatePointerType = (board, pointer) => {
|
|
1222
|
+
if (board.pointer === pointer)
|
|
1223
|
+
return;
|
|
1186
1224
|
board.pointer = pointer;
|
|
1187
1225
|
const boardComponent = BOARD_TO_COMPONENT.get(board);
|
|
1188
1226
|
boardComponent?.markForCheck();
|
|
@@ -1285,6 +1323,13 @@ const BoardTransforms = {
|
|
|
1285
1323
|
|
|
1286
1324
|
const IS_FROM_SCROLLING = new WeakMap();
|
|
1287
1325
|
const IS_FROM_VIEWPORT_CHANGE = new WeakMap();
|
|
1326
|
+
function toSVGScreenPoint(board, point) {
|
|
1327
|
+
const { zoom } = board.viewport;
|
|
1328
|
+
const viewBox = getViewBox(board, zoom);
|
|
1329
|
+
const x = (point[0] - viewBox[0]) * zoom;
|
|
1330
|
+
const y = (point[1] - viewBox[1]) * zoom;
|
|
1331
|
+
return [x, y];
|
|
1332
|
+
}
|
|
1288
1333
|
function getViewportContainerRect(board) {
|
|
1289
1334
|
const { hideScrollbar } = board.options;
|
|
1290
1335
|
const scrollBarWidth = hideScrollbar ? SCROLL_BAR_WIDTH : 0;
|
|
@@ -1372,17 +1417,17 @@ function updateViewportOffset(board) {
|
|
|
1372
1417
|
if (!origination) {
|
|
1373
1418
|
return;
|
|
1374
1419
|
}
|
|
1375
|
-
const
|
|
1376
|
-
const viewBox = getViewBox(board, zoom);
|
|
1377
|
-
const scrollLeft = (origination[0] - viewBox[0]) * zoom;
|
|
1378
|
-
const scrollTop = (origination[1] - viewBox[1]) * zoom;
|
|
1420
|
+
const [scrollLeft, scrollTop] = toSVGScreenPoint(board, origination);
|
|
1379
1421
|
updateViewportContainerScroll(board, scrollLeft, scrollTop);
|
|
1380
1422
|
}
|
|
1381
1423
|
function updateViewportContainerScroll(board, left, top, isFromViewportChange = true) {
|
|
1382
1424
|
const viewportContainer = PlaitBoard.getViewportContainer(board);
|
|
1383
1425
|
const previousScrollLeft = viewportContainer.scrollLeft;
|
|
1384
1426
|
const previousScrollTop = viewportContainer.scrollTop;
|
|
1385
|
-
|
|
1427
|
+
// scrollTop assign 11.8 will get 11.5 in chrome
|
|
1428
|
+
// scrollTop assign 11.8 will get 11 in firefox, safari
|
|
1429
|
+
// scrollTop assign 11.4 will get 11 in chrome, firefox, safari
|
|
1430
|
+
if (viewportContainer.scrollLeft !== Math.floor(left) || viewportContainer.scrollTop !== Math.floor(top)) {
|
|
1386
1431
|
viewportContainer.scrollLeft = left;
|
|
1387
1432
|
viewportContainer.scrollTop = top;
|
|
1388
1433
|
const offsetWidth = viewportContainer.offsetWidth;
|
|
@@ -1406,7 +1451,7 @@ function updateViewportByScrolling(board, scrollLeft, scrollTop) {
|
|
|
1406
1451
|
const zoom = board.viewport.zoom;
|
|
1407
1452
|
const viewBox = getViewBox(board, zoom);
|
|
1408
1453
|
const origination = [scrollLeft / zoom + viewBox[0], scrollTop / zoom + viewBox[1]];
|
|
1409
|
-
if (Point.isEquals(origination, board
|
|
1454
|
+
if (Point.isEquals(origination, getViewportOrigination(board))) {
|
|
1410
1455
|
return;
|
|
1411
1456
|
}
|
|
1412
1457
|
BoardTransforms.updateViewport(board, origination);
|
|
@@ -1491,7 +1536,9 @@ const debounce = (func, wait, options) => {
|
|
|
1491
1536
|
}
|
|
1492
1537
|
else {
|
|
1493
1538
|
if (options?.leading) {
|
|
1494
|
-
|
|
1539
|
+
timer(0).subscribe(() => {
|
|
1540
|
+
func();
|
|
1541
|
+
});
|
|
1495
1542
|
}
|
|
1496
1543
|
timerSubscription = timer(wait).subscribe();
|
|
1497
1544
|
}
|
|
@@ -1501,6 +1548,9 @@ const debounce = (func, wait, options) => {
|
|
|
1501
1548
|
const getMovingElements = (board) => {
|
|
1502
1549
|
return BOARD_TO_MOVING_ELEMENT.get(board) || [];
|
|
1503
1550
|
};
|
|
1551
|
+
const isMovingElements = (board) => {
|
|
1552
|
+
return (BOARD_TO_MOVING_ELEMENT.get(board) || []).length > 0;
|
|
1553
|
+
};
|
|
1504
1554
|
const addMovingElements = (board, elements) => {
|
|
1505
1555
|
const movingElements = getMovingElements(board);
|
|
1506
1556
|
const newElements = elements.filter(item => !movingElements.find(movingElement => movingElement.key === item.key));
|
|
@@ -1530,7 +1580,7 @@ function isElementNode(node) {
|
|
|
1530
1580
|
function loadImage(src) {
|
|
1531
1581
|
return new Promise((resolve, reject) => {
|
|
1532
1582
|
const img = new Image();
|
|
1533
|
-
img.crossOrigin = '
|
|
1583
|
+
img.crossOrigin = 'Anonymous';
|
|
1534
1584
|
img.onload = () => resolve(img);
|
|
1535
1585
|
img.onerror = () => reject(new Error('Failed to load image'));
|
|
1536
1586
|
img.src = src;
|
|
@@ -1645,7 +1695,7 @@ async function batchConvertImage(sourceNode, cloneNode) {
|
|
|
1645
1695
|
* @param options parameter configuration
|
|
1646
1696
|
* @returns clone svg element
|
|
1647
1697
|
*/
|
|
1648
|
-
function cloneSvg(board, elements, rectangle, options) {
|
|
1698
|
+
async function cloneSvg(board, elements, rectangle, options) {
|
|
1649
1699
|
const { width, height, x, y } = rectangle;
|
|
1650
1700
|
const { padding = 4, inlineStyleClassNames } = options;
|
|
1651
1701
|
const sourceSvg = PlaitBoard.getHost(board);
|
|
@@ -1658,12 +1708,12 @@ function cloneSvg(board, elements, rectangle, options) {
|
|
|
1658
1708
|
cloneSvgElement.setAttribute('width', `${width}`);
|
|
1659
1709
|
cloneSvgElement.setAttribute('height', `${height}`);
|
|
1660
1710
|
cloneSvgElement.setAttribute('viewBox', [x - padding, y - padding, width + 2 * padding, height + 2 * padding].join(','));
|
|
1661
|
-
selectedGElements.
|
|
1711
|
+
await Promise.all(selectedGElements.map(async (child, i) => {
|
|
1662
1712
|
const cloneChild = child.cloneNode(true);
|
|
1663
1713
|
batchCloneCSSStyle(child, cloneChild, inlineStyleClassNames);
|
|
1664
|
-
batchConvertImage(child, cloneChild);
|
|
1714
|
+
await batchConvertImage(child, cloneChild);
|
|
1665
1715
|
newHostElement.appendChild(cloneChild);
|
|
1666
|
-
});
|
|
1716
|
+
}));
|
|
1667
1717
|
cloneSvgElement.appendChild(newHostElement);
|
|
1668
1718
|
return cloneSvgElement;
|
|
1669
1719
|
}
|
|
@@ -2536,7 +2586,7 @@ const NodeTransforms = {
|
|
|
2536
2586
|
};
|
|
2537
2587
|
|
|
2538
2588
|
function withSelection(board) {
|
|
2539
|
-
const { pointerDown, globalPointerMove, globalPointerUp, onChange } = board;
|
|
2589
|
+
const { pointerDown, globalPointerMove, globalPointerUp, keyup, onChange, afterChange } = board;
|
|
2540
2590
|
let start = null;
|
|
2541
2591
|
let end = null;
|
|
2542
2592
|
let selectionMovingG;
|
|
@@ -2544,11 +2594,15 @@ function withSelection(board) {
|
|
|
2544
2594
|
let previousSelectedElements;
|
|
2545
2595
|
// prevent text from being selected when user pressed main pointer and is moving
|
|
2546
2596
|
let needPreventNativeSelectionWhenMoving = false;
|
|
2597
|
+
let isShift = false;
|
|
2547
2598
|
board.pointerDown = (event) => {
|
|
2548
2599
|
const isHitText = event.target instanceof Element && event.target.closest('.plait-richtext-container');
|
|
2549
|
-
|
|
2550
|
-
if (!isHitText && event.shiftKey) {
|
|
2600
|
+
if (event.shiftKey) {
|
|
2551
2601
|
event.preventDefault();
|
|
2602
|
+
isShift = true;
|
|
2603
|
+
}
|
|
2604
|
+
else {
|
|
2605
|
+
isShift = false;
|
|
2552
2606
|
}
|
|
2553
2607
|
if (!isHitText) {
|
|
2554
2608
|
needPreventNativeSelectionWhenMoving = true;
|
|
@@ -2562,7 +2616,7 @@ function withSelection(board) {
|
|
|
2562
2616
|
const selection = { anchor: point, focus: point };
|
|
2563
2617
|
const hitElement = getHitElementByPoint(board, point);
|
|
2564
2618
|
const selectedElements = getSelectedElements(board);
|
|
2565
|
-
if (hitElement && selectedElements.includes(hitElement) && !options.isDisabledSelect) {
|
|
2619
|
+
if (!isShift && hitElement && selectedElements.includes(hitElement) && !options.isDisabledSelect) {
|
|
2566
2620
|
pointerDown(event);
|
|
2567
2621
|
return;
|
|
2568
2622
|
}
|
|
@@ -2574,12 +2628,18 @@ function withSelection(board) {
|
|
|
2574
2628
|
Transforms.setSelection(board, selection);
|
|
2575
2629
|
pointerDown(event);
|
|
2576
2630
|
};
|
|
2631
|
+
board.keyup = (event) => {
|
|
2632
|
+
if (isShift && event.key === 'Shift') {
|
|
2633
|
+
isShift = false;
|
|
2634
|
+
}
|
|
2635
|
+
keyup(event);
|
|
2636
|
+
};
|
|
2577
2637
|
board.globalPointerMove = (event) => {
|
|
2578
2638
|
if (needPreventNativeSelectionWhenMoving) {
|
|
2579
2639
|
// prevent text from being selected
|
|
2580
2640
|
event.preventDefault();
|
|
2581
2641
|
}
|
|
2582
|
-
if (start) {
|
|
2642
|
+
if (start && PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
|
|
2583
2643
|
const movedTarget = transformPoint(board, toPoint(event.x, event.y, PlaitBoard.getHost(board)));
|
|
2584
2644
|
const rectangle = RectangleClient.toRectangleClient([start, movedTarget]);
|
|
2585
2645
|
selectionMovingG?.remove();
|
|
@@ -2635,43 +2695,63 @@ function withSelection(board) {
|
|
|
2635
2695
|
removeSelectedElement(board, op.node);
|
|
2636
2696
|
}
|
|
2637
2697
|
});
|
|
2638
|
-
|
|
2639
|
-
if (board.pointer !== PlaitPointerType.hand && !options.isDisabledSelect) {
|
|
2698
|
+
if (isHandleSelection(board) && isSetSelectionOperation(board)) {
|
|
2640
2699
|
try {
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
|
|
2647
|
-
|
|
2700
|
+
selectionRectangleG?.remove();
|
|
2701
|
+
const temporaryElements = getTemporaryElements(board);
|
|
2702
|
+
let elements = temporaryElements ? temporaryElements : getHitElementsBySelection(board);
|
|
2703
|
+
if (!options.isMultiple && elements.length > 1) {
|
|
2704
|
+
elements = [elements[0]];
|
|
2705
|
+
}
|
|
2706
|
+
if (isShift && board.selection && Selection.isCollapsed(board.selection)) {
|
|
2707
|
+
const newSelectedElements = [...getSelectedElements(board)];
|
|
2708
|
+
elements.forEach(element => {
|
|
2709
|
+
if (newSelectedElements.includes(element)) {
|
|
2710
|
+
newSelectedElements.splice(newSelectedElements.indexOf(element), 1);
|
|
2711
|
+
}
|
|
2712
|
+
else {
|
|
2713
|
+
newSelectedElements.push(element);
|
|
2714
|
+
}
|
|
2715
|
+
});
|
|
2716
|
+
cacheSelectedElements(board, newSelectedElements);
|
|
2717
|
+
}
|
|
2718
|
+
else {
|
|
2648
2719
|
cacheSelectedElements(board, elements);
|
|
2649
|
-
|
|
2650
|
-
|
|
2651
|
-
|
|
2720
|
+
}
|
|
2721
|
+
const newElements = getSelectedElements(board);
|
|
2722
|
+
previousSelectedElements = newElements;
|
|
2723
|
+
deleteTemporaryElements(board);
|
|
2724
|
+
if (!isSelectionMoving(board) && newElements.length > 1) {
|
|
2725
|
+
selectionRectangleG = createSelectionRectangleG(board);
|
|
2726
|
+
}
|
|
2727
|
+
}
|
|
2728
|
+
catch (error) {
|
|
2729
|
+
console.error(error);
|
|
2730
|
+
}
|
|
2731
|
+
}
|
|
2732
|
+
onChange();
|
|
2733
|
+
};
|
|
2734
|
+
board.afterChange = () => {
|
|
2735
|
+
if (isHandleSelection(board) && !isSetSelectionOperation(board)) {
|
|
2736
|
+
try {
|
|
2737
|
+
const currentSelectedElements = getSelectedElements(board);
|
|
2738
|
+
if (currentSelectedElements.length && currentSelectedElements.length > 1) {
|
|
2739
|
+
if (currentSelectedElements.length !== previousSelectedElements.length ||
|
|
2740
|
+
currentSelectedElements.some((c, index) => c !== previousSelectedElements[index])) {
|
|
2741
|
+
selectionRectangleG?.remove();
|
|
2652
2742
|
selectionRectangleG = createSelectionRectangleG(board);
|
|
2743
|
+
previousSelectedElements = currentSelectedElements;
|
|
2653
2744
|
}
|
|
2654
2745
|
}
|
|
2655
2746
|
else {
|
|
2656
|
-
|
|
2657
|
-
if (currentSelectedElements.length && currentSelectedElements.length > 1) {
|
|
2658
|
-
if (currentSelectedElements.length !== previousSelectedElements.length ||
|
|
2659
|
-
currentSelectedElements.some((c, index) => c !== previousSelectedElements[index])) {
|
|
2660
|
-
selectionRectangleG?.remove();
|
|
2661
|
-
selectionRectangleG = createSelectionRectangleG(board);
|
|
2662
|
-
previousSelectedElements = currentSelectedElements;
|
|
2663
|
-
}
|
|
2664
|
-
}
|
|
2665
|
-
else {
|
|
2666
|
-
selectionRectangleG?.remove();
|
|
2667
|
-
}
|
|
2747
|
+
selectionRectangleG?.remove();
|
|
2668
2748
|
}
|
|
2669
2749
|
}
|
|
2670
2750
|
catch (error) {
|
|
2671
2751
|
console.error(error);
|
|
2672
2752
|
}
|
|
2673
2753
|
}
|
|
2674
|
-
|
|
2754
|
+
afterChange();
|
|
2675
2755
|
};
|
|
2676
2756
|
board.setPluginOptions(PlaitPluginKey.withSelection, {
|
|
2677
2757
|
isMultiple: true,
|
|
@@ -2679,6 +2759,13 @@ function withSelection(board) {
|
|
|
2679
2759
|
});
|
|
2680
2760
|
return board;
|
|
2681
2761
|
}
|
|
2762
|
+
function isHandleSelection(board) {
|
|
2763
|
+
const options = board.getPluginOptions(PlaitPluginKey.withSelection);
|
|
2764
|
+
return board.pointer !== PlaitPointerType.hand && !options.isDisabledSelect && !PlaitBoard.isReadonly(board);
|
|
2765
|
+
}
|
|
2766
|
+
function isSetSelectionOperation(board) {
|
|
2767
|
+
return !!board.operations.find(value => value.type === 'set_selection');
|
|
2768
|
+
}
|
|
2682
2769
|
function getTemporaryElements(board) {
|
|
2683
2770
|
const ref = BOARD_TO_TEMPORARY_ELEMENTS.get(board);
|
|
2684
2771
|
if (ref) {
|
|
@@ -2817,6 +2904,7 @@ function createBoard(children, options) {
|
|
|
2817
2904
|
Promise.resolve().then(() => {
|
|
2818
2905
|
FLUSHING.set(board, false);
|
|
2819
2906
|
board.onChange();
|
|
2907
|
+
board.afterChange();
|
|
2820
2908
|
board.operations = [];
|
|
2821
2909
|
});
|
|
2822
2910
|
}
|
|
@@ -2847,6 +2935,7 @@ function createBoard(children, options) {
|
|
|
2847
2935
|
return refs;
|
|
2848
2936
|
},
|
|
2849
2937
|
onChange: () => { },
|
|
2938
|
+
afterChange: () => { },
|
|
2850
2939
|
mousedown: (event) => { },
|
|
2851
2940
|
mousemove: (event) => { },
|
|
2852
2941
|
mouseleave: (event) => { },
|
|
@@ -2883,13 +2972,13 @@ function createBoard(children, options) {
|
|
|
2883
2972
|
pointerLeave: pointer => { },
|
|
2884
2973
|
globalPointerMove: pointer => { },
|
|
2885
2974
|
globalPointerUp: pointer => { },
|
|
2886
|
-
isImageBindingAllowed: (element) => false
|
|
2975
|
+
isImageBindingAllowed: (element) => false
|
|
2887
2976
|
};
|
|
2888
2977
|
return board;
|
|
2889
2978
|
}
|
|
2890
2979
|
|
|
2891
2980
|
function withBoard(board) {
|
|
2892
|
-
const { onChange } = board;
|
|
2981
|
+
const { onChange, afterChange } = board;
|
|
2893
2982
|
board.onChange = () => {
|
|
2894
2983
|
const onContextChange = BOARD_TO_ON_CHANGE.get(board);
|
|
2895
2984
|
if (onContextChange) {
|
|
@@ -2897,6 +2986,13 @@ function withBoard(board) {
|
|
|
2897
2986
|
}
|
|
2898
2987
|
onChange();
|
|
2899
2988
|
};
|
|
2989
|
+
board.afterChange = () => {
|
|
2990
|
+
const afterContextChange = BOARD_TO_AFTER_CHANGE.get(board);
|
|
2991
|
+
if (afterContextChange) {
|
|
2992
|
+
afterContextChange();
|
|
2993
|
+
}
|
|
2994
|
+
afterChange();
|
|
2995
|
+
};
|
|
2900
2996
|
return board;
|
|
2901
2997
|
}
|
|
2902
2998
|
|
|
@@ -2985,23 +3081,23 @@ function withHistory(board) {
|
|
|
2985
3081
|
}
|
|
2986
3082
|
|
|
2987
3083
|
function withHandPointer(board) {
|
|
2988
|
-
const {
|
|
3084
|
+
const { pointerDown, pointerMove, globalPointerUp, keydown, keyup } = board;
|
|
2989
3085
|
let isMoving = false;
|
|
2990
3086
|
const plaitBoardMove = {
|
|
2991
3087
|
x: 0,
|
|
2992
3088
|
y: 0
|
|
2993
3089
|
};
|
|
2994
|
-
board.
|
|
3090
|
+
board.pointerDown = (event) => {
|
|
2995
3091
|
if (PlaitBoard.isPointer(board, PlaitPointerType.hand) && isMainPointer(event)) {
|
|
2996
3092
|
isMoving = true;
|
|
2997
3093
|
PlaitBoard.getBoardContainer(board).classList.add('viewport-moving');
|
|
2998
3094
|
plaitBoardMove.x = event.x;
|
|
2999
3095
|
plaitBoardMove.y = event.y;
|
|
3000
3096
|
}
|
|
3001
|
-
|
|
3097
|
+
pointerDown(event);
|
|
3002
3098
|
};
|
|
3003
|
-
board.
|
|
3004
|
-
if (PlaitBoard.isPointer(board, PlaitPointerType.hand) &&
|
|
3099
|
+
board.pointerMove = (event) => {
|
|
3100
|
+
if (PlaitBoard.isPointer(board, PlaitPointerType.hand) && isMoving) {
|
|
3005
3101
|
const viewportContainer = PlaitBoard.getViewportContainer(board);
|
|
3006
3102
|
const left = viewportContainer.scrollLeft - (event.x - plaitBoardMove.x);
|
|
3007
3103
|
const top = viewportContainer.scrollTop - (event.y - plaitBoardMove.y);
|
|
@@ -3009,16 +3105,16 @@ function withHandPointer(board) {
|
|
|
3009
3105
|
plaitBoardMove.x = event.x;
|
|
3010
3106
|
plaitBoardMove.y = event.y;
|
|
3011
3107
|
}
|
|
3012
|
-
|
|
3108
|
+
pointerMove(event);
|
|
3013
3109
|
};
|
|
3014
|
-
board.
|
|
3015
|
-
if (
|
|
3110
|
+
board.globalPointerUp = (event) => {
|
|
3111
|
+
if (isMoving) {
|
|
3016
3112
|
isMoving = false;
|
|
3017
3113
|
PlaitBoard.getBoardContainer(board).classList.remove('viewport-moving');
|
|
3018
3114
|
plaitBoardMove.x = 0;
|
|
3019
3115
|
plaitBoardMove.y = 0;
|
|
3020
3116
|
}
|
|
3021
|
-
|
|
3117
|
+
globalPointerUp(event);
|
|
3022
3118
|
};
|
|
3023
3119
|
board.keydown = (event) => {
|
|
3024
3120
|
if (event.code === 'Space') {
|
|
@@ -3446,7 +3542,11 @@ function withMoving(board) {
|
|
|
3446
3542
|
const host = BOARD_TO_HOST.get(board);
|
|
3447
3543
|
const point = transformPoint(board, toPoint(event.x, event.y, host));
|
|
3448
3544
|
let movableElements = board.children.filter(item => board.isMovable(item));
|
|
3449
|
-
if (!PlaitBoard.isReadonly(board) &&
|
|
3545
|
+
if (!PlaitBoard.isReadonly(board) &&
|
|
3546
|
+
PlaitBoard.isPointer(board, PlaitPointerType.selection) &&
|
|
3547
|
+
movableElements.length &&
|
|
3548
|
+
!isPreventTouchMove(board) &&
|
|
3549
|
+
isMainPointer(event)) {
|
|
3450
3550
|
startPoint = point;
|
|
3451
3551
|
const selectedMovableElements = getSelectedElements(board).filter(item => movableElements.includes(item));
|
|
3452
3552
|
const hitElement = getHitElementByPoint(board, point);
|
|
@@ -3941,8 +4041,10 @@ class PlaitBoardComponent {
|
|
|
3941
4041
|
activeHost: elementActiveHost
|
|
3942
4042
|
});
|
|
3943
4043
|
BOARD_TO_ON_CHANGE.set(this.board, () => {
|
|
4044
|
+
this.update();
|
|
4045
|
+
});
|
|
4046
|
+
BOARD_TO_AFTER_CHANGE.set(this.board, () => {
|
|
3944
4047
|
this.ngZone.run(() => {
|
|
3945
|
-
this.detect();
|
|
3946
4048
|
const changeEvent = {
|
|
3947
4049
|
children: this.board.children,
|
|
3948
4050
|
operations: this.board.operations,
|
|
@@ -3959,7 +4061,7 @@ class PlaitBoardComponent {
|
|
|
3959
4061
|
ngAfterContentInit() {
|
|
3960
4062
|
this.initializeIslands();
|
|
3961
4063
|
}
|
|
3962
|
-
|
|
4064
|
+
update() {
|
|
3963
4065
|
this.effect = {};
|
|
3964
4066
|
this.cdr.detectChanges();
|
|
3965
4067
|
}
|
|
@@ -4429,5 +4531,5 @@ function createModModifierKeys() {
|
|
|
4429
4531
|
* Generated bundle index. Do not edit.
|
|
4430
4532
|
*/
|
|
4431
4533
|
|
|
4432
|
-
export { A, ACTIVE_MOVING_CLASS_NAME, ACTIVE_STROKE_WIDTH, ALT, APOSTROPHE, ATTACHED_ELEMENT_CLASS_NAME, AT_SIGN, B, BACKSLASH, BACKSPACE, BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_MOVING_POINT_IN_BOARD, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_TOUCH_REF, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, CoreTransforms, CursorClass, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, Direction, E, EIGHT, ELEMENT_TO_COMPONENT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FLUSHING, FOUR, G, H, HOME, HOST_CLASS_NAME, I, INSERT, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_MAC, IS_SAFARI, IS_TEXT_EDITABLE, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, MAX_RADIUS, MERGING, META, MUTE, N, NINE, NODE_TO_INDEX, NODE_TO_PARENT, NS, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PATH_REFS, PAUSE, PERIOD, PLUS_SIGN, POINTER_BUTTON, PRESS_AND_MOVE_BUFFER, PRINT_SCREEN, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElementComponent, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, RgbaToHEX, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SELECTION_RECTANGLE_CLASS_NAME, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, Selection, SoftThemeColor, StarryThemeColor, T, TAB, THREE, TILDE, TWO, ThemeColorMode, ThemeColors, Transforms, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, Viewport, W, X, Y, Z, ZERO, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, catmullRomFitting, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createMask, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createRect, createSVG, createSelectionRectangleG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, distanceBetweenPointAndSegments, downScale, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRectangle, drawRoundRectangle, fakeNodeWeakMap, findElements, getBoardRectangle, getClipboardByKey, getClipboardDataByMedia, getDataFromClipboard, getElementById, getElementHostBBox, getHitElementByPoint, getHitElementsBySelection, getIsRecursionFunc, getMovingElements, getNearestPointBetweenPointAndSegment, getNearestPointBetweenPointAndSegments, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getTemporaryRef, getTextFromClipboard, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, handleTouchTarget, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isInPlaitBoard, isLineHitLine, isMainPointer, isNullOrUndefined, isPointInEllipse, isPointInPolygon, isPointInRoundRectangle, isPolylineHitRectangle, isPreventTouchMove, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetViewportOperation, normalizePoint, preventTouchMove, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setClipboardData, setClipboardDataByMedia, setClipboardDataByText, setIsFromScrolling, setIsFromViewportChange, setPathStrokeLinecap, setSVGViewBox, setSelectionMoving, setStrokeLinecap, shouldClear, shouldMerge, shouldSave, temporaryDisableSelection, throttleRAF, toImage, toPoint, transformPoint, transformPoints, updateForeignObject, updateForeignObjectWidth, updateViewportByScrolling, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
|
|
4534
|
+
export { A, ACTIVE_MOVING_CLASS_NAME, ACTIVE_STROKE_WIDTH, ALT, APOSTROPHE, ATTACHED_ELEMENT_CLASS_NAME, AT_SIGN, B, BACKSLASH, BACKSPACE, BOARD_TO_AFTER_CHANGE, BOARD_TO_COMPONENT, BOARD_TO_ELEMENT_HOST, BOARD_TO_HOST, BOARD_TO_IS_SELECTION_MOVING, BOARD_TO_MOVING_ELEMENT, BOARD_TO_MOVING_POINT, BOARD_TO_MOVING_POINT_IN_BOARD, BOARD_TO_ON_CHANGE, BOARD_TO_ROUGH_SVG, BOARD_TO_SELECTED_ELEMENT, BOARD_TO_TEMPORARY_ELEMENTS, BOARD_TO_TOUCH_REF, BOARD_TO_VIEWPORT_ORIGINATION, BoardTransforms, C, CAPS_LOCK, CLIP_BOARD_FORMAT_KEY, CLOSE_SQUARE_BRACKET, COMMA, CONTEXT_MENU, CONTROL, ColorfulThemeColor, CoreTransforms, CursorClass, D, DASH, DELETE, DOWN_ARROW, DarkThemeColor, DefaultThemeColor, Direction, E, EIGHT, ELEMENT_TO_COMPONENT, END, ENTER, EQUALS, ESCAPE, F, F1, F10, F11, F12, F2, F3, F4, F5, F6, F7, F8, F9, FF_EQUALS, FF_MINUS, FF_MUTE, FF_SEMICOLON, FF_VOLUME_DOWN, FF_VOLUME_UP, FIRST_MEDIA, FIVE, FLUSHING, FOUR, G, H, HOME, HOST_CLASS_NAME, I, INSERT, IS_APPLE, IS_BOARD_CACHE, IS_CHROME, IS_CHROME_LEGACY, IS_EDGE_LEGACY, IS_FIREFOX, IS_IOS, IS_MAC, IS_SAFARI, IS_TEXT_EDITABLE, J, K, L, LAST_MEDIA, LEFT_ARROW, M, MAC_ENTER, MAC_META, MAC_WK_CMD_LEFT, MAC_WK_CMD_RIGHT, MAX_RADIUS, MERGING, META, MUTE, N, NINE, NODE_TO_INDEX, NODE_TO_PARENT, NS, NUMPAD_DIVIDE, NUMPAD_EIGHT, NUMPAD_FIVE, NUMPAD_FOUR, NUMPAD_MINUS, NUMPAD_MULTIPLY, NUMPAD_NINE, NUMPAD_ONE, NUMPAD_PERIOD, NUMPAD_PLUS, NUMPAD_SEVEN, NUMPAD_SIX, NUMPAD_THREE, NUMPAD_TWO, NUMPAD_ZERO, NUM_CENTER, NUM_LOCK, O, ONE, OPEN_SQUARE_BRACKET, P, PAGE_DOWN, PAGE_UP, PATH_REFS, PAUSE, PERIOD, PLUS_SIGN, POINTER_BUTTON, PRESS_AND_MOVE_BUFFER, PRINT_SCREEN, Path, PlaitBoard, PlaitBoardComponent, PlaitChildrenElementComponent, PlaitContextService, PlaitElement, PlaitElementComponent, PlaitHistoryBoard, PlaitIslandBaseComponent, PlaitIslandPopoverBaseComponent, PlaitNode, PlaitOperation, PlaitPluginElementComponent, PlaitPluginKey, PlaitPointerType, Point, Q, QUESTION_MARK, R, RIGHT_ARROW, RectangleClient, ResizeCursorClass, RetroThemeColor, RgbaToHEX, S, SAVING, SCROLL_BAR_WIDTH, SCROLL_LOCK, SELECTION_BORDER_COLOR, SELECTION_FILL_COLOR, SELECTION_RECTANGLE_CLASS_NAME, SEMICOLON, SEVEN, SHIFT, SINGLE_QUOTE, SIX, SLASH, SPACE, Selection, SoftThemeColor, StarryThemeColor, T, TAB, THREE, TILDE, TWO, ThemeColorMode, ThemeColors, Transforms, U, UP_ARROW, V, VOLUME_DOWN, VOLUME_UP, Viewport, W, X, Y, Z, ZERO, addMovingElements, addSelectedElement, arrowPoints, cacheMovingElements, cacheSelectedElements, catmullRomFitting, clampZoomLevel, clearNodeWeakMap, clearSelectedElement, clearSelectionMoving, clearViewportOrigination, createFakeEvent, createForeignObject, createG, createKeyboardEvent, createMask, createModModifierKeys, createMouseEvent, createPath, createPointerEvent, createRect, createSVG, createSelectionRectangleG, createTestingBoard, createText, createTouchEvent, debounce, deleteTemporaryElements, depthFirstRecursion, distanceBetweenPointAndPoint, distanceBetweenPointAndRectangle, distanceBetweenPointAndSegment, distanceBetweenPointAndSegments, downScale, downloadImage, drawArrow, drawBezierPath, drawCircle, drawLine, drawLinearPath, drawRectangle, drawRoundRectangle, fakeNodeWeakMap, findElements, getBoardRectangle, getClipboardByKey, getClipboardDataByMedia, getDataFromClipboard, getElementById, getElementHostBBox, getHitElementByPoint, getHitElementsBySelection, getIsRecursionFunc, getMovingElements, getNearestPointBetweenPointAndSegment, getNearestPointBetweenPointAndSegments, getRealScrollBarWidth, getRectangleByElements, getSelectedElements, getTemporaryElements, getTemporaryRef, getTextFromClipboard, getViewBox, getViewBoxCenterPoint, getViewportContainerRect, getViewportOrigination, handleTouchTarget, hasBeforeContextChange, hasInputOrTextareaTarget, hasOnBoardChange, hasOnContextChanged, hotkeys, idCreator, initializeViewBox, initializeViewportContainer, initializeViewportOffset, inverse, isDOMElement, isDOMNode, isFromScrolling, isFromViewportChange, isHandleSelection, isInPlaitBoard, isLineHitLine, isMainPointer, isMovingElements, isNullOrUndefined, isPointInEllipse, isPointInPolygon, isPointInRoundRectangle, isPolylineHitRectangle, isPreventTouchMove, isSecondaryPointer, isSelectedElement, isSelectionMoving, isSetSelectionOperation, isSetViewportOperation, normalizePoint, preventTouchMove, removeMovingElements, removeSelectedElement, rotate, scrollToRectangle, setClipboardData, setClipboardDataByMedia, setClipboardDataByText, setIsFromScrolling, setIsFromViewportChange, setPathStrokeLinecap, setSVGViewBox, setSelectionMoving, setStrokeLinecap, shouldClear, shouldMerge, shouldSave, temporaryDisableSelection, throttleRAF, toImage, toPoint, toSVGScreenPoint, toScreenPoint, transformPoint, transformPoints, updateForeignObject, updateForeignObjectWidth, updateViewportByScrolling, updateViewportContainerScroll, updateViewportOffset, updateViewportOrigination, withMoving, withOptions, withSelection };
|
|
4433
4535
|
//# sourceMappingURL=plait-core.mjs.map
|