UNPKG

vue-gantt-3

Version:

A gantt component for Vue 3

1 lines 13.4 kB
{"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;"}