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.
Files changed (39) hide show
  1. package/README.md +7 -0
  2. package/dist/react-design-editor.js +175962 -167735
  3. package/dist/react-design-editor.min.js +24 -2
  4. package/dist/react-design-editor.min.js.LICENSE.txt +0 -9
  5. package/lib/Canvas.js +3 -3
  6. package/lib/CanvasObject.js +3 -0
  7. package/lib/constants/code.d.ts +1 -0
  8. package/lib/constants/code.js +2 -1
  9. package/lib/handlers/AbstractHandler.d.ts +6 -0
  10. package/lib/handlers/AbstractHandler.js +10 -0
  11. package/lib/handlers/DrawingHandler.js +5 -5
  12. package/lib/handlers/EventHandler.d.ts +1 -1
  13. package/lib/handlers/EventHandler.js +4 -7
  14. package/lib/handlers/GridHandler.d.ts +1 -1
  15. package/lib/handlers/GridHandler.js +44 -24
  16. package/lib/handlers/GuidelineHandler.d.ts +1 -1
  17. package/lib/handlers/Handler.d.ts +23 -2
  18. package/lib/handlers/Handler.js +56 -40
  19. package/lib/handlers/LayoutHandler.d.ts +15 -0
  20. package/lib/handlers/LayoutHandler.js +110 -0
  21. package/lib/handlers/LinkHandler.d.ts +3 -12
  22. package/lib/handlers/LinkHandler.js +19 -40
  23. package/lib/handlers/PortHandler.d.ts +1 -1
  24. package/lib/handlers/PortHandler.js +12 -30
  25. package/lib/handlers/ShortcutHandler.d.ts +1 -1
  26. package/lib/handlers/TransactionHandler.js +8 -15
  27. package/lib/handlers/ZoomHandler.d.ts +1 -1
  28. package/lib/handlers/index.d.ts +2 -22
  29. package/lib/handlers/index.js +5 -45
  30. package/lib/objects/LineLink.d.ts +15 -0
  31. package/lib/objects/LineLink.js +107 -0
  32. package/lib/objects/Link.d.ts +8 -1
  33. package/lib/objects/Link.js +152 -44
  34. package/lib/objects/Node.js +3 -3
  35. package/lib/objects/index.d.ts +4 -0
  36. package/lib/objects/index.js +3 -1
  37. package/package.json +22 -15
  38. package/lib/handlers/FiberHandler.d.ts +0 -6
  39. 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 uuidv4_1 = require("uuidv4");
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, uuidv4_1.uuid)(),
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, uuidv4_1.uuid)(),
74
+ id: (0, uuid_1.v4)(),
75
75
  editable: true,
76
76
  zoomEnabled: true,
77
77
  minZoom: 30,
@@ -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
  },
@@ -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";
@@ -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';
@@ -0,0 +1,6 @@
1
+ import { Handler } from '.';
2
+ export default abstract class AbstractHandler {
3
+ protected handler: Handler;
4
+ constructor(handler: Handler);
5
+ protected initialize(): void;
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class AbstractHandler {
4
+ constructor(handler) {
5
+ this.handler = handler;
6
+ this.initialize();
7
+ }
8
+ initialize() { }
9
+ }
10
+ exports.default = AbstractHandler;
@@ -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 uuidv4_1 = require("uuidv4");
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, uuidv4_1.uuid)(),
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, uuidv4_1.uuid)();
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, uuidv4_1.uuid)();
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, uuidv4_1.uuid)(),
343
+ id: (0, uuid_1.v4)(),
344
344
  points,
345
345
  type: 'arrow',
346
346
  stroke: 'rgba(0, 0, 0, 1)',
@@ -1,5 +1,5 @@
1
1
  import { FabricEvent } from '../utils';
2
- import Handler from './Handler';
2
+ import type Handler from './Handler';
3
3
  /**
4
4
  * Event Handler Class
5
5
  * @author salgum1114
@@ -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.set({
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
- stroke: target.selectedStroke || 'green',
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.set({ x2: pointer.x, y2: pointer.y });
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
  }
@@ -1,6 +1,6 @@
1
1
  import { fabric } from 'fabric';
2
- import Handler from './Handler';
3
2
  import { FabricObject } from '../utils';
3
+ import type Handler from './Handler';
4
4
  declare class GridHandler {
5
5
  handler?: Handler;
6
6
  constructor(handler: Handler);
@@ -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 width = 5000;
14
- const gridLength = width / grid;
15
- const lineOptions = {
16
- stroke: lineColor,
17
- selectable: false,
18
- evented: false,
19
- id: 'grid',
20
- };
21
- for (let i = 0; i < gridLength; i++) {
22
- const distance = i * grid;
23
- const fhorizontal = new fabric_1.fabric.Line([distance, -width, distance, width], lineOptions);
24
- const shorizontal = new fabric_1.fabric.Line([distance - width, -width, distance - width, width], lineOptions);
25
- this.handler.canvas.add(fhorizontal);
26
- this.handler.canvas.add(shorizontal);
27
- const fvertical = new fabric_1.fabric.Line([-width, distance - width, width, distance - width], lineOptions);
28
- const svertical = new fabric_1.fabric.Line([-width, distance, width, distance], lineOptions);
29
- this.handler.canvas.add(fvertical);
30
- this.handler.canvas.add(svertical);
31
- if (i % 5 === 0) {
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,5 +1,5 @@
1
1
  import { FabricEvent, FabricObject } from '../utils';
2
- import Handler from './Handler';
2
+ import type Handler from './Handler';
3
3
  declare class GuidelineHandler {
4
4
  handler: Handler;
5
5
  verticalLines: {
@@ -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 { TransactionEvent } from './TransactionHandler';
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
  };
@@ -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 uuidv4_1 = require("uuidv4");
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 _1.WorkareaHandler(this);
86
- this.imageHandler = new _1.ImageHandler(this);
87
- this.chartHandler = new _1.ChartHandler(this);
88
- this.elementHandler = new _1.ElementHandler(this);
89
- this.cropHandler = new _1.CropHandler(this);
90
- this.animationHandler = new _1.AnimationHandler(this);
91
- this.contextmenuHandler = new _1.ContextmenuHandler(this);
92
- this.tooltipHandler = new _1.TooltipHandler(this);
93
- this.zoomHandler = new _1.ZoomHandler(this, this.zoomStep);
94
- this.interactionHandler = new _1.InteractionHandler(this);
95
- this.transactionHandler = new _1.TransactionHandler(this);
96
- this.gridHandler = new _1.GridHandler(this);
97
- this.portHandler = new _1.PortHandler(this);
98
- this.linkHandler = new _1.LinkHandler(this);
99
- this.nodeHandler = new _1.NodeHandler(this);
100
- this.alignmentHandler = new _1.AlignmentHandler(this);
101
- this.guidelineHandler = new _1.GuidelineHandler(this);
102
- this.eventHandler = new _1.EventHandler(this);
103
- this.drawingHandler = new _1.DrawingHandler(this);
104
- this.shortcutHandler = new _1.ShortcutHandler(this);
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.forEach(obj => (this.objectMap[obj.id] = obj));
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, uuidv4_1.uuid)());
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, uuidv4_1.uuid)());
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, uuidv4_1.uuid)(),
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: 'curvedLink',
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: 'curvedLink',
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, uuidv4_1.uuid)(),
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, uuidv4_1.uuid)());
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, uuidv4_1.uuid)();
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, uuidv4_1.uuid)(),
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 === 'grid' || obj.id === 'workarea') {
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(canvasOption.backgroundColor, this.canvas.renderAll.bind(this.canvas));
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;