@idraw/util 0.4.0-beta.4 → 0.4.0-beta.40

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 (60) hide show
  1. package/dist/esm/index.d.ts +17 -7
  2. package/dist/esm/index.js +17 -7
  3. package/dist/esm/lib/box.d.ts +2 -0
  4. package/dist/esm/lib/box.js +173 -0
  5. package/dist/esm/lib/canvas.d.ts +0 -1
  6. package/dist/esm/lib/canvas.js +26 -50
  7. package/dist/esm/lib/color.js +9 -6
  8. package/dist/esm/lib/config.d.ts +5 -10
  9. package/dist/esm/lib/config.js +9 -9
  10. package/dist/esm/lib/context2d.d.ts +4 -0
  11. package/dist/esm/lib/context2d.js +20 -0
  12. package/dist/esm/lib/controller.d.ts +8 -2
  13. package/dist/esm/lib/controller.js +184 -9
  14. package/dist/esm/lib/data.d.ts +7 -2
  15. package/dist/esm/lib/data.js +114 -4
  16. package/dist/esm/lib/element.d.ts +5 -0
  17. package/dist/esm/lib/element.js +54 -1
  18. package/dist/esm/lib/event.d.ts +4 -2
  19. package/dist/esm/lib/event.js +31 -11
  20. package/dist/esm/lib/file.d.ts +2 -1
  21. package/dist/esm/lib/file.js +4 -1
  22. package/dist/esm/lib/flat.d.ts +2 -0
  23. package/dist/esm/lib/flat.js +132 -0
  24. package/dist/esm/lib/group.d.ts +3 -0
  25. package/dist/esm/lib/group.js +81 -0
  26. package/dist/esm/lib/handle-element.d.ts +6 -1
  27. package/dist/esm/lib/handle-element.js +108 -43
  28. package/dist/esm/lib/html.d.ts +1 -1
  29. package/dist/esm/lib/is.d.ts +3 -1
  30. package/dist/esm/lib/is.js +21 -5
  31. package/dist/esm/lib/istype.d.ts +1 -0
  32. package/dist/esm/lib/istype.js +3 -0
  33. package/dist/esm/lib/merge.d.ts +1 -0
  34. package/dist/esm/lib/merge.js +17 -0
  35. package/dist/esm/lib/modify-recorder.d.ts +15 -0
  36. package/dist/esm/lib/modify-recorder.js +177 -0
  37. package/dist/esm/lib/modify.d.ts +6 -0
  38. package/dist/esm/lib/modify.js +99 -0
  39. package/dist/esm/lib/omit.d.ts +1 -0
  40. package/dist/esm/lib/omit.js +7 -0
  41. package/dist/esm/lib/point-move-element.d.ts +5 -0
  42. package/dist/esm/lib/point-move-element.js +26 -0
  43. package/dist/esm/lib/rect.js +9 -9
  44. package/dist/esm/lib/resize-element.d.ts +2 -0
  45. package/dist/esm/lib/resize-element.js +101 -0
  46. package/dist/esm/lib/rotate.js +8 -13
  47. package/dist/esm/lib/store.d.ts +9 -5
  48. package/dist/esm/lib/store.js +39 -9
  49. package/dist/esm/lib/text.d.ts +1 -0
  50. package/dist/esm/lib/text.js +4 -0
  51. package/dist/esm/lib/time.d.ts +1 -0
  52. package/dist/esm/lib/time.js +13 -1
  53. package/dist/esm/lib/view-box.js +4 -2
  54. package/dist/esm/lib/view-calc.d.ts +16 -3
  55. package/dist/esm/lib/view-calc.js +127 -3
  56. package/dist/esm/lib/view-content.d.ts +14 -0
  57. package/dist/esm/lib/view-content.js +88 -0
  58. package/dist/index.global.js +1614 -257
  59. package/dist/index.global.min.js +1 -1
  60. package/package.json +2 -2
@@ -1,6 +1,8 @@
1
1
  import { createUUID } from './uuid';
2
2
  import { getCenterFromTwoPoints } from './point';
3
3
  import { calcElementVertexesInGroup, calcElementVertexes } from './vertex';
4
+ import { calcViewElementSize } from './view-calc';
5
+ import { calcElementCenter } from './rotate';
4
6
  function createControllerElementSizeFromCenter(center, opts) {
5
7
  const { x, y } = center;
6
8
  const { size, angle } = opts;
@@ -13,9 +15,11 @@ function createControllerElementSizeFromCenter(center, opts) {
13
15
  };
14
16
  }
15
17
  export function calcElementSizeController(elemSize, opts) {
16
- const { groupQueue, controllerSize, viewScaleInfo } = opts;
18
+ const { groupQueue, controllerSize, viewScaleInfo, rotateControllerSize, rotateControllerPosition } = opts;
17
19
  const ctrlSize = (controllerSize && controllerSize > 0 ? controllerSize : 8) / viewScaleInfo.scale;
18
20
  const { x, y, w, h, angle = 0 } = elemSize;
21
+ const rotateCtrlSize = rotateControllerSize;
22
+ const rotateCtrlPos = rotateControllerPosition;
19
23
  const ctrlGroupQueue = [
20
24
  ...[
21
25
  {
@@ -36,6 +40,13 @@ export function calcElementSizeController(elemSize, opts) {
36
40
  totalAngle += angle;
37
41
  });
38
42
  const vertexes = calcElementVertexesInGroup(elemSize, { groupQueue });
43
+ const rotateElemVertexes = calcElementVertexesInGroup({
44
+ x: x,
45
+ y: y - (rotateCtrlPos + rotateCtrlSize / 2) / viewScaleInfo.scale,
46
+ h: h + (rotateCtrlPos * 2 + rotateCtrlSize) / viewScaleInfo.scale,
47
+ w: w,
48
+ angle
49
+ }, { groupQueue: [...groupQueue] });
39
50
  const topCenter = getCenterFromTwoPoints(vertexes[0], vertexes[1]);
40
51
  const rightCenter = getCenterFromTwoPoints(vertexes[1], vertexes[2]);
41
52
  const bottomCenter = getCenterFromTwoPoints(vertexes[2], vertexes[3]);
@@ -44,6 +55,10 @@ export function calcElementSizeController(elemSize, opts) {
44
55
  const topRightCenter = vertexes[1];
45
56
  const bottomRightCenter = vertexes[2];
46
57
  const bottomLeftCenter = vertexes[3];
58
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: totalAngle });
59
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: totalAngle });
60
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: totalAngle });
61
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: totalAngle });
47
62
  const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: totalAngle });
48
63
  const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: totalAngle });
49
64
  const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: totalAngle });
@@ -56,47 +71,207 @@ export function calcElementSizeController(elemSize, opts) {
56
71
  const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
57
72
  const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
58
73
  const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
74
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
75
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
76
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
77
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
78
+ const rotateCenter = getCenterFromTwoPoints(rotateElemVertexes[0], rotateElemVertexes[1]);
79
+ const tempRotateSizeRepairRatio = 1.1;
80
+ const rotateSize = createControllerElementSizeFromCenter(rotateCenter, {
81
+ size: (rotateControllerSize * tempRotateSizeRepairRatio) / viewScaleInfo.scale,
82
+ angle: totalAngle
83
+ });
84
+ const rotateVertexes = calcElementVertexes(rotateSize);
59
85
  const sizeController = {
86
+ originalElementCenter: calcElementCenter(elemSize),
87
+ originalElementSize: Object.assign({}, elemSize),
60
88
  elementWrapper: vertexes,
61
89
  left: {
62
90
  type: 'left',
63
91
  vertexes: leftVertexes,
64
- center: leftCenter
92
+ center: leftCenter,
93
+ size: ctrlSize
65
94
  },
66
95
  right: {
67
96
  type: 'right',
68
97
  vertexes: rightVertexes,
69
- center: rightCenter
98
+ center: rightCenter,
99
+ size: ctrlSize
70
100
  },
71
101
  top: {
72
102
  type: 'top',
73
103
  vertexes: topVertexes,
74
- center: topCenter
104
+ center: topCenter,
105
+ size: ctrlSize
75
106
  },
76
107
  bottom: {
77
108
  type: 'bottom',
78
109
  vertexes: bottomVertexes,
79
- center: bottomCenter
110
+ center: bottomCenter,
111
+ size: ctrlSize
80
112
  },
81
113
  topLeft: {
82
114
  type: 'top-left',
83
115
  vertexes: topLeftVertexes,
84
- center: topLeftCenter
116
+ center: topLeftCenter,
117
+ size: ctrlSize
85
118
  },
86
119
  topRight: {
87
120
  type: 'top-right',
88
121
  vertexes: topRightVertexes,
89
- center: topRightCenter
122
+ center: topRightCenter,
123
+ size: ctrlSize
90
124
  },
91
125
  bottomLeft: {
92
126
  type: 'bottom-left',
93
127
  vertexes: bottomLeftVertexes,
94
- center: bottomLeftCenter
128
+ center: bottomLeftCenter,
129
+ size: ctrlSize
95
130
  },
96
131
  bottomRight: {
97
132
  type: 'bottom-right',
98
133
  vertexes: bottomRightVertexes,
99
- center: bottomRightCenter
134
+ center: bottomRightCenter,
135
+ size: ctrlSize
136
+ },
137
+ leftMiddle: {
138
+ type: 'left-middle',
139
+ vertexes: leftMiddleVertexes,
140
+ center: leftCenter,
141
+ size: ctrlSize
142
+ },
143
+ rightMiddle: {
144
+ type: 'right-middle',
145
+ vertexes: rightMiddleVertexes,
146
+ center: rightCenter,
147
+ size: ctrlSize
148
+ },
149
+ topMiddle: {
150
+ type: 'top-middle',
151
+ vertexes: topMiddleVertexes,
152
+ center: topCenter,
153
+ size: ctrlSize
154
+ },
155
+ bottomMiddle: {
156
+ type: 'bottom-middle',
157
+ vertexes: bottomMiddleVertexes,
158
+ center: bottomCenter,
159
+ size: ctrlSize
160
+ },
161
+ rotate: {
162
+ type: 'rotate',
163
+ vertexes: rotateVertexes,
164
+ center: rotateCenter,
165
+ size: rotateControllerSize
166
+ }
167
+ };
168
+ return sizeController;
169
+ }
170
+ export function calcLayoutSizeController(layoutSize, opts) {
171
+ const { controllerSize, viewScaleInfo } = opts;
172
+ const ctrlSize = controllerSize && controllerSize > 0 ? controllerSize : 8;
173
+ const { x, y, w, h } = calcViewElementSize(layoutSize, { viewScaleInfo });
174
+ const center = calcElementCenter({ x, y, w, h });
175
+ const topCenter = { x: center.x, y };
176
+ const rightCenter = { x: x + w, y: center.y };
177
+ const bottomCenter = { x: center.x, y: y + h };
178
+ const leftCenter = { x, y: center.y };
179
+ const topLeftCenter = { x, y };
180
+ const topRightCenter = { x: x + w, y };
181
+ const bottomRightCenter = { x: x + w, y: y + h };
182
+ const bottomLeftCenter = { x, y: y + h };
183
+ const topMiddleSize = createControllerElementSizeFromCenter(topCenter, { size: ctrlSize, angle: 0 });
184
+ const rightMiddleSize = createControllerElementSizeFromCenter(rightCenter, { size: ctrlSize, angle: 0 });
185
+ const bottomMiddleSize = createControllerElementSizeFromCenter(bottomCenter, { size: ctrlSize, angle: 0 });
186
+ const leftMiddleSize = createControllerElementSizeFromCenter(leftCenter, { size: ctrlSize, angle: 0 });
187
+ const topLeftSize = createControllerElementSizeFromCenter(topLeftCenter, { size: ctrlSize, angle: 0 });
188
+ const topRightSize = createControllerElementSizeFromCenter(topRightCenter, { size: ctrlSize, angle: 0 });
189
+ const bottomLeftSize = createControllerElementSizeFromCenter(bottomLeftCenter, { size: ctrlSize, angle: 0 });
190
+ const bottomRightSize = createControllerElementSizeFromCenter(bottomRightCenter, { size: ctrlSize, angle: 0 });
191
+ const topLeftVertexes = calcElementVertexes(topLeftSize);
192
+ const topRightVertexes = calcElementVertexes(topRightSize);
193
+ const bottomLeftVertexes = calcElementVertexes(bottomLeftSize);
194
+ const bottomRightVertexes = calcElementVertexes(bottomRightSize);
195
+ const topVertexes = [topLeftVertexes[1], topRightVertexes[0], topRightVertexes[3], topLeftVertexes[2]];
196
+ const rightVertexes = [topRightVertexes[3], topRightVertexes[2], bottomRightVertexes[1], bottomRightVertexes[0]];
197
+ const bottomVertexes = [bottomLeftVertexes[1], bottomRightVertexes[0], bottomRightVertexes[3], bottomLeftVertexes[2]];
198
+ const leftVertexes = [topLeftVertexes[3], topLeftVertexes[2], bottomLeftVertexes[1], bottomLeftVertexes[0]];
199
+ const topMiddleVertexes = calcElementVertexes(topMiddleSize);
200
+ const rightMiddleVertexes = calcElementVertexes(rightMiddleSize);
201
+ const bottomMiddleVertexes = calcElementVertexes(bottomMiddleSize);
202
+ const leftMiddleVertexes = calcElementVertexes(leftMiddleSize);
203
+ const sizeController = {
204
+ left: {
205
+ type: 'left',
206
+ vertexes: leftVertexes,
207
+ center: leftCenter,
208
+ size: ctrlSize
209
+ },
210
+ right: {
211
+ type: 'right',
212
+ vertexes: rightVertexes,
213
+ center: rightCenter,
214
+ size: ctrlSize
215
+ },
216
+ top: {
217
+ type: 'top',
218
+ vertexes: topVertexes,
219
+ center: topCenter,
220
+ size: ctrlSize
221
+ },
222
+ bottom: {
223
+ type: 'bottom',
224
+ vertexes: bottomVertexes,
225
+ center: bottomCenter,
226
+ size: ctrlSize
227
+ },
228
+ topLeft: {
229
+ type: 'top-left',
230
+ vertexes: topLeftVertexes,
231
+ center: topLeftCenter,
232
+ size: ctrlSize
233
+ },
234
+ topRight: {
235
+ type: 'top-right',
236
+ vertexes: topRightVertexes,
237
+ center: topRightCenter,
238
+ size: ctrlSize
239
+ },
240
+ bottomLeft: {
241
+ type: 'bottom-left',
242
+ vertexes: bottomLeftVertexes,
243
+ center: bottomLeftCenter,
244
+ size: ctrlSize
245
+ },
246
+ bottomRight: {
247
+ type: 'bottom-right',
248
+ vertexes: bottomRightVertexes,
249
+ center: bottomRightCenter,
250
+ size: ctrlSize
251
+ },
252
+ leftMiddle: {
253
+ type: 'left-middle',
254
+ vertexes: leftMiddleVertexes,
255
+ center: leftCenter,
256
+ size: ctrlSize
257
+ },
258
+ rightMiddle: {
259
+ type: 'right-middle',
260
+ vertexes: rightMiddleVertexes,
261
+ center: rightCenter,
262
+ size: ctrlSize
263
+ },
264
+ topMiddle: {
265
+ type: 'top-middle',
266
+ vertexes: topMiddleVertexes,
267
+ center: topCenter,
268
+ size: ctrlSize
269
+ },
270
+ bottomMiddle: {
271
+ type: 'bottom-middle',
272
+ vertexes: bottomMiddleVertexes,
273
+ center: bottomCenter,
274
+ size: ctrlSize
100
275
  }
101
276
  };
102
277
  return sizeController;
@@ -1,5 +1,10 @@
1
- import type { Data } from '@idraw/types';
2
- export declare function deepClone<T extends any = any>(target: T): T;
1
+ import type { Data, Element, LoadItemMap } from '@idraw/types';
2
+ export declare function deepClone<T = any>(target: T): T;
3
+ export declare function deepCloneElement<T extends Element = Element>(element: T): T;
4
+ export declare function deepCloneData(data: Data): Data;
3
5
  export declare function sortDataAsserts(data: Data, opts?: {
4
6
  clone?: boolean;
5
7
  }): Data;
8
+ export declare function filterCompactData(data: Data, opts?: {
9
+ loadItemMap?: LoadItemMap;
10
+ }): Data<Record<string, any>>;
@@ -1,4 +1,15 @@
1
- import { createAssetId } from './uuid';
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 { createAssetId, createUUID, isAssetId } from './uuid';
2
13
  export function deepClone(target) {
3
14
  function _clone(t) {
4
15
  const type = is(t);
@@ -27,11 +38,30 @@ export function deepClone(target) {
27
38
  }
28
39
  return _clone(target);
29
40
  }
41
+ export function deepCloneElement(element) {
42
+ const elem = deepClone(element);
43
+ const _resetUUID = (e) => {
44
+ e.uuid = createUUID();
45
+ if (e.type === 'group' && e.detail.children) {
46
+ e.detail.children.forEach((child) => {
47
+ _resetUUID(child);
48
+ });
49
+ }
50
+ };
51
+ _resetUUID(elem);
52
+ return elem;
53
+ }
54
+ export function deepCloneData(data) {
55
+ const { elements } = data, restData = __rest(data, ["elements"]);
56
+ return Object.assign(Object.assign({}, deepClone(restData)), {
57
+ elements: elements.map((elem) => deepCloneElement(elem))
58
+ });
59
+ }
30
60
  function is(target) {
31
- return Object.prototype.toString
61
+ return (Object.prototype.toString
32
62
  .call(target)
33
63
  .replace(/[\]|\[]{1,1}/gi, '')
34
- .split(' ')[1];
64
+ .split(' ')[1]);
35
65
  }
36
66
  export function sortDataAsserts(data, opts) {
37
67
  const assets = data.assets || {};
@@ -68,7 +98,7 @@ export function sortDataAsserts(data, opts) {
68
98
  const assetUUID = createAssetId(html);
69
99
  if (!assets[assetUUID]) {
70
100
  assets[assetUUID] = {
71
- type: 'svg',
101
+ type: 'html',
72
102
  value: html
73
103
  };
74
104
  }
@@ -90,3 +120,83 @@ export function sortDataAsserts(data, opts) {
90
120
  sortedData.assets = assets;
91
121
  return sortedData;
92
122
  }
123
+ export function filterCompactData(data, opts) {
124
+ const assets = data.assets || {};
125
+ const sortedData = deepClone(data);
126
+ const loadItemMap = (opts === null || opts === void 0 ? void 0 : opts.loadItemMap) || {};
127
+ const _scanElements = (elems) => {
128
+ elems.forEach((elem) => {
129
+ var _a, _b, _c;
130
+ if (elem.type === 'image' && elem.detail.src) {
131
+ const src = elem.detail.src;
132
+ if (isAssetId(src) && !assets[src] && loadItemMap[src] && typeof ((_a = loadItemMap[src]) === null || _a === void 0 ? void 0 : _a.source) === 'string') {
133
+ assets[src] = {
134
+ type: 'image',
135
+ value: loadItemMap[src].source
136
+ };
137
+ }
138
+ else if (!assets[src]) {
139
+ const assetUUID = createAssetId(src);
140
+ if (!assets[assetUUID]) {
141
+ assets[assetUUID] = {
142
+ type: 'image',
143
+ value: src
144
+ };
145
+ }
146
+ elem.detail.src = assetUUID;
147
+ }
148
+ }
149
+ else if (elem.type === 'svg') {
150
+ const svg = elem.detail.svg;
151
+ if (isAssetId(svg) && !assets[svg] && loadItemMap[svg] && typeof ((_b = loadItemMap[svg]) === null || _b === void 0 ? void 0 : _b.source) === 'string') {
152
+ assets[svg] = {
153
+ type: 'svg',
154
+ value: loadItemMap[svg].source
155
+ };
156
+ }
157
+ else if (!assets[svg]) {
158
+ const assetUUID = createAssetId(svg);
159
+ if (!assets[assetUUID]) {
160
+ assets[assetUUID] = {
161
+ type: 'svg',
162
+ value: svg
163
+ };
164
+ }
165
+ elem.detail.svg = assetUUID;
166
+ }
167
+ }
168
+ else if (elem.type === 'html') {
169
+ const html = elem.detail.html;
170
+ if (isAssetId(html) && !assets[html] && loadItemMap[html] && typeof ((_c = loadItemMap[html]) === null || _c === void 0 ? void 0 : _c.source) === 'string') {
171
+ assets[html] = {
172
+ type: 'html',
173
+ value: loadItemMap[html].source
174
+ };
175
+ }
176
+ else if (!assets[html]) {
177
+ const assetUUID = createAssetId(html);
178
+ if (!assets[assetUUID]) {
179
+ assets[assetUUID] = {
180
+ type: 'html',
181
+ value: html
182
+ };
183
+ }
184
+ elem.detail.html = assetUUID;
185
+ }
186
+ }
187
+ else if (elem.type === 'group' && Array.isArray(elem.detail.children)) {
188
+ const groupAssets = elem.detail.assets || {};
189
+ Object.keys(groupAssets).forEach((assetId) => {
190
+ if (!assets[assetId]) {
191
+ assets[assetId] = groupAssets[assetId];
192
+ }
193
+ });
194
+ delete elem.detail.assets;
195
+ _scanElements(elem.detail.children);
196
+ }
197
+ });
198
+ };
199
+ _scanElements(sortedData.elements);
200
+ sortedData.assets = assets;
201
+ return sortedData;
202
+ }
@@ -16,6 +16,7 @@ export declare function getElemenetsAssetIds(elements: Elements): string[];
16
16
  export declare function findElementFromList(uuid: string, list: Element<ElementType>[]): Element<ElementType> | null;
17
17
  export declare function findElementsFromList(uuids: string[], list: Element<ElementType>[]): Element<ElementType>[];
18
18
  export declare function getGroupQueueFromList(uuid: string, elements: Element<ElementType>[]): Element<'group'>[];
19
+ export declare function getGroupQueueByElementPosition(elements: Element<ElementType>[], position: ElementPosition): Element<'group'>[] | null;
19
20
  export declare function getElementSize(elem: Element): ElementSize;
20
21
  export declare function mergeElementAsset<T extends Element<LoadElementType>>(element: T, assets: ElementAssets): T;
21
22
  export declare function filterElementAsset<T extends Element<LoadElementType>>(element: T): {
@@ -28,3 +29,7 @@ export declare function findElementsFromListByPositions(positions: ElementPositi
28
29
  export declare function findElementFromListByPosition(position: ElementPosition, list: Element[]): Element | null;
29
30
  export declare function findElementQueueFromListByPosition(position: ElementPosition, list: Element[]): Element[];
30
31
  export declare function getElementPositionFromList(uuid: string, elements: Element<ElementType>[]): ElementPosition;
32
+ export declare function getElementPositionMapFromList(uuids: string[], elements: Element<ElementType>[]): {
33
+ [uuid: string]: ElementPosition;
34
+ };
35
+ export declare function isSameElementSize(elem1: ElementSize, elem2: ElementSize): boolean;
@@ -1,4 +1,4 @@
1
- import { rotateElementVertexes } from './rotate';
1
+ import { limitAngle, rotateElementVertexes } from './rotate';
2
2
  import { isAssetId, createAssetId } from './uuid';
3
3
  function getGroupUUIDs(elements, index) {
4
4
  var _a;
@@ -260,6 +260,25 @@ export function getGroupQueueFromList(uuid, elements) {
260
260
  _scan(uuid, elements);
261
261
  return groupQueue;
262
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
+ }
263
282
  export function getElementSize(elem) {
264
283
  const { x, y, w, h, angle } = elem;
265
284
  const size = { x, y, w, h, angle };
@@ -408,3 +427,37 @@ export function getElementPositionFromList(uuid, elements) {
408
427
  _loop(elements);
409
428
  return result;
410
429
  }
430
+ export function getElementPositionMapFromList(uuids, elements) {
431
+ const currentPosition = [];
432
+ const positionMap = {};
433
+ let over = false;
434
+ const _loop = (list) => {
435
+ var _a;
436
+ for (let i = 0; i < list.length; i++) {
437
+ if (over === true) {
438
+ break;
439
+ }
440
+ currentPosition.push(i);
441
+ const elem = list[i];
442
+ if (uuids.includes(elem.uuid)) {
443
+ positionMap[elem.uuid] = [...currentPosition];
444
+ if (Object.keys(positionMap).length === uuids.length) {
445
+ over = true;
446
+ break;
447
+ }
448
+ }
449
+ else if (elem.type === 'group') {
450
+ _loop(((_a = elem === null || elem === void 0 ? void 0 : elem.detail) === null || _a === void 0 ? void 0 : _a.children) || []);
451
+ }
452
+ if (over) {
453
+ break;
454
+ }
455
+ currentPosition.pop();
456
+ }
457
+ };
458
+ _loop(elements);
459
+ return positionMap;
460
+ }
461
+ export function isSameElementSize(elem1, elem2) {
462
+ return (elem1.x === elem2.x && elem1.y === elem2.y && elem1.h === elem2.h && elem1.w === elem2.w && limitAngle(elem1.angle || 0) === limitAngle(elem2.angle || 0));
463
+ }
@@ -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 _listeners;
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: T[K]): boolean;
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
  }
@@ -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._listeners = new Map();
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._listeners.has(eventKey)) {
7
- const callbacks = this._listeners.get(eventKey) || [];
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._listeners.set(eventKey, callbacks);
22
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks);
10
23
  }
11
24
  else {
12
- this._listeners.set(eventKey, [callback]);
25
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, [callback]);
13
26
  }
14
27
  }
15
28
  off(eventKey, callback) {
16
- if (this._listeners.has(eventKey)) {
17
- const callbacks = this._listeners.get(eventKey);
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._listeners.set(eventKey, callbacks || []);
39
+ __classPrivateFieldGet(this, _EventEmitter_listeners, "f").set(eventKey, callbacks || []);
27
40
  }
28
41
  }
29
42
  trigger(eventKey, e) {
30
- const callbacks = this._listeners.get(eventKey);
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._listeners.has(name)) {
43
- const list = this._listeners.get(name);
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();
@@ -4,10 +4,11 @@ export declare function downloadImageFromCanvas(canvas: HTMLCanvasElement, opts:
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: ErrorEvent) => void;
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>;
@@ -8,9 +8,12 @@ export function downloadImageFromCanvas(canvas, opts) {
8
8
  downloadLink = null;
9
9
  }
10
10
  export function pickFile(opts) {
11
- const { success, error } = opts;
11
+ const { accept, success, error } = opts;
12
12
  let input = document.createElement('input');
13
13
  input.type = 'file';
14
+ if (accept) {
15
+ input.accept = accept;
16
+ }
14
17
  input.addEventListener('change', function () {
15
18
  var _a;
16
19
  const file = (_a = input.files) === null || _a === void 0 ? void 0 : _a[0];
@@ -0,0 +1,2 @@
1
+ import type { Elements } from '@idraw/types';
2
+ export declare function flatElementList(list: Elements): Elements;