@idraw/core 0.4.0-beta.40 → 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 (32) hide show
  1. package/dist/esm/board/index.d.ts +2 -4
  2. package/dist/esm/board/index.js +20 -33
  3. package/dist/esm/index.d.ts +22 -7
  4. package/dist/esm/index.js +233 -2
  5. package/dist/esm/middleware/dragger/index.d.ts +2 -2
  6. package/dist/esm/middleware/info/draw-info.js +3 -3
  7. package/dist/esm/middleware/info/index.d.ts +2 -2
  8. package/dist/esm/middleware/layout-selector/index.d.ts +2 -2
  9. package/dist/esm/middleware/layout-selector/index.js +24 -2
  10. package/dist/esm/middleware/layout-selector/util.js +19 -4
  11. package/dist/esm/middleware/pointer/index.d.ts +2 -2
  12. package/dist/esm/middleware/pointer/index.js +11 -12
  13. package/dist/esm/middleware/ruler/config.js +1 -1
  14. package/dist/esm/middleware/ruler/index.d.ts +2 -2
  15. package/dist/esm/middleware/ruler/index.js +1 -1
  16. package/dist/esm/middleware/ruler/util.js +5 -4
  17. package/dist/esm/middleware/scaler/index.d.ts +2 -2
  18. package/dist/esm/middleware/scroller/index.d.ts +2 -2
  19. package/dist/esm/middleware/scroller/util.js +1 -1
  20. package/dist/esm/middleware/selector/draw-base.js +2 -2
  21. package/dist/esm/middleware/selector/draw-debug.js +1 -1
  22. package/dist/esm/middleware/selector/draw-wrapper.js +15 -5
  23. package/dist/esm/middleware/selector/index.d.ts +2 -2
  24. package/dist/esm/middleware/selector/index.js +35 -5
  25. package/dist/esm/middleware/selector/types.d.ts +2 -2
  26. package/dist/esm/middleware/text-editor/index.d.ts +2 -2
  27. package/dist/esm/middleware/text-editor/index.js +85 -22
  28. package/dist/esm/record.d.ts +5 -0
  29. package/dist/esm/record.js +38 -0
  30. package/dist/index.global.js +1050 -139
  31. package/dist/index.global.min.js +1 -1
  32. package/package.json +4 -4
@@ -44,8 +44,8 @@ export const MiddlewareRuler = (opts, config) => {
44
44
  if (show === true) {
45
45
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
46
46
  const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
47
- drawScrollerSelectedArea(overlayContext, { snapshot, calculator, style });
48
47
  drawRulerBackground(overlayContext, { viewScaleInfo, viewSizeInfo, style });
48
+ drawScrollerSelectedArea(overlayContext, { snapshot, calculator, style });
49
49
  const { list: xList, rulerUnit } = calcXRulerScaleList({ viewScaleInfo, viewSizeInfo });
50
50
  drawXRuler(overlayContext, { scaleList: xList, style });
51
51
  const { list: yList } = calcYRulerScaleList({ viewScaleInfo, viewSizeInfo });
@@ -162,7 +162,7 @@ export function drawRulerBackground(ctx, opts) {
162
162
  ctx.lineTo(basePosition, basePosition);
163
163
  ctx.closePath();
164
164
  ctx.fillStyle = background;
165
- ctx.fill();
165
+ ctx.fill('nonzero');
166
166
  ctx.lineWidth = lineSize;
167
167
  ctx.setLineDash([]);
168
168
  ctx.strokeStyle = borderColor;
@@ -210,7 +210,8 @@ export function drawScrollerSelectedArea(ctx, opts) {
210
210
  const { selectedAreaColor } = style;
211
211
  const selectedElementList = sharedStore[keySelectedElementList];
212
212
  const actionType = sharedStore[keyActionType];
213
- if (['select', 'drag', 'drag-list', 'drag-list-end'].includes(actionType) && selectedElementList.length > 0) {
213
+ if (['select', 'drag', 'drag-list', 'drag-list-end'].includes(actionType) &&
214
+ selectedElementList.length > 0) {
214
215
  const viewScaleInfo = getViewScaleInfoFromSnapshot(snapshot);
215
216
  const viewSizeInfo = getViewSizeInfoFromSnapshot(snapshot);
216
217
  const rangeRectInfoList = [];
@@ -246,7 +247,7 @@ export function drawScrollerSelectedArea(ctx, opts) {
246
247
  ctx.lineTo(xAreaStart, rulerSize);
247
248
  ctx.fillStyle = selectedAreaColor;
248
249
  ctx.closePath();
249
- ctx.fill();
250
+ ctx.fill('nonzero');
250
251
  ctx.beginPath();
251
252
  ctx.moveTo(0, yAreaStart);
252
253
  ctx.lineTo(rulerSize, yAreaStart);
@@ -254,6 +255,6 @@ export function drawScrollerSelectedArea(ctx, opts) {
254
255
  ctx.lineTo(0, yAreaEnd);
255
256
  ctx.fillStyle = selectedAreaColor;
256
257
  ctx.closePath();
257
- ctx.fill();
258
+ ctx.fill('nonzero');
258
259
  }
259
260
  }
@@ -1,2 +1,2 @@
1
- import type { BoardMiddleware, CoreEventMap } from '@idraw/types';
2
- export declare const MiddlewareScaler: BoardMiddleware<Record<string, any>, CoreEventMap>;
1
+ import type { Middleware, CoreEventMap } from '@idraw/types';
2
+ export declare const MiddlewareScaler: Middleware<Record<string, any>, CoreEventMap>;
@@ -1,3 +1,3 @@
1
- import type { BoardMiddleware, MiddlewareScrollerConfig } from '@idraw/types';
1
+ import type { Middleware, MiddlewareScrollerConfig } from '@idraw/types';
2
2
  import type { DeepScrollerSharedStorage } from './types';
3
- export declare const MiddlewareScroller: BoardMiddleware<DeepScrollerSharedStorage, any, MiddlewareScrollerConfig>;
3
+ export declare const MiddlewareScroller: Middleware<DeepScrollerSharedStorage, any, MiddlewareScrollerConfig>;
@@ -139,7 +139,7 @@ function drawScrollerThumb(ctx, opts) {
139
139
  ctx.arcTo(x, y, x + w, y, r);
140
140
  ctx.closePath();
141
141
  ctx.fillStyle = background;
142
- ctx.fill();
142
+ ctx.fill('nonzero');
143
143
  ctx.beginPath();
144
144
  ctx.lineWidth = 1;
145
145
  ctx.strokeStyle = borderColor;
@@ -13,7 +13,7 @@ export function drawVertexes(ctx, vertexes, opts) {
13
13
  ctx.lineTo(vertexes[0].x, vertexes[0].y);
14
14
  ctx.closePath();
15
15
  ctx.stroke();
16
- ctx.fill();
16
+ ctx.fill('nonzero');
17
17
  }
18
18
  export function drawLine(ctx, start, end, opts) {
19
19
  const { borderColor, borderWidth, lineDash } = opts;
@@ -48,7 +48,7 @@ export function drawCircleController(ctx, circleCenter, opts) {
48
48
  ctx.fillStyle = background;
49
49
  ctx.circle(center.x, center.y, a, b, 0, 0, 2 * Math.PI);
50
50
  ctx.closePath();
51
- ctx.fill();
51
+ ctx.fill('nonzero');
52
52
  }
53
53
  }
54
54
  export function drawCrossVertexes(ctx, vertexes, opts) {
@@ -13,7 +13,7 @@ function drawDebugControllerVertexes(opts) {
13
13
  ctx.lineTo(v3.x, v3.y);
14
14
  ctx.lineTo(v0.x, v0.y);
15
15
  ctx.closePath();
16
- ctx.fill();
16
+ ctx.fill('nonzero');
17
17
  return false;
18
18
  }
19
19
  export function drawDebugStoreSelectedElementController(ctx, controller, opts) {
@@ -41,7 +41,12 @@ export function drawSelectedElementControllersVertexes(ctx, controller, opts) {
41
41
  const { devicePixelRatio = 1 } = viewSizeInfo;
42
42
  const { activeColor } = style;
43
43
  const { elementWrapper, topLeft, topRight, bottomLeft, bottomRight, rotate } = controller;
44
- const wrapperOpts = { borderColor: activeColor, borderWidth: selectWrapperBorderWidth, background: 'transparent', lineDash: [] };
44
+ const wrapperOpts = {
45
+ borderColor: activeColor,
46
+ borderWidth: selectWrapperBorderWidth,
47
+ background: 'transparent',
48
+ lineDash: []
49
+ };
45
50
  const ctrlOpts = Object.assign(Object.assign({}, wrapperOpts), { borderWidth: resizeControllerBorderWidth, background: '#FFFFFF' });
46
51
  drawVertexes(ctx, calcViewVertexes(elementWrapper, opts), wrapperOpts);
47
52
  if (!hideControllers) {
@@ -81,7 +86,7 @@ export function drawElementListShadows(ctx, elements, opts) {
81
86
  }
82
87
  ctx.closePath();
83
88
  ctx.stroke();
84
- ctx.fill();
89
+ ctx.fill('nonzero');
85
90
  }
86
91
  });
87
92
  }
@@ -99,7 +104,7 @@ export function drawArea(ctx, opts) {
99
104
  ctx.lineTo(start.x, end.y);
100
105
  ctx.closePath();
101
106
  ctx.stroke();
102
- ctx.fill();
107
+ ctx.fill('nonzero');
103
108
  }
104
109
  export function drawListArea(ctx, opts) {
105
110
  const { areaSize, style } = opts;
@@ -116,14 +121,19 @@ export function drawListArea(ctx, opts) {
116
121
  ctx.lineTo(x, y + h);
117
122
  ctx.closePath();
118
123
  ctx.stroke();
119
- ctx.fill();
124
+ ctx.fill('nonzero');
120
125
  }
121
126
  export function drawGroupQueueVertexesWrappers(ctx, vertexesList, opts) {
122
127
  const { style } = opts;
123
128
  const { activeColor } = style;
124
129
  for (let i = 0; i < vertexesList.length; i++) {
125
130
  const vertexes = vertexesList[i];
126
- const wrapperOpts = { borderColor: activeColor, borderWidth: selectWrapperBorderWidth, background: 'transparent', lineDash: [4, 4] };
131
+ const wrapperOpts = {
132
+ borderColor: activeColor,
133
+ borderWidth: selectWrapperBorderWidth,
134
+ background: 'transparent',
135
+ lineDash: [4, 4]
136
+ };
127
137
  drawVertexes(ctx, calcViewVertexes(vertexes, opts), wrapperOpts);
128
138
  }
129
139
  }
@@ -1,10 +1,10 @@
1
1
  import type { CoreEventMap, MiddlewareSelectorConfig } from '@idraw/types';
2
- import type { BoardMiddleware, ActionType, DeepSelectorSharedStorage } from './types';
2
+ import type { Middleware, ActionType, DeepSelectorSharedStorage } from './types';
3
3
  import { keyActionType, keyResizeType, keyGroupQueue, keyHoverElement, keySelectedElementList } from './config';
4
4
  import { MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE } from '../info';
5
5
  export { keySelectedElementList, keyHoverElement, keyActionType, keyResizeType, keyGroupQueue };
6
6
  export type { DeepSelectorSharedStorage, ActionType };
7
- export declare const MiddlewareSelector: BoardMiddleware<DeepSelectorSharedStorage, CoreEventMap & {
7
+ export declare const MiddlewareSelector: Middleware<DeepSelectorSharedStorage, CoreEventMap & {
8
8
  [MIDDLEWARE_INTERNAL_EVENT_SHOW_INFO_ANGLE]: {
9
9
  show: boolean;
10
10
  };
@@ -1,4 +1,4 @@
1
- import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, getElementPositionMapFromList, deepResizeGroupElement, getElementSize, calcPointMoveElementInGroup, isSameElementSize } from '@idraw/util';
1
+ import { is, calcElementsViewInfo, calcElementVertexesInGroup, calcElementQueueVertexesQueueInGroup, calcElementSizeController, calcElementCenterFromVertexes, rotatePointInGroup, getGroupQueueFromList, findElementsFromList, findElementsFromListByPositions, getElementPositionFromList, getElementPositionMapFromList, deepResizeGroupElement, getElementSize, calcPointMoveElementInGroup, isSameElementSize, toFlattenElement } from '@idraw/util';
2
2
  import { drawHoverVertexesWrapper, drawLockedVertexesWrapper, drawArea, drawListArea, drawGroupQueueVertexesWrappers, drawSelectedElementControllersVertexes } from './draw-wrapper';
3
3
  import { drawReferenceLines } from './draw-reference';
4
4
  import { getPointTarget, resizeElement, rotateElement, getSelectedListArea, calcSelectedElementsArea, isElementInGroup, isPointInViewActiveGroup } from './util';
@@ -14,6 +14,7 @@ export const MiddlewareSelector = (opts, config) => {
14
14
  const { viewer, sharer, boardContent, calculator, eventHub } = opts;
15
15
  const { overlayContext } = boardContent;
16
16
  let prevPoint = null;
17
+ let pointStartElementSizeList = [];
17
18
  let moveOriginalStartPoint = null;
18
19
  let moveOriginalStartElementSize = null;
19
20
  let inBusyMode = null;
@@ -172,6 +173,8 @@ export const MiddlewareSelector = (opts, config) => {
172
173
  eventHub.off(coreEventKeys.CLEAR_SELECT, selectClearCallback);
173
174
  eventHub.off(coreEventKeys.SELECT_IN_GROUP, selectInGroupCallback);
174
175
  eventHub.off(coreEventKeys.SNAP_TO_GRID, setSnapToSnapCallback);
176
+ clear();
177
+ innerConfig = null;
175
178
  },
176
179
  resetConfig(config) {
177
180
  innerConfig = Object.assign(Object.assign({}, innerConfig), config);
@@ -299,6 +302,7 @@ export const MiddlewareSelector = (opts, config) => {
299
302
  else if (target.type === 'over-element' && ((_e = target === null || target === void 0 ? void 0 : target.elements) === null || _e === void 0 ? void 0 : _e.length) === 1) {
300
303
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
301
304
  sharer.setSharedStorage(keyActionType, 'drag');
305
+ pointStartElementSizeList = [Object.assign(Object.assign({}, getElementSize(target === null || target === void 0 ? void 0 : target.elements[0])), { uuid: target === null || target === void 0 ? void 0 : target.elements[0].uuid })];
302
306
  }
303
307
  else if ((_f = target.type) === null || _f === void 0 ? void 0 : _f.startsWith('resize-')) {
304
308
  sharer.setSharedStorage(keyResizeType, target.type);
@@ -337,6 +341,7 @@ export const MiddlewareSelector = (opts, config) => {
337
341
  else if (target.type === 'over-element' && ((_l = target === null || target === void 0 ? void 0 : target.elements) === null || _l === void 0 ? void 0 : _l.length) === 1) {
338
342
  updateSelectedElementList([target.elements[0]], { triggerEvent: true });
339
343
  sharer.setSharedStorage(keyActionType, 'drag');
344
+ pointStartElementSizeList = [Object.assign(Object.assign({}, getElementSize(target === null || target === void 0 ? void 0 : target.elements[0])), { uuid: target === null || target === void 0 ? void 0 : target.elements[0].uuid })];
340
345
  }
341
346
  else if ((_m = target.type) === null || _m === void 0 ? void 0 : _m.startsWith('resize-')) {
342
347
  sharer.setSharedStorage(keyResizeType, target.type);
@@ -404,7 +409,7 @@ export const MiddlewareSelector = (opts, config) => {
404
409
  elems[0].y = calculator.toGridNum(moveOriginalStartElementSize.y + totalMoveY);
405
410
  updateSelectedElementList([elems[0]]);
406
411
  calculator.modifyVirtualFlatItemMap(data, {
407
- modifyOptions: {
412
+ modifyInfo: {
408
413
  type: 'updateElement',
409
414
  content: {
410
415
  element: elems[0],
@@ -429,7 +434,7 @@ export const MiddlewareSelector = (opts, config) => {
429
434
  elem.x = calculator.toGridNum(elem.x + moveX);
430
435
  elem.y = calculator.toGridNum(elem.y + moveY);
431
436
  calculator.modifyVirtualFlatItemMap(data, {
432
- modifyOptions: {
437
+ modifyInfo: {
433
438
  type: 'updateElement',
434
439
  content: {
435
440
  element: elem,
@@ -508,7 +513,7 @@ export const MiddlewareSelector = (opts, config) => {
508
513
  }
509
514
  updateSelectedElementList([elems[0]]);
510
515
  calculator.modifyVirtualFlatItemMap(data, {
511
- modifyOptions: {
516
+ modifyInfo: {
512
517
  type: 'updateElement',
513
518
  content: {
514
519
  element: elems[0],
@@ -606,7 +611,32 @@ export const MiddlewareSelector = (opts, config) => {
606
611
  type = 'resizeElement';
607
612
  }
608
613
  if (hasChangedData) {
609
- eventHub.trigger(coreEventKeys.CHANGE, { data, type, selectedElements, hoverElement });
614
+ const startSize = pointStartElementSizeList[0];
615
+ let modifyRecord = undefined;
616
+ if (selectedElements.length === 1) {
617
+ modifyRecord = {
618
+ type: 'dragElement',
619
+ time: 0,
620
+ content: {
621
+ method: 'modifyElement',
622
+ uuid: startSize.uuid,
623
+ before: toFlattenElement(startSize),
624
+ after: toFlattenElement(getElementSize(selectedElements[0]))
625
+ }
626
+ };
627
+ }
628
+ else if (selectedElements.length > 1) {
629
+ modifyRecord = {
630
+ type: 'dragElements',
631
+ time: 0,
632
+ content: {
633
+ method: 'modifyElements',
634
+ before: pointStartElementSizeList.map((item) => (Object.assign(Object.assign({}, toFlattenElement(item)), { uuid: item.uuid }))),
635
+ after: selectedElements.map((item) => (Object.assign(Object.assign({}, toFlattenElement(getElementSize(item))), { uuid: item.uuid })))
636
+ }
637
+ };
638
+ }
639
+ eventHub.trigger(coreEventKeys.CHANGE, { data, type, selectedElements, hoverElement, modifyRecord });
610
640
  hasChangedData = false;
611
641
  }
612
642
  }
@@ -1,7 +1,7 @@
1
- import { Data, ElementSize, ElementType, Element, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware, ViewRectVertexes, ElementSizeController, ElementPosition } from '@idraw/types';
1
+ import { Data, ElementSize, ElementType, Element, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, Middleware, ViewRectVertexes, ElementSizeController, ElementPosition } from '@idraw/types';
2
2
  import { keyActionType, keyResizeType, keyAreaStart, keyAreaEnd, keyGroupQueue, keyGroupQueueVertexesList, keyHoverElement, keyHoverElementVertexes, keySelectedElementList, keySelectedElementListVertexes, keySelectedElementController, keySelectedElementPosition, keyIsMoving, keyEnableSelectInGroup, keyEnableSnapToGrid, keyDebugElemCenter, keyDebugEnd0, keyDebugEndHorizontal, keyDebugEndVertical, keyDebugStartHorizontal, keyDebugStartVertical } from './config';
3
3
  import { keyLayoutIsSelected, keyLayoutIsBusyMoving } from '../layout-selector';
4
- export { Data, ElementType, Element, ElementSize, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, BoardMiddleware };
4
+ export { Data, ElementType, Element, ElementSize, ViewContext2D, Point, PointSize, ViewScaleInfo, ViewSizeInfo, ViewCalculator, PointWatcherEvent, Middleware };
5
5
  export type ControllerStyle = ElementSize & {
6
6
  borderWidth: number;
7
7
  borderColor: string;
@@ -1,4 +1,4 @@
1
- import type { BoardMiddleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
1
+ import type { Middleware, CoreEventMap, Element, ViewScaleInfo, ElementPosition } from '@idraw/types';
2
2
  import { coreEventKeys } from '../../config';
3
3
  type TextEditEvent = {
4
4
  element: Element<'text'>;
@@ -16,5 +16,5 @@ type TextChangeEvent = {
16
16
  position: ElementPosition;
17
17
  };
18
18
  type ExtendEventMap = Record<typeof coreEventKeys.TEXT_EDIT, TextEditEvent> & Record<typeof coreEventKeys.TEXT_CHANGE, TextChangeEvent>;
19
- export declare const MiddlewareTextEditor: BoardMiddleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
19
+ export declare const MiddlewareTextEditor: Middleware<ExtendEventMap, CoreEventMap & ExtendEventMap>;
20
20
  export {};
@@ -1,16 +1,17 @@
1
- import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy } from '@idraw/util';
1
+ import { limitAngle, getDefaultElementDetailConfig, enhanceFontFamliy, updateElementInList } from '@idraw/util';
2
2
  import { coreEventKeys } from '../../config';
3
3
  const defaultElementDetail = getDefaultElementDetailConfig();
4
4
  export const MiddlewareTextEditor = (opts) => {
5
- const { eventHub, boardContent, viewer, sharer } = opts;
5
+ const { eventHub, boardContent, viewer, sharer, calculator } = opts;
6
6
  const canvas = boardContent.boardContext.canvas;
7
- const textarea = document.createElement('div');
8
- textarea.setAttribute('contenteditable', 'true');
9
- const canvasWrapper = document.createElement('div');
10
7
  const container = opts.container || document.body;
11
- 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');
12
12
  let activeElem = null;
13
13
  let activePosition = [];
14
+ let originText = '';
14
15
  const id = `idraw-middleware-text-editor-${Math.random().toString(26).substring(2)}`;
15
16
  mask.setAttribute('id', id);
16
17
  canvasWrapper.appendChild(textarea);
@@ -27,12 +28,14 @@ export const MiddlewareTextEditor = (opts) => {
27
28
  resetCanvasWrapper();
28
29
  resetTextArea(e);
29
30
  mask.style.display = 'block';
31
+ originText = '';
30
32
  if (activeElem === null || activeElem === void 0 ? void 0 : activeElem.uuid) {
31
33
  sharer.setActiveOverrideElemenentMap({
32
34
  [activeElem.uuid]: {
33
35
  operations: { invisible: true }
34
36
  }
35
37
  });
38
+ originText = activeElem.detail.text || '';
36
39
  viewer.drawFrame();
37
40
  }
38
41
  };
@@ -155,13 +158,13 @@ export const MiddlewareTextEditor = (opts) => {
155
158
  canvasWrapper.style.width = `${width}px`;
156
159
  canvasWrapper.style.height = `${height}px`;
157
160
  };
158
- mask.addEventListener('click', () => {
161
+ const maskClickEvent = () => {
159
162
  hideTextArea();
160
- });
161
- textarea.addEventListener('click', (e) => {
163
+ };
164
+ const textareaClickEvent = (e) => {
162
165
  e.stopPropagation();
163
- });
164
- textarea.addEventListener('input', () => {
166
+ };
167
+ const textareaInputEvent = () => {
165
168
  if (activeElem && activePosition) {
166
169
  activeElem.detail.text = textarea.innerText || '';
167
170
  eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
@@ -173,11 +176,13 @@ export const MiddlewareTextEditor = (opts) => {
173
176
  },
174
177
  position: [...(activePosition || [])]
175
178
  });
179
+ calculator.modifyText(activeElem);
176
180
  viewer.drawFrame();
177
181
  }
178
- });
179
- textarea.addEventListener('blur', () => {
182
+ };
183
+ const textareaBlurEvent = () => {
180
184
  if (activeElem && activePosition) {
185
+ activeElem.detail.text = textarea.innerText || '';
181
186
  eventHub.trigger(coreEventKeys.TEXT_CHANGE, {
182
187
  element: {
183
188
  uuid: activeElem.uuid,
@@ -187,22 +192,60 @@ export const MiddlewareTextEditor = (opts) => {
187
192
  },
188
193
  position: [...activePosition]
189
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();
190
225
  }
191
226
  hideTextArea();
192
- });
193
- textarea.addEventListener('keydown', (e) => {
227
+ };
228
+ const textareaKeyDownEvent = (e) => {
194
229
  e.stopPropagation();
195
- });
196
- textarea.addEventListener('keypress', (e) => {
230
+ };
231
+ const textareaKeyPressEvent = (e) => {
197
232
  e.stopPropagation();
198
- });
199
- textarea.addEventListener('keyup', (e) => {
233
+ };
234
+ const textareaKeyUpEvent = (e) => {
200
235
  e.stopPropagation();
201
- });
202
- textarea.addEventListener('wheel', (e) => {
236
+ };
237
+ const textareaWheelEvent = (e) => {
203
238
  e.stopPropagation();
204
239
  e.preventDefault();
205
- });
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);
206
249
  const textEditCallback = (e) => {
207
250
  var _a;
208
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') {
@@ -218,6 +261,26 @@ export const MiddlewareTextEditor = (opts) => {
218
261
  },
219
262
  disuse() {
220
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;
221
284
  }
222
285
  };
223
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
+ }