{"version":3,"file":"XConnector.min.mjs","sources":["../../../../src/shapes/canvasx/XConnector.ts"],"sourcesContent":["import { Path } from '../Path';\nimport { sendPointToPlane, TSimpleParsedCommand } from '../../util';\nimport { Point, XY } from '../../Point';\nimport { classRegistry } from '../../ClassRegistry';\nimport { iMatrix } from '../../constants';\nimport { createPathControls } from '../../controls/pathControl';\nimport { XCanvas } from '../../canvas/canvasx/bx-canvas';\nimport { Transform } from '../../EventTypeDefs';\n\nimport { EntityKeys, WidgetConnectorInterface } from './type/widget.entity.connector';\nimport { WidgetType } from './type/widget.type';\n\nconst getPath = (\n  fromPoint: XY,\n  toPoint: XY,\n  control1: XY,\n  control2: XY,\n  pathType: 'curvePath' | 'straightPath' = 'curvePath'\n) => {\n  if (pathType === 'curvePath') {\n    return `M ${fromPoint.x} ${fromPoint.y} C ${control1.x}, ${control1.y}, ${control2.x} ${control2.y}, ${toPoint.x} ${toPoint.y}`;\n  } else {\n    return `M ${fromPoint.x} ${fromPoint.y} L ${toPoint.x} ${toPoint.y}`;\n  }\n};\n\nclass XConnector extends Path implements WidgetConnectorInterface {\n  static type: WidgetType = 'XConnector';\n  static objType: WidgetType = 'XConnector';\n  style: any;\n  declare fromObjectId: string;\n  declare toObjectId: string;\n  declare pathType: 'curvePath' | 'straightPath';\n  declare pathArrowTip: 'none' | 'start' | 'end' | 'both';\n  declare fromPoint: XY;\n  declare toPoint: XY;\n  declare control1: XY;\n  declare control2: XY;\n\n  /**\n   * Contains the path to draw the arrow tip start\n   */\n  declare pathStart: TSimpleParsedCommand[];\n\n  /**\n   * Contains the path to draw the arrow tip end\n   */\n  declare pathEnd: TSimpleParsedCommand[];\n\n\n  constructor(\n    fromPoint: XY,\n    toPoint: XY,\n    control1: XY,\n    control2: XY,\n    options: any = {}\n  ) {\n    const path = getPath(fromPoint, toPoint, control1, control2, options.pathType);\n\n\n\n\n    super(path, options);\n    // Object.assign(this, options);\n\n    //default values\n    this.perPixelTargetFind = true;\n    this.cornerColor = 'white';\n    this.cornerStyle = 'circle';\n    this.type = 'XConnector';\n    this.objType = 'XConnector';\n    this.transparentCorners = false;\n    this.cornerStrokeColor = 'gray';\n    this.hasBorders = false;\n    this.objectCaching = false;\n\n\n    this.pathType = options.pathType || 'curvePath';\n    this.pathArrowTip = options.pathArrowTip || 'both';\n    this.fromObjectId = options.fromObjectId;\n    this.toObjectId = options.toObjectId;\n    this.fromPoint = fromPoint;\n    this.toPoint = toPoint;\n    this.control1 = control1;\n    this.control2 = control2;\n    this.createdByName = options.createdByName;\n    this.createdBy = options.createdBy;\n    this.createdAt = options.createdAt;\n    this.boardId = options.boardId;\n    this.style = options.style;\n    this.fill = options.fill || 'transparent';\n    this.stroke = options.stroke || '#000000';\n    this.createdAt = options.createdAt;\n    this.updatedBy = options.updatedBy;\n    this.updatedByName = options.updatedByName;\n    this.version = options.version;\n    this.zIndex = options.zIndex;\n\n    // Object.assign(this, options);\n    this._setMovementLock();\n    this.calcStartEndPath();\n    this.controls = {\n      ...createPathControls(this, {\n        mouseDownHandler: this._mouseDownControl.bind(this),\n        mouseUpHandler: this._mouseUpControl.bind(this),\n        cursorStyle: 'crosshair',\n        pointStyle: {\n          controlFill: 'white',\n          controlStroke: 'gray',\n        },\n        controlPointStyle: {\n          controlFill: 'white',\n          connectionDashArray: [5, 5],\n          controlStroke: 'gray',\n        },\n      }),\n    };\n    this.on('modifyPath', function (this: XConnector, evtOpt) {\n      this.calcStartEndPath();\n      const { commandIndex, pointIndex } = evtOpt;\n      // commandIndex === 0 is always start,\n      // all the commandIndex === 1 are control points apart the 5\n      if (commandIndex === 1 && pointIndex !== 5) {\n        return;\n      }\n      this.dragActionEventHandler(evtOpt.commandIndex, evtOpt.pointIndex);\n    });\n  }\n  updatedBy: string;\n  updatedByName: string;\n\n  createdByName: string;\n  boardId: string;\n  objType: WidgetType;\n  userId: string;\n  zIndex: number;\n  version: string;\n  updatedAt: number;\n\n  createdAt: number;\n  createdBy: string;\n\n  getFromPoint() {\n    const command = this.path[0];\n    return new Point(command[1]!, command[2]!);\n  }\n  getObject() {\n    const entityKeys: string[] = EntityKeys;\n    const result: Record<string, any> = {};\n\n    entityKeys.forEach((key) => {\n      if (key in this) {\n        result[key] = (this as any)[key];\n      }\n    });\n\n    return result;\n  }\n\n\n  getToPoint() {\n    const lastCommand = this.path[this.path.length - 1];\n    return lastCommand[0] === 'L'\n      ? new Point(lastCommand[1]!, lastCommand[2]!)\n      : new Point(lastCommand[5]!, lastCommand[6]!);\n  }\n\n  /**\n   * calculate the drawing commands for the connector tips\n   */\n  calcStartEndPath() {\n    this.pathStart = [];\n    this.pathEnd = [];\n\n    const { pathType, pathArrowTip } = this;\n    const firstCommand = this.path[0];\n    const lastCommand = this.path[this.path.length - 1];\n\n    const fromPoint = new Point(firstCommand[1]!, firstCommand[2]!);\n    const toPoint =\n      lastCommand[0] === 'L'\n        ? new Point(lastCommand[1]!, lastCommand[2]!)\n        : new Point(lastCommand[5]!, lastCommand[6]!);\n\n    /* Calculate Path START */\n    if (pathArrowTip === 'start' || pathArrowTip === 'both') {\n      const startArrowSize = 20 + this.strokeWidth; // Adjust the size of the start arrow tip\n\n      const startAngle =\n        pathType === 'straightPath'\n          ? Math.atan2(fromPoint.y - toPoint.y, fromPoint.x - toPoint.x) +\n          Math.PI\n          : Math.atan2(\n            lastCommand[2]! - fromPoint.y,\n            lastCommand[1]! - fromPoint.x\n          );\n\n      const startArrow1X =\n        fromPoint.x + startArrowSize * Math.cos(startAngle + Math.PI / 6);\n      const startArrow1Y =\n        fromPoint.y + startArrowSize * Math.sin(startAngle + Math.PI / 6);\n      const startArrow2X =\n        fromPoint.x + startArrowSize * Math.cos(startAngle - Math.PI / 6);\n      const startArrow2Y =\n        fromPoint.y + startArrowSize * Math.sin(startAngle - Math.PI / 6);\n\n      this.pathStart = [\n        ['M', startArrow1X, startArrow1Y],\n        ['L', fromPoint.x, fromPoint.y],\n        ['L', startArrow2X, startArrow2Y],\n      ];\n    }\n    /* Calculate Path End */\n    if (pathArrowTip === 'end' || pathArrowTip === 'both') {\n      const endArrowSize = 20 + this.strokeWidth; // Adjust the size of the end arrow tip\n      const endAngle =\n        pathType === 'straightPath'\n          ? Math.atan2(toPoint.y - fromPoint.y, toPoint.x - fromPoint.x)\n          : Math.atan2(\n            toPoint.y - lastCommand[4]!,\n            toPoint.x - lastCommand[3]!\n          );\n\n      const endArrow1X =\n        toPoint.x - endArrowSize * Math.cos(endAngle - Math.PI / 6);\n      const endArrow1Y =\n        toPoint.y - endArrowSize * Math.sin(endAngle - Math.PI / 6);\n      const endArrow2X =\n        toPoint.x - endArrowSize * Math.cos(endAngle + Math.PI / 6);\n      const endArrow2Y =\n        toPoint.y - endArrowSize * Math.sin(endAngle + Math.PI / 6);\n\n      this.pathEnd = [\n        ['M', endArrow1X, endArrow1Y],\n        ['L', toPoint.x, toPoint.y],\n        ['L', endArrow2X, endArrow2Y],\n      ];\n    }\n  }\n\n  calculateControlPoint(controlPointType: 'from' | 'to', point: any) {\n    let controlPoint;\n    if (controlPointType === 'from') {\n      //@ts-ignore\n      const fromObject = this.canvas?.findById(this.fromObjectId);\n      if (fromObject && fromObject.calculateControlPoint) {\n        controlPoint = fromObject.calculateControlPoint(point);\n      }\n    }\n\n    if (controlPointType === 'to') {\n      //@ts-ignore\n      const toObject = this.canvas?.findById(this.toObjectId);\n      if (toObject && toObject.calculateControlPoint) {\n        controlPoint = toObject.calculateControlPoint(point);\n      }\n    }\n\n    if (controlPoint) {\n      return controlPoint;\n    } else {\n      return point;\n    }\n  }\n\n  /**\n   * Given the points in scene coordinates, updates the path\n   * This function is called by other objects that are moving or changing properties\n   */\n  update({ fromPoint, toPoint, control1, control2, style }: any = {}) {\n    const finalCommand = this.path[this.path.length - 1];\n\n    if (!fromPoint) {\n      fromPoint = TransformPointFromPathToCanvas(\n        this,\n        new Point(this.path[0][1]!, this.path[0][2]!)\n      );\n      this.fromPoint = fromPoint;\n    }\n\n    if (!toPoint) {\n      toPoint = TransformPointFromPathToCanvas(\n        this,\n        finalCommand[0] === 'L'\n          ? new Point(finalCommand[1]!, finalCommand[2]!)\n          : new Point(finalCommand[5]!, finalCommand[6]!)\n      );\n      finalCommand[0] === 'L' ? 1 : 5;\n      this.toPoint = toPoint;\n    }\n    let controlPoint1: Point, controlPoint2: Point;\n    if (finalCommand[0] === 'L') {\n      controlPoint1 = this.calculateControlPoint('from', fromPoint);\n      controlPoint2 = this.calculateControlPoint('to', toPoint);\n    }\n    if (!control1) {\n      control1 = TransformPointFromPathToCanvas(\n        this,\n        finalCommand[0] === 'L'\n          ? controlPoint1!\n          : new Point(finalCommand[1]!, finalCommand[2]!)\n      );\n      this.control1 = control1;\n    }\n\n    if (!control2) {\n      control2 = TransformPointFromPathToCanvas(\n        this,\n        finalCommand[0] === 'L'\n          ? controlPoint2!\n          : new Point(finalCommand[3]!, finalCommand[4]!)\n      );\n      this.control2 = control2;\n    }\n\n    if (style) {\n      this.style = style;\n    }\n\n    const path = getPath(fromPoint, toPoint, control1, control2, this.pathType);\n\n    const { path: newPath } = new Path(path);\n    this.path = newPath;\n    this.setBoundingBox(true);\n\n    this.calcStartEndPath();\n    this.dirty = true;\n  }\n\n  _mouseDownControl(\n    eventData: any,\n    transform: Transform,\n    x: number,\n    y: number\n  ) {\n    const target = transform.target;\n    target.objectCaching = false;\n\n    this.mouseDownHandler(eventData, transform, x, y);\n  }\n\n  mouseDownHandler(eventData: any, transform: Transform, x: number, y: number) {\n    //reserve for subclass\n  }\n\n  mouseUpHandler(eventData: any, transform: Transform, x: number, y: number) {\n    //reserve for subclass\n  }\n  /**\n   * Compared to Path, it will render the official Path + the arrow tips.\n   * @param ctx\n   */\n  _renderPathCommands(ctx: CanvasRenderingContext2D) {\n    const path = this.path;\n    this.path = [...this.pathStart, ...this.path, ...this.pathEnd];\n    super._renderPathCommands(ctx);\n    this.path = path;\n  }\n\n  _mouseUpControl(eventData: any, transform: Transform, x: number, y: number) {\n    const { target } = transform;\n    if (!target.canvas) {\n      return;\n    }\n    (target.canvas as XCanvas).dockingWidget = null;\n    target.dirty = true;\n    target.setCoords();\n    transform.target.canvas?.requestRenderAll();\n    this.mouseUpHandler(eventData, transform, x, y);\n    this._setMovementLock();\n  }\n\n  _setMovementLock() {\n    if (this.fromObjectId || this.toObjectId) {\n      this.lockMovementX = true;\n      this.lockMovementY = true;\n    } else {\n      this.lockMovementX = false;\n      this.lockMovementY = false;\n    }\n  }\n\n  getControlPointOnCanvas(obj: any, controlName: string) {\n    const controlInfo = obj.controls[controlName];\n    const x = controlInfo.x * obj.width;\n    const y = controlInfo.y * obj.height;\n    const point = new Point(x, y);\n\n    const transformedPoint = obj.transformPointToCanvas(point);\n\n    return transformedPoint;\n  }\n\n  /**\n   * Responds to the path points being moved calculating the docking.\n   * @param commandIndex The command index in the path we are dragging\n   * @param pointIndex  the index of the X coordinate of the point we are moving in .path[commandIndex]\n   * @returns\n   */\n  dragActionEventHandler(commandIndex: number, pointIndex: number) {\n    const target = this;\n    // const relevantPoint = getLocalPoint(transform, 'center', 'top', x, y);\n    //@ts-ignore\n    const currentDockingObject = target.canvas?.dockingWidget;\n\n    const property = commandIndex === 0 ? 'fromObjectId' : 'toObjectId';\n    const existingConnectionId = target[property];\n    let connectedObject: any = null;\n    if (existingConnectionId) {\n      connectedObject = (target.canvas as XCanvas).findById(\n        existingConnectionId\n      ) as any;\n    }\n\n    // Andrea, followup: currentDockingObject.hoveringControl relies on a mousemove event that gets added\n    // and removed when we start the connector drag.\n    // this logic should be resolved inside the connector.\n    const connectorType = commandIndex === 0 ? 'from' : 'to';\n    if (\n      currentDockingObject &&\n      currentDockingObject.controls[\n      currentDockingObject.canvas.hoveringControl\n      ] &&\n      currentDockingObject.calculateControlPoint\n    ) {\n      const hoverPoint = this.getControlPointOnCanvas(\n        currentDockingObject,\n        currentDockingObject.canvas.hoveringControl\n      );\n\n      const targetX = hoverPoint.x;\n      const targetY = hoverPoint.y;\n\n      if (existingConnectionId) {\n        if (connectedObject) {\n          connectedObject.connectors = connectedObject.connectors?.filter(\n            (connector: any) =>\n              !(\n                connector.connectorId === target.id &&\n                connector.connectorType === connectorType\n              )\n          );\n          if (connectedObject.calculateControlPoint) {\n            const controlPoint =\n              connectedObject.calculateControlPoint(hoverPoint);\n            if (commandIndex === 0) {\n              this.update({\n                fromPoint: { x: targetX, y: targetY },\n                control1: controlPoint,\n              });\n            } else {\n              this.update({\n                toPoint: { x: targetX, y: targetY },\n                control2: controlPoint,\n              });\n            }\n          }\n        }\n      }\n\n      target[commandIndex === 0 ? 'fromObjectId' : 'toObjectId'] =\n        currentDockingObject.id;\n\n      if (!currentDockingObject.connectors) {\n        currentDockingObject.connectors = [];\n      }\n\n      currentDockingObject.connectors.push({\n        connectorId: target.id,\n        connectorType: connectorType,\n        point: currentDockingObject.transformPointFromCanvas({\n          x: targetX,\n          y: targetY,\n        }),\n      });\n    }\n\n    if (!currentDockingObject && connectedObject) {\n      //if it is not attached to object, remove the connector from the existing connected object and clear the from/to object id\n      target[property] = '';\n      connectedObject.connectors = connectedObject.connectors?.filter(\n        (connector: any) =>\n          !(\n            connector.connectorId === target.id &&\n            connector.connectorType === connectorType\n          )\n      );\n    }\n  }\n}\n\nexport { XConnector };\n\nexport const TransformPointFromPathToCanvas = (\n  object: XConnector,\n  point: Point\n) =>\n  sendPointToPlane(\n    point.subtract(object.pathOffset),\n    object.calcOwnMatrix(),\n    iMatrix\n  );\n\nclassRegistry.setClass(XConnector);\n"],"names":["getPath","fromPoint","toPoint","control1","control2","arguments","length","undefined","concat","x","y","XConnector","Path","constructor","options","super","pathType","_defineProperty","this","perPixelTargetFind","cornerColor","cornerStyle","type","objType","transparentCorners","cornerStrokeColor","hasBorders","objectCaching","pathArrowTip","fromObjectId","toObjectId","createdByName","createdBy","createdAt","boardId","style","fill","stroke","updatedBy","updatedByName","version","zIndex","_setMovementLock","calcStartEndPath","controls","_objectSpread","createPathControls","mouseDownHandler","_mouseDownControl","bind","mouseUpHandler","_mouseUpControl","cursorStyle","pointStyle","controlFill","controlStroke","controlPointStyle","connectionDashArray","on","evtOpt","commandIndex","pointIndex","dragActionEventHandler","getFromPoint","command","path","Point","getObject","result","EntityKeys","forEach","key","getToPoint","lastCommand","pathStart","pathEnd","firstCommand","startArrowSize","strokeWidth","startAngle","Math","atan2","PI","startArrow1X","cos","startArrow1Y","sin","startArrow2X","startArrow2Y","endArrowSize","endAngle","endArrow1X","endArrow1Y","endArrow2X","endArrow2Y","calculateControlPoint","controlPointType","point","controlPoint","_this$canvas","fromObject","canvas","findById","_this$canvas2","toObject","update","finalCommand","controlPoint1","controlPoint2","TransformPointFromPathToCanvas","newPath","setBoundingBox","dirty","eventData","transform","target","_renderPathCommands","ctx","_transform$target$can","dockingWidget","setCoords","requestRenderAll","lockMovementX","lockMovementY","getControlPointOnCanvas","obj","controlName","controlInfo","width","height","transformPointToCanvas","_target$canvas","currentDockingObject","property","existingConnectionId","connectedObject","connectorType","hoveringControl","hoverPoint","targetX","targetY","_connectedObject$conn","connectors","filter","connector","connectorId","id","push","transformPointFromCanvas","_connectedObject$conn2","object","sendPointToPlane","subtract","pathOffset","calcOwnMatrix","iMatrix","classRegistry","setClass"],"mappings":"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"}