64 lines
1.8 KiB
TypeScript
Raw Normal View History

import React, { useRef, useEffect } from "react";
import { GridProps, Grid } from "../grid/grid";
import { CalendarProps, Calendar } from "../calendar/calendar";
import { TaskGanttContentProps, TaskGanttContent } from "./task-gantt-content";
import styles from "./gantt.module.css";
export type TaskGanttProps = {
gridProps: GridProps;
calendarProps: CalendarProps;
barProps: TaskGanttContentProps;
ganttHeight: number;
scrollY: number;
};
export const TaskGantt: React.FC<TaskGanttProps> = ({
gridProps,
calendarProps,
barProps,
ganttHeight,
scrollY,
}) => {
const ganttSVGRef = useRef<SVGSVGElement>(null);
const horizontalContainerRef = useRef<HTMLDivElement>(null);
const newBarProps = { ...barProps, svg: ganttSVGRef };
useEffect(() => {
if (horizontalContainerRef.current) {
horizontalContainerRef.current.scrollTop = scrollY;
}
}, [scrollY]);
return (
<div className={styles.ganttVerticalContainer}>
<svg
xmlns="http://www.w3.org/2000/svg"
width={gridProps.gridWidth}
height={calendarProps.headerHeight}
fontFamily={barProps.fontFamily}
>
<Calendar {...calendarProps} />
</svg>
<div
ref={horizontalContainerRef}
className={styles.horizontalContainer}
style={
ganttHeight
? { height: ganttHeight, width: gridProps.gridWidth }
: { width: gridProps.gridWidth }
}
>
<svg
xmlns="http://www.w3.org/2000/svg"
width={gridProps.gridWidth}
height={barProps.rowHeight * barProps.tasks.length}
fontFamily={barProps.fontFamily}
ref={ganttSVGRef}
>
<Grid {...gridProps} />
<TaskGanttContent {...newBarProps} />
</svg>
</div>
</div>
);
};