ImportDockingFix.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {
  2. getMid
  3. } from 'diagram-js/lib/layout/LayoutUtil';
  4. import lineIntersect from './util/LineIntersect';
  5. /**
  6. * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus
  7. */
  8. /**
  9. * Fix broken dockings after DI imports.
  10. *
  11. * @param {EventBus} eventBus
  12. */
  13. export default function ImportDockingFix(eventBus) {
  14. function adjustDocking(startPoint, nextPoint, elementMid) {
  15. var elementTop = {
  16. x: elementMid.x,
  17. y: elementMid.y - 50
  18. };
  19. var elementLeft = {
  20. x: elementMid.x - 50,
  21. y: elementMid.y
  22. };
  23. var verticalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementTop),
  24. horizontalIntersect = lineIntersect(startPoint, nextPoint, elementMid, elementLeft);
  25. // original is horizontal or vertical center cross intersection
  26. var centerIntersect;
  27. if (verticalIntersect && horizontalIntersect) {
  28. if (getDistance(verticalIntersect, elementMid) > getDistance(horizontalIntersect, elementMid)) {
  29. centerIntersect = horizontalIntersect;
  30. } else {
  31. centerIntersect = verticalIntersect;
  32. }
  33. } else {
  34. centerIntersect = verticalIntersect || horizontalIntersect;
  35. }
  36. startPoint.original = centerIntersect;
  37. }
  38. function fixDockings(connection) {
  39. var waypoints = connection.waypoints;
  40. adjustDocking(
  41. waypoints[0],
  42. waypoints[1],
  43. getMid(connection.source)
  44. );
  45. adjustDocking(
  46. waypoints[waypoints.length - 1],
  47. waypoints[waypoints.length - 2],
  48. getMid(connection.target)
  49. );
  50. }
  51. eventBus.on('bpmnElement.added', function(e) {
  52. var element = e.element;
  53. if (element.waypoints) {
  54. fixDockings(element);
  55. }
  56. });
  57. }
  58. ImportDockingFix.$inject = [
  59. 'eventBus'
  60. ];
  61. // helpers //////////////////////
  62. function getDistance(p1, p2) {
  63. return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));
  64. }