@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.
- package/dist/esm/board/index.d.ts +2 -4
- package/dist/esm/board/index.js +20 -33
- package/dist/esm/index.d.ts +22 -7
- package/dist/esm/index.js +233 -2
- package/dist/esm/middleware/dragger/index.d.ts +2 -2
- package/dist/esm/middleware/info/draw-info.js +3 -3
- package/dist/esm/middleware/info/index.d.ts +2 -2
- package/dist/esm/middleware/layout-selector/index.d.ts +2 -2
- package/dist/esm/middleware/layout-selector/index.js +24 -2
- package/dist/esm/middleware/layout-selector/util.js +19 -4
- package/dist/esm/middleware/pointer/index.d.ts +2 -2
- package/dist/esm/middleware/pointer/index.js +11 -12
- package/dist/esm/middleware/ruler/config.js +1 -1
- package/dist/esm/middleware/ruler/index.d.ts +2 -2
- package/dist/esm/middleware/ruler/index.js +1 -1
- package/dist/esm/middleware/ruler/util.js +5 -4
- package/dist/esm/middleware/scaler/index.d.ts +2 -2
- package/dist/esm/middleware/scroller/index.d.ts +2 -2
- package/dist/esm/middleware/scroller/util.js +1 -1
- package/dist/esm/middleware/selector/draw-base.js +2 -2
- package/dist/esm/middleware/selector/draw-debug.js +1 -1
- package/dist/esm/middleware/selector/draw-wrapper.js +15 -5
- package/dist/esm/middleware/selector/index.d.ts +2 -2
- package/dist/esm/middleware/selector/index.js +35 -5
- package/dist/esm/middleware/selector/types.d.ts +2 -2
- package/dist/esm/middleware/text-editor/index.d.ts +2 -2
- package/dist/esm/middleware/text-editor/index.js +85 -22
- package/dist/esm/record.d.ts +5 -0
- package/dist/esm/record.js +38 -0
- package/dist/index.global.js +1050 -139
- package/dist/index.global.min.js +1 -1
- 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) &&
|
|
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 {
|
|
2
|
-
export declare const MiddlewareScaler:
|
|
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 {
|
|
1
|
+
import type { Middleware, MiddlewareScrollerConfig } from '@idraw/types';
|
|
2
2
|
import type { DeepScrollerSharedStorage } from './types';
|
|
3
|
-
export declare const MiddlewareScroller:
|
|
3
|
+
export declare const MiddlewareScroller: Middleware<DeepScrollerSharedStorage, any, MiddlewareScrollerConfig>;
|
|
@@ -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 = {
|
|
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 = {
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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 {
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
161
|
+
const maskClickEvent = () => {
|
|
159
162
|
hideTextArea();
|
|
160
|
-
}
|
|
161
|
-
|
|
163
|
+
};
|
|
164
|
+
const textareaClickEvent = (e) => {
|
|
162
165
|
e.stopPropagation();
|
|
163
|
-
}
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
227
|
+
};
|
|
228
|
+
const textareaKeyDownEvent = (e) => {
|
|
194
229
|
e.stopPropagation();
|
|
195
|
-
}
|
|
196
|
-
|
|
230
|
+
};
|
|
231
|
+
const textareaKeyPressEvent = (e) => {
|
|
197
232
|
e.stopPropagation();
|
|
198
|
-
}
|
|
199
|
-
|
|
233
|
+
};
|
|
234
|
+
const textareaKeyUpEvent = (e) => {
|
|
200
235
|
e.stopPropagation();
|
|
201
|
-
}
|
|
202
|
-
|
|
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
|
+
}
|