@idraw/util 0.4.0-beta.2 → 0.4.0-beta.20
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/index.d.ts +13 -9
- package/dist/esm/index.js +13 -9
- package/dist/esm/lib/canvas.d.ts +8 -3
- package/dist/esm/lib/canvas.js +27 -4
- package/dist/esm/lib/config.d.ts +5 -10
- package/dist/esm/lib/config.js +7 -9
- package/dist/esm/lib/context2d.d.ts +2 -0
- package/dist/esm/lib/context2d.js +14 -0
- package/dist/esm/lib/controller.d.ts +5 -1
- package/dist/esm/lib/controller.js +142 -0
- package/dist/esm/lib/data.d.ts +6 -2
- package/dist/esm/lib/data.js +95 -2
- package/dist/esm/lib/element.d.ts +3 -0
- package/dist/esm/lib/element.js +94 -1
- package/dist/esm/lib/event.d.ts +4 -2
- package/dist/esm/lib/event.js +31 -11
- package/dist/esm/lib/file.d.ts +7 -2
- package/dist/esm/lib/file.js +26 -7
- package/dist/esm/lib/handle-element.d.ts +6 -1
- package/dist/esm/lib/handle-element.js +56 -36
- package/dist/esm/lib/html.d.ts +1 -1
- package/dist/esm/lib/istype.d.ts +1 -0
- package/dist/esm/lib/istype.js +3 -0
- package/dist/esm/lib/modify-recorder.d.ts +15 -0
- package/dist/esm/lib/modify-recorder.js +177 -0
- package/dist/esm/lib/modify.d.ts +6 -0
- package/dist/esm/lib/modify.js +99 -0
- package/dist/esm/lib/rect.js +9 -9
- package/dist/esm/lib/resize-element.d.ts +2 -0
- package/dist/esm/lib/resize-element.js +101 -0
- package/dist/esm/lib/store.d.ts +6 -5
- package/dist/esm/lib/store.js +30 -9
- package/dist/esm/lib/time.d.ts +1 -0
- package/dist/esm/lib/time.js +13 -1
- package/dist/esm/lib/view-box.js +3 -2
- package/dist/esm/lib/view-calc.d.ts +20 -3
- package/dist/esm/lib/view-calc.js +171 -3
- package/dist/esm/lib/view-content.d.ts +14 -0
- package/dist/esm/lib/view-content.js +88 -0
- package/dist/esm/lib/view-visible.d.ts +21 -0
- package/dist/esm/lib/view-visible.js +93 -0
- package/dist/index.global.js +1154 -155
- package/dist/index.global.min.js +1 -1
- package/package.json +1 -1
package/dist/esm/lib/element.js
CHANGED
|
@@ -66,6 +66,59 @@ export function validateElements(elements) {
|
|
|
66
66
|
}
|
|
67
67
|
return isValid;
|
|
68
68
|
}
|
|
69
|
+
export function calcElementListSize(list) {
|
|
70
|
+
var _a;
|
|
71
|
+
const area = { x: 0, y: 0, w: 0, h: 0 };
|
|
72
|
+
let prevElemSize = null;
|
|
73
|
+
for (let i = 0; i < list.length; i++) {
|
|
74
|
+
const elem = list[i];
|
|
75
|
+
if ((_a = elem === null || elem === void 0 ? void 0 : elem.operations) === null || _a === void 0 ? void 0 : _a.invisible) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
const elemSize = {
|
|
79
|
+
x: elem.x,
|
|
80
|
+
y: elem.y,
|
|
81
|
+
w: elem.w,
|
|
82
|
+
h: elem.h,
|
|
83
|
+
angle: elem.angle || 0
|
|
84
|
+
};
|
|
85
|
+
if (elemSize.angle && (elemSize.angle > 0 || elemSize.angle < 0)) {
|
|
86
|
+
const ves = rotateElementVertexes(elemSize);
|
|
87
|
+
if (ves.length === 4) {
|
|
88
|
+
const xList = [ves[0].x, ves[1].x, ves[2].x, ves[3].x];
|
|
89
|
+
const yList = [ves[0].y, ves[1].y, ves[2].y, ves[3].y];
|
|
90
|
+
elemSize.x = Math.min(...xList);
|
|
91
|
+
elemSize.y = Math.min(...yList);
|
|
92
|
+
elemSize.w = Math.abs(Math.max(...xList) - Math.min(...xList));
|
|
93
|
+
elemSize.h = Math.abs(Math.max(...yList) - Math.min(...yList));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
if (prevElemSize) {
|
|
97
|
+
const areaStartX = Math.min(elemSize.x, area.x);
|
|
98
|
+
const areaStartY = Math.min(elemSize.y, area.y);
|
|
99
|
+
const areaEndX = Math.max(elemSize.x + elemSize.w, area.x + area.w);
|
|
100
|
+
const areaEndY = Math.max(elemSize.y + elemSize.h, area.y + area.h);
|
|
101
|
+
area.x = areaStartX;
|
|
102
|
+
area.y = areaStartY;
|
|
103
|
+
area.w = Math.abs(areaEndX - areaStartX);
|
|
104
|
+
area.h = Math.abs(areaEndY - areaStartY);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
area.x = elemSize.x;
|
|
108
|
+
area.y = elemSize.y;
|
|
109
|
+
area.w = elemSize.w;
|
|
110
|
+
area.h = elemSize.h;
|
|
111
|
+
}
|
|
112
|
+
prevElemSize = elemSize;
|
|
113
|
+
}
|
|
114
|
+
const listSize = {
|
|
115
|
+
x: Math.floor(area.x),
|
|
116
|
+
y: Math.floor(area.y),
|
|
117
|
+
w: Math.ceil(area.w),
|
|
118
|
+
h: Math.ceil(area.h)
|
|
119
|
+
};
|
|
120
|
+
return listSize;
|
|
121
|
+
}
|
|
69
122
|
export function calcElementsContextSize(elements, opts) {
|
|
70
123
|
const area = { x: 0, y: 0, w: 0, h: 0 };
|
|
71
124
|
elements.forEach((elem) => {
|
|
@@ -207,6 +260,25 @@ export function getGroupQueueFromList(uuid, elements) {
|
|
|
207
260
|
_scan(uuid, elements);
|
|
208
261
|
return groupQueue;
|
|
209
262
|
}
|
|
263
|
+
export function getGroupQueueByElementPosition(elements, position) {
|
|
264
|
+
var _a;
|
|
265
|
+
const groupQueue = [];
|
|
266
|
+
let currentElements = elements;
|
|
267
|
+
if (position.length > 1) {
|
|
268
|
+
for (let i = 0; i < position.length - 1; i++) {
|
|
269
|
+
const index = position[i];
|
|
270
|
+
const group = currentElements[index];
|
|
271
|
+
if ((group === null || group === void 0 ? void 0 : group.type) === 'group' && Array.isArray((_a = group === null || group === void 0 ? void 0 : group.detail) === null || _a === void 0 ? void 0 : _a.children)) {
|
|
272
|
+
groupQueue.push(group);
|
|
273
|
+
currentElements = group.detail.children;
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
return null;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return groupQueue;
|
|
281
|
+
}
|
|
210
282
|
export function getElementSize(elem) {
|
|
211
283
|
const { x, y, w, h, angle } = elem;
|
|
212
284
|
const size = { x, y, w, h, angle };
|
|
@@ -307,8 +379,29 @@ export function findElementFromListByPosition(position, list) {
|
|
|
307
379
|
}
|
|
308
380
|
return result;
|
|
309
381
|
}
|
|
382
|
+
export function findElementQueueFromListByPosition(position, list) {
|
|
383
|
+
const result = [];
|
|
384
|
+
let tempList = list;
|
|
385
|
+
for (let i = 0; i < position.length; i++) {
|
|
386
|
+
const pos = position[i];
|
|
387
|
+
const item = tempList[pos];
|
|
388
|
+
if (item) {
|
|
389
|
+
result.push(item);
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
break;
|
|
393
|
+
}
|
|
394
|
+
if (i < position.length - 1 && item.type === 'group') {
|
|
395
|
+
tempList = item.detail.children;
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return result;
|
|
402
|
+
}
|
|
310
403
|
export function getElementPositionFromList(uuid, elements) {
|
|
311
|
-
|
|
404
|
+
const result = [];
|
|
312
405
|
let over = false;
|
|
313
406
|
const _loop = (list) => {
|
|
314
407
|
var _a;
|
package/dist/esm/lib/event.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { UtilEventEmitter } from '@idraw/types';
|
|
2
2
|
export declare class EventEmitter<T extends Record<string, any>> implements UtilEventEmitter<T> {
|
|
3
|
-
private
|
|
3
|
+
#private;
|
|
4
4
|
constructor();
|
|
5
5
|
on<K extends keyof T>(eventKey: K, callback: (e: T[K]) => void): void;
|
|
6
6
|
off<K extends keyof T>(eventKey: K, callback: (e: T[K]) => void): void;
|
|
7
|
-
trigger<K extends keyof T>(eventKey: K, e
|
|
7
|
+
trigger<K extends keyof T>(eventKey: K, e?: T[K]): boolean;
|
|
8
8
|
has<K extends keyof T>(name: K | string): boolean;
|
|
9
|
+
destroy(): void;
|
|
10
|
+
clear(): void;
|
|
9
11
|
}
|
package/dist/esm/lib/event.js
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _EventEmitter_listeners;
|
|
1
13
|
export class EventEmitter {
|
|
2
14
|
constructor() {
|
|
3
|
-
this
|
|
15
|
+
_EventEmitter_listeners.set(this, void 0);
|
|
16
|
+
__classPrivateFieldSet(this, _EventEmitter_listeners, new Map(), "f");
|
|
4
17
|
}
|
|
5
18
|
on(eventKey, callback) {
|
|
6
|
-
if (this.
|
|
7
|
-
const callbacks = this.
|
|
19
|
+
if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(eventKey)) {
|
|
20
|
+
const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey) || [];
|
|
8
21
|
callbacks === null || callbacks === void 0 ? void 0 : callbacks.push(callback);
|
|
9
|
-
this.
|
|
22
|
+
__classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks);
|
|
10
23
|
}
|
|
11
24
|
else {
|
|
12
|
-
this.
|
|
25
|
+
__classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, [callback]);
|
|
13
26
|
}
|
|
14
27
|
}
|
|
15
28
|
off(eventKey, callback) {
|
|
16
|
-
if (this.
|
|
17
|
-
const callbacks = this.
|
|
29
|
+
if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(eventKey)) {
|
|
30
|
+
const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey);
|
|
18
31
|
if (Array.isArray(callbacks)) {
|
|
19
32
|
for (let i = 0; i < (callbacks === null || callbacks === void 0 ? void 0 : callbacks.length); i++) {
|
|
20
33
|
if (callbacks[i] === callback) {
|
|
@@ -23,11 +36,11 @@ export class EventEmitter {
|
|
|
23
36
|
}
|
|
24
37
|
}
|
|
25
38
|
}
|
|
26
|
-
this.
|
|
39
|
+
__classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks || []);
|
|
27
40
|
}
|
|
28
41
|
}
|
|
29
42
|
trigger(eventKey, e) {
|
|
30
|
-
const callbacks = this.
|
|
43
|
+
const callbacks = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(eventKey);
|
|
31
44
|
if (Array.isArray(callbacks)) {
|
|
32
45
|
callbacks.forEach((cb) => {
|
|
33
46
|
cb(e);
|
|
@@ -39,12 +52,19 @@ export class EventEmitter {
|
|
|
39
52
|
}
|
|
40
53
|
}
|
|
41
54
|
has(name) {
|
|
42
|
-
if (this.
|
|
43
|
-
const list = this.
|
|
55
|
+
if (__classPrivateFieldGet(this, _EventEmitter_listeners, "f").has(name)) {
|
|
56
|
+
const list = __classPrivateFieldGet(this, _EventEmitter_listeners, "f").get(name);
|
|
44
57
|
if (Array.isArray(list) && list.length > 0) {
|
|
45
58
|
return true;
|
|
46
59
|
}
|
|
47
60
|
}
|
|
48
61
|
return false;
|
|
49
62
|
}
|
|
63
|
+
destroy() {
|
|
64
|
+
this.clear();
|
|
65
|
+
}
|
|
66
|
+
clear() {
|
|
67
|
+
__classPrivateFieldGet(this, _EventEmitter_listeners, "f").clear();
|
|
68
|
+
}
|
|
50
69
|
}
|
|
70
|
+
_EventEmitter_listeners = new WeakMap();
|
package/dist/esm/lib/file.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
type ImageType = 'image/jpeg' | 'image/png';
|
|
2
2
|
export declare function downloadImageFromCanvas(canvas: HTMLCanvasElement, opts: {
|
|
3
|
-
|
|
3
|
+
fileName: string;
|
|
4
4
|
type: ImageType;
|
|
5
5
|
}): void;
|
|
6
6
|
export declare function pickFile(opts: {
|
|
7
|
+
accept?: string;
|
|
7
8
|
success: (data: {
|
|
8
9
|
file: File;
|
|
9
10
|
}) => void;
|
|
10
|
-
error?: (err:
|
|
11
|
+
error?: (err: Error | any) => void;
|
|
11
12
|
}): void;
|
|
12
13
|
export declare function parseFileToBase64(file: File): Promise<string | ArrayBuffer>;
|
|
13
14
|
export declare function parseFileToText(file: File): Promise<string | ArrayBuffer>;
|
|
15
|
+
export declare function parseTextToBlobURL(text: string): string;
|
|
16
|
+
export declare function downloadFileFromText(text: string, opts: {
|
|
17
|
+
fileName: string;
|
|
18
|
+
}): void;
|
|
14
19
|
export {};
|
package/dist/esm/lib/file.js
CHANGED
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
export function downloadImageFromCanvas(canvas, opts) {
|
|
2
|
-
const {
|
|
2
|
+
const { fileName, type = 'image/jpeg' } = opts;
|
|
3
3
|
const stream = canvas.toDataURL(type);
|
|
4
|
-
|
|
4
|
+
let downloadLink = document.createElement('a');
|
|
5
5
|
downloadLink.href = stream;
|
|
6
|
-
downloadLink.download =
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
downloadLink.dispatchEvent(downloadClickEvent);
|
|
6
|
+
downloadLink.download = fileName;
|
|
7
|
+
downloadLink.click();
|
|
8
|
+
downloadLink = null;
|
|
10
9
|
}
|
|
11
10
|
export function pickFile(opts) {
|
|
12
|
-
const { success, error } = opts;
|
|
11
|
+
const { accept, success, error } = opts;
|
|
13
12
|
let input = document.createElement('input');
|
|
14
13
|
input.type = 'file';
|
|
14
|
+
if (accept) {
|
|
15
|
+
input.accept = accept;
|
|
16
|
+
}
|
|
15
17
|
input.addEventListener('change', function () {
|
|
16
18
|
var _a;
|
|
17
19
|
const file = (_a = input.files) === null || _a === void 0 ? void 0 : _a[0];
|
|
@@ -64,3 +66,20 @@ export function parseFileToText(file) {
|
|
|
64
66
|
reader.readAsText(file);
|
|
65
67
|
});
|
|
66
68
|
}
|
|
69
|
+
export function parseTextToBlobURL(text) {
|
|
70
|
+
const bytes = new TextEncoder().encode(text);
|
|
71
|
+
const blob = new Blob([bytes], {
|
|
72
|
+
type: 'text/plain;charset=utf-8'
|
|
73
|
+
});
|
|
74
|
+
const blobURL = window.URL.createObjectURL(blob);
|
|
75
|
+
return blobURL;
|
|
76
|
+
}
|
|
77
|
+
export function downloadFileFromText(text, opts) {
|
|
78
|
+
const { fileName } = opts;
|
|
79
|
+
const blobURL = parseTextToBlobURL(text);
|
|
80
|
+
let downloadLink = document.createElement('a');
|
|
81
|
+
downloadLink.href = blobURL;
|
|
82
|
+
downloadLink.download = fileName;
|
|
83
|
+
downloadLink.click();
|
|
84
|
+
downloadLink = null;
|
|
85
|
+
}
|
|
@@ -10,5 +10,10 @@ export declare function deleteElementInList(uuid: string, list: Element[]): bool
|
|
|
10
10
|
export declare function moveElementPosition(elements: Elements, opts: {
|
|
11
11
|
from: ElementPosition;
|
|
12
12
|
to: ElementPosition;
|
|
13
|
-
}):
|
|
13
|
+
}): {
|
|
14
|
+
elements: Elements;
|
|
15
|
+
from: ElementPosition;
|
|
16
|
+
to: ElementPosition;
|
|
17
|
+
};
|
|
14
18
|
export declare function updateElementInList(uuid: string, updateContent: RecursivePartial<Element<ElementType>>, elements: Element[]): Element | null;
|
|
19
|
+
export declare function updateElementInListByPosition(position: ElementPosition, updateContent: RecursivePartial<Element<ElementType>>, elements: Element[]): Element | null;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createUUID } from './uuid';
|
|
2
|
-
import {
|
|
2
|
+
import { defaultText, getDefaultElementRectDetail, getDefaultElementCircleDetail, getDefaultElementTextDetail, getDefaultElementSVGDetail, getDefaultElementImageDetail, getDefaultElementGroupDetail } from './config';
|
|
3
3
|
import { istype } from './istype';
|
|
4
4
|
import { findElementFromListByPosition, getElementPositionFromList } from './element';
|
|
5
|
+
import { deepResizeGroupElement } from './resize-element';
|
|
5
6
|
const defaultViewWidth = 200;
|
|
6
7
|
const defaultViewHeight = 200;
|
|
7
|
-
const defaultDetail = getDefaultElementDetailConfig();
|
|
8
8
|
function createElementSize(type, opts) {
|
|
9
9
|
let x = 0;
|
|
10
10
|
let y = 0;
|
|
@@ -14,29 +14,26 @@ function createElementSize(type, opts) {
|
|
|
14
14
|
const { viewScaleInfo, viewSizeInfo } = opts;
|
|
15
15
|
const { scale, offsetLeft, offsetTop } = viewScaleInfo;
|
|
16
16
|
const { width, height } = viewSizeInfo;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
const limitViewWidth = width / 4;
|
|
18
|
+
const limitViewHeight = height / 4;
|
|
19
|
+
if (defaultViewWidth >= limitViewWidth) {
|
|
20
|
+
w = limitViewWidth / scale;
|
|
21
21
|
}
|
|
22
22
|
else {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (['circle', 'svg', 'image'].includes(type)) {
|
|
38
|
-
w = h = Math.max(w, h);
|
|
39
|
-
}
|
|
23
|
+
w = defaultViewWidth / scale;
|
|
24
|
+
}
|
|
25
|
+
if (defaultViewHeight >= limitViewHeight) {
|
|
26
|
+
h = limitViewHeight / scale;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
h = defaultViewHeight / scale;
|
|
30
|
+
}
|
|
31
|
+
if (['circle', 'svg', 'image'].includes(type)) {
|
|
32
|
+
w = h = Math.max(w, h);
|
|
33
|
+
}
|
|
34
|
+
else if (type === 'text') {
|
|
35
|
+
const fontSize = w / defaultText.length;
|
|
36
|
+
h = fontSize * 2;
|
|
40
37
|
}
|
|
41
38
|
x = (0 - offsetLeft + width / 2 - (w * scale) / 2) / scale;
|
|
42
39
|
y = (0 - offsetTop + height / 2 - (h * scale) / 2) / scale;
|
|
@@ -50,18 +47,16 @@ function createElementSize(type, opts) {
|
|
|
50
47
|
return elemSize;
|
|
51
48
|
}
|
|
52
49
|
export function createElement(type, baseElem, opts) {
|
|
53
|
-
const
|
|
50
|
+
const elementSize = createElementSize(type, opts);
|
|
54
51
|
let detail = {};
|
|
55
52
|
if (type === 'rect') {
|
|
56
53
|
detail = getDefaultElementRectDetail();
|
|
57
54
|
}
|
|
58
55
|
else if (type === 'circle') {
|
|
59
|
-
detail = getDefaultElementCircleDetail(
|
|
60
|
-
radius: elemSize.w
|
|
61
|
-
});
|
|
56
|
+
detail = getDefaultElementCircleDetail();
|
|
62
57
|
}
|
|
63
58
|
else if (type === 'text') {
|
|
64
|
-
detail = getDefaultElementTextDetail(
|
|
59
|
+
detail = getDefaultElementTextDetail(elementSize);
|
|
65
60
|
}
|
|
66
61
|
else if (type === 'svg') {
|
|
67
62
|
detail = getDefaultElementSVGDetail();
|
|
@@ -72,7 +67,7 @@ export function createElement(type, baseElem, opts) {
|
|
|
72
67
|
else if (type === 'group') {
|
|
73
68
|
detail = getDefaultElementGroupDetail();
|
|
74
69
|
}
|
|
75
|
-
const elem = Object.assign(Object.assign(Object.assign({},
|
|
70
|
+
const elem = Object.assign(Object.assign(Object.assign({}, elementSize), baseElem), { uuid: createUUID(), type, detail: Object.assign(Object.assign({}, detail), (baseElem.detail || {})) });
|
|
76
71
|
return elem;
|
|
77
72
|
}
|
|
78
73
|
export function insertElementToListByPosition(element, position, list) {
|
|
@@ -134,15 +129,16 @@ export function deleteElementInList(uuid, list) {
|
|
|
134
129
|
return deleteElementInListByPosition(position, list);
|
|
135
130
|
}
|
|
136
131
|
export function moveElementPosition(elements, opts) {
|
|
137
|
-
const
|
|
132
|
+
const from = [...opts.from];
|
|
133
|
+
const to = [...opts.to];
|
|
138
134
|
if (from.length === 0 || to.length === 0) {
|
|
139
|
-
return elements;
|
|
135
|
+
return { elements, from, to };
|
|
140
136
|
}
|
|
141
137
|
if (from.length <= to.length) {
|
|
142
138
|
for (let i = 0; i < from.length; i++) {
|
|
143
139
|
if (to[i] === from[i]) {
|
|
144
140
|
if (i === from.length - 1) {
|
|
145
|
-
return elements;
|
|
141
|
+
return { elements, from, to };
|
|
146
142
|
}
|
|
147
143
|
continue;
|
|
148
144
|
}
|
|
@@ -152,7 +148,7 @@ export function moveElementPosition(elements, opts) {
|
|
|
152
148
|
if (target) {
|
|
153
149
|
const insterResult = insertElementToListByPosition(target, to, elements);
|
|
154
150
|
if (!insterResult) {
|
|
155
|
-
return elements;
|
|
151
|
+
return { elements, from, to };
|
|
156
152
|
}
|
|
157
153
|
let trimDeletePosIndex = -1;
|
|
158
154
|
const trimDeletePosAction = 'down';
|
|
@@ -174,7 +170,7 @@ export function moveElementPosition(elements, opts) {
|
|
|
174
170
|
}
|
|
175
171
|
deleteElementInListByPosition(from, elements);
|
|
176
172
|
}
|
|
177
|
-
return elements;
|
|
173
|
+
return { elements, from, to };
|
|
178
174
|
}
|
|
179
175
|
function mergeElement(originElem, updateContent) {
|
|
180
176
|
var _a;
|
|
@@ -209,18 +205,42 @@ function mergeElement(originElem, updateContent) {
|
|
|
209
205
|
return originElem;
|
|
210
206
|
}
|
|
211
207
|
export function updateElementInList(uuid, updateContent, elements) {
|
|
212
|
-
var _a;
|
|
208
|
+
var _a, _b;
|
|
213
209
|
let targetElement = null;
|
|
214
210
|
for (let i = 0; i < elements.length; i++) {
|
|
215
211
|
const elem = elements[i];
|
|
216
212
|
if (elem.uuid === uuid) {
|
|
213
|
+
if (elem.type === 'group' && ((_a = elem.operations) === null || _a === void 0 ? void 0 : _a.deepResize) === true) {
|
|
214
|
+
if ((updateContent.w && updateContent.w > 0) || (updateContent.h && updateContent.h > 0)) {
|
|
215
|
+
deepResizeGroupElement(elem, {
|
|
216
|
+
w: updateContent.w,
|
|
217
|
+
h: updateContent.h
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
217
221
|
mergeElement(elem, updateContent);
|
|
218
222
|
targetElement = elem;
|
|
219
223
|
break;
|
|
220
224
|
}
|
|
221
225
|
else if (elem.type === 'group') {
|
|
222
|
-
targetElement = updateElementInList(uuid, updateContent, ((
|
|
226
|
+
targetElement = updateElementInList(uuid, updateContent, ((_b = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _b === void 0 ? void 0 : _b.children) || []);
|
|
223
227
|
}
|
|
224
228
|
}
|
|
225
229
|
return targetElement;
|
|
226
230
|
}
|
|
231
|
+
export function updateElementInListByPosition(position, updateContent, elements) {
|
|
232
|
+
var _a;
|
|
233
|
+
const elem = findElementFromListByPosition(position, elements);
|
|
234
|
+
if (elem) {
|
|
235
|
+
if (elem.type === 'group' && ((_a = elem.operations) === null || _a === void 0 ? void 0 : _a.deepResize) === true) {
|
|
236
|
+
if ((updateContent.w && updateContent.w > 0) || (updateContent.h && updateContent.h > 0)) {
|
|
237
|
+
deepResizeGroupElement(elem, {
|
|
238
|
+
w: updateContent.w,
|
|
239
|
+
h: updateContent.h
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
mergeElement(elem, updateContent);
|
|
244
|
+
}
|
|
245
|
+
return elem;
|
|
246
|
+
}
|
package/dist/esm/lib/html.d.ts
CHANGED
package/dist/esm/lib/istype.d.ts
CHANGED
package/dist/esm/lib/istype.js
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Data, ModifyType, ModifyOptions, ModifyRecord } from '@idraw/types';
|
|
2
|
+
export interface ModifyRecorderOptions {
|
|
3
|
+
recordable: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare class ModifyRecorder {
|
|
6
|
+
#private;
|
|
7
|
+
constructor(opts: ModifyRecorderOptions);
|
|
8
|
+
$getDoStack(): ModifyRecord[];
|
|
9
|
+
$getUndoStack(): ModifyRecord[];
|
|
10
|
+
clear(): void;
|
|
11
|
+
destroy(): void;
|
|
12
|
+
do<T extends ModifyType>(data: Data, opts: ModifyOptions<T>): Data;
|
|
13
|
+
undo(data: Data): Data | null;
|
|
14
|
+
redo(data: Data): Data | null;
|
|
15
|
+
}
|