UNPKG

vue-gantt-3

Version:

A gantt component for Vue 3

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