@idraw/core 0.4.0-beta.4 → 0.4.0-beta.41
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 +358 -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/index.d.ts +37 -8
- package/dist/esm/index.js +265 -10
- package/dist/esm/lib/cursor-image.d.ts +1 -0
- package/dist/esm/lib/cursor-image.js +1 -0
- package/dist/esm/lib/cursor.d.ts +3 -12
- package/dist/esm/lib/cursor.js +137 -112
- package/dist/esm/middleware/dragger/index.d.ts +2 -2
- package/dist/esm/middleware/dragger/index.js +5 -3
- package/dist/esm/middleware/info/config.d.ts +5 -0
- package/dist/esm/middleware/info/config.js +9 -0
- package/dist/esm/middleware/info/draw-info.d.ts +29 -0
- package/dist/esm/middleware/info/draw-info.js +113 -0
- package/dist/esm/middleware/info/index.d.ts +9 -0
- package/dist/esm/middleware/info/index.js +131 -0
- package/dist/esm/middleware/info/types.d.ts +3 -0
- package/dist/esm/middleware/info/types.js +1 -0
- package/dist/esm/middleware/layout-selector/config.d.ts +11 -0
- package/dist/esm/middleware/layout-selector/config.js +12 -0
- package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
- package/dist/esm/middleware/layout-selector/index.js +371 -0
- package/dist/esm/middleware/layout-selector/types.d.ts +17 -0
- package/dist/esm/middleware/layout-selector/types.js +2 -0
- package/dist/esm/middleware/layout-selector/util.d.ts +9 -0
- package/dist/esm/middleware/layout-selector/util.js +78 -0
- package/dist/esm/middleware/pointer/index.d.ts +3 -0
- package/dist/esm/middleware/pointer/index.js +42 -0
- package/dist/esm/middleware/pointer/types.d.ts +3 -0
- package/dist/esm/middleware/pointer/types.js +1 -0
- package/dist/esm/middleware/ruler/config.d.ts +7 -0
- package/dist/esm/middleware/ruler/config.js +21 -0
- package/dist/esm/middleware/ruler/index.d.ts +3 -3
- package/dist/esm/middleware/ruler/index.js +33 -14
- package/dist/esm/middleware/ruler/types.d.ts +3 -0
- package/dist/esm/middleware/ruler/types.js +1 -0
- package/dist/esm/middleware/ruler/util.d.ts +20 -4
- package/dist/esm/middleware/ruler/util.js +99 -26
- package/dist/esm/middleware/scaler/index.d.ts +2 -3
- package/dist/esm/middleware/scaler/index.js +3 -2
- package/dist/esm/middleware/scroller/config.d.ts +4 -0
- package/dist/esm/middleware/scroller/config.js +10 -0
- package/dist/esm/middleware/scroller/index.d.ts +3 -2
- package/dist/esm/middleware/scroller/index.js +48 -6
- package/dist/esm/middleware/scroller/types.d.ts +11 -0
- package/dist/esm/middleware/scroller/types.js +1 -0
- package/dist/esm/middleware/scroller/util.d.ts +3 -2
- package/dist/esm/middleware/scroller/util.js +33 -44
- package/dist/esm/middleware/selector/config.d.ts +9 -1
- package/dist/esm/middleware/selector/config.js +17 -1
- package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
- package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
- package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
- package/dist/esm/middleware/selector/draw-base.js +100 -0
- package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
- package/dist/esm/middleware/selector/draw-debug.js +30 -0
- package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
- package/dist/esm/middleware/selector/draw-reference.js +31 -0
- package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -1
- package/dist/esm/middleware/selector/draw-wrapper.js +70 -38
- package/dist/esm/middleware/selector/index.d.ts +11 -4
- package/dist/esm/middleware/selector/index.js +450 -70
- package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
- package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
- package/dist/esm/middleware/selector/pattern/index.d.ts +8 -0
- package/dist/esm/middleware/selector/pattern/index.js +38 -0
- package/dist/esm/middleware/selector/reference.d.ts +13 -0
- package/dist/esm/middleware/selector/reference.js +267 -0
- package/dist/esm/middleware/selector/types.d.ts +11 -5
- package/dist/esm/middleware/selector/types.js +2 -1
- package/dist/esm/middleware/selector/util.d.ts +14 -7
- package/dist/esm/middleware/selector/util.js +45 -43
- package/dist/esm/middleware/text-editor/index.d.ts +20 -3
- package/dist/esm/middleware/text-editor/index.js +168 -28
- package/dist/esm/record.d.ts +5 -0
- package/dist/esm/record.js +38 -0
- package/dist/index.global.js +5729 -1519
- package/dist/index.global.min.js +1 -1
- package/package.json +5 -6
|
@@ -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 })) {
|
|
@@ -65,7 +68,7 @@ export function getPointTarget(p, opts) {
|
|
|
65
68
|
}
|
|
66
69
|
if (groupQueue && Array.isArray(groupQueue) && groupQueue.length > 0) {
|
|
67
70
|
const lastGroup = groupQueue[groupQueue.length - 1];
|
|
68
|
-
if (((
|
|
71
|
+
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
72
|
for (let i = lastGroup.detail.children.length - 1; i >= 0; i--) {
|
|
70
73
|
const child = lastGroup.detail.children[i];
|
|
71
74
|
const vertexes = calcElementVertexesInGroup(child, { groupQueue });
|
|
@@ -94,7 +97,7 @@ export function getPointTarget(p, opts) {
|
|
|
94
97
|
}
|
|
95
98
|
if (data) {
|
|
96
99
|
const { index, element } = calculator.getPointElement(p, { data, viewScaleInfo, viewSizeInfo });
|
|
97
|
-
if (index >= 0 && element && ((
|
|
100
|
+
if (index >= 0 && element && ((_e = element === null || element === void 0 ? void 0 : element.operations) === null || _e === void 0 ? void 0 : _e.invisible) !== true) {
|
|
98
101
|
target.elements = [element];
|
|
99
102
|
target.type = 'over-element';
|
|
100
103
|
return target;
|
|
@@ -410,7 +413,8 @@ export function resizeElement(elem, opts) {
|
|
|
410
413
|
let centerY = elemCenter.y;
|
|
411
414
|
if (angle < 90) {
|
|
412
415
|
moveVerticalDist = 0 - changeMoveDistDirect(moveVerticalDist, moveVerticalY);
|
|
413
|
-
moveHorizontalDist =
|
|
416
|
+
moveHorizontalDist =
|
|
417
|
+
0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
|
|
414
418
|
const centerMoveVerticalDist = moveVerticalDist / 2;
|
|
415
419
|
centerX = centerX + centerMoveVerticalDist * Math.sin(radian);
|
|
416
420
|
centerY = centerY - centerMoveVerticalDist * Math.cos(radian);
|
|
@@ -545,7 +549,8 @@ export function resizeElement(elem, opts) {
|
|
|
545
549
|
let centerY = elemCenter.y;
|
|
546
550
|
if (angle < 90) {
|
|
547
551
|
moveVerticalDist = changeMoveDistDirect(moveVerticalDist, moveVerticalY);
|
|
548
|
-
moveHorizontalDist =
|
|
552
|
+
moveHorizontalDist =
|
|
553
|
+
0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
|
|
549
554
|
const radian = parseRadian(angle);
|
|
550
555
|
const centerMoveVerticalDist = moveVerticalDist / 2;
|
|
551
556
|
centerX = centerX - centerMoveVerticalDist * Math.sin(radian);
|
|
@@ -671,11 +676,29 @@ export function resizeElement(elem, opts) {
|
|
|
671
676
|
}
|
|
672
677
|
return { x, y, w, h, angle: elem.angle };
|
|
673
678
|
}
|
|
679
|
+
export function rotateElement(elem, opts) {
|
|
680
|
+
const { x, y, w, h, angle = 0 } = elem;
|
|
681
|
+
const { center, start, end, viewScaleInfo } = opts;
|
|
682
|
+
const elemCenter = calcViewPointSize(center, {
|
|
683
|
+
viewScaleInfo
|
|
684
|
+
});
|
|
685
|
+
const startAngle = limitAngle(angle);
|
|
686
|
+
const changedRadian = calcRadian(elemCenter, start, end);
|
|
687
|
+
const endAngle = limitAngle(startAngle + parseRadianToAngle(changedRadian));
|
|
688
|
+
return {
|
|
689
|
+
x,
|
|
690
|
+
y,
|
|
691
|
+
w,
|
|
692
|
+
h,
|
|
693
|
+
angle: endAngle
|
|
694
|
+
};
|
|
695
|
+
}
|
|
674
696
|
export function getSelectedListArea(data, opts) {
|
|
697
|
+
var _a;
|
|
675
698
|
const indexes = [];
|
|
676
699
|
const uuids = [];
|
|
677
700
|
const elements = [];
|
|
678
|
-
const {
|
|
701
|
+
const { viewScaleInfo, start, end } = opts;
|
|
679
702
|
if (!(Array.isArray(data.elements) && start && end)) {
|
|
680
703
|
return { indexes, uuids, elements };
|
|
681
704
|
}
|
|
@@ -683,8 +706,12 @@ export function getSelectedListArea(data, opts) {
|
|
|
683
706
|
const endX = Math.max(start.x, end.x);
|
|
684
707
|
const startY = Math.min(start.y, end.y);
|
|
685
708
|
const endY = Math.max(start.y, end.y);
|
|
686
|
-
data.elements.
|
|
687
|
-
const
|
|
709
|
+
for (let idx = 0; idx < data.elements.length; idx++) {
|
|
710
|
+
const elem = data.elements[idx];
|
|
711
|
+
if (((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.locked) === true) {
|
|
712
|
+
continue;
|
|
713
|
+
}
|
|
714
|
+
const elemSize = calcViewElementSize(elem, { viewScaleInfo });
|
|
688
715
|
const center = calcElementCenter(elemSize);
|
|
689
716
|
if (center.x >= startX && center.x <= endX && center.y >= startY && center.y <= endY) {
|
|
690
717
|
indexes.push(idx);
|
|
@@ -702,7 +729,7 @@ export function getSelectedListArea(data, opts) {
|
|
|
702
729
|
}
|
|
703
730
|
}
|
|
704
731
|
}
|
|
705
|
-
}
|
|
732
|
+
}
|
|
706
733
|
return { indexes, uuids, elements };
|
|
707
734
|
}
|
|
708
735
|
export function calcSelectedElementsArea(elements, opts) {
|
|
@@ -711,14 +738,14 @@ export function calcSelectedElementsArea(elements, opts) {
|
|
|
711
738
|
return null;
|
|
712
739
|
}
|
|
713
740
|
const area = { x: 0, y: 0, w: 0, h: 0 };
|
|
714
|
-
const {
|
|
741
|
+
const { viewScaleInfo } = opts;
|
|
715
742
|
let prevElemSize = null;
|
|
716
743
|
for (let i = 0; i < elements.length; i++) {
|
|
717
744
|
const elem = elements[i];
|
|
718
745
|
if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
|
|
719
746
|
continue;
|
|
720
747
|
}
|
|
721
|
-
const elemSize =
|
|
748
|
+
const elemSize = calcViewElementSize(elem, { viewScaleInfo });
|
|
722
749
|
if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
|
|
723
750
|
const ves = rotateElementVertexes(elemSize);
|
|
724
751
|
if (ves.length === 4) {
|
|
@@ -762,28 +789,3 @@ export function isElementInGroup(elem, group) {
|
|
|
762
789
|
}
|
|
763
790
|
return false;
|
|
764
791
|
}
|
|
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
|
-
}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
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 {};
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
import { limitAngle, getDefaultElementDetailConfig } from '@idraw/util';
|
|
2
|
-
|
|
1
|
+
import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy, updateElementInList } from '@idraw/util';
|
|
2
|
+
import { coreEventKeys } from '../../config';
|
|
3
3
|
const defaultElementDetail = getDefaultElementDetailConfig();
|
|
4
4
|
export const MiddlewareTextEditor = (opts) => {
|
|
5
|
-
const { eventHub, boardContent, viewer } = opts;
|
|
5
|
+
const { eventHub, boardContent, viewer, sharer, calculator } = opts;
|
|
6
6
|
const canvas = boardContent.boardContext.canvas;
|
|
7
|
-
const textarea = document.createElement('textarea');
|
|
8
|
-
const canvasWrapper = document.createElement('div');
|
|
9
7
|
const container = opts.container || document.body;
|
|
10
|
-
|
|
8
|
+
let textarea = document.createElement('div');
|
|
9
|
+
textarea.setAttribute('contenteditable', 'true');
|
|
10
|
+
let canvasWrapper = document.createElement('div');
|
|
11
|
+
let mask = document.createElement('div');
|
|
11
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);
|
|
12
17
|
canvasWrapper.appendChild(textarea);
|
|
13
18
|
canvasWrapper.style.position = 'absolute';
|
|
14
19
|
mask.appendChild(canvasWrapper);
|
|
@@ -23,10 +28,29 @@ export const MiddlewareTextEditor = (opts) => {
|
|
|
23
28
|
resetCanvasWrapper();
|
|
24
29
|
resetTextArea(e);
|
|
25
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
|
+
}
|
|
26
41
|
};
|
|
27
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
|
+
}
|
|
28
51
|
mask.style.display = 'none';
|
|
29
52
|
activeElem = null;
|
|
53
|
+
activePosition = [];
|
|
30
54
|
};
|
|
31
55
|
const getCanvasRect = () => {
|
|
32
56
|
const clientRect = canvas.getBoundingClientRect();
|
|
@@ -84,24 +108,45 @@ export const MiddlewareTextEditor = (opts) => {
|
|
|
84
108
|
elemW = element.w * scale;
|
|
85
109
|
elemH = element.h * scale;
|
|
86
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;
|
|
87
128
|
textarea.style.position = 'absolute';
|
|
88
|
-
textarea.style.left = `${elemX}px`;
|
|
89
|
-
textarea.style.top = `${elemY}px`;
|
|
90
|
-
textarea.style.width = `${elemW}px`;
|
|
91
|
-
textarea.style.height = `${elemH}px`;
|
|
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`;
|
|
92
133
|
textarea.style.transform = `rotate(${limitAngle(element.angle || 0)}deg)`;
|
|
93
134
|
textarea.style.boxSizing = 'border-box';
|
|
94
135
|
textarea.style.border = '1px solid #1973ba';
|
|
95
136
|
textarea.style.resize = 'none';
|
|
96
137
|
textarea.style.overflow = 'hidden';
|
|
97
138
|
textarea.style.wordBreak = 'break-all';
|
|
98
|
-
textarea.style.
|
|
99
|
-
textarea.style.
|
|
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'}`;
|
|
100
142
|
textarea.style.fontSize = `${detail.fontSize * scale}px`;
|
|
101
|
-
textarea.style.lineHeight = `${detail.lineHeight * scale}px`;
|
|
102
|
-
textarea.style.fontFamily = detail.fontFamily;
|
|
143
|
+
textarea.style.lineHeight = `${(detail.lineHeight || detail.fontSize) * scale}px`;
|
|
144
|
+
textarea.style.fontFamily = enhanceFontFamliy(detail.fontFamily);
|
|
103
145
|
textarea.style.fontWeight = `${detail.fontWeight}`;
|
|
104
|
-
textarea.
|
|
146
|
+
textarea.style.padding = '0';
|
|
147
|
+
textarea.style.margin = '0';
|
|
148
|
+
textarea.style.outline = 'none';
|
|
149
|
+
textarea.innerText = detail.text || '';
|
|
105
150
|
parent.appendChild(textarea);
|
|
106
151
|
};
|
|
107
152
|
const resetCanvasWrapper = () => {
|
|
@@ -113,34 +158,129 @@ export const MiddlewareTextEditor = (opts) => {
|
|
|
113
158
|
canvasWrapper.style.width = `${width}px`;
|
|
114
159
|
canvasWrapper.style.height = `${height}px`;
|
|
115
160
|
};
|
|
116
|
-
|
|
161
|
+
const maskClickEvent = () => {
|
|
117
162
|
hideTextArea();
|
|
118
|
-
}
|
|
119
|
-
|
|
163
|
+
};
|
|
164
|
+
const textareaClickEvent = (e) => {
|
|
120
165
|
e.stopPropagation();
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (activeElem) {
|
|
124
|
-
activeElem.detail.text =
|
|
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);
|
|
125
224
|
viewer.drawFrame();
|
|
126
225
|
}
|
|
127
|
-
});
|
|
128
|
-
textarea.addEventListener('blur', () => {
|
|
129
226
|
hideTextArea();
|
|
130
|
-
}
|
|
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);
|
|
131
249
|
const textEditCallback = (e) => {
|
|
132
250
|
var _a;
|
|
133
|
-
if ((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') {
|
|
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') {
|
|
134
252
|
activeElem = e.element;
|
|
253
|
+
activePosition = e.position;
|
|
135
254
|
}
|
|
136
255
|
showTextArea(e);
|
|
137
256
|
};
|
|
138
257
|
return {
|
|
258
|
+
name: '@middleware/text-editor',
|
|
139
259
|
use() {
|
|
140
|
-
eventHub.on(
|
|
260
|
+
eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
|
|
141
261
|
},
|
|
142
262
|
disuse() {
|
|
143
|
-
eventHub.off(
|
|
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;
|
|
144
284
|
}
|
|
145
285
|
};
|
|
146
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
|
+
}
|