@idraw/core 0.4.0-beta.9 → 0.4.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/dist/esm/board/index.d.ts +44 -0
- package/dist/esm/board/index.js +366 -0
- package/dist/esm/board/sharer.d.ts +21 -0
- package/dist/esm/board/sharer.js +101 -0
- package/dist/esm/board/viewer.d.ts +32 -0
- package/dist/esm/board/viewer.js +165 -0
- package/dist/esm/board/watcher.d.ts +15 -0
- package/dist/esm/board/watcher.js +218 -0
- package/dist/esm/config.d.ts +28 -0
- package/dist/esm/config.js +34 -0
- package/dist/esm/{lib → cursor}/cursor-image.d.ts +1 -0
- package/dist/esm/{lib → cursor}/cursor-image.js +1 -0
- package/dist/esm/cursor/cursor.d.ts +7 -0
- package/dist/esm/cursor/cursor.js +154 -0
- package/dist/esm/index.d.ts +39 -10
- package/dist/esm/index.js +296 -17
- package/dist/esm/middlewares/dragger/index.d.ts +7 -0
- package/dist/esm/{middleware → middlewares}/dragger/index.js +4 -3
- package/dist/esm/middlewares/info/config.d.ts +5 -0
- package/dist/esm/middlewares/info/config.js +9 -0
- package/dist/esm/middlewares/info/draw-info.d.ts +29 -0
- package/dist/esm/middlewares/info/draw-info.js +113 -0
- package/dist/esm/middlewares/info/index.d.ts +9 -0
- package/dist/esm/middlewares/info/index.js +131 -0
- package/dist/esm/middlewares/info/types.d.ts +3 -0
- package/dist/esm/middlewares/info/types.js +1 -0
- package/dist/esm/middlewares/layout-selector/config.d.ts +11 -0
- package/dist/esm/middlewares/layout-selector/config.js +12 -0
- package/dist/esm/middlewares/layout-selector/index.d.ts +5 -0
- package/dist/esm/middlewares/layout-selector/index.js +371 -0
- package/dist/esm/middlewares/layout-selector/types.d.ts +17 -0
- package/dist/esm/middlewares/layout-selector/types.js +2 -0
- package/dist/esm/middlewares/layout-selector/util.d.ts +9 -0
- package/dist/esm/middlewares/layout-selector/util.js +78 -0
- package/dist/esm/middlewares/pointer/index.d.ts +3 -0
- package/dist/esm/middlewares/pointer/index.js +42 -0
- package/dist/esm/middlewares/pointer/types.d.ts +3 -0
- package/dist/esm/middlewares/pointer/types.js +1 -0
- package/dist/esm/middlewares/ruler/config.d.ts +7 -0
- package/dist/esm/middlewares/ruler/config.js +21 -0
- package/dist/esm/middlewares/ruler/index.d.ts +3 -0
- package/dist/esm/middlewares/ruler/index.js +66 -0
- package/dist/esm/middlewares/ruler/types.d.ts +3 -0
- package/dist/esm/middlewares/ruler/types.js +1 -0
- package/dist/esm/{middleware → middlewares}/ruler/util.d.ts +20 -4
- package/dist/esm/{middleware → middlewares}/ruler/util.js +99 -26
- package/dist/esm/middlewares/scaler/index.d.ts +2 -0
- package/dist/esm/{middleware → middlewares}/scaler/index.js +2 -2
- package/dist/esm/{middleware → middlewares}/scroller/config.d.ts +4 -0
- package/dist/esm/middlewares/scroller/config.js +16 -0
- package/dist/esm/middlewares/scroller/index.d.ts +3 -0
- package/dist/esm/{middleware → middlewares}/scroller/index.js +47 -6
- package/dist/esm/middlewares/scroller/types.d.ts +11 -0
- package/dist/esm/middlewares/scroller/types.js +1 -0
- package/dist/esm/{middleware → middlewares}/scroller/util.d.ts +3 -2
- package/dist/esm/{middleware → middlewares}/scroller/util.js +33 -44
- package/dist/esm/{middleware → middlewares}/selector/config.d.ts +9 -1
- package/dist/esm/{middleware → middlewares}/selector/config.js +17 -1
- package/dist/esm/middlewares/selector/draw-auxiliary.d.ts +1 -0
- package/dist/esm/middlewares/selector/draw-auxiliary.js +12 -0
- package/dist/esm/middlewares/selector/draw-base.d.ts +30 -0
- package/dist/esm/middlewares/selector/draw-base.js +100 -0
- package/dist/esm/middlewares/selector/draw-debug.d.ts +5 -0
- package/dist/esm/middlewares/selector/draw-debug.js +30 -0
- package/dist/esm/middlewares/selector/draw-reference.d.ts +7 -0
- package/dist/esm/middlewares/selector/draw-reference.js +31 -0
- package/dist/esm/{middleware → middlewares}/selector/draw-wrapper.d.ts +16 -1
- package/dist/esm/middlewares/selector/draw-wrapper.js +139 -0
- package/dist/esm/middlewares/selector/index.d.ts +11 -0
- package/dist/esm/middlewares/selector/index.js +879 -0
- package/dist/esm/middlewares/selector/pattern/icon-rotate.d.ts +4 -0
- package/dist/esm/middlewares/selector/pattern/icon-rotate.js +88 -0
- package/dist/esm/middlewares/selector/pattern/index.d.ts +8 -0
- package/dist/esm/middlewares/selector/pattern/index.js +38 -0
- package/dist/esm/middlewares/selector/reference.d.ts +13 -0
- package/dist/esm/middlewares/selector/reference.js +267 -0
- package/dist/esm/{middleware → middlewares}/selector/types.d.ts +11 -5
- package/dist/esm/middlewares/selector/types.js +2 -0
- package/dist/esm/{middleware → middlewares}/selector/util.d.ts +14 -7
- package/dist/esm/{middleware → middlewares}/selector/util.js +46 -43
- package/dist/esm/middlewares/text-editor/index.d.ts +20 -0
- package/dist/esm/middlewares/text-editor/index.js +286 -0
- package/dist/esm/record.d.ts +5 -0
- package/dist/esm/record.js +38 -0
- package/dist/index.global.js +5740 -1632
- package/dist/index.global.min.js +1 -1
- package/package.json +5 -6
- package/dist/esm/lib/cursor.d.ts +0 -16
- package/dist/esm/lib/cursor.js +0 -129
- package/dist/esm/middleware/dragger/index.d.ts +0 -7
- package/dist/esm/middleware/ruler/index.d.ts +0 -3
- package/dist/esm/middleware/ruler/index.js +0 -48
- package/dist/esm/middleware/scaler/index.d.ts +0 -3
- package/dist/esm/middleware/scroller/config.js +0 -6
- package/dist/esm/middleware/scroller/index.d.ts +0 -2
- package/dist/esm/middleware/selector/draw-wrapper.js +0 -107
- package/dist/esm/middleware/selector/index.d.ts +0 -5
- package/dist/esm/middleware/selector/index.js +0 -510
- package/dist/esm/middleware/selector/types.js +0 -1
- package/dist/esm/middleware/text-editor/index.d.ts +0 -3
- package/dist/esm/middleware/text-editor/index.js +0 -147
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { calcElementCenter, rotateElementVertexes, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcViewPointSize,
|
|
1
|
+
import { calcElementCenter, rotateElementVertexes, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcViewPointSize, calcViewElementSize, rotatePoint, parseAngleToRadian, parseRadianToAngle, limitAngle, calcRadian } from '@idraw/util';
|
|
2
2
|
function parseRadian(angle) {
|
|
3
3
|
return (angle * Math.PI) / 180;
|
|
4
4
|
}
|
|
@@ -9,11 +9,11 @@ function changeMoveDistDirect(moveDist, moveDirect) {
|
|
|
9
9
|
return moveDirect > 0 ? Math.abs(moveDist) : 0 - Math.abs(moveDist);
|
|
10
10
|
}
|
|
11
11
|
export function isPointInViewActiveVertexes(p, opts) {
|
|
12
|
-
const { ctx, viewScaleInfo,
|
|
13
|
-
const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo
|
|
14
|
-
const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo
|
|
15
|
-
const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo
|
|
16
|
-
const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo
|
|
12
|
+
const { ctx, viewScaleInfo, vertexes } = opts;
|
|
13
|
+
const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo });
|
|
14
|
+
const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo });
|
|
15
|
+
const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo });
|
|
16
|
+
const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo });
|
|
17
17
|
ctx.beginPath();
|
|
18
18
|
ctx.moveTo(v0.x, v0.y);
|
|
19
19
|
ctx.lineTo(v1.x, v1.y);
|
|
@@ -39,7 +39,7 @@ export function isPointInViewActiveGroup(p, opts) {
|
|
|
39
39
|
return isPointInViewActiveVertexes(p, { ctx, vertexes, viewScaleInfo, viewSizeInfo });
|
|
40
40
|
}
|
|
41
41
|
export function getPointTarget(p, opts) {
|
|
42
|
-
var _a, _b, _c;
|
|
42
|
+
var _a, _b, _c, _d, _e;
|
|
43
43
|
const target = {
|
|
44
44
|
type: null,
|
|
45
45
|
elements: [],
|
|
@@ -49,8 +49,11 @@ export function getPointTarget(p, opts) {
|
|
|
49
49
|
};
|
|
50
50
|
const { ctx, data, calculator, selectedElements, viewScaleInfo, viewSizeInfo, areaSize, groupQueue, selectedElementController } = opts;
|
|
51
51
|
if (selectedElementController) {
|
|
52
|
-
const { left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight } = selectedElementController;
|
|
52
|
+
const { left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight, rotate } = selectedElementController;
|
|
53
53
|
const ctrls = [left, right, top, bottom, topLeft, topRight, bottomLeft, bottomRight];
|
|
54
|
+
if ((selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.length) === 1 && ((_b = (_a = selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements[0]) === null || _a === void 0 ? void 0 : _a.operations) === null || _b === void 0 ? void 0 : _b.rotatable) !== false) {
|
|
55
|
+
ctrls.push(rotate);
|
|
56
|
+
}
|
|
54
57
|
for (let i = 0; i < ctrls.length; i++) {
|
|
55
58
|
const ctrl = ctrls[i];
|
|
56
59
|
if (isPointInViewActiveVertexes(p, { ctx, vertexes: ctrl.vertexes, viewSizeInfo, viewScaleInfo })) {
|
|
@@ -58,6 +61,7 @@ export function getPointTarget(p, opts) {
|
|
|
58
61
|
if (selectedElements && (selectedElements === null || selectedElements === void 0 ? void 0 : selectedElements.length) > 0) {
|
|
59
62
|
target.groupQueue = groupQueue || [];
|
|
60
63
|
target.elements = [selectedElements[0]];
|
|
64
|
+
return target;
|
|
61
65
|
}
|
|
62
66
|
break;
|
|
63
67
|
}
|
|
@@ -65,7 +69,7 @@ export function getPointTarget(p, opts) {
|
|
|
65
69
|
}
|
|
66
70
|
if (groupQueue && Array.isArray(groupQueue) && groupQueue.length > 0) {
|
|
67
71
|
const lastGroup = groupQueue[groupQueue.length - 1];
|
|
68
|
-
if (((
|
|
72
|
+
if (((_c = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _c === void 0 ? void 0 : _c.children) && Array.isArray((_d = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _d === void 0 ? void 0 : _d.children)) {
|
|
69
73
|
for (let i = lastGroup.detail.children.length - 1; i >= 0; i--) {
|
|
70
74
|
const child = lastGroup.detail.children[i];
|
|
71
75
|
const vertexes = calcElementVertexesInGroup(child, { groupQueue });
|
|
@@ -94,7 +98,7 @@ export function getPointTarget(p, opts) {
|
|
|
94
98
|
}
|
|
95
99
|
if (data) {
|
|
96
100
|
const { index, element } = calculator.getPointElement(p, { data, viewScaleInfo, viewSizeInfo });
|
|
97
|
-
if (index >= 0 && element && ((
|
|
101
|
+
if (index >= 0 && element && ((_e = element === null || element === void 0 ? void 0 : element.operations) === null || _e === void 0 ? void 0 : _e.invisible) !== true) {
|
|
98
102
|
target.elements = [element];
|
|
99
103
|
target.type = 'over-element';
|
|
100
104
|
return target;
|
|
@@ -410,7 +414,8 @@ export function resizeElement(elem, opts) {
|
|
|
410
414
|
let centerY = elemCenter.y;
|
|
411
415
|
if (angle < 90) {
|
|
412
416
|
moveVerticalDist = 0 - changeMoveDistDirect(moveVerticalDist, moveVerticalY);
|
|
413
|
-
moveHorizontalDist =
|
|
417
|
+
moveHorizontalDist =
|
|
418
|
+
0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
|
|
414
419
|
const centerMoveVerticalDist = moveVerticalDist / 2;
|
|
415
420
|
centerX = centerX + centerMoveVerticalDist * Math.sin(radian);
|
|
416
421
|
centerY = centerY - centerMoveVerticalDist * Math.cos(radian);
|
|
@@ -545,7 +550,8 @@ export function resizeElement(elem, opts) {
|
|
|
545
550
|
let centerY = elemCenter.y;
|
|
546
551
|
if (angle < 90) {
|
|
547
552
|
moveVerticalDist = changeMoveDistDirect(moveVerticalDist, moveVerticalY);
|
|
548
|
-
moveHorizontalDist =
|
|
553
|
+
moveHorizontalDist =
|
|
554
|
+
0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
|
|
549
555
|
const radian = parseRadian(angle);
|
|
550
556
|
const centerMoveVerticalDist = moveVerticalDist / 2;
|
|
551
557
|
centerX = centerX - centerMoveVerticalDist * Math.sin(radian);
|
|
@@ -671,11 +677,29 @@ export function resizeElement(elem, opts) {
|
|
|
671
677
|
}
|
|
672
678
|
return { x, y, w, h, angle: elem.angle };
|
|
673
679
|
}
|
|
680
|
+
export function rotateElement(elem, opts) {
|
|
681
|
+
const { x, y, w, h, angle = 0 } = elem;
|
|
682
|
+
const { center, start, end, viewScaleInfo } = opts;
|
|
683
|
+
const elemCenter = calcViewPointSize(center, {
|
|
684
|
+
viewScaleInfo
|
|
685
|
+
});
|
|
686
|
+
const startAngle = limitAngle(angle);
|
|
687
|
+
const changedRadian = calcRadian(elemCenter, start, end);
|
|
688
|
+
const endAngle = limitAngle(startAngle + parseRadianToAngle(changedRadian));
|
|
689
|
+
return {
|
|
690
|
+
x,
|
|
691
|
+
y,
|
|
692
|
+
w,
|
|
693
|
+
h,
|
|
694
|
+
angle: endAngle
|
|
695
|
+
};
|
|
696
|
+
}
|
|
674
697
|
export function getSelectedListArea(data, opts) {
|
|
698
|
+
var _a;
|
|
675
699
|
const indexes = [];
|
|
676
700
|
const uuids = [];
|
|
677
701
|
const elements = [];
|
|
678
|
-
const {
|
|
702
|
+
const { viewScaleInfo, start, end } = opts;
|
|
679
703
|
if (!(Array.isArray(data.elements) && start && end)) {
|
|
680
704
|
return { indexes, uuids, elements };
|
|
681
705
|
}
|
|
@@ -683,8 +707,12 @@ export function getSelectedListArea(data, opts) {
|
|
|
683
707
|
const endX = Math.max(start.x, end.x);
|
|
684
708
|
const startY = Math.min(start.y, end.y);
|
|
685
709
|
const endY = Math.max(start.y, end.y);
|
|
686
|
-
data.elements.
|
|
687
|
-
const
|
|
710
|
+
for (let idx = 0; idx < data.elements.length; idx++) {
|
|
711
|
+
const elem = data.elements[idx];
|
|
712
|
+
if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.locked) === true) {
|
|
713
|
+
continue;
|
|
714
|
+
}
|
|
715
|
+
const elemSize = calcViewElementSize(elem, { viewScaleInfo });
|
|
688
716
|
const center = calcElementCenter(elemSize);
|
|
689
717
|
if (center.x >= startX && center.x <= endX && center.y >= startY && center.y <= endY) {
|
|
690
718
|
indexes.push(idx);
|
|
@@ -702,7 +730,7 @@ export function getSelectedListArea(data, opts) {
|
|
|
702
730
|
}
|
|
703
731
|
}
|
|
704
732
|
}
|
|
705
|
-
}
|
|
733
|
+
}
|
|
706
734
|
return { indexes, uuids, elements };
|
|
707
735
|
}
|
|
708
736
|
export function calcSelectedElementsArea(elements, opts) {
|
|
@@ -711,14 +739,14 @@ export function calcSelectedElementsArea(elements, opts) {
|
|
|
711
739
|
return null;
|
|
712
740
|
}
|
|
713
741
|
const area = { x: 0, y: 0, w: 0, h: 0 };
|
|
714
|
-
const {
|
|
742
|
+
const { viewScaleInfo } = opts;
|
|
715
743
|
let prevElemSize = null;
|
|
716
744
|
for (let i = 0; i < elements.length; i++) {
|
|
717
745
|
const elem = elements[i];
|
|
718
746
|
if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
|
|
719
747
|
continue;
|
|
720
748
|
}
|
|
721
|
-
const elemSize =
|
|
749
|
+
const elemSize = calcViewElementSize(elem, { viewScaleInfo });
|
|
722
750
|
if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
|
|
723
751
|
const ves = rotateElementVertexes(elemSize);
|
|
724
752
|
if (ves.length === 4) {
|
|
@@ -762,28 +790,3 @@ export function isElementInGroup(elem, group) {
|
|
|
762
790
|
}
|
|
763
791
|
return false;
|
|
764
792
|
}
|
|
765
|
-
export function calcMoveInGroup(start, end, groupQueue) {
|
|
766
|
-
let moveX = end.x - start.x;
|
|
767
|
-
let moveY = end.y - start.y;
|
|
768
|
-
const pointGroupQueue = [];
|
|
769
|
-
groupQueue.forEach((group) => {
|
|
770
|
-
const { x, y, w, h, angle = 0 } = group;
|
|
771
|
-
pointGroupQueue.push({
|
|
772
|
-
x,
|
|
773
|
-
y,
|
|
774
|
-
w,
|
|
775
|
-
h,
|
|
776
|
-
angle: 0 - angle
|
|
777
|
-
});
|
|
778
|
-
});
|
|
779
|
-
if ((groupQueue === null || groupQueue === void 0 ? void 0 : groupQueue.length) > 0) {
|
|
780
|
-
const startInGroup = rotatePointInGroup(start, pointGroupQueue);
|
|
781
|
-
const endInGroup = rotatePointInGroup(end, pointGroupQueue);
|
|
782
|
-
moveX = endInGroup.x - startInGroup.x;
|
|
783
|
-
moveY = endInGroup.y - startInGroup.y;
|
|
784
|
-
}
|
|
785
|
-
return {
|
|
786
|
-
moveX,
|
|
787
|
-
moveY
|
|
788
|
-
};
|
|
789
|
-
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Middleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
|
|
2
|
+
import { coreEventKeys } from '../../config';
|
|
3
|
+
type TextEditEvent = {
|
|
4
|
+
element: Element<'text'>;
|
|
5
|
+
position: ElementPosition;
|
|
6
|
+
groupQueue: Element<'group'>[];
|
|
7
|
+
viewScaleInfo: ViewScaleInfo;
|
|
8
|
+
};
|
|
9
|
+
type TextChangeEvent = {
|
|
10
|
+
element: {
|
|
11
|
+
uuid: string;
|
|
12
|
+
detail: {
|
|
13
|
+
text: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
position: ElementPosition;
|
|
17
|
+
};
|
|
18
|
+
type ExtendEventMap = Record<typeof coreEventKeys.TEXT_EDIT, TextEditEvent> & Record<typeof coreEventKeys.TEXT_CHANGE, TextChangeEvent>;
|
|
19
|
+
export declare const MiddlewareTextEditor: Middleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy, updateElementInList } from '@idraw/util';
|
|
2
|
+
import { coreEventKeys } from '../../config';
|
|
3
|
+
const defaultElementDetail = getDefaultElementDetailConfig();
|
|
4
|
+
export const MiddlewareTextEditor = (opts) => {
|
|
5
|
+
const { eventHub, boardContent, viewer, sharer, calculator } = opts;
|
|
6
|
+
const canvas = boardContent.boardContext.canvas;
|
|
7
|
+
const container = opts.container || document.body;
|
|
8
|
+
let textarea = document.createElement('div');
|
|
9
|
+
textarea.setAttribute('contenteditable', 'true');
|
|
10
|
+
let canvasWrapper = document.createElement('div');
|
|
11
|
+
let mask = document.createElement('div');
|
|
12
|
+
let activeElem = null;
|
|
13
|
+
let activePosition = [];
|
|
14
|
+
let originText = '';
|
|
15
|
+
const id = `idraw-middleware-text-editor-${Math.random().toString(26).substring(2)}`;
|
|
16
|
+
mask.setAttribute('id', id);
|
|
17
|
+
canvasWrapper.appendChild(textarea);
|
|
18
|
+
canvasWrapper.style.position = 'absolute';
|
|
19
|
+
mask.appendChild(canvasWrapper);
|
|
20
|
+
mask.style.position = 'fixed';
|
|
21
|
+
mask.style.top = '0';
|
|
22
|
+
mask.style.bottom = '0';
|
|
23
|
+
mask.style.left = '0';
|
|
24
|
+
mask.style.right = '0';
|
|
25
|
+
mask.style.display = 'none';
|
|
26
|
+
container.appendChild(mask);
|
|
27
|
+
const showTextArea = (e) => {
|
|
28
|
+
resetCanvasWrapper();
|
|
29
|
+
resetTextArea(e);
|
|
30
|
+
mask.style.display = 'block';
|
|
31
|
+
originText = '';
|
|
32
|
+
if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
|
|
33
|
+
sharer.setActiveOverrideElemenentMap({
|
|
34
|
+
[activeElem.uuid]: {
|
|
35
|
+
operations: { invisible: true }
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
originText = activeElem.detail.text || '';
|
|
39
|
+
viewer.drawFrame();
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const hideTextArea = () => {
|
|
43
|
+
if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
|
|
44
|
+
const map = sharer.getActiveOverrideElemenentMap();
|
|
45
|
+
if (map) {
|
|
46
|
+
delete map[activeElem.uuid];
|
|
47
|
+
}
|
|
48
|
+
sharer.setActiveOverrideElemenentMap(map);
|
|
49
|
+
viewer.drawFrame();
|
|
50
|
+
}
|
|
51
|
+
mask.style.display = 'none';
|
|
52
|
+
activeElem = null;
|
|
53
|
+
activePosition = [];
|
|
54
|
+
};
|
|
55
|
+
const getCanvasRect = () => {
|
|
56
|
+
const clientRect = canvas.getBoundingClientRect();
|
|
57
|
+
const { left, top, width, height } = clientRect;
|
|
58
|
+
return { left, top, width, height };
|
|
59
|
+
};
|
|
60
|
+
const createBox = (opts) => {
|
|
61
|
+
const { size, parent } = opts;
|
|
62
|
+
const div = document.createElement('div');
|
|
63
|
+
const { x, y, w, h } = size;
|
|
64
|
+
const angle = limitAngle(size.angle || 0);
|
|
65
|
+
div.style.position = 'absolute';
|
|
66
|
+
div.style.left = `${x}px`;
|
|
67
|
+
div.style.top = `${y}px`;
|
|
68
|
+
div.style.width = `${w}px`;
|
|
69
|
+
div.style.height = `${h}px`;
|
|
70
|
+
div.style.transform = `rotate(${angle}deg)`;
|
|
71
|
+
parent.appendChild(div);
|
|
72
|
+
return div;
|
|
73
|
+
};
|
|
74
|
+
const resetTextArea = (e) => {
|
|
75
|
+
const { viewScaleInfo, element, groupQueue } = e;
|
|
76
|
+
const { scale, offsetTop, offsetLeft } = viewScaleInfo;
|
|
77
|
+
if (canvasWrapper.children) {
|
|
78
|
+
Array.from(canvasWrapper.children).forEach((child) => {
|
|
79
|
+
child.remove();
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
let parent = canvasWrapper;
|
|
83
|
+
for (let i = 0; i < groupQueue.length; i++) {
|
|
84
|
+
const group = groupQueue[i];
|
|
85
|
+
const { x, y, w, h } = group;
|
|
86
|
+
const angle = limitAngle(group.angle || 0);
|
|
87
|
+
const size = {
|
|
88
|
+
x: x * scale,
|
|
89
|
+
y: y * scale,
|
|
90
|
+
w: w * scale,
|
|
91
|
+
h: h * scale,
|
|
92
|
+
angle
|
|
93
|
+
};
|
|
94
|
+
if (i === 0) {
|
|
95
|
+
size.x += offsetLeft;
|
|
96
|
+
size.y += offsetTop;
|
|
97
|
+
}
|
|
98
|
+
parent = createBox({ size, parent });
|
|
99
|
+
}
|
|
100
|
+
const detail = Object.assign(Object.assign({}, defaultElementDetail), element.detail);
|
|
101
|
+
let elemX = element.x * scale + offsetLeft;
|
|
102
|
+
let elemY = element.y * scale + offsetTop;
|
|
103
|
+
let elemW = element.w * scale;
|
|
104
|
+
let elemH = element.h * scale;
|
|
105
|
+
if (groupQueue.length > 0) {
|
|
106
|
+
elemX = element.x * scale;
|
|
107
|
+
elemY = element.y * scale;
|
|
108
|
+
elemW = element.w * scale;
|
|
109
|
+
elemH = element.h * scale;
|
|
110
|
+
}
|
|
111
|
+
let justifyContent = 'center';
|
|
112
|
+
let alignItems = 'center';
|
|
113
|
+
if (detail.textAlign === 'left') {
|
|
114
|
+
justifyContent = 'start';
|
|
115
|
+
}
|
|
116
|
+
else if (detail.textAlign === 'right') {
|
|
117
|
+
justifyContent = 'end';
|
|
118
|
+
}
|
|
119
|
+
if (detail.verticalAlign === 'top') {
|
|
120
|
+
alignItems = 'start';
|
|
121
|
+
}
|
|
122
|
+
else if (detail.verticalAlign === 'bottom') {
|
|
123
|
+
alignItems = 'end';
|
|
124
|
+
}
|
|
125
|
+
textarea.style.display = 'inline-flex';
|
|
126
|
+
textarea.style.justifyContent = justifyContent;
|
|
127
|
+
textarea.style.alignItems = alignItems;
|
|
128
|
+
textarea.style.position = 'absolute';
|
|
129
|
+
textarea.style.left = `${elemX - 1}px`;
|
|
130
|
+
textarea.style.top = `${elemY - 1}px`;
|
|
131
|
+
textarea.style.width = `${elemW + 2}px`;
|
|
132
|
+
textarea.style.height = `${elemH + 2}px`;
|
|
133
|
+
textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
|
|
134
|
+
textarea.style.boxSizing = 'border-box';
|
|
135
|
+
textarea.style.border = '1px solid #1973ba';
|
|
136
|
+
textarea.style.resize = 'none';
|
|
137
|
+
textarea.style.overflow = 'hidden';
|
|
138
|
+
textarea.style.wordBreak = 'break-all';
|
|
139
|
+
textarea.style.borderRadius = `${(typeof detail.borderRadius === 'number' ? detail.borderRadius : 0) * scale}px`;
|
|
140
|
+
textarea.style.background = `${detail.background || 'transparent'}`;
|
|
141
|
+
textarea.style.color = `${detail.color || '#333333'}`;
|
|
142
|
+
textarea.style.fontSize = `${detail.fontSize * scale}px`;
|
|
143
|
+
textarea.style.lineHeight = `${(detail.lineHeight || detail.fontSize) * scale}px`;
|
|
144
|
+
textarea.style.fontFamily = enhanceFontFamliy(detail.fontFamily);
|
|
145
|
+
textarea.style.fontWeight = `${detail.fontWeight}`;
|
|
146
|
+
textarea.style.padding = '0';
|
|
147
|
+
textarea.style.margin = '0';
|
|
148
|
+
textarea.style.outline = 'none';
|
|
149
|
+
textarea.innerText = detail.text || '';
|
|
150
|
+
parent.appendChild(textarea);
|
|
151
|
+
};
|
|
152
|
+
const resetCanvasWrapper = () => {
|
|
153
|
+
const { left, top, width, height } = getCanvasRect();
|
|
154
|
+
canvasWrapper.style.position = 'absolute';
|
|
155
|
+
canvasWrapper.style.overflow = 'hidden';
|
|
156
|
+
canvasWrapper.style.top = `${top}px`;
|
|
157
|
+
canvasWrapper.style.left = `${left}px`;
|
|
158
|
+
canvasWrapper.style.width = `${width}px`;
|
|
159
|
+
canvasWrapper.style.height = `${height}px`;
|
|
160
|
+
};
|
|
161
|
+
const maskClickEvent = () => {
|
|
162
|
+
hideTextArea();
|
|
163
|
+
};
|
|
164
|
+
const textareaClickEvent = (e) => {
|
|
165
|
+
e.stopPropagation();
|
|
166
|
+
};
|
|
167
|
+
const textareaInputEvent = () => {
|
|
168
|
+
if (activeElem && activePosition) {
|
|
169
|
+
activeElem.detail.text = textarea.innerText || '';
|
|
170
|
+
eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
|
|
171
|
+
element: {
|
|
172
|
+
uuid: activeElem.uuid,
|
|
173
|
+
detail: {
|
|
174
|
+
text: activeElem.detail.text
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
position: [...(activePosition || [])]
|
|
178
|
+
});
|
|
179
|
+
calculator.modifyText(activeElem);
|
|
180
|
+
viewer.drawFrame();
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
const textareaBlurEvent = () => {
|
|
184
|
+
if (activeElem && activePosition) {
|
|
185
|
+
activeElem.detail.text = textarea.innerText || '';
|
|
186
|
+
eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
|
|
187
|
+
element: {
|
|
188
|
+
uuid: activeElem.uuid,
|
|
189
|
+
detail: {
|
|
190
|
+
text: activeElem.detail.text
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
position: [...activePosition]
|
|
194
|
+
});
|
|
195
|
+
const data = sharer.getActiveStorage('data') || { elements: [] };
|
|
196
|
+
const updateContent = {
|
|
197
|
+
detail: {
|
|
198
|
+
text: activeElem.detail.text
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
updateElementInList(activeElem.uuid, updateContent, data.elements);
|
|
202
|
+
eventHub.trigger(coreEventKeys.CHANGE, {
|
|
203
|
+
selectedElements: [
|
|
204
|
+
Object.assign(Object.assign({}, activeElem), { detail: Object.assign(Object.assign({}, activeElem.detail), updateContent.detail) })
|
|
205
|
+
],
|
|
206
|
+
data,
|
|
207
|
+
type: 'modifyElement',
|
|
208
|
+
modifyRecord: {
|
|
209
|
+
type: 'modifyElement',
|
|
210
|
+
time: Date.now(),
|
|
211
|
+
content: {
|
|
212
|
+
method: 'modifyElement',
|
|
213
|
+
uuid: activeElem.uuid,
|
|
214
|
+
before: {
|
|
215
|
+
'detail.text': originText
|
|
216
|
+
},
|
|
217
|
+
after: {
|
|
218
|
+
'detail.text': activeElem.detail.text
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
calculator.modifyText(activeElem);
|
|
224
|
+
viewer.drawFrame();
|
|
225
|
+
}
|
|
226
|
+
hideTextArea();
|
|
227
|
+
};
|
|
228
|
+
const textareaKeyDownEvent = (e) => {
|
|
229
|
+
e.stopPropagation();
|
|
230
|
+
};
|
|
231
|
+
const textareaKeyPressEvent = (e) => {
|
|
232
|
+
e.stopPropagation();
|
|
233
|
+
};
|
|
234
|
+
const textareaKeyUpEvent = (e) => {
|
|
235
|
+
e.stopPropagation();
|
|
236
|
+
};
|
|
237
|
+
const textareaWheelEvent = (e) => {
|
|
238
|
+
e.stopPropagation();
|
|
239
|
+
e.preventDefault();
|
|
240
|
+
};
|
|
241
|
+
mask.addEventListener('click', maskClickEvent);
|
|
242
|
+
textarea.addEventListener('click', textareaClickEvent);
|
|
243
|
+
textarea.addEventListener('input', textareaInputEvent);
|
|
244
|
+
textarea.addEventListener('blur', textareaBlurEvent);
|
|
245
|
+
textarea.addEventListener('keydown', textareaKeyDownEvent);
|
|
246
|
+
textarea.addEventListener('keypress', textareaKeyPressEvent);
|
|
247
|
+
textarea.addEventListener('keyup', textareaKeyUpEvent);
|
|
248
|
+
textarea.addEventListener('wheel', textareaWheelEvent);
|
|
249
|
+
const textEditCallback = (e) => {
|
|
250
|
+
var _a;
|
|
251
|
+
if ((e === null || e === void 0 ? void 0 : e.position) && (e === null || e === void 0 ? void 0 : e.element) && ((_a = e === null || e === void 0 ? void 0 : e.element) === null || _a === void 0 ? void 0 : _a.type) === 'text') {
|
|
252
|
+
activeElem = e.element;
|
|
253
|
+
activePosition = e.position;
|
|
254
|
+
}
|
|
255
|
+
showTextArea(e);
|
|
256
|
+
};
|
|
257
|
+
return {
|
|
258
|
+
name: '@middleware/text-editor',
|
|
259
|
+
use() {
|
|
260
|
+
eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
|
|
261
|
+
},
|
|
262
|
+
disuse() {
|
|
263
|
+
eventHub.off(coreEventKeys.TEXT_EDIT, textEditCallback);
|
|
264
|
+
mask.removeEventListener('click', maskClickEvent);
|
|
265
|
+
textarea.removeEventListener('click', textareaClickEvent);
|
|
266
|
+
textarea.removeEventListener('input', textareaInputEvent);
|
|
267
|
+
textarea.removeEventListener('blur', textareaBlurEvent);
|
|
268
|
+
textarea.removeEventListener('keydown', textareaKeyDownEvent);
|
|
269
|
+
textarea.removeEventListener('keypress', textareaKeyPressEvent);
|
|
270
|
+
textarea.removeEventListener('keyup', textareaKeyUpEvent);
|
|
271
|
+
textarea.removeEventListener('wheel', textareaWheelEvent);
|
|
272
|
+
canvasWrapper.removeChild(textarea);
|
|
273
|
+
mask.removeChild(canvasWrapper);
|
|
274
|
+
container.removeChild(mask);
|
|
275
|
+
textarea.remove();
|
|
276
|
+
canvasWrapper.remove();
|
|
277
|
+
mask = null;
|
|
278
|
+
textarea = null;
|
|
279
|
+
canvasWrapper = null;
|
|
280
|
+
mask = null;
|
|
281
|
+
activeElem = null;
|
|
282
|
+
activePosition = null;
|
|
283
|
+
originText = null;
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RecursivePartial, Element, ModifyRecord } from '@idraw/types';
|
|
2
|
+
export declare function getModifyElementRecord(opts: {
|
|
3
|
+
modifiedElement: RecursivePartial<Omit<Element, 'uuid'>> & Pick<Element, 'uuid'>;
|
|
4
|
+
beforeElement: Element;
|
|
5
|
+
}): ModifyRecord<'modifyElement'>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { toFlattenElement, get } from '@idraw/util';
|
|
13
|
+
export function getModifyElementRecord(opts) {
|
|
14
|
+
const { modifiedElement, beforeElement } = opts;
|
|
15
|
+
const { uuid } = modifiedElement, restElement = __rest(modifiedElement, ["uuid"]);
|
|
16
|
+
const after = toFlattenElement(restElement);
|
|
17
|
+
let before = {};
|
|
18
|
+
Object.keys(after).forEach((key) => {
|
|
19
|
+
let val = get(beforeElement, key);
|
|
20
|
+
if (val === undefined && /(borderRadius|borderWidth)\[[0-9]{1,}\]$/.test(key)) {
|
|
21
|
+
key = key.replace(/\[[0-9]{1,}\]$/, '');
|
|
22
|
+
val = get(beforeElement, key);
|
|
23
|
+
}
|
|
24
|
+
before[key] = val;
|
|
25
|
+
});
|
|
26
|
+
before = toFlattenElement(before);
|
|
27
|
+
const record = {
|
|
28
|
+
type: 'modifyElement',
|
|
29
|
+
time: Date.now(),
|
|
30
|
+
content: {
|
|
31
|
+
method: 'modifyElement',
|
|
32
|
+
uuid,
|
|
33
|
+
before,
|
|
34
|
+
after
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
return record;
|
|
38
|
+
}
|