ReconnectConnectionHandler.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { isArray } from 'min-dash';
  2. /**
  3. * Reconnect connection handler
  4. */
  5. export default function ReconnectConnectionHandler(modeling) {
  6. this._modeling = modeling;
  7. }
  8. ReconnectConnectionHandler.$inject = [ 'modeling' ];
  9. ReconnectConnectionHandler.prototype.execute = function(context) {
  10. var newSource = context.newSource,
  11. newTarget = context.newTarget,
  12. connection = context.connection,
  13. dockingOrPoints = context.dockingOrPoints;
  14. if (!newSource && !newTarget) {
  15. throw new Error('newSource or newTarget required');
  16. }
  17. if (isArray(dockingOrPoints)) {
  18. context.oldWaypoints = connection.waypoints;
  19. connection.waypoints = dockingOrPoints;
  20. }
  21. if (newSource) {
  22. context.oldSource = connection.source;
  23. connection.source = newSource;
  24. }
  25. if (newTarget) {
  26. context.oldTarget = connection.target;
  27. connection.target = newTarget;
  28. }
  29. return connection;
  30. };
  31. ReconnectConnectionHandler.prototype.postExecute = function(context) {
  32. var connection = context.connection,
  33. newSource = context.newSource,
  34. newTarget = context.newTarget,
  35. dockingOrPoints = context.dockingOrPoints,
  36. hints = context.hints || {};
  37. var layoutConnectionHints = {};
  38. if (hints.connectionStart) {
  39. layoutConnectionHints.connectionStart = hints.connectionStart;
  40. }
  41. if (hints.connectionEnd) {
  42. layoutConnectionHints.connectionEnd = hints.connectionEnd;
  43. }
  44. if (hints.layoutConnection === false) {
  45. return;
  46. }
  47. if (newSource && (!newTarget || hints.docking === 'source')) {
  48. layoutConnectionHints.connectionStart = layoutConnectionHints.connectionStart
  49. || getDocking(isArray(dockingOrPoints) ? dockingOrPoints[ 0 ] : dockingOrPoints);
  50. }
  51. if (newTarget && (!newSource || hints.docking === 'target')) {
  52. layoutConnectionHints.connectionEnd = layoutConnectionHints.connectionEnd
  53. || getDocking(isArray(dockingOrPoints) ? dockingOrPoints[ dockingOrPoints.length - 1 ] : dockingOrPoints);
  54. }
  55. if (hints.newWaypoints) {
  56. layoutConnectionHints.waypoints = hints.newWaypoints;
  57. }
  58. this._modeling.layoutConnection(connection, layoutConnectionHints);
  59. };
  60. ReconnectConnectionHandler.prototype.revert = function(context) {
  61. var oldSource = context.oldSource,
  62. oldTarget = context.oldTarget,
  63. oldWaypoints = context.oldWaypoints,
  64. connection = context.connection;
  65. if (oldSource) {
  66. connection.source = oldSource;
  67. }
  68. if (oldTarget) {
  69. connection.target = oldTarget;
  70. }
  71. if (oldWaypoints) {
  72. connection.waypoints = oldWaypoints;
  73. }
  74. return connection;
  75. };
  76. // helpers //////////
  77. function getDocking(point) {
  78. return point.original || point;
  79. }