{"version":3,"file":"useGanttRowNode.mjs","sources":["../../../src/composables/useGanttRowNode.ts"],"sourcesContent":["import { ref, provide, onBeforeMount, shallowRef, watch } from 'vue';\nimport type { Ref } from 'vue';\nimport type GanttView from \"@/components/ganttView/GanttView.vue\";\nimport type TableView from \"@/components/tableView/TableView.vue\";\n\nimport type { RowData, GanttRowNode } from '@/types';\nimport dayjs from 'dayjs';\nimport { treeForEachSkipChildren } from \"@/utils/common\";\n\nexport const useGanttRowNode = ({\n  ganttViewRef,\n  tableViewRef,\n  rows,\n  getRowId,\n  setExpand,\n  setSelect,\n  refreshCells,\n  onViewPortChanged\n}: {\n  ganttViewRef: Ref<InstanceType<typeof GanttView>| undefined>,\n  tableViewRef: Ref<InstanceType<typeof TableView>| undefined>,\n  rows: Ref<RowData[], RowData[]>,\n  getRowId: (row: RowData) => string,\n  setExpand: (id: string, expand: boolean) => void,\n  setSelect: (id: string) => void,\n  refreshCells: (ids: string[], force?: boolean) => void,\n  onViewPortChanged: (data: RowData[]) => void\n}) => {\n\n  const rowNodeMap = shallowRef(new Map<string, GanttRowNode>());\n  const rowNodeIds = ref<string[]>([]); // every row's id，order is same as original row data\n  const visibleRowIds = ref<string[]>([]); // exclude hidden row，order is same as original row data\n  const rowDataList = shallowRef<RowData[]>([]); // include all row，order is same as original row data\n  const firstLevelRowNode = shallowRef<GanttRowNode[]>([]); // the rows don't have parent，order is same as original row data\n\n  onBeforeMount(() => {\n    initRowNode();\n  });\n\n  watch(rows, (newRows, oldRows) => {\n    onRowsChange(newRows, oldRows);\n  }, { deep: false });\n\n  /**\n   * init rowNode, convert original row data to rowNode, include create and update rowNode\n   */\n  const initRowNode = () => {\n    const oldRowNodeMap = rowNodeMap.value;\n    const newRowNodeMap = new Map<string, GanttRowNode>();\n    const newRowNodeIds: string[] = [];\n    const newVisibleRowIds: string[] = [];\n    const newRowDataList: RowData[] = [];\n    const newFirstLevelRowNode: GanttRowNode[] = [];\n    convertALLRows(rows.value, oldRowNodeMap, newRowNodeMap, newRowNodeIds, newRowDataList);\n    rowNodeIds.value = newRowNodeIds;\n    rowNodeMap.value = newRowNodeMap;\n    rowDataList.value = newRowDataList;\n\n    for (let rowId of newRowNodeIds) {\n      const rowNode = newRowNodeMap.get(rowId);\n      if (rowNode) {\n        if (rowNode.expand) {\n          newVisibleRowIds.push(rowId);\n        }\n        if (!rowNode.parentId) {\n          newFirstLevelRowNode.push(rowNode);\n        }\n      }\n    }\n    visibleRowIds.value = newVisibleRowIds;\n    firstLevelRowNode.value = newFirstLevelRowNode;\n  };\n\n  /**\n   * a recursion function, collect row info for array and map etc.\n   * @param rows\n   * @param oldRowNodeMap\n   * @param newRowNodeMap\n   * @param newRowNodeIds\n   * @param newRowDataList\n   * @param level\n   */\n  const convertALLRows = (rows: RowData[], oldRowNodeMap: Map<string, GanttRowNode>, newRowNodeMap: Map<string, GanttRowNode>, newRowNodeIds: string[], newRowDataList: RowData[], level = 0) => {\n    for (let row of rows) {\n      const id = getRowId(row);\n      newRowNodeIds.push(id);\n      newRowDataList.push(row);\n      if (row.children) {\n        convertALLRows(row.children, oldRowNodeMap, newRowNodeMap, newRowNodeIds, newRowDataList, level + 1);\n      }\n      const newRowNode = oldRowNodeMap.get(id) || createRowNode(row, newRowNodeMap);\n      updateRowNodeInfo(newRowNode, row, newRowNodeMap, level);\n      newRowNodeMap.set(id, newRowNode);\n\n    }\n  };\n\n  /**\n   * convert original row data to rowNode\n   * @param row\n   * @param newRowNodeMap\n   * @returns\n   */\n  const createRowNode = (row: RowData, newRowNodeMap: Map<string, GanttRowNode>) => {\n    const startDateArr: dayjs.Dayjs[] = [];\n    const endDateArr: dayjs.Dayjs[] = [];\n    const hasChildren = row.children && row.children.length > 0;\n\n    if (hasChildren) {\n      for (let child of row.children!) {\n        const id = getRowId(child);\n        const childRowNode = newRowNodeMap.get(id);\n        if (childRowNode) {\n          childRowNode.startDate && startDateArr.push(childRowNode.startDate);\n          childRowNode.endDate && endDateArr.push(childRowNode.endDate);\n        }\n      }\n    } else if (row.timeLines) {\n      for (let timeLine of row.timeLines) {\n        startDateArr.push(dayjs(timeLine.startDate));\n        endDateArr.push(dayjs(timeLine.endDate));\n      }\n    }\n\n    const id = getRowId(row);\n\n    const baseNode: GanttRowNode = {\n      id,\n      data: row,\n      startDate: dayjs.min(startDateArr),\n      endDate: dayjs.max(endDateArr),\n      hasChildren: !!hasChildren,\n      setExpand,\n      setSelect,\n      expand: true,\n      level: 0\n    };\n    return baseNode;\n  };\n\n  /**\n   * set RowNode's children and level in final\n   * @param rowNode\n   * @param row\n   * @param newRowNodeMap\n   * @param level\n   */\n  const updateRowNodeInfo = (rowNode: GanttRowNode, row: RowData, newRowNodeMap: Map<string, GanttRowNode>, level: number) => {\n    const hasChildren = row.children && row.children.length > 0;\n    const children: GanttRowNode[] = [];\n\n    if (hasChildren) {\n      for (let child of row.children!) {\n        const id = getRowId(child);\n        const childRowNode = newRowNodeMap.get(id);\n        if (childRowNode) {\n          children.push(childRowNode);\n        }\n      }\n    }\n\n    for (let child of children) {\n      child.parentId = rowNode.id;\n    }\n\n    Object.assign(rowNode, {\n      data: row,\n      readOnly: hasChildren,\n      hasChildren: !!hasChildren,\n      children,\n      level\n    });\n  };\n\n  /**\n   * update rowNode when row data change\n   * @param newRows\n   * @param oldRows\n   */\n  const onRowsChange = (newRows: RowData[], oldRows: RowData[]) => {\n    const oldRowNodeMap = rowNodeMap.value;\n    const newAddRowIds: string[] = [];\n    treeForEachSkipChildren(newRows, (currentRow) => {\n      const id = getRowId(currentRow);\n      if (!oldRowNodeMap.has(id)) {\n        newAddRowIds.push(id);\n        return 'skipChildren';\n      }\n    });\n    initRowNode();\n\n    const newRowNodeMap = rowNodeMap.value;\n    const newDeleteRowIds: string[] = [];\n    treeForEachSkipChildren(oldRows, (currentRow) => {\n      const id = getRowId(currentRow);\n      if (!newRowNodeMap.has(id)) {\n        newDeleteRowIds.push(id);\n        return 'skipChildren';\n      }\n    });\n\n    const topLevelRowNodeFromAdd: GanttRowNode[] = [];\n    const topLevelRowNodeFromDelete: GanttRowNode[] = [];\n    const topLevelRowNodeFromOldDelete: GanttRowNode[] = [];\n    for (let rowId of newAddRowIds) {\n      const topParentRowNode = getTopLevelRow(rowId, newRowNodeMap);\n      topParentRowNode && topLevelRowNodeFromAdd.push(topParentRowNode);\n    }\n\n    for (let rowId of newDeleteRowIds) {\n      const oldTopParentRowNode = getTopLevelRow(rowId, oldRowNodeMap);\n      oldTopParentRowNode && topLevelRowNodeFromOldDelete.push(oldTopParentRowNode);\n\n      const topParentRowNode = oldTopParentRowNode && newRowNodeMap.get(oldTopParentRowNode.id);\n      if (topParentRowNode) {\n        topLevelRowNodeFromDelete.push(topParentRowNode);\n      }\n    }\n\n    // new rowNodes or new rowNodes will update date from top to bottom\n    const needFreshTopNodes = topLevelRowNodeFromAdd.concat(topLevelRowNodeFromDelete);\n    refreshRowNodeDate(needFreshTopNodes);\n\n    // calculate ganttView's min startDate and max endDate\n    ganttViewRef.value && ganttViewRef.value.updateMinAndMaxDateByChangeRowNode(\n      { addedRowNodes: topLevelRowNodeFromAdd, deletedRowNodes: topLevelRowNodeFromOldDelete }, firstLevelRowNode.value);\n\n    // fresh gantt time lines and table view\n    const allNeedFreshCellNodes = getAllChildren(needFreshTopNodes);\n    ganttViewRef.value && ganttViewRef.value.freshTimeLines(needFreshTopNodes);\n    refreshCells(allNeedFreshCellNodes.map(item => item.id), true);\n\n    // if row data is set in async, notice user\n    const displayRows = getDisplayRows();\n    if (displayRows) {\n      onViewPortChanged(displayRows);\n    }\n  };\n\n  const getTopLevelRow = (rowId: string, currentRowNodeMap: Map<string, GanttRowNode>) => {\n    let currentRowNode = currentRowNodeMap.get(rowId);\n    while (currentRowNode?.parentId) {\n      currentRowNode = currentRowNodeMap.get(currentRowNode.parentId);\n    }\n    return currentRowNode;\n  };\n\n  provide(\n    'getTopLevelRow',\n    getTopLevelRow\n  );\n\n  /**\n   * if user want to refresh row nodes data, call it\n   */\n  const freshRowNodes = (rows: RowData[]) => {\n    const needUpdateTopRowNodes = new Set<GanttRowNode>();\n    const rowIds = new Set<string>();\n    for (let row of rows) {\n      const startDateArr: dayjs.Dayjs[] = [];\n      const endDateArr: dayjs.Dayjs[] = [];\n      const id = getRowId(row);\n      const currentRowNode = rowNodeMap.value.get(id);\n      if (!currentRowNode) continue;\n\n      rowIds.add(id);\n      const hasChildren = currentRowNode.hasChildren;\n\n      if (!hasChildren && row.timeLines) {\n        for (let timeLine of row.timeLines) {\n          startDateArr.push(dayjs(timeLine.startDate));\n          endDateArr.push(dayjs(timeLine.endDate));\n        }\n        const oldStartDate = currentRowNode.startDate;\n        const oldEndDate = currentRowNode.endDate;\n        Object.assign(currentRowNode, {\n          startDate: dayjs.min(startDateArr),\n          endDate: dayjs.max(endDateArr),\n          oldStartDate,\n          oldEndDate\n        });\n        const topLevelRowNode = getTopLevelRow(currentRowNode.id, rowNodeMap.value);\n        topLevelRowNode && needUpdateTopRowNodes.add(topLevelRowNode);\n      }\n\n    }\n\n    const needUpdateTopRowNodeList = [...needUpdateTopRowNodes];\n    refreshRowNodeDate(needUpdateTopRowNodeList);\n    ganttViewRef.value && ganttViewRef.value.freshTimeLines(needUpdateTopRowNodeList);\n    ganttViewRef.value && ganttViewRef.value.updateMinAndMaxDateByChangeRowNode({ updatedRowNodes: needUpdateTopRowNodeList }, firstLevelRowNode.value);\n    refreshCells([...rowIds], true);\n  };\n\n  /**\n   * a recursion function, fresh RowNodes' date\n   * @param rowNodes\n   */\n  const refreshRowNodeDate = (rowNodes: GanttRowNode[]) => {\n    for (let rowNode of rowNodes) {\n      const startDateArr: dayjs.Dayjs[] = [];\n      const endDateArr: dayjs.Dayjs[] = [];\n      const hasChildren = rowNode.hasChildren;\n      if (hasChildren) {\n        const children = rowNode.children || [];\n        refreshRowNodeDate(children);\n        for (let child of children) {\n          child.startDate && startDateArr.push(child.startDate);\n          child.endDate && endDateArr.push(child.endDate);\n        }\n        const oldStartDate = rowNode.startDate;\n        const oldEndDate = rowNode.endDate;\n        Object.assign(rowNode, {\n          startDate: dayjs.min(startDateArr),\n          endDate: dayjs.max(endDateArr),\n          oldStartDate,\n          oldEndDate\n        });\n      }\n\n    }\n  };\n\n  /**\n   * update row node date when time line changed by move or stretch\n   * @param rowId\n   */\n  const freshRowNodeDateByTimeLine = (rowId: string) => {\n    const currentRowNode = rowNodeMap.value.get(rowId);\n    const startDateArr: dayjs.Dayjs[] = [];\n    const endDateArr: dayjs.Dayjs[] = [];\n\n    if (currentRowNode?.timeLineNodes) {\n      for (let timeLineNode of currentRowNode.timeLineNodes) {\n        startDateArr.push(timeLineNode.startDate);\n        endDateArr.push(timeLineNode.endDate);\n      }\n      const oldStartDate = currentRowNode.startDate;\n      const oldEndDate = currentRowNode.endDate;\n      Object.assign(currentRowNode, {\n        startDate: dayjs.min(startDateArr),\n        endDate: dayjs.max(endDateArr),\n        oldStartDate,\n        oldEndDate\n      });\n      refreshRowNodeDate([getTopLevelRow(rowId, rowNodeMap.value)!]);\n    }\n  };\n\n  provide(\n    'freshRowNodeDateByTimeLine',\n    freshRowNodeDateByTimeLine\n  );\n\n  /**\n   * get rowNode all children ,include children's children\n   * @param rowNodes\n   * @returns\n   */\n  const getAllChildren = (rowNodes: GanttRowNode[]) => {\n    const result: GanttRowNode[] = [];\n    treeForEachSkipChildren(rowNodes, (currentRowNode) => {\n      result.push(currentRowNode);\n    });\n\n    return result;\n  };\n\n  /**\n   * get data from rows which are showing in visual area\n   * @returns\n   */\n  const getDisplayRows = () => {\n    const firstRowIndex = tableViewRef.value?.getFirstDisplayedRow();\n    const lastRowIndex = tableViewRef.value?.getLastDisplayedRow();\n\n    if (firstRowIndex !== undefined && lastRowIndex !== undefined) {\n      return rowDataList.value.slice(firstRowIndex, lastRowIndex + 1);\n    } else {\n      return null;\n    }\n  };\n\n  const getRowNode = (id: string) => {\n    return rowNodeMap.value.get(id);\n  };\n\n  const getRowNodeChildren = (parentId?: string) => {\n    if (parentId) {\n      return rowNodeMap.value.get(parentId)?.children || [];\n    } else {\n      return firstLevelRowNode.value;\n    }\n  };\n\n  const getRowDataList = () => {\n    return rowDataList.value;\n  };\n\n  return {\n    rowNodeMap,\n    rowNodeIds,\n    visibleRowIds,\n    rowDataList,\n    firstLevelRowNode,\n    getRowNode,\n    getRowNodeChildren,\n    getRowDataList,\n    freshRowNodes,\n    getDisplayRows\n  };\n};"],"names":["rows","id"],"mappings":"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"}