@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.
Files changed (87) hide show
  1. package/dist/esm/board/index.d.ts +44 -0
  2. package/dist/esm/board/index.js +358 -0
  3. package/dist/esm/board/sharer.d.ts +21 -0
  4. package/dist/esm/board/sharer.js +101 -0
  5. package/dist/esm/board/viewer.d.ts +32 -0
  6. package/dist/esm/board/viewer.js +165 -0
  7. package/dist/esm/board/watcher.d.ts +15 -0
  8. package/dist/esm/board/watcher.js +218 -0
  9. package/dist/esm/config.d.ts +28 -0
  10. package/dist/esm/config.js +34 -0
  11. package/dist/esm/index.d.ts +37 -8
  12. package/dist/esm/index.js +265 -10
  13. package/dist/esm/lib/cursor-image.d.ts +1 -0
  14. package/dist/esm/lib/cursor-image.js +1 -0
  15. package/dist/esm/lib/cursor.d.ts +3 -12
  16. package/dist/esm/lib/cursor.js +137 -112
  17. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  18. package/dist/esm/middleware/dragger/index.js +5 -3
  19. package/dist/esm/middleware/info/config.d.ts +5 -0
  20. package/dist/esm/middleware/info/config.js +9 -0
  21. package/dist/esm/middleware/info/draw-info.d.ts +29 -0
  22. package/dist/esm/middleware/info/draw-info.js +113 -0
  23. package/dist/esm/middleware/info/index.d.ts +9 -0
  24. package/dist/esm/middleware/info/index.js +131 -0
  25. package/dist/esm/middleware/info/types.d.ts +3 -0
  26. package/dist/esm/middleware/info/types.js +1 -0
  27. package/dist/esm/middleware/layout-selector/config.d.ts +11 -0
  28. package/dist/esm/middleware/layout-selector/config.js +12 -0
  29. package/dist/esm/middleware/layout-selector/index.d.ts +5 -0
  30. package/dist/esm/middleware/layout-selector/index.js +371 -0
  31. package/dist/esm/middleware/layout-selector/types.d.ts +17 -0
  32. package/dist/esm/middleware/layout-selector/types.js +2 -0
  33. package/dist/esm/middleware/layout-selector/util.d.ts +9 -0
  34. package/dist/esm/middleware/layout-selector/util.js +78 -0
  35. package/dist/esm/middleware/pointer/index.d.ts +3 -0
  36. package/dist/esm/middleware/pointer/index.js +42 -0
  37. package/dist/esm/middleware/pointer/types.d.ts +3 -0
  38. package/dist/esm/middleware/pointer/types.js +1 -0
  39. package/dist/esm/middleware/ruler/config.d.ts +7 -0
  40. package/dist/esm/middleware/ruler/config.js +21 -0
  41. package/dist/esm/middleware/ruler/index.d.ts +3 -3
  42. package/dist/esm/middleware/ruler/index.js +33 -14
  43. package/dist/esm/middleware/ruler/types.d.ts +3 -0
  44. package/dist/esm/middleware/ruler/types.js +1 -0
  45. package/dist/esm/middleware/ruler/util.d.ts +20 -4
  46. package/dist/esm/middleware/ruler/util.js +99 -26
  47. package/dist/esm/middleware/scaler/index.d.ts +2 -3
  48. package/dist/esm/middleware/scaler/index.js +3 -2
  49. package/dist/esm/middleware/scroller/config.d.ts +4 -0
  50. package/dist/esm/middleware/scroller/config.js +10 -0
  51. package/dist/esm/middleware/scroller/index.d.ts +3 -2
  52. package/dist/esm/middleware/scroller/index.js +48 -6
  53. package/dist/esm/middleware/scroller/types.d.ts +11 -0
  54. package/dist/esm/middleware/scroller/types.js +1 -0
  55. package/dist/esm/middleware/scroller/util.d.ts +3 -2
  56. package/dist/esm/middleware/scroller/util.js +33 -44
  57. package/dist/esm/middleware/selector/config.d.ts +9 -1
  58. package/dist/esm/middleware/selector/config.js +17 -1
  59. package/dist/esm/middleware/selector/draw-auxiliary.d.ts +1 -0
  60. package/dist/esm/middleware/selector/draw-auxiliary.js +12 -0
  61. package/dist/esm/middleware/selector/draw-base.d.ts +30 -0
  62. package/dist/esm/middleware/selector/draw-base.js +100 -0
  63. package/dist/esm/middleware/selector/draw-debug.d.ts +5 -0
  64. package/dist/esm/middleware/selector/draw-debug.js +30 -0
  65. package/dist/esm/middleware/selector/draw-reference.d.ts +7 -0
  66. package/dist/esm/middleware/selector/draw-reference.js +31 -0
  67. package/dist/esm/middleware/selector/draw-wrapper.d.ts +16 -1
  68. package/dist/esm/middleware/selector/draw-wrapper.js +70 -38
  69. package/dist/esm/middleware/selector/index.d.ts +11 -4
  70. package/dist/esm/middleware/selector/index.js +450 -70
  71. package/dist/esm/middleware/selector/pattern/icon-rotate.d.ts +4 -0
  72. package/dist/esm/middleware/selector/pattern/icon-rotate.js +88 -0
  73. package/dist/esm/middleware/selector/pattern/index.d.ts +8 -0
  74. package/dist/esm/middleware/selector/pattern/index.js +38 -0
  75. package/dist/esm/middleware/selector/reference.d.ts +13 -0
  76. package/dist/esm/middleware/selector/reference.js +267 -0
  77. package/dist/esm/middleware/selector/types.d.ts +11 -5
  78. package/dist/esm/middleware/selector/types.js +2 -1
  79. package/dist/esm/middleware/selector/util.d.ts +14 -7
  80. package/dist/esm/middleware/selector/util.js +45 -43
  81. package/dist/esm/middleware/text-editor/index.d.ts +20 -3
  82. package/dist/esm/middleware/text-editor/index.js +168 -28
  83. package/dist/esm/record.d.ts +5 -0
  84. package/dist/esm/record.js +38 -0
  85. package/dist/index.global.js +5729 -1519
  86. package/dist/index.global.min.js +1 -1
  87. package/package.json +5 -6
@@ -1,4 +1,4 @@
1
- import { calcElementCenter, rotateElementVertexes, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcViewPointSize, rotatePointInGroup, rotatePoint, parseAngleToRadian, limitAngle } from '@idraw/util';
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, viewSizeInfo, vertexes } = opts;
13
- const v0 = calcViewPointSize(vertexes[0], { viewScaleInfo, viewSizeInfo });
14
- const v1 = calcViewPointSize(vertexes[1], { viewScaleInfo, viewSizeInfo });
15
- const v2 = calcViewPointSize(vertexes[2], { viewScaleInfo, viewSizeInfo });
16
- const v3 = calcViewPointSize(vertexes[3], { viewScaleInfo, viewSizeInfo });
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 (((_a = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _a === void 0 ? void 0 : _a.children) && Array.isArray((_b = lastGroup === null || lastGroup === void 0 ? void 0 : lastGroup.detail) === null || _b === void 0 ? void 0 : _b.children)) {
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 && ((_c = element === null || element === void 0 ? void 0 : element.operations) === null || _c === void 0 ? void 0 : _c.invisible) !== true) {
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 = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
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 = 0 - changeMoveDistDirect(moveHorizontalDist, limitRatio ? 0 - moveVerticalDist : moveHorizontalX);
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 { calculator, viewScaleInfo, viewSizeInfo, start, end } = opts;
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.forEach((elem, idx) => {
687
- const elemSize = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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 { calculator, viewScaleInfo, viewSizeInfo } = opts;
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 = calculator.elementSize(elem, viewScaleInfo, viewSizeInfo);
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 { BoardMiddleware, CoreEvent } from '@idraw/types';
2
- export declare const middlewareEventTextEdit = "@middleware/text-edit";
3
- export declare const MiddlewareTextEditor: BoardMiddleware<Record<string, any>, CoreEvent>;
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
- export const middlewareEventTextEdit = '@middleware/text-edit';
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
- const mask = document.createElement('div');
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.background = '#FFFFFF';
99
- textarea.style.color = '#333333';
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.value = detail.text || '';
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
- mask.addEventListener('click', () => {
161
+ const maskClickEvent = () => {
117
162
  hideTextArea();
118
- });
119
- textarea.addEventListener('click', (e) => {
163
+ };
164
+ const textareaClickEvent = (e) => {
120
165
  e.stopPropagation();
121
- });
122
- textarea.addEventListener('input', (e) => {
123
- if (activeElem) {
124
- activeElem.detail.text = e.target.value || '';
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(middlewareEventTextEdit, textEditCallback);
260
+ eventHub.on(coreEventKeys.TEXT_EDIT, textEditCallback);
141
261
  },
142
262
  disuse() {
143
- eventHub.off(middlewareEventTextEdit, textEditCallback);
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
+ }