import Expander from "@/components/Expander"; import { Task } from "@/components/interfaces"; import GanttElasticContext from "@/GanttElasticContext"; import { emitEvent } from "@/GanttElasticEvents"; import React, { useCallback, useContext, useMemo } from "react"; import { invariant } from "ts-invariant"; import ProgressBar from "../ProgressBar"; import ChartText from "../Text"; export interface ProjectProps { task: Task; } const ChartProject: React.FC = ({ task }) => { const { style, options } = useContext(GanttElasticContext); /** * Emit event * * @param {string} eventName * @param {Event} event */ const onEmitEvent = useCallback( event => { invariant.warn(event.type, task); emitEvent.emit(`chart-${task.type}-${event.type}`, { event, data: task }); task.events && task.events[event.type] && task.events[event.type](event, task); }, [task] ); /** * Get points */ const points = useMemo(() => { const bottom = task.height - task.height / 4; const corner = task.height / 6; const smallCorner = task.height / 8; return `M ${smallCorner},0 L ${task.width - smallCorner} 0 L ${task.width} ${smallCorner} L ${task.width} ${bottom} L ${task.width - corner} ${task.height} L ${task.width - corner * 2} ${bottom} L ${corner * 2} ${bottom} L ${corner} ${task.height} L 0 ${bottom} L 0 ${smallCorner} Z `; }, [task.height, task.width]); return useMemo(() => { const clipPathId = `gantt-elastic__project-clip-path-${task.id}`; const displayExpander = options.chart.expander.display || (options.chart.expander.displayIfTaskListHidden && !options.taskList.display); return ( {displayExpander && ( )} {options.chart.text.display && } ); }, [ onEmitEvent, options.chart.expander.display, options.chart.expander.displayIfTaskListHidden, options.chart.expander.offset, options.chart.expander.size, options.chart.expander.type, options.chart.text.display, options.row.height, options.taskList.display, points, style, task ]); }; export default ChartProject;