{"version":3,"file":"useTimeLineMove.mjs","sources":["../../../../../../src/components/ganttView/ganttBody/ganttTimeLineView/useTimeLineMove.ts"],"sourcesContent":["import { inject, triggerRef } from 'vue';\nimport type { Ref, ShallowRef, ComputedRef } from 'vue';\nimport type { GanttRowNode, VisibleTimeLine, TimeLineNode, MovedTimeLineData, TimePointNode } from '@/types';\nimport dayjs from 'dayjs';\nimport { getRound } from '@/utils/common';\n\nexport const useTimeLineMove = ({\n  edgeSpacing,\n  ganttViewWidth,\n  rowNodeMap,\n  movingTimeLineRowId,\n  movingTimeLine,\n  timeLineMoving,\n  visibleTimeLineMap,\n  disableMove,\n  closeEdgeScroll,\n  sortTimeLineNodes,\n  mergeOverlapTimeLine,\n  freshVisibleTimeLines,\n  getDiffSecondByDistance,\n  getDistanceByDiffDate,\n  emitUpdateMinDate,\n  emitUpdateMaxDate,\n  updateParentTimeLine\n}: {\n  edgeSpacing: number,\n  ganttViewWidth: Ref<number>,\n  rowNodeMap: Ref<Map<string, GanttRowNode>, Map<string, GanttRowNode>>,\n  movingTimeLineRowId: Ref<string>,\n  movingTimeLine: Ref<VisibleTimeLine | null>,\n  timeLineMoving: Ref<boolean>,\n  visibleTimeLineMap: ShallowRef<Map<string, VisibleTimeLine[]>, Map<string, VisibleTimeLine[]>>,\n  disableMove: ComputedRef<boolean | undefined>,\n  closeEdgeScroll: (perMoveSpacing: number, callBack: (moveSpacing: number) => any) => void\n  sortTimeLineNodes: (timeLineNodes: TimeLineNode[]) => void,\n  mergeOverlapTimeLine: (timeLineNodes: TimeLineNode[]) => TimeLineNode[],\n  freshVisibleTimeLines: (freshAll?: boolean) => void\n  getDiffSecondByDistance: (distance: number, startDate: dayjs.Dayjs) => dayjs.Dayjs,\n  getDistanceByDiffDate: (startDate: dayjs.Dayjs, endDate: dayjs.Dayjs) => number,\n  emitUpdateMinDate: (date: dayjs.Dayjs) => void,\n  emitUpdateMaxDate: (date: dayjs.Dayjs) => void,\n  updateParentTimeLine: (rowId: string) => void\n}) => {\n  const wrapRef = inject('wrapRef') as Ref<HTMLDivElement | undefined>;\n  const freshRowNodeDateByTimeLine = inject('freshRowNodeDateByTimeLine') as (rowId: string) => void;\n  const getGanttMinAndMaxDate = inject('getGanttMinAndMaxDate') as (excludeRowIds?: string[], freshStartDate?: boolean, freshEndDate?: boolean)\n  => { minStartDate: dayjs.Dayjs | null, maxEndDate: dayjs.Dayjs | null };\n  const timeLineMoveChange = inject('timeLineMoveChange') as (rowId: string, timeLineIds: string[], movedTimeData: MovedTimeLineData[]) => void;\n  const clearDateCache = inject('clearDateCache') as () => void;\n\n  /**\n   * handle time line move\n   * @param e\n   * @param timeLine\n   * @param rowId\n   */\n  const startTimeLineMove = (e: MouseEvent, timeLine: VisibleTimeLine, rowId: string) => {\n    if (disableMove.value || timeLine.disableMove) return;\n    timeLine.moving = true;\n    movingTimeLine.value = timeLine;\n    movingTimeLineRowId.value = rowId;\n    let lastX = e.clientX;\n    let startScrollX = 0;\n    const wrapWidth = wrapRef.value!.offsetWidth;\n    const oldStartDate = timeLine.startDate;\n    const currentRowNode = rowNodeMap.value.get(rowId);\n\n    const onMouseMove = (event: MouseEvent) => {\n      let currentX = event.clientX;\n      const layerX = event.layerX;\n      const diffX = currentX - lastX;\n      timeLineMove(timeLine, rowId, diffX);\n\n      const scrollDistance = 10;\n      const scrollLeft = wrapRef.value!.scrollLeft;\n\n      if (layerX <= scrollLeft + edgeSpacing || timeLine.translateX <= edgeSpacing) {\n        if (diffX < 0) {\n          if (!timeLineMoving.value) {\n            timeLineMoving.value = true;\n            startScrollX = lastX;\n            closeEdgeScroll(-scrollDistance, (moveSpacing) => {\n              timeLineMove(timeLine, rowId, moveSpacing);\n            });\n          }\n        } else if (currentX >= startScrollX) {\n          timeLineMoving.value = false;\n        }\n\n      } else if (layerX >= wrapWidth + scrollLeft - edgeSpacing || timeLine.translateX + timeLine.width >= ganttViewWidth.value - edgeSpacing) {\n        if (diffX > 0) {\n          if (!timeLineMoving.value) {\n            timeLineMoving.value = true;\n            startScrollX = lastX;\n            closeEdgeScroll(scrollDistance, (moveSpacing) => {\n              timeLineMove(timeLine, rowId, moveSpacing);\n            });\n          }\n        } else if (currentX <= startScrollX) {\n          timeLineMoving.value = false;\n        }\n\n      } else {\n        timeLineMoving.value = false;\n      }\n\n      lastX = currentX;\n\n    };\n    const onMouseUp = () => {\n      timeLine.moving = false;\n      timeLineMoving.value = false;\n      movingTimeLine.value = null;\n      movingTimeLineRowId.value = '';\n      clearDateCache();\n      if (!oldStartDate.isSame(timeLine.startDate)) {\n        // update row node date\n        freshRowNodeDateByTimeLine(rowId);\n        if (currentRowNode?.timeLineNodes) {\n          // if time line overlap, merge them\n          sortTimeLineNodes(currentRowNode.timeLineNodes);\n          currentRowNode.timeLineNodes = mergeOverlapTimeLine(currentRowNode.timeLineNodes);\n\n          // if timeline is a merge node, update all merged nodes' date\n          const diffSecond = timeLine.startDate.diff(oldStartDate, 'second', true);\n          onTimeLineMoveChange(rowId, timeLine, diffSecond);\n\n          // fresh visible time lines\n          visibleTimeLineMap.value.delete(rowId);\n          freshVisibleTimeLines(false);\n        }\n      }\n      triggerRef(visibleTimeLineMap);\n      window.removeEventListener('mousemove', onMouseMove);\n      window.removeEventListener('mouseup', onMouseUp);\n    };\n    triggerRef(visibleTimeLineMap);\n    window.addEventListener('mousemove', onMouseMove);\n    window.addEventListener('mouseup', onMouseUp);\n  };\n\n  /**\n   * calculate time line position, date and gantt min and max date\n   * @param timeLine\n   * @param rowId\n   * @param distance\n   * @returns\n   */\n  const timeLineMove = (timeLine: VisibleTimeLine, rowId: string, distance: number) => {\n    const nextStartDate = getDiffSecondByDistance(distance, timeLine.startDate);\n    timeLine.startDate = nextStartDate;\n    timeLine.timeLineNode.startDate = nextStartDate;\n    const nextEndDate = getDiffSecondByDistance(distance, timeLine.endDate);\n    timeLine.endDate = nextEndDate;\n    timeLine.timeLineNode.endDate = nextEndDate;\n    if (getRound(timeLine.translateX) === edgeSpacing && distance > 0) {\n      const { minStartDate } = getGanttMinAndMaxDate([rowId], true, false);\n      if (!minStartDate || nextStartDate.isBefore(minStartDate)) {\n        emitUpdateMinDate(nextStartDate);\n        timeLine.translateX = edgeSpacing;\n        updateParentTimeLine(rowId);\n        return;\n      } else if (nextStartDate.isAfter(minStartDate) || nextStartDate.isSame(minStartDate)) {\n        timeLine.translateX += getDistanceByDiffDate(minStartDate, nextStartDate);\n        emitUpdateMinDate(minStartDate);\n        updateParentTimeLine(rowId);\n        return;\n      }\n    } else if (getRound(timeLine.translateX + timeLine.width + edgeSpacing) === getRound(ganttViewWidth.value) && distance < 0) {\n      const { maxEndDate } = getGanttMinAndMaxDate([rowId], false, true);\n      if (!maxEndDate || nextEndDate.isAfter(maxEndDate)) {\n        timeLine.translateX += distance;\n        emitUpdateMaxDate(nextEndDate);\n        updateParentTimeLine(rowId);\n        return;\n      } else if (nextEndDate.isBefore(maxEndDate) || nextEndDate.isSame(maxEndDate)) {\n        emitUpdateMaxDate(maxEndDate);\n\n      }\n    }\n    timeLine.translateX += distance;\n    if (timeLine.translateX < edgeSpacing) {\n      emitUpdateMinDate(timeLine.startDate);\n      timeLine.translateX = edgeSpacing;\n    } else if (timeLine.translateX + timeLine.width + edgeSpacing > ganttViewWidth.value) {\n      emitUpdateMaxDate(timeLine.endDate);\n    }\n    updateParentTimeLine(rowId);\n    triggerRef(visibleTimeLineMap);\n  };\n\n  /**\n   * update merged time line nodes' date, and notice user\n   * @param rowId\n   * @param timeLine\n   * @param diffSecond\n   */\n  const onTimeLineMoveChange = (rowId: string, timeLine: VisibleTimeLine, diffSecond: number) => {\n    const timeLineNode = timeLine.timeLineNode;\n    const mergedTimeLineNodes = timeLineNode.mergedTimeLineNodes || [];\n    const allTimeLineNodes = [timeLineNode, ...mergedTimeLineNodes.filter(node => node.id !== timeLineNode.id)];\n    const timeLineIds: string[] = [];\n    const result: MovedTimeLineData[] = [];\n\n    for (let currentTimeLineNode of allTimeLineNodes) {\n      timeLineIds.push(currentTimeLineNode.id);\n      if (currentTimeLineNode.id !== timeLineNode.id) {\n        currentTimeLineNode.startDate = currentTimeLineNode.startDate.add(diffSecond, 'second');\n        currentTimeLineNode.endDate = currentTimeLineNode.endDate.add(diffSecond, 'second');\n      }\n      const movedResult: MovedTimeLineData = {\n        timeLineId: currentTimeLineNode.id,\n        startDate: currentTimeLineNode.startDate,\n        endDate: currentTimeLineNode.endDate\n      };\n\n      if (currentTimeLineNode.timePointNodes) {\n        const timePointsData: Pick<TimePointNode, 'id' | 'date'>[] = [];\n        currentTimeLineNode.timePointNodes.forEach(timePointNode => {\n          timePointNode.date = timePointNode.date.add(diffSecond, 'second');\n          timePointsData.push({ id: timePointNode.id, date: timePointNode.date });\n        });\n        movedResult.timePoints = timePointsData;\n      }\n      result.push(movedResult);\n    }\n    timeLineMoveChange(rowId, timeLineIds, result);\n  };\n\n  return {\n    startTimeLineMove\n  };\n};"],"names":[],"mappings":";;AAMO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAkBM;AACE,QAAA,UAAU,OAAO,SAAS;AAC1B,QAAA,6BAA6B,OAAO,4BAA4B;AAChE,QAAA,wBAAwB,OAAO,uBAAuB;AAEtD,QAAA,qBAAqB,OAAO,oBAAoB;AAChD,QAAA,iBAAiB,OAAO,gBAAgB;AAQ9C,QAAM,oBAAoB,CAAC,GAAe,UAA2B,UAAkB;AACjF,QAAA,YAAY,SAAS,SAAS,YAAa;AAC/C,aAAS,SAAS;AAClB,mBAAe,QAAQ;AACvB,wBAAoB,QAAQ;AAC5B,QAAI,QAAQ,EAAE;AACd,QAAI,eAAe;AACb,UAAA,YAAY,QAAQ,MAAO;AACjC,UAAM,eAAe,SAAS;AAC9B,UAAM,iBAAiB,WAAW,MAAM,IAAI,KAAK;AAE3C,UAAA,cAAc,CAAC,UAAsB;AACzC,UAAI,WAAW,MAAM;AACrB,YAAM,SAAS,MAAM;AACrB,YAAM,QAAQ,WAAW;AACZ,mBAAA,UAAU,OAAO,KAAK;AAEnC,YAAM,iBAAiB;AACjB,YAAA,aAAa,QAAQ,MAAO;AAElC,UAAI,UAAU,aAAa,eAAe,SAAS,cAAc,aAAa;AAC5E,YAAI,QAAQ,GAAG;AACT,cAAA,CAAC,eAAe,OAAO;AACzB,2BAAe,QAAQ;AACR,2BAAA;AACC,4BAAA,KAAiB,CAAC,gBAAgB;AACnC,2BAAA,UAAU,OAAO,WAAW;AAAA,YAAA,CAC1C;AAAA,UAAA;AAAA,QACH,WACS,YAAY,cAAc;AACnC,yBAAe,QAAQ;AAAA,QAAA;AAAA,MAG3B,WAAW,UAAU,YAAY,aAAa,eAAe,SAAS,aAAa,SAAS,SAAS,eAAe,QAAQ,aAAa;AACvI,YAAI,QAAQ,GAAG;AACT,cAAA,CAAC,eAAe,OAAO;AACzB,2BAAe,QAAQ;AACR,2BAAA;AACC,4BAAA,gBAAgB,CAAC,gBAAgB;AAClC,2BAAA,UAAU,OAAO,WAAW;AAAA,YAAA,CAC1C;AAAA,UAAA;AAAA,QACH,WACS,YAAY,cAAc;AACnC,yBAAe,QAAQ;AAAA,QAAA;AAAA,MACzB,OAEK;AACL,uBAAe,QAAQ;AAAA,MAAA;AAGjB,cAAA;AAAA,IAEV;AACA,UAAM,YAAY,MAAM;AACtB,eAAS,SAAS;AAClB,qBAAe,QAAQ;AACvB,qBAAe,QAAQ;AACvB,0BAAoB,QAAQ;AACb,qBAAA;AACf,UAAI,CAAC,aAAa,OAAO,SAAS,SAAS,GAAG;AAE5C,mCAA2B,KAAK;AAChC,YAAI,iDAAgB,eAAe;AAEjC,4BAAkB,eAAe,aAAa;AAC/B,yBAAA,gBAAgB,qBAAqB,eAAe,aAAa;AAGhF,gBAAM,aAAa,SAAS,UAAU,KAAK,cAAc,UAAU,IAAI;AAClD,+BAAA,OAAO,UAAU,UAAU;AAG7B,6BAAA,MAAM,OAAO,KAAK;AACrC,gCAAsB,KAAK;AAAA,QAAA;AAAA,MAC7B;AAEF,iBAAW,kBAAkB;AACtB,aAAA,oBAAoB,aAAa,WAAW;AAC5C,aAAA,oBAAoB,WAAW,SAAS;AAAA,IACjD;AACA,eAAW,kBAAkB;AACtB,WAAA,iBAAiB,aAAa,WAAW;AACzC,WAAA,iBAAiB,WAAW,SAAS;AAAA,EAC9C;AASA,QAAM,eAAe,CAAC,UAA2B,OAAe,aAAqB;AACnF,UAAM,gBAAgB,wBAAwB,UAAU,SAAS,SAAS;AAC1E,aAAS,YAAY;AACrB,aAAS,aAAa,YAAY;AAClC,UAAM,cAAc,wBAAwB,UAAU,SAAS,OAAO;AACtE,aAAS,UAAU;AACnB,aAAS,aAAa,UAAU;AAChC,QAAI,SAAS,SAAS,UAAU,MAAM,eAAe,WAAW,GAAG;AAC3D,YAAA,EAAE,iBAAiB,sBAAsB,CAAC,KAAK,GAAG,MAAM,KAAK;AACnE,UAAI,CAAC,gBAAgB,cAAc,SAAS,YAAY,GAAG;AACzD,0BAAkB,aAAa;AAC/B,iBAAS,aAAa;AACtB,6BAAqB,KAAK;AAC1B;AAAA,MAAA,WACS,cAAc,QAAQ,YAAY,KAAK,cAAc,OAAO,YAAY,GAAG;AAC3E,iBAAA,cAAc,sBAAsB,cAAc,aAAa;AACxE,0BAAkB,YAAY;AAC9B,6BAAqB,KAAK;AAC1B;AAAA,MAAA;AAAA,IAEO,WAAA,SAAS,SAAS,aAAa,SAAS,QAAQ,WAAW,MAAM,SAAS,eAAe,KAAK,KAAK,WAAW,GAAG;AACpH,YAAA,EAAE,eAAe,sBAAsB,CAAC,KAAK,GAAG,OAAO,IAAI;AACjE,UAAI,CAAC,cAAc,YAAY,QAAQ,UAAU,GAAG;AAClD,iBAAS,cAAc;AACvB,0BAAkB,WAAW;AAC7B,6BAAqB,KAAK;AAC1B;AAAA,MAAA,WACS,YAAY,SAAS,UAAU,KAAK,YAAY,OAAO,UAAU,GAAG;AAC7E,0BAAkB,UAAU;AAAA,MAAA;AAAA,IAE9B;AAEF,aAAS,cAAc;AACnB,QAAA,SAAS,aAAa,aAAa;AACrC,wBAAkB,SAAS,SAAS;AACpC,eAAS,aAAa;AAAA,IAAA,WACb,SAAS,aAAa,SAAS,QAAQ,cAAc,eAAe,OAAO;AACpF,wBAAkB,SAAS,OAAO;AAAA,IAAA;AAEpC,yBAAqB,KAAK;AAC1B,eAAW,kBAAkB;AAAA,EAC/B;AAQA,QAAM,uBAAuB,CAAC,OAAe,UAA2B,eAAuB;AAC7F,UAAM,eAAe,SAAS;AACxB,UAAA,sBAAsB,aAAa,uBAAuB,CAAC;AAC3D,UAAA,mBAAmB,CAAC,cAAc,GAAG,oBAAoB,OAAO,CAAA,SAAQ,KAAK,OAAO,aAAa,EAAE,CAAC;AAC1G,UAAM,cAAwB,CAAC;AAC/B,UAAM,SAA8B,CAAC;AAErC,aAAS,uBAAuB,kBAAkB;AACpC,kBAAA,KAAK,oBAAoB,EAAE;AACnC,UAAA,oBAAoB,OAAO,aAAa,IAAI;AAC9C,4BAAoB,YAAY,oBAAoB,UAAU,IAAI,YAAY,QAAQ;AACtF,4BAAoB,UAAU,oBAAoB,QAAQ,IAAI,YAAY,QAAQ;AAAA,MAAA;AAEpF,YAAM,cAAiC;AAAA,QACrC,YAAY,oBAAoB;AAAA,QAChC,WAAW,oBAAoB;AAAA,QAC/B,SAAS,oBAAoB;AAAA,MAC/B;AAEA,UAAI,oBAAoB,gBAAgB;AACtC,cAAM,iBAAuD,CAAC;AAC1C,4BAAA,eAAe,QAAQ,CAAiB,kBAAA;AAC1D,wBAAc,OAAO,cAAc,KAAK,IAAI,YAAY,QAAQ;AACjD,yBAAA,KAAK,EAAE,IAAI,cAAc,IAAI,MAAM,cAAc,MAAM;AAAA,QAAA,CACvE;AACD,oBAAY,aAAa;AAAA,MAAA;AAE3B,aAAO,KAAK,WAAW;AAAA,IAAA;AAEN,uBAAA,OAAO,aAAa,MAAM;AAAA,EAC/C;AAEO,SAAA;AAAA,IACL;AAAA,EACF;AACF;"}