react-design-editor 0.0.32 → 0.0.36

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 (101) hide show
  1. package/README.md +37 -33
  2. package/dist/react-design-editor.js +33723 -13736
  3. package/dist/react-design-editor.min.js +1 -1
  4. package/dist/react-design-editor.min.js.LICENSE.txt +13 -2
  5. package/lib/Canvas.d.ts +18 -32
  6. package/lib/Canvas.js +172 -245
  7. package/lib/CanvasObject.d.ts +10 -10
  8. package/lib/CanvasObject.js +96 -89
  9. package/lib/constants/code.d.ts +19 -0
  10. package/lib/constants/code.js +22 -0
  11. package/lib/constants/defaults.d.ts +38 -0
  12. package/lib/constants/defaults.js +69 -0
  13. package/lib/constants/index.d.ts +3 -0
  14. package/lib/constants/index.js +26 -0
  15. package/lib/handlers/AlignmentHandler.d.ts +18 -18
  16. package/lib/handlers/AlignmentHandler.js +58 -58
  17. package/lib/handlers/AnimationHandler.d.ts +50 -48
  18. package/lib/handlers/AnimationHandler.js +323 -298
  19. package/lib/handlers/ChartHandler.d.ts +8 -8
  20. package/lib/handlers/ChartHandler.js +8 -8
  21. package/lib/handlers/ContextmenuHandler.d.ts +28 -23
  22. package/lib/handlers/ContextmenuHandler.js +65 -56
  23. package/lib/handlers/CropHandler.d.ts +43 -37
  24. package/lib/handlers/CropHandler.js +261 -243
  25. package/lib/handlers/CustomHandler.d.ts +7 -0
  26. package/lib/handlers/CustomHandler.js +10 -0
  27. package/lib/handlers/DrawingHandler.d.ts +28 -28
  28. package/lib/handlers/DrawingHandler.js +318 -318
  29. package/lib/handlers/ElementHandler.d.ts +80 -80
  30. package/lib/handlers/ElementHandler.js +154 -154
  31. package/lib/handlers/EventHandler.d.ts +170 -182
  32. package/lib/handlers/EventHandler.js +880 -904
  33. package/lib/handlers/FiberHandler.d.ts +6 -0
  34. package/lib/handlers/FiberHandler.js +23 -0
  35. package/lib/handlers/GridHandler.d.ts +19 -18
  36. package/lib/handlers/GridHandler.js +77 -76
  37. package/lib/handlers/GuidelineHandler.d.ts +61 -39
  38. package/lib/handlers/GuidelineHandler.js +315 -266
  39. package/lib/handlers/Handler.d.ts +622 -543
  40. package/lib/handlers/Handler.js +1638 -1510
  41. package/lib/handlers/ImageHandler.d.ts +307 -307
  42. package/lib/handlers/ImageHandler.js +529 -484
  43. package/lib/handlers/InteractionHandler.d.ts +45 -45
  44. package/lib/handlers/InteractionHandler.js +164 -159
  45. package/lib/handlers/LinkHandler.d.ts +115 -116
  46. package/lib/handlers/LinkHandler.js +247 -246
  47. package/lib/handlers/NodeHandler.d.ts +50 -50
  48. package/lib/handlers/NodeHandler.js +274 -274
  49. package/lib/handlers/PortHandler.d.ts +22 -22
  50. package/lib/handlers/PortHandler.js +179 -179
  51. package/lib/handlers/ShortcutHandler.d.ts +119 -119
  52. package/lib/handlers/ShortcutHandler.js +151 -150
  53. package/lib/handlers/TooltipHandler.d.ts +33 -24
  54. package/lib/handlers/TooltipHandler.js +91 -78
  55. package/lib/handlers/TransactionHandler.d.ts +59 -54
  56. package/lib/handlers/TransactionHandler.js +137 -132
  57. package/lib/handlers/WorkareaHandler.d.ts +43 -41
  58. package/lib/handlers/WorkareaHandler.js +354 -352
  59. package/lib/handlers/ZoomHandler.d.ts +48 -48
  60. package/lib/handlers/ZoomHandler.js +143 -143
  61. package/lib/handlers/index.d.ts +23 -21
  62. package/lib/handlers/index.js +48 -44
  63. package/lib/index.d.ts +6 -5
  64. package/lib/index.js +20 -19
  65. package/lib/objects/Arrow.d.ts +2 -2
  66. package/lib/objects/Arrow.js +40 -39
  67. package/lib/objects/Chart.d.ts +10 -10
  68. package/lib/objects/Chart.js +117 -116
  69. package/lib/objects/CirclePort.d.ts +2 -2
  70. package/lib/objects/CirclePort.js +28 -28
  71. package/lib/objects/Cube.d.ts +5 -5
  72. package/lib/objects/Cube.js +71 -71
  73. package/lib/objects/CurvedLink.d.ts +2 -2
  74. package/lib/objects/CurvedLink.js +51 -49
  75. package/lib/objects/Element.d.ts +13 -13
  76. package/lib/objects/Element.js +77 -76
  77. package/lib/objects/Gif.d.ts +3 -3
  78. package/lib/objects/Gif.js +41 -38
  79. package/lib/objects/Iframe.d.ts +9 -9
  80. package/lib/objects/Iframe.js +63 -62
  81. package/lib/objects/Line.d.ts +2 -2
  82. package/lib/objects/Line.js +24 -24
  83. package/lib/objects/Link.d.ts +15 -15
  84. package/lib/objects/Link.js +106 -104
  85. package/lib/objects/Node.d.ts +59 -59
  86. package/lib/objects/Node.js +271 -268
  87. package/lib/objects/OrthogonalLink.d.ts +2 -2
  88. package/lib/objects/OrthogonalLink.js +54 -52
  89. package/lib/objects/Port.d.ts +12 -12
  90. package/lib/objects/Port.js +28 -28
  91. package/lib/objects/Svg.d.ts +8 -0
  92. package/lib/objects/Svg.js +59 -0
  93. package/lib/objects/Video.d.ts +14 -14
  94. package/lib/objects/Video.js +113 -112
  95. package/lib/objects/index.d.ts +15 -14
  96. package/lib/objects/index.js +32 -30
  97. package/lib/utils/ObjectUtil.d.ts +407 -413
  98. package/lib/utils/ObjectUtil.js +13 -13
  99. package/lib/utils/index.d.ts +1 -1
  100. package/lib/utils/index.js +13 -13
  101. package/package.json +20 -17
@@ -1,352 +1,354 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const fabric_1 = require("fabric");
4
- class WorkareaHandler {
5
- constructor(handler) {
6
- /**
7
- * Init workarea
8
- */
9
- this.init = () => {
10
- const { workareaOption } = this.handler;
11
- const image = new Image(workareaOption.width, workareaOption.height);
12
- image.width = workareaOption.width;
13
- image.height = workareaOption.height;
14
- this.handler.workarea = new fabric_1.fabric.Image(image, workareaOption);
15
- this.handler.canvas.add(this.handler.workarea);
16
- this.handler.objects = this.handler.getObjects();
17
- this.handler.canvas.centerObject(this.handler.workarea);
18
- this.handler.canvas.renderAll();
19
- };
20
- /**
21
- * Set the layout on workarea
22
- * @param {WorkareaLayout} layout
23
- * @returns
24
- */
25
- this.setLayout = (layout) => {
26
- this.handler.workarea.set('layout', layout);
27
- const { _element, isElement, workareaWidth, workareaHeight } = this.handler.workarea;
28
- const { canvas } = this.handler;
29
- let scaleX = 1;
30
- let scaleY = 1;
31
- const isFixed = layout === 'fixed';
32
- const isResponsive = layout === 'responsive';
33
- const isFullscreen = layout === 'fullscreen';
34
- if (isElement) {
35
- if (isFixed) {
36
- scaleX = workareaWidth / _element.width;
37
- scaleY = workareaHeight / _element.height;
38
- }
39
- else if (isResponsive) {
40
- const scales = this.calculateScale();
41
- scaleX = scales.scaleX;
42
- scaleY = scales.scaleY;
43
- }
44
- else {
45
- scaleX = canvas.getWidth() / _element.width;
46
- scaleY = canvas.getHeight() / _element.height;
47
- }
48
- }
49
- this.handler.getObjects().forEach(obj => {
50
- const { id, player } = obj;
51
- if (id !== 'workarea') {
52
- const objScaleX = !isFullscreen ? 1 : scaleX;
53
- const objScaleY = !isFullscreen ? 1 : scaleY;
54
- const objWidth = obj.width * objScaleX * canvas.getZoom();
55
- const objHeight = obj.height * objScaleY * canvas.getZoom();
56
- const el = this.handler.elementHandler.findById(obj.id);
57
- this.handler.elementHandler.setSize(el, obj);
58
- if (player) {
59
- player.setPlayerSize(objWidth, objHeight);
60
- }
61
- obj.set({
62
- scaleX: !isFullscreen ? 1 : objScaleX,
63
- scaleY: !isFullscreen ? 1 : objScaleY,
64
- });
65
- }
66
- });
67
- if (isResponsive) {
68
- const center = canvas.getCenter();
69
- if (isElement) {
70
- this.handler.workarea.set({
71
- scaleX: 1,
72
- scaleY: 1,
73
- });
74
- this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), scaleX);
75
- }
76
- else {
77
- this.handler.workarea.set({
78
- width: workareaWidth,
79
- height: workareaHeight,
80
- });
81
- scaleX = canvas.getWidth() / workareaWidth;
82
- scaleY = canvas.getHeight() / workareaHeight;
83
- if (workareaHeight >= workareaWidth) {
84
- scaleX = scaleY;
85
- }
86
- else {
87
- scaleY = scaleX;
88
- }
89
- this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), scaleX);
90
- }
91
- canvas.centerObject(this.handler.workarea);
92
- canvas.renderAll();
93
- return;
94
- }
95
- if (isElement) {
96
- this.handler.workarea.set({
97
- width: _element.width,
98
- height: _element.height,
99
- scaleX,
100
- scaleY,
101
- });
102
- }
103
- else {
104
- const width = isFixed ? workareaWidth : this.handler.canvas.getWidth();
105
- const height = isFixed ? workareaHeight : this.handler.canvas.getHeight();
106
- this.handler.workarea.set({
107
- width,
108
- height,
109
- backgroundColor: 'rgba(255, 255, 255, 1)',
110
- });
111
- this.handler.canvas.renderAll();
112
- if (isFixed) {
113
- canvas.centerObject(this.handler.workarea);
114
- }
115
- else {
116
- this.handler.workarea.set({
117
- left: 0,
118
- top: 0,
119
- });
120
- }
121
- }
122
- canvas.centerObject(this.handler.workarea);
123
- const center = canvas.getCenter();
124
- canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
125
- this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), 1);
126
- canvas.renderAll();
127
- };
128
- /**
129
- * Set the responsive image on Workarea
130
- * @param {string | File} [source]
131
- * @param {boolean} [loaded]
132
- * @returns
133
- */
134
- this.setResponsiveImage = async (source, loaded) => {
135
- const imageFromUrl = async (src = '') => {
136
- return new Promise(resolve => {
137
- fabric_1.fabric.Image.fromURL(src, (img) => {
138
- const { canvas, workarea, editable } = this.handler;
139
- const { workareaWidth, workareaHeight } = workarea;
140
- const { scaleX, scaleY } = this.calculateScale(img);
141
- if (img._element) {
142
- workarea.set({
143
- ...img,
144
- isElement: true,
145
- selectable: false,
146
- });
147
- }
148
- else {
149
- const image = new Image(workareaWidth, workareaHeight);
150
- workarea.setElement(image);
151
- workarea.set({
152
- isElement: false,
153
- selectable: false,
154
- width: workareaWidth,
155
- height: workareaHeight,
156
- });
157
- }
158
- if (editable && !loaded) {
159
- canvas.getObjects().forEach(obj => {
160
- const { id, player } = obj;
161
- if (id !== 'workarea') {
162
- const objWidth = obj.width * scaleX;
163
- const objHeight = obj.height * scaleY;
164
- const el = this.handler.elementHandler.findById(id);
165
- this.handler.elementHandler.setScaleOrAngle(el, obj);
166
- this.handler.elementHandler.setSize(el, obj);
167
- if (player) {
168
- player.setPlayerSize(objWidth, objHeight);
169
- }
170
- obj.set({
171
- scaleX: 1,
172
- scaleY: 1,
173
- });
174
- obj.setCoords();
175
- }
176
- });
177
- }
178
- // 파일이 없을 경우 Canvas의 nextWidth, nextHeight 값이 변경되기 전 상태에서 zoomToFit이 동작함
179
- // 정상 동작 resize event logic => zoomToFit
180
- // 현재 동작 zoomToFit -> resize event logic
181
- this.handler.zoomHandler.zoomToFit();
182
- canvas.centerObject(workarea);
183
- resolve(workarea);
184
- });
185
- });
186
- };
187
- const { workarea } = this.handler;
188
- if (!source) {
189
- workarea.set({
190
- src: null,
191
- file: null,
192
- });
193
- return imageFromUrl(source);
194
- }
195
- if (source instanceof File) {
196
- return new Promise(resolve => {
197
- const reader = new FileReader();
198
- reader.onload = () => {
199
- workarea.set({
200
- file: source,
201
- });
202
- imageFromUrl(reader.result).then(resolve);
203
- };
204
- reader.readAsDataURL(source);
205
- });
206
- }
207
- else {
208
- workarea.set({
209
- src: source,
210
- });
211
- return imageFromUrl(source);
212
- }
213
- };
214
- /**
215
- * Set the image on Workarea
216
- * @param {string | File} source
217
- * @param {boolean} [loaded=false]
218
- * @returns
219
- */
220
- this.setImage = async (source, loaded = false) => {
221
- const { canvas, workarea, editable } = this.handler;
222
- if (workarea.layout === 'responsive') {
223
- return this.setResponsiveImage(source, loaded);
224
- }
225
- const imageFromUrl = async (src) => {
226
- return new Promise(resolve => {
227
- fabric_1.fabric.Image.fromURL(src, (img) => {
228
- let width = canvas.getWidth();
229
- let height = canvas.getHeight();
230
- if (workarea.layout === 'fixed') {
231
- width = workarea.width * workarea.scaleX;
232
- height = workarea.height * workarea.scaleY;
233
- }
234
- let scaleX = 1;
235
- let scaleY = 1;
236
- if (img._element) {
237
- scaleX = width / img.width;
238
- scaleY = height / img.height;
239
- img.set({
240
- originX: 'left',
241
- originY: 'top',
242
- scaleX,
243
- scaleY,
244
- });
245
- workarea.set({
246
- ...img,
247
- isElement: true,
248
- selectable: false,
249
- });
250
- }
251
- else {
252
- workarea.setElement(new Image());
253
- workarea.set({
254
- width,
255
- height,
256
- scaleX,
257
- scaleY,
258
- isElement: false,
259
- selectable: false,
260
- });
261
- }
262
- canvas.centerObject(workarea);
263
- if (editable && !loaded) {
264
- const { layout } = workarea;
265
- canvas.getObjects().forEach(obj => {
266
- const { id, player } = obj;
267
- if (id !== 'workarea') {
268
- scaleX = layout === 'fullscreen' ? scaleX : obj.scaleX;
269
- scaleY = layout === 'fullscreen' ? scaleY : obj.scaleY;
270
- const el = this.handler.elementHandler.findById(id);
271
- this.handler.elementHandler.setSize(el, obj);
272
- if (player) {
273
- const objWidth = obj.width * scaleX;
274
- const objHeight = obj.height * scaleY;
275
- player.setPlayerSize(objWidth, objHeight);
276
- }
277
- obj.set({
278
- scaleX,
279
- scaleY,
280
- });
281
- obj.setCoords();
282
- }
283
- });
284
- }
285
- const center = canvas.getCenter();
286
- const zoom = loaded || workarea.layout === 'fullscreen' ? 1 : this.handler.canvas.getZoom();
287
- canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
288
- this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), zoom);
289
- canvas.renderAll();
290
- resolve(workarea);
291
- });
292
- });
293
- };
294
- if (!source) {
295
- workarea.set({
296
- src: null,
297
- file: null,
298
- });
299
- return imageFromUrl(source);
300
- }
301
- if (source instanceof File) {
302
- return new Promise(resolve => {
303
- const reader = new FileReader();
304
- reader.onload = () => {
305
- workarea.set({
306
- file: source,
307
- });
308
- imageFromUrl(reader.result).then(resolve);
309
- };
310
- reader.readAsDataURL(source);
311
- });
312
- }
313
- else {
314
- workarea.set({
315
- src: source,
316
- });
317
- return imageFromUrl(source);
318
- }
319
- };
320
- /**
321
- * Calculate scale to the image
322
- *
323
- * @param {FabricImage} [image]
324
- * @returns
325
- */
326
- this.calculateScale = (image) => {
327
- const { canvas, workarea } = this.handler;
328
- const { workareaWidth, workareaHeight } = workarea;
329
- const { _element } = image || workarea;
330
- const width = _element?.width || workareaWidth;
331
- const height = _element?.height || workareaHeight;
332
- let scaleX = canvas.getWidth() / width;
333
- let scaleY = canvas.getHeight() / height;
334
- if (height >= width) {
335
- scaleX = scaleY;
336
- if (canvas.getWidth() < width * scaleX) {
337
- scaleX = scaleX * (canvas.getWidth() / (width * scaleX));
338
- }
339
- }
340
- else {
341
- scaleY = scaleX;
342
- if (canvas.getHeight() < height * scaleX) {
343
- scaleX = scaleX * (canvas.getHeight() / (height * scaleX));
344
- }
345
- }
346
- return { scaleX, scaleY };
347
- };
348
- this.handler = handler;
349
- this.init();
350
- }
351
- }
352
- exports.default = WorkareaHandler;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fabric_1 = require("fabric");
4
+ class WorkareaHandler {
5
+ constructor(handler) {
6
+ /**
7
+ * Set the layout on workarea
8
+ * @param {WorkareaLayout} layout
9
+ * @returns
10
+ */
11
+ this.setLayout = (layout) => {
12
+ this.handler.workarea.set('layout', layout);
13
+ const { _element, isElement, workareaWidth, workareaHeight } = this.handler.workarea;
14
+ const { canvas } = this.handler;
15
+ let scaleX = 1;
16
+ let scaleY = 1;
17
+ const isFixed = layout === 'fixed';
18
+ const isResponsive = layout === 'responsive';
19
+ const isFullscreen = layout === 'fullscreen';
20
+ if (isElement) {
21
+ if (isFixed) {
22
+ scaleX = workareaWidth / _element.width;
23
+ scaleY = workareaHeight / _element.height;
24
+ }
25
+ else if (isResponsive) {
26
+ const scales = this.calculateScale();
27
+ scaleX = scales.scaleX;
28
+ scaleY = scales.scaleY;
29
+ }
30
+ else {
31
+ scaleX = canvas.getWidth() / _element.width;
32
+ scaleY = canvas.getHeight() / _element.height;
33
+ }
34
+ }
35
+ this.handler.getObjects().forEach(obj => {
36
+ const { id, player } = obj;
37
+ if (id !== 'workarea') {
38
+ const objScaleX = !isFullscreen ? 1 : scaleX;
39
+ const objScaleY = !isFullscreen ? 1 : scaleY;
40
+ const objWidth = obj.width * objScaleX * canvas.getZoom();
41
+ const objHeight = obj.height * objScaleY * canvas.getZoom();
42
+ const el = this.handler.elementHandler.findById(obj.id);
43
+ this.handler.elementHandler.setSize(el, obj);
44
+ if (player) {
45
+ player.setPlayerSize(objWidth, objHeight);
46
+ }
47
+ obj.set({
48
+ scaleX: !isFullscreen ? 1 : objScaleX,
49
+ scaleY: !isFullscreen ? 1 : objScaleY,
50
+ });
51
+ }
52
+ });
53
+ if (isResponsive) {
54
+ const center = canvas.getCenter();
55
+ if (isElement) {
56
+ this.handler.workarea.set({
57
+ scaleX: 1,
58
+ scaleY: 1,
59
+ });
60
+ this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), scaleX);
61
+ }
62
+ else {
63
+ this.handler.workarea.set({
64
+ width: workareaWidth,
65
+ height: workareaHeight,
66
+ });
67
+ scaleX = canvas.getWidth() / workareaWidth;
68
+ scaleY = canvas.getHeight() / workareaHeight;
69
+ if (workareaHeight >= workareaWidth) {
70
+ scaleX = scaleY;
71
+ }
72
+ else {
73
+ scaleY = scaleX;
74
+ }
75
+ this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), scaleX);
76
+ }
77
+ canvas.centerObject(this.handler.workarea);
78
+ canvas.renderAll();
79
+ return;
80
+ }
81
+ if (isElement) {
82
+ this.handler.workarea.set({
83
+ width: _element.width,
84
+ height: _element.height,
85
+ scaleX,
86
+ scaleY,
87
+ });
88
+ }
89
+ else {
90
+ const width = isFixed ? workareaWidth : this.handler.canvas.getWidth();
91
+ const height = isFixed ? workareaHeight : this.handler.canvas.getHeight();
92
+ this.handler.workarea.set({
93
+ width,
94
+ height,
95
+ backgroundColor: 'rgba(255, 255, 255, 1)',
96
+ });
97
+ this.handler.canvas.renderAll();
98
+ if (isFixed) {
99
+ canvas.centerObject(this.handler.workarea);
100
+ }
101
+ else {
102
+ this.handler.workarea.set({
103
+ left: 0,
104
+ top: 0,
105
+ });
106
+ }
107
+ }
108
+ canvas.centerObject(this.handler.workarea);
109
+ const center = canvas.getCenter();
110
+ canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
111
+ this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), 1);
112
+ canvas.renderAll();
113
+ };
114
+ /**
115
+ * Set the responsive image on Workarea
116
+ * @param {string | File} [source]
117
+ * @param {boolean} [loaded]
118
+ * @returns
119
+ */
120
+ this.setResponsiveImage = async (source, loaded) => {
121
+ const imageFromUrl = async (src = '') => {
122
+ return new Promise(resolve => {
123
+ fabric_1.fabric.Image.fromURL(src, (img) => {
124
+ const { canvas, workarea, editable } = this.handler;
125
+ const { workareaWidth, workareaHeight } = workarea;
126
+ const { scaleX, scaleY } = this.calculateScale(img);
127
+ if (img._element) {
128
+ workarea.set({
129
+ ...img,
130
+ isElement: true,
131
+ selectable: false,
132
+ });
133
+ }
134
+ else {
135
+ const image = new Image(workareaWidth, workareaHeight);
136
+ workarea.setElement(image);
137
+ workarea.set({
138
+ isElement: false,
139
+ selectable: false,
140
+ width: workareaWidth,
141
+ height: workareaHeight,
142
+ });
143
+ }
144
+ if (editable && !loaded) {
145
+ canvas.getObjects().forEach(obj => {
146
+ const { id, player } = obj;
147
+ if (id !== 'workarea') {
148
+ const objWidth = obj.width * scaleX;
149
+ const objHeight = obj.height * scaleY;
150
+ const el = this.handler.elementHandler.findById(id);
151
+ this.handler.elementHandler.setScaleOrAngle(el, obj);
152
+ this.handler.elementHandler.setSize(el, obj);
153
+ if (player) {
154
+ player.setPlayerSize(objWidth, objHeight);
155
+ }
156
+ obj.set({
157
+ scaleX: 1,
158
+ scaleY: 1,
159
+ });
160
+ obj.setCoords();
161
+ }
162
+ });
163
+ }
164
+ // 파일이 없을 경우 Canvas의 nextWidth, nextHeight 값이 변경되기 전 상태에서 zoomToFit이 동작함
165
+ // 정상 동작 resize event logic => zoomToFit
166
+ // 현재 동작 zoomToFit -> resize event logic
167
+ this.handler.zoomHandler.zoomToFit();
168
+ canvas.centerObject(workarea);
169
+ resolve(workarea);
170
+ });
171
+ });
172
+ };
173
+ const { workarea } = this.handler;
174
+ if (!source) {
175
+ workarea.set({
176
+ src: null,
177
+ file: null,
178
+ });
179
+ return imageFromUrl(source);
180
+ }
181
+ if (source instanceof File) {
182
+ return new Promise(resolve => {
183
+ const reader = new FileReader();
184
+ reader.onload = () => {
185
+ workarea.set({
186
+ file: source,
187
+ });
188
+ imageFromUrl(reader.result).then(resolve);
189
+ };
190
+ reader.readAsDataURL(source);
191
+ });
192
+ }
193
+ else {
194
+ workarea.set({
195
+ src: source,
196
+ });
197
+ return imageFromUrl(source);
198
+ }
199
+ };
200
+ /**
201
+ * Set the image on Workarea
202
+ * @param {string | File} source
203
+ * @param {boolean} [loaded=false]
204
+ * @returns
205
+ */
206
+ this.setImage = async (source, loaded = false) => {
207
+ const { canvas, workarea, editable } = this.handler;
208
+ if (workarea.layout === 'responsive') {
209
+ return this.setResponsiveImage(source, loaded);
210
+ }
211
+ const imageFromUrl = async (src) => {
212
+ return new Promise(resolve => {
213
+ fabric_1.fabric.Image.fromURL(src, (img) => {
214
+ let width = canvas.getWidth();
215
+ let height = canvas.getHeight();
216
+ if (workarea.layout === 'fixed') {
217
+ width = workarea.width * workarea.scaleX;
218
+ height = workarea.height * workarea.scaleY;
219
+ }
220
+ let scaleX = 1;
221
+ let scaleY = 1;
222
+ if (img._element) {
223
+ scaleX = width / img.width;
224
+ scaleY = height / img.height;
225
+ img.set({
226
+ originX: 'left',
227
+ originY: 'top',
228
+ scaleX,
229
+ scaleY,
230
+ });
231
+ workarea.set({
232
+ ...img,
233
+ isElement: true,
234
+ selectable: false,
235
+ });
236
+ }
237
+ else {
238
+ workarea.setElement(new Image());
239
+ workarea.set({
240
+ width,
241
+ height,
242
+ scaleX,
243
+ scaleY,
244
+ isElement: false,
245
+ selectable: false,
246
+ });
247
+ }
248
+ canvas.centerObject(workarea);
249
+ if (editable && !loaded) {
250
+ const { layout } = workarea;
251
+ canvas.getObjects().forEach(obj => {
252
+ const { id, player } = obj;
253
+ if (id !== 'workarea') {
254
+ scaleX = layout === 'fullscreen' ? scaleX : obj.scaleX;
255
+ scaleY = layout === 'fullscreen' ? scaleY : obj.scaleY;
256
+ const el = this.handler.elementHandler.findById(id);
257
+ this.handler.elementHandler.setSize(el, obj);
258
+ if (player) {
259
+ const objWidth = obj.width * scaleX;
260
+ const objHeight = obj.height * scaleY;
261
+ player.setPlayerSize(objWidth, objHeight);
262
+ }
263
+ obj.set({
264
+ scaleX,
265
+ scaleY,
266
+ });
267
+ obj.setCoords();
268
+ }
269
+ });
270
+ }
271
+ const center = canvas.getCenter();
272
+ const zoom = loaded || workarea.layout === 'fullscreen' ? 1 : this.handler.canvas.getZoom();
273
+ canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
274
+ this.handler.zoomHandler.zoomToPoint(new fabric_1.fabric.Point(center.left, center.top), zoom);
275
+ canvas.renderAll();
276
+ resolve(workarea);
277
+ });
278
+ });
279
+ };
280
+ if (!source) {
281
+ workarea.set({
282
+ src: null,
283
+ file: null,
284
+ });
285
+ return imageFromUrl(source);
286
+ }
287
+ if (source instanceof File) {
288
+ return new Promise(resolve => {
289
+ const reader = new FileReader();
290
+ reader.onload = () => {
291
+ workarea.set({
292
+ file: source,
293
+ });
294
+ imageFromUrl(reader.result).then(resolve);
295
+ };
296
+ reader.readAsDataURL(source);
297
+ });
298
+ }
299
+ else {
300
+ workarea.set({
301
+ src: source,
302
+ });
303
+ return imageFromUrl(source);
304
+ }
305
+ };
306
+ /**
307
+ * Calculate scale to the image
308
+ *
309
+ * @param {FabricImage} [image]
310
+ * @returns
311
+ */
312
+ this.calculateScale = (image) => {
313
+ const { canvas, workarea } = this.handler;
314
+ const { workareaWidth, workareaHeight } = workarea;
315
+ const { _element } = image || workarea;
316
+ const width = _element?.width || workareaWidth;
317
+ const height = _element?.height || workareaHeight;
318
+ let scaleX = canvas.getWidth() / width;
319
+ let scaleY = canvas.getHeight() / height;
320
+ if (height >= width) {
321
+ scaleX = scaleY;
322
+ if (canvas.getWidth() < width * scaleX) {
323
+ scaleX = scaleX * (canvas.getWidth() / (width * scaleX));
324
+ }
325
+ }
326
+ else {
327
+ scaleY = scaleX;
328
+ if (canvas.getHeight() < height * scaleX) {
329
+ scaleX = scaleX * (canvas.getHeight() / (height * scaleX));
330
+ }
331
+ }
332
+ return { scaleX, scaleY };
333
+ };
334
+ this.handler = handler;
335
+ this.initialize();
336
+ }
337
+ /**
338
+ * Initialize workarea
339
+ *
340
+ * @author salgum1114
341
+ */
342
+ initialize() {
343
+ const { workareaOption } = this.handler;
344
+ const image = new Image(workareaOption.width, workareaOption.height);
345
+ image.width = workareaOption.width;
346
+ image.height = workareaOption.height;
347
+ this.handler.workarea = new fabric_1.fabric.Image(image, workareaOption);
348
+ this.handler.canvas.add(this.handler.workarea);
349
+ this.handler.objects = this.handler.getObjects();
350
+ this.handler.canvas.centerObject(this.handler.workarea);
351
+ this.handler.canvas.renderAll();
352
+ }
353
+ }
354
+ exports.default = WorkareaHandler;