react-design-editor 0.0.61 → 0.0.63
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/README.md +7 -0
- package/dist/react-design-editor.js +175962 -167735
- package/dist/react-design-editor.min.js +24 -2
- package/dist/react-design-editor.min.js.LICENSE.txt +0 -9
- package/lib/Canvas.js +3 -3
- package/lib/CanvasObject.js +3 -0
- package/lib/constants/code.d.ts +1 -0
- package/lib/constants/code.js +2 -1
- package/lib/handlers/AbstractHandler.d.ts +6 -0
- package/lib/handlers/AbstractHandler.js +10 -0
- package/lib/handlers/DrawingHandler.js +5 -5
- package/lib/handlers/EventHandler.d.ts +1 -1
- package/lib/handlers/EventHandler.js +4 -7
- package/lib/handlers/GridHandler.d.ts +1 -1
- package/lib/handlers/GridHandler.js +44 -24
- package/lib/handlers/GuidelineHandler.d.ts +1 -1
- package/lib/handlers/Handler.d.ts +23 -2
- package/lib/handlers/Handler.js +56 -40
- package/lib/handlers/LayoutHandler.d.ts +15 -0
- package/lib/handlers/LayoutHandler.js +110 -0
- package/lib/handlers/LinkHandler.d.ts +3 -12
- package/lib/handlers/LinkHandler.js +19 -40
- package/lib/handlers/PortHandler.d.ts +1 -1
- package/lib/handlers/PortHandler.js +12 -30
- package/lib/handlers/ShortcutHandler.d.ts +1 -1
- package/lib/handlers/TransactionHandler.js +8 -15
- package/lib/handlers/ZoomHandler.d.ts +1 -1
- package/lib/handlers/index.d.ts +2 -22
- package/lib/handlers/index.js +5 -45
- package/lib/objects/LineLink.d.ts +15 -0
- package/lib/objects/LineLink.js +107 -0
- package/lib/objects/Link.d.ts +8 -1
- package/lib/objects/Link.js +152 -44
- package/lib/objects/Node.js +3 -3
- package/lib/objects/index.d.ts +4 -0
- package/lib/objects/index.js +3 -1
- package/package.json +22 -15
- package/lib/handlers/FiberHandler.d.ts +0 -6
- package/lib/handlers/FiberHandler.js +0 -23
|
@@ -10,17 +10,8 @@
|
|
|
10
10
|
*
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
/*!
|
|
14
|
-
* The buffer module from node.js, for the browser.
|
|
15
|
-
*
|
|
16
|
-
* @author Feross Aboukhadijeh <http://feross.org>
|
|
17
|
-
* @license MIT
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
13
|
/*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */
|
|
21
14
|
|
|
22
|
-
/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
23
|
-
|
|
24
15
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
|
25
16
|
|
|
26
17
|
/**
|
package/lib/Canvas.js
CHANGED
|
@@ -29,7 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
29
29
|
const fabric_1 = require("fabric");
|
|
30
30
|
const react_1 = __importStar(require("react"));
|
|
31
31
|
const resize_observer_polyfill_1 = __importDefault(require("resize-observer-polyfill"));
|
|
32
|
-
const
|
|
32
|
+
const uuid_1 = require("uuid");
|
|
33
33
|
const constants_1 = require("./constants");
|
|
34
34
|
const Handler_1 = __importDefault(require("./handlers/Handler"));
|
|
35
35
|
require("./styles/canvas.less");
|
|
@@ -41,7 +41,7 @@ class InternalCanvas extends react_1.Component {
|
|
|
41
41
|
super(...arguments);
|
|
42
42
|
this.containerRef = react_1.default.createRef();
|
|
43
43
|
this.state = {
|
|
44
|
-
id: (0,
|
|
44
|
+
id: (0, uuid_1.v4)(),
|
|
45
45
|
loaded: false,
|
|
46
46
|
};
|
|
47
47
|
this.createObserver = () => {
|
|
@@ -71,7 +71,7 @@ class InternalCanvas extends react_1.Component {
|
|
|
71
71
|
};
|
|
72
72
|
}
|
|
73
73
|
static { this.defaultProps = {
|
|
74
|
-
id: (0,
|
|
74
|
+
id: (0, uuid_1.v4)(),
|
|
75
75
|
editable: true,
|
|
76
76
|
zoomEnabled: true,
|
|
77
77
|
minZoom: 30,
|
package/lib/CanvasObject.js
CHANGED
|
@@ -81,6 +81,9 @@ const CanvasObject = {
|
|
|
81
81
|
node: {
|
|
82
82
|
create: (option) => new objects_1.Node(option),
|
|
83
83
|
},
|
|
84
|
+
lineLink: {
|
|
85
|
+
create: (fromNode, fromPort, toNode, toPort, option) => new objects_1.LineLink(fromNode, fromPort, toNode, toPort, option),
|
|
86
|
+
},
|
|
84
87
|
link: {
|
|
85
88
|
create: (fromNode, fromPort, toNode, toPort, option) => new objects_1.Link(fromNode, fromPort, toNode, toPort, option),
|
|
86
89
|
},
|
package/lib/constants/code.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export declare const ESCAPE = "Escape";
|
|
2
2
|
export declare const DELETE = "Delete";
|
|
3
3
|
export declare const BACKSPACE = "Backspace";
|
|
4
|
+
export declare const SPACE = "Space";
|
|
4
5
|
export declare const EQUAL = "Equal";
|
|
5
6
|
export declare const MINUS = "Minus";
|
|
6
7
|
export declare const KEY_A = "KeyA";
|
package/lib/constants/code.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ARROW_RIGHT = exports.ARROW_LEFT = exports.ARROW_DOWN = exports.ARROW_UP = exports.KEY_X = exports.KEY_P = exports.KEY_O = exports.KEY_Y = exports.KEY_Z = exports.KEY_V = exports.KEY_C = exports.KEY_W = exports.KEY_Q = exports.KEY_A = exports.MINUS = exports.EQUAL = exports.BACKSPACE = exports.DELETE = exports.ESCAPE = void 0;
|
|
3
|
+
exports.ARROW_RIGHT = exports.ARROW_LEFT = exports.ARROW_DOWN = exports.ARROW_UP = exports.KEY_X = exports.KEY_P = exports.KEY_O = exports.KEY_Y = exports.KEY_Z = exports.KEY_V = exports.KEY_C = exports.KEY_W = exports.KEY_Q = exports.KEY_A = exports.MINUS = exports.EQUAL = exports.SPACE = exports.BACKSPACE = exports.DELETE = exports.ESCAPE = void 0;
|
|
4
4
|
exports.ESCAPE = 'Escape';
|
|
5
5
|
exports.DELETE = 'Delete';
|
|
6
6
|
exports.BACKSPACE = 'Backspace';
|
|
7
|
+
exports.SPACE = 'Space';
|
|
7
8
|
exports.EQUAL = 'Equal';
|
|
8
9
|
exports.MINUS = 'Minus';
|
|
9
10
|
exports.KEY_A = 'KeyA';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const fabric_1 = require("fabric");
|
|
4
|
-
const
|
|
4
|
+
const uuid_1 = require("uuid");
|
|
5
5
|
const objects_1 = require("../objects");
|
|
6
6
|
class DrawingHandler {
|
|
7
7
|
constructor(handler) {
|
|
@@ -47,7 +47,7 @@ class DrawingHandler {
|
|
|
47
47
|
hoverCursor: 'pointer',
|
|
48
48
|
});
|
|
49
49
|
circle.set({
|
|
50
|
-
id: (0,
|
|
50
|
+
id: (0, uuid_1.v4)(),
|
|
51
51
|
});
|
|
52
52
|
if (!this.handler.pointArray.length) {
|
|
53
53
|
circle.set({
|
|
@@ -114,7 +114,7 @@ class DrawingHandler {
|
|
|
114
114
|
},
|
|
115
115
|
generate: (pointArray) => {
|
|
116
116
|
const points = [];
|
|
117
|
-
const id = (0,
|
|
117
|
+
const id = (0, uuid_1.v4)();
|
|
118
118
|
pointArray.forEach(point => {
|
|
119
119
|
points.push({
|
|
120
120
|
x: point.left,
|
|
@@ -252,7 +252,7 @@ class DrawingHandler {
|
|
|
252
252
|
const { absolutePointer } = opt;
|
|
253
253
|
const { x, y } = absolutePointer;
|
|
254
254
|
let points = [];
|
|
255
|
-
const id = (0,
|
|
255
|
+
const id = (0, uuid_1.v4)();
|
|
256
256
|
this.handler.pointArray.forEach(point => {
|
|
257
257
|
points = points.concat(point.left, point.top, x, y);
|
|
258
258
|
this.handler.canvas.remove(point);
|
|
@@ -340,7 +340,7 @@ class DrawingHandler {
|
|
|
340
340
|
});
|
|
341
341
|
this.handler.canvas.remove(this.handler.activeLine);
|
|
342
342
|
const option = {
|
|
343
|
-
id: (0,
|
|
343
|
+
id: (0, uuid_1.v4)(),
|
|
344
344
|
points,
|
|
345
345
|
type: 'arrow',
|
|
346
346
|
stroke: 'rgba(0, 0, 0, 1)',
|
|
@@ -313,9 +313,7 @@ class EventHandler {
|
|
|
313
313
|
const { target } = event;
|
|
314
314
|
if (editable) {
|
|
315
315
|
if (this.handler.prevTarget && this.handler.prevTarget.superType === 'link') {
|
|
316
|
-
this.handler.prevTarget.
|
|
317
|
-
stroke: this.handler.prevTarget.originStroke || this.handler.prevTarget.stroke,
|
|
318
|
-
});
|
|
316
|
+
this.handler.prevTarget.setColor(this.handler.prevTarget.originStroke || this.handler.prevTarget.stroke);
|
|
319
317
|
}
|
|
320
318
|
if (target && target.type === 'fromPort') {
|
|
321
319
|
this.handler.linkHandler.init(target);
|
|
@@ -338,9 +336,8 @@ class EventHandler {
|
|
|
338
336
|
this.handler.guidelineHandler.zoom = this.handler.canvas.getZoom();
|
|
339
337
|
if (this.handler.interactionMode === 'selection') {
|
|
340
338
|
if (target && target.superType === 'link') {
|
|
341
|
-
target.set({
|
|
342
|
-
|
|
343
|
-
});
|
|
339
|
+
target.line.set({ stroke: target.selectedStroke || 'green' });
|
|
340
|
+
target.arrow.set({ fill: target.selectedStroke || 'green' });
|
|
344
341
|
}
|
|
345
342
|
this.handler.prevTarget = target;
|
|
346
343
|
return;
|
|
@@ -428,7 +425,7 @@ class EventHandler {
|
|
|
428
425
|
else if (this.handler.interactionMode === 'link') {
|
|
429
426
|
if (this.handler.activeLine && this.handler.activeLine.class === 'line') {
|
|
430
427
|
const pointer = this.handler.canvas.getPointer(event.e);
|
|
431
|
-
this.handler.activeLine.
|
|
428
|
+
this.handler.activeLine.update(this.handler.activeLine.fromPort, { left: pointer.x, top: pointer.y });
|
|
432
429
|
}
|
|
433
430
|
this.handler.canvas.requestRenderAll();
|
|
434
431
|
}
|
|
@@ -10,31 +10,51 @@ class GridHandler {
|
|
|
10
10
|
this.initialize = () => {
|
|
11
11
|
const { grid, lineColor, borderColor, enabled } = this.handler.gridOption;
|
|
12
12
|
if (enabled && grid) {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
fhorizontal.set({ stroke: borderColor });
|
|
33
|
-
shorizontal.set({ stroke: borderColor });
|
|
34
|
-
fvertical.set({ stroke: borderColor });
|
|
35
|
-
svertical.set({ stroke: borderColor });
|
|
36
|
-
}
|
|
13
|
+
const patternCanvas = document.createElement('canvas');
|
|
14
|
+
patternCanvas.width = grid * 5;
|
|
15
|
+
patternCanvas.height = grid * 5;
|
|
16
|
+
const ctx = patternCanvas.getContext('2d');
|
|
17
|
+
// 작은 칸 선 (얇은 회색)
|
|
18
|
+
ctx.strokeStyle = lineColor;
|
|
19
|
+
ctx.lineWidth = 1;
|
|
20
|
+
for (let i = 0; i <= 5; i++) {
|
|
21
|
+
const pos = i * grid;
|
|
22
|
+
// 세로 얇은 선
|
|
23
|
+
ctx.beginPath();
|
|
24
|
+
ctx.moveTo(pos, 0);
|
|
25
|
+
ctx.lineTo(pos, patternCanvas.height);
|
|
26
|
+
ctx.stroke();
|
|
27
|
+
// 가로 얇은 선
|
|
28
|
+
ctx.beginPath();
|
|
29
|
+
ctx.moveTo(0, pos);
|
|
30
|
+
ctx.lineTo(patternCanvas.width, pos);
|
|
31
|
+
ctx.stroke();
|
|
37
32
|
}
|
|
33
|
+
// 큰 칸 선 (굵은 진회색)
|
|
34
|
+
ctx.strokeStyle = borderColor;
|
|
35
|
+
// 바깥 세로선 (왼쪽, 오른쪽)
|
|
36
|
+
ctx.beginPath();
|
|
37
|
+
ctx.moveTo(0, 0);
|
|
38
|
+
ctx.lineTo(0, patternCanvas.height);
|
|
39
|
+
ctx.stroke();
|
|
40
|
+
ctx.beginPath();
|
|
41
|
+
ctx.moveTo(patternCanvas.width, 0);
|
|
42
|
+
ctx.lineTo(patternCanvas.width, patternCanvas.height);
|
|
43
|
+
ctx.stroke();
|
|
44
|
+
// 바깥 가로선 (위쪽, 아래쪽)
|
|
45
|
+
ctx.beginPath();
|
|
46
|
+
ctx.moveTo(0, 0);
|
|
47
|
+
ctx.lineTo(patternCanvas.width, 0);
|
|
48
|
+
ctx.stroke();
|
|
49
|
+
ctx.beginPath();
|
|
50
|
+
ctx.moveTo(0, patternCanvas.height);
|
|
51
|
+
ctx.lineTo(patternCanvas.width, patternCanvas.height);
|
|
52
|
+
ctx.stroke();
|
|
53
|
+
const image = new Image();
|
|
54
|
+
image.src = patternCanvas.toDataURL();
|
|
55
|
+
const pattern = new fabric_1.fabric.Pattern({ source: image, repeat: 'repeat' });
|
|
56
|
+
this.handler.canvas.setBackgroundColor(pattern, this.handler.canvas.renderAll.bind(this.handler.canvas));
|
|
57
|
+
this.handler.canvasOption.backgroundColor = pattern;
|
|
38
58
|
}
|
|
39
59
|
};
|
|
40
60
|
/**
|
|
@@ -1,10 +1,30 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
/// <reference types="animejs" />
|
|
3
3
|
import { fabric } from 'fabric';
|
|
4
|
-
import { AlignmentHandler, AnimationHandler, ChartHandler, ContextmenuHandler, CropHandler, CustomHandler, DrawingHandler, ElementHandler, EventHandler, GridHandler, GuidelineHandler, ImageHandler, InteractionHandler, LinkHandler, NodeHandler, PortHandler, ShortcutHandler, TooltipHandler, TransactionHandler, WorkareaHandler, ZoomHandler } from '.';
|
|
5
4
|
import { SvgObject } from '../objects/Svg';
|
|
6
5
|
import { CanvasOption, FabricCanvas, FabricGroup, FabricImage, FabricObject, FabricObjectOption, FabricObjects, GridOption, GuidelineOption, InteractionMode, KeyEvent, WorkareaObject, WorkareaOption } from '../utils';
|
|
7
|
-
import
|
|
6
|
+
import AlignmentHandler from './AlignmentHandler';
|
|
7
|
+
import AnimationHandler from './AnimationHandler';
|
|
8
|
+
import ChartHandler from './ChartHandler';
|
|
9
|
+
import ContextmenuHandler from './ContextmenuHandler';
|
|
10
|
+
import CropHandler from './CropHandler';
|
|
11
|
+
import CustomHandler from './CustomHandler';
|
|
12
|
+
import DrawingHandler from './DrawingHandler';
|
|
13
|
+
import ElementHandler from './ElementHandler';
|
|
14
|
+
import EventHandler from './EventHandler';
|
|
15
|
+
import GridHandler from './GridHandler';
|
|
16
|
+
import GuidelineHandler from './GuidelineHandler';
|
|
17
|
+
import ImageHandler from './ImageHandler';
|
|
18
|
+
import InteractionHandler from './InteractionHandler';
|
|
19
|
+
import LayoutHandler from './LayoutHandler';
|
|
20
|
+
import LinkHandler from './LinkHandler';
|
|
21
|
+
import NodeHandler from './NodeHandler';
|
|
22
|
+
import PortHandler from './PortHandler';
|
|
23
|
+
import ShortcutHandler from './ShortcutHandler';
|
|
24
|
+
import TooltipHandler from './TooltipHandler';
|
|
25
|
+
import TransactionHandler, { TransactionEvent } from './TransactionHandler';
|
|
26
|
+
import WorkareaHandler from './WorkareaHandler';
|
|
27
|
+
import ZoomHandler from './ZoomHandler';
|
|
8
28
|
export interface HandlerCallback {
|
|
9
29
|
/**
|
|
10
30
|
* When has been added object in Canvas, Called function
|
|
@@ -231,6 +251,7 @@ declare class Handler implements HandlerOptions {
|
|
|
231
251
|
eventHandler: EventHandler;
|
|
232
252
|
drawingHandler: DrawingHandler;
|
|
233
253
|
shortcutHandler: ShortcutHandler;
|
|
254
|
+
layoutHandler: LayoutHandler;
|
|
234
255
|
handlers: {
|
|
235
256
|
[key: string]: CustomHandler;
|
|
236
257
|
};
|
package/lib/handlers/Handler.js
CHANGED
|
@@ -5,11 +5,31 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const fabric_1 = require("fabric");
|
|
7
7
|
const lodash_1 = require("lodash");
|
|
8
|
-
const
|
|
8
|
+
const uuid_1 = require("uuid");
|
|
9
9
|
const warning_1 = __importDefault(require("warning"));
|
|
10
|
-
const _1 = require(".");
|
|
11
10
|
const CanvasObject_1 = __importDefault(require("../CanvasObject"));
|
|
12
11
|
const constants_1 = require("../constants");
|
|
12
|
+
const AlignmentHandler_1 = __importDefault(require("./AlignmentHandler"));
|
|
13
|
+
const AnimationHandler_1 = __importDefault(require("./AnimationHandler"));
|
|
14
|
+
const ChartHandler_1 = __importDefault(require("./ChartHandler"));
|
|
15
|
+
const ContextmenuHandler_1 = __importDefault(require("./ContextmenuHandler"));
|
|
16
|
+
const CropHandler_1 = __importDefault(require("./CropHandler"));
|
|
17
|
+
const DrawingHandler_1 = __importDefault(require("./DrawingHandler"));
|
|
18
|
+
const ElementHandler_1 = __importDefault(require("./ElementHandler"));
|
|
19
|
+
const EventHandler_1 = __importDefault(require("./EventHandler"));
|
|
20
|
+
const GridHandler_1 = __importDefault(require("./GridHandler"));
|
|
21
|
+
const GuidelineHandler_1 = __importDefault(require("./GuidelineHandler"));
|
|
22
|
+
const ImageHandler_1 = __importDefault(require("./ImageHandler"));
|
|
23
|
+
const InteractionHandler_1 = __importDefault(require("./InteractionHandler"));
|
|
24
|
+
const LayoutHandler_1 = __importDefault(require("./LayoutHandler"));
|
|
25
|
+
const LinkHandler_1 = __importDefault(require("./LinkHandler"));
|
|
26
|
+
const NodeHandler_1 = __importDefault(require("./NodeHandler"));
|
|
27
|
+
const PortHandler_1 = __importDefault(require("./PortHandler"));
|
|
28
|
+
const ShortcutHandler_1 = __importDefault(require("./ShortcutHandler"));
|
|
29
|
+
const TooltipHandler_1 = __importDefault(require("./TooltipHandler"));
|
|
30
|
+
const TransactionHandler_1 = __importDefault(require("./TransactionHandler"));
|
|
31
|
+
const WorkareaHandler_1 = __importDefault(require("./WorkareaHandler"));
|
|
32
|
+
const ZoomHandler_1 = __importDefault(require("./ZoomHandler"));
|
|
13
33
|
/**
|
|
14
34
|
* Main handler for Canvas
|
|
15
35
|
* @class Handler
|
|
@@ -82,26 +102,27 @@ class Handler {
|
|
|
82
102
|
*
|
|
83
103
|
*/
|
|
84
104
|
this.initHandler = () => {
|
|
85
|
-
this.workareaHandler = new
|
|
86
|
-
this.imageHandler = new
|
|
87
|
-
this.chartHandler = new
|
|
88
|
-
this.elementHandler = new
|
|
89
|
-
this.cropHandler = new
|
|
90
|
-
this.animationHandler = new
|
|
91
|
-
this.contextmenuHandler = new
|
|
92
|
-
this.tooltipHandler = new
|
|
93
|
-
this.zoomHandler = new
|
|
94
|
-
this.interactionHandler = new
|
|
95
|
-
this.transactionHandler = new
|
|
96
|
-
this.gridHandler = new
|
|
97
|
-
this.portHandler = new
|
|
98
|
-
this.linkHandler = new
|
|
99
|
-
this.nodeHandler = new
|
|
100
|
-
this.alignmentHandler = new
|
|
101
|
-
this.guidelineHandler = new
|
|
102
|
-
this.eventHandler = new
|
|
103
|
-
this.drawingHandler = new
|
|
104
|
-
this.shortcutHandler = new
|
|
105
|
+
this.workareaHandler = new WorkareaHandler_1.default(this);
|
|
106
|
+
this.imageHandler = new ImageHandler_1.default(this);
|
|
107
|
+
this.chartHandler = new ChartHandler_1.default(this);
|
|
108
|
+
this.elementHandler = new ElementHandler_1.default(this);
|
|
109
|
+
this.cropHandler = new CropHandler_1.default(this);
|
|
110
|
+
this.animationHandler = new AnimationHandler_1.default(this);
|
|
111
|
+
this.contextmenuHandler = new ContextmenuHandler_1.default(this);
|
|
112
|
+
this.tooltipHandler = new TooltipHandler_1.default(this);
|
|
113
|
+
this.zoomHandler = new ZoomHandler_1.default(this, this.zoomStep);
|
|
114
|
+
this.interactionHandler = new InteractionHandler_1.default(this);
|
|
115
|
+
this.transactionHandler = new TransactionHandler_1.default(this);
|
|
116
|
+
this.gridHandler = new GridHandler_1.default(this);
|
|
117
|
+
this.portHandler = new PortHandler_1.default(this);
|
|
118
|
+
this.linkHandler = new LinkHandler_1.default(this);
|
|
119
|
+
this.nodeHandler = new NodeHandler_1.default(this);
|
|
120
|
+
this.alignmentHandler = new AlignmentHandler_1.default(this);
|
|
121
|
+
this.guidelineHandler = new GuidelineHandler_1.default(this);
|
|
122
|
+
this.eventHandler = new EventHandler_1.default(this);
|
|
123
|
+
this.drawingHandler = new DrawingHandler_1.default(this);
|
|
124
|
+
this.shortcutHandler = new ShortcutHandler_1.default(this);
|
|
125
|
+
this.layoutHandler = new LayoutHandler_1.default(this);
|
|
105
126
|
};
|
|
106
127
|
/**
|
|
107
128
|
* Get primary object
|
|
@@ -112,9 +133,6 @@ class Handler {
|
|
|
112
133
|
if (obj.id === 'workarea') {
|
|
113
134
|
return false;
|
|
114
135
|
}
|
|
115
|
-
else if (obj.id === 'grid') {
|
|
116
|
-
return false;
|
|
117
|
-
}
|
|
118
136
|
else if (obj.superType === 'port') {
|
|
119
137
|
return false;
|
|
120
138
|
}
|
|
@@ -124,7 +142,7 @@ class Handler {
|
|
|
124
142
|
return true;
|
|
125
143
|
});
|
|
126
144
|
if (objects.length) {
|
|
127
|
-
objects.
|
|
145
|
+
this.objectMap = objects.reduce((p, c) => Object.assign(p, { [c.id]: c }), {});
|
|
128
146
|
}
|
|
129
147
|
else {
|
|
130
148
|
this.objectMap = {};
|
|
@@ -532,9 +550,7 @@ class Handler {
|
|
|
532
550
|
this.animationHandler.play(createdObj.id);
|
|
533
551
|
}
|
|
534
552
|
if (createdObj.superType === 'node') {
|
|
535
|
-
createdObj.set('shadow', {
|
|
536
|
-
color: createdObj.stroke,
|
|
537
|
-
});
|
|
553
|
+
createdObj.set('shadow', { color: createdObj.stroke });
|
|
538
554
|
}
|
|
539
555
|
if (gridOption.enabled) {
|
|
540
556
|
this.gridHandler.setCoords(createdObj);
|
|
@@ -719,7 +735,7 @@ class Handler {
|
|
|
719
735
|
const activeSelection = clonedObj;
|
|
720
736
|
activeSelection.canvas = this.canvas;
|
|
721
737
|
activeSelection.forEachObject((obj) => {
|
|
722
|
-
obj.set('id', (0,
|
|
738
|
+
obj.set('id', (0, uuid_1.v4)());
|
|
723
739
|
if (obj.superType === 'node') {
|
|
724
740
|
obj.set('shadow', {
|
|
725
741
|
color: obj.stroke,
|
|
@@ -738,7 +754,7 @@ class Handler {
|
|
|
738
754
|
}
|
|
739
755
|
else {
|
|
740
756
|
if (activeObject.id === clonedObj.id) {
|
|
741
|
-
clonedObj.set('id', (0,
|
|
757
|
+
clonedObj.set('id', (0, uuid_1.v4)());
|
|
742
758
|
}
|
|
743
759
|
if (clonedObj.superType === 'node') {
|
|
744
760
|
clonedObj.set('shadow', {
|
|
@@ -775,7 +791,7 @@ class Handler {
|
|
|
775
791
|
cloned.set({
|
|
776
792
|
left: cloned.left + grid,
|
|
777
793
|
top: cloned.top + grid,
|
|
778
|
-
id: (0,
|
|
794
|
+
id: (0, uuid_1.v4)(),
|
|
779
795
|
evented: true,
|
|
780
796
|
});
|
|
781
797
|
this.canvas.add(cloned);
|
|
@@ -847,7 +863,7 @@ class Handler {
|
|
|
847
863
|
const linkTarget = {
|
|
848
864
|
fromNodeIndex: index,
|
|
849
865
|
fromPortId: port.id,
|
|
850
|
-
type: '
|
|
866
|
+
type: 'link',
|
|
851
867
|
superType: 'link',
|
|
852
868
|
};
|
|
853
869
|
const findIndex = activeSelection
|
|
@@ -983,7 +999,7 @@ class Handler {
|
|
|
983
999
|
const { fromNode, fromPort, toNodeIndex } = linkObject;
|
|
984
1000
|
const toNode = objects[toNodeIndex];
|
|
985
1001
|
const link = {
|
|
986
|
-
type: '
|
|
1002
|
+
type: 'link',
|
|
987
1003
|
fromNodeId: fromNode,
|
|
988
1004
|
fromPortId: fromPort,
|
|
989
1005
|
toNodeId: toNode.id,
|
|
@@ -1015,13 +1031,13 @@ class Handler {
|
|
|
1015
1031
|
clonedObj.set({
|
|
1016
1032
|
left: clonedObj.left + padding,
|
|
1017
1033
|
top: clonedObj.top + padding,
|
|
1018
|
-
id: isCut ? clipboard.id : (0,
|
|
1034
|
+
id: isCut ? clipboard.id : (0, uuid_1.v4)(),
|
|
1019
1035
|
evented: true,
|
|
1020
1036
|
});
|
|
1021
1037
|
if (clonedObj.type === 'activeSelection') {
|
|
1022
1038
|
clonedObj.canvas = this.canvas;
|
|
1023
1039
|
clonedObj.forEachObject((obj) => {
|
|
1024
|
-
obj.set('id', isCut ? obj.id : (0,
|
|
1040
|
+
obj.set('id', isCut ? obj.id : (0, uuid_1.v4)());
|
|
1025
1041
|
this.canvas.add(obj);
|
|
1026
1042
|
if (obj.dblclick) {
|
|
1027
1043
|
obj.on('mousedblclick', this.eventHandler.object.mousedblclick);
|
|
@@ -1291,7 +1307,7 @@ class Handler {
|
|
|
1291
1307
|
obj.top += diffTop;
|
|
1292
1308
|
}
|
|
1293
1309
|
if (obj.superType === 'element') {
|
|
1294
|
-
obj.id = (0,
|
|
1310
|
+
obj.id = (0, uuid_1.v4)();
|
|
1295
1311
|
}
|
|
1296
1312
|
this.add(obj, false, true);
|
|
1297
1313
|
this.canvas.renderAll();
|
|
@@ -1320,7 +1336,7 @@ class Handler {
|
|
|
1320
1336
|
}
|
|
1321
1337
|
const group = activeObject.toGroup();
|
|
1322
1338
|
group.set({
|
|
1323
|
-
id: (0,
|
|
1339
|
+
id: (0, uuid_1.v4)(),
|
|
1324
1340
|
name: 'New group',
|
|
1325
1341
|
type: 'group',
|
|
1326
1342
|
...this.objectOption,
|
|
@@ -1448,7 +1464,7 @@ class Handler {
|
|
|
1448
1464
|
else {
|
|
1449
1465
|
this.canvas.discardActiveObject();
|
|
1450
1466
|
this.canvas.getObjects().forEach((obj) => {
|
|
1451
|
-
if (obj.id === '
|
|
1467
|
+
if (obj.id === 'workarea') {
|
|
1452
1468
|
return;
|
|
1453
1469
|
}
|
|
1454
1470
|
this.canvas.remove(obj);
|
|
@@ -1573,7 +1589,7 @@ class Handler {
|
|
|
1573
1589
|
*/
|
|
1574
1590
|
this.setCanvasOption = (canvasOption) => {
|
|
1575
1591
|
this.canvasOption = Object.assign({}, this.canvasOption, canvasOption);
|
|
1576
|
-
this.canvas.setBackgroundColor(
|
|
1592
|
+
this.canvas.setBackgroundColor('blue', this.canvas.renderAll.bind(this.canvas));
|
|
1577
1593
|
if (typeof canvasOption.width !== 'undefined' && typeof canvasOption.height !== 'undefined') {
|
|
1578
1594
|
if (this.eventHandler) {
|
|
1579
1595
|
this.eventHandler.resize(canvasOption.width, canvasOption.height);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AbstractHandler } from '.';
|
|
2
|
+
import { LinkObject, NodeObject } from '../objects';
|
|
3
|
+
export type LayoutType = 'dagre' | 'elk';
|
|
4
|
+
export type LayoutDirection = 'vertical' | 'horizontal';
|
|
5
|
+
export interface LayoutOptions {
|
|
6
|
+
type: LayoutType;
|
|
7
|
+
direction?: LayoutDirection;
|
|
8
|
+
nodes: NodeObject[];
|
|
9
|
+
links?: LinkObject[];
|
|
10
|
+
}
|
|
11
|
+
export default class LayoutHandler extends AbstractHandler {
|
|
12
|
+
runLayout(options: LayoutOptions): void;
|
|
13
|
+
private elk;
|
|
14
|
+
private dagre;
|
|
15
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const dagre_1 = __importDefault(require("@dagrejs/dagre"));
|
|
7
|
+
const elk_bundled_js_1 = __importDefault(require("elkjs/lib/elk.bundled.js"));
|
|
8
|
+
const _1 = require(".");
|
|
9
|
+
class LayoutHandler extends _1.AbstractHandler {
|
|
10
|
+
runLayout(options) {
|
|
11
|
+
const { type } = options;
|
|
12
|
+
if (!type) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (type === 'dagre') {
|
|
16
|
+
this.dagre(options);
|
|
17
|
+
}
|
|
18
|
+
else if (type === 'elk') {
|
|
19
|
+
this.elk(options);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
async elk(options) {
|
|
23
|
+
const { nodes, links } = options;
|
|
24
|
+
const elk = new elk_bundled_js_1.default();
|
|
25
|
+
const elkGraph = {
|
|
26
|
+
id: 'root',
|
|
27
|
+
layoutOptions: {
|
|
28
|
+
'elk.algorithm': 'layered',
|
|
29
|
+
'elk.direction': 'DOWN',
|
|
30
|
+
'elk.spacing.nodeNode': '60',
|
|
31
|
+
'elk.layered.spacing.nodeNodeBetweenLayers': '60',
|
|
32
|
+
'elk.spacing.componentSpacing': '200',
|
|
33
|
+
'elk.layered.nodePlacement.strategy': 'SIMPLEX',
|
|
34
|
+
},
|
|
35
|
+
children: nodes.map(node => ({
|
|
36
|
+
id: node.id,
|
|
37
|
+
width: node.width,
|
|
38
|
+
height: node.height,
|
|
39
|
+
layoutOptions: {
|
|
40
|
+
'elk.portConstraints': 'FIXED_ORDER',
|
|
41
|
+
'elk.portAlignment.default': 'CENTER',
|
|
42
|
+
},
|
|
43
|
+
ports: node.fromPort?.length
|
|
44
|
+
? node.fromPort
|
|
45
|
+
?.map(port => ({
|
|
46
|
+
id: `${node.id}:${port.id}`,
|
|
47
|
+
layoutOptions: { 'elk.port.side': 'SOUTH' },
|
|
48
|
+
}))
|
|
49
|
+
.concat(node.toPort
|
|
50
|
+
? [
|
|
51
|
+
{
|
|
52
|
+
id: `${node.id}:${node.toPort.id}`,
|
|
53
|
+
layoutOptions: {
|
|
54
|
+
'elk.port.side': 'NORTH',
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
]
|
|
58
|
+
: [])
|
|
59
|
+
: [
|
|
60
|
+
{
|
|
61
|
+
id: `${node.id}:${node.toPort.id}`,
|
|
62
|
+
layoutOptions: {
|
|
63
|
+
'elk.port.side': 'NORTH',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
})),
|
|
68
|
+
edges: links.map(link => ({
|
|
69
|
+
id: `${link.fromNode?.id}_${link.toNode?.id}`,
|
|
70
|
+
sources: [`${link.fromNode?.id}:${link.fromPort?.id}`],
|
|
71
|
+
targets: [`${link.toNode?.id}:${link.toPort?.id}`],
|
|
72
|
+
})),
|
|
73
|
+
};
|
|
74
|
+
const layout = await elk.layout(elkGraph);
|
|
75
|
+
const grid = this.handler.gridOption.grid || 20;
|
|
76
|
+
layout.children.forEach(nodeLayout => {
|
|
77
|
+
let { x: left, y: top } = nodeLayout;
|
|
78
|
+
left = Math.round(left / grid) * grid;
|
|
79
|
+
top = Math.round(top / grid) * grid;
|
|
80
|
+
const node = this.handler.objectMap[nodeLayout.id];
|
|
81
|
+
node.set({ left, top });
|
|
82
|
+
node.setCoords();
|
|
83
|
+
this.handler.portHandler.setCoords(node);
|
|
84
|
+
});
|
|
85
|
+
this.handler.canvas.renderAll();
|
|
86
|
+
}
|
|
87
|
+
dagre(options) {
|
|
88
|
+
const { nodes, links } = options;
|
|
89
|
+
const g = new dagre_1.default.graphlib.Graph();
|
|
90
|
+
g.setGraph({ nodesep: 80, ranksep: 80, edgesep: 0, rankdir: 'TB' });
|
|
91
|
+
g.setDefaultEdgeLabel(() => ({}));
|
|
92
|
+
nodes.forEach(node => g.setNode(node.id, { label: node.name, width: node.width, height: node.height }));
|
|
93
|
+
links?.forEach(link => g.setEdge(link.fromNode?.id, link.toNode?.id));
|
|
94
|
+
dagre_1.default.layout(g);
|
|
95
|
+
const grid = this.handler.gridOption.grid || 20;
|
|
96
|
+
g.nodes().forEach(id => {
|
|
97
|
+
let { x, y, width, height } = g.node(id);
|
|
98
|
+
let left = x - width / 2;
|
|
99
|
+
let top = y - height / 2;
|
|
100
|
+
left = Math.round(left / grid) * grid;
|
|
101
|
+
top = Math.round(top / grid) * grid;
|
|
102
|
+
const node = this.handler.objectMap[id];
|
|
103
|
+
node.set({ left, top });
|
|
104
|
+
node.setCoords();
|
|
105
|
+
this.handler.portHandler.setCoords(node);
|
|
106
|
+
});
|
|
107
|
+
this.handler.canvas.renderAll();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
exports.default = LayoutHandler;
|