import GanttElasticContext from "@/GanttElasticContext"; import { emitEvent } from "@/GanttElasticEvents"; import _ from "lodash"; import React, { useCallback, useContext, useEffect, useMemo, useState } from "react"; import Expander from "../Expander"; import { TaskListColumnOption } from "../interfaces"; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface TaskListHeaderProps {} const TaskListHeader: React.FC = () => { const { style, taskList, allTasks, calendar, options } = useContext( GanttElasticContext ); const [resizer] = useState<{ moving?: TaskListColumnOption; x: number; initialWidth: number; }>({ // moving: false, x: 0, initialWidth: 0 }); /** * Resizer mouse down event handler */ const resizerMouseDown = useCallback( column => { return (event: React.MouseEvent): void => { if (!resizer.moving) { resizer.moving = column; resizer.x = event.clientX; resizer.initialWidth = column.width; emitEvent.emit("taskList-column-width-change-start", resizer.moving); } }; }, [resizer] ); /** * Resizer mouse move event handler */ const resizerMouseMove = useCallback( event => { if (resizer.moving) { const lastWidth = resizer.moving.width; resizer.moving.width = resizer.initialWidth + event.clientX - resizer.x; if (resizer.moving.width < options.taskList.minWidth) { resizer.moving.width = options.taskList.minWidth; } if (lastWidth !== resizer.moving.width) { // set({ ...resizer }); // dispatch({ // payload: { // options: { // ...options, // taskList: { ...taskList, columns: [...taskList.columns] } // } // } // }); emitEvent.emit("taskList-column-width-change", resizer.moving); } } }, [resizer.initialWidth, resizer.moving, resizer.x, options.taskList.minWidth] ); /** * Resizer mouse up event handler */ const resizerMouseUp = useCallback((): void => { if (resizer.moving) { resizer.moving = undefined; emitEvent.emit("taskList-column-width-change-stop", resizer.moving); } }, [resizer]); useEffect(() => { document.addEventListener("mouseup", resizerMouseUp); document.addEventListener("mousemove", resizerMouseMove); emitEvent.on("main-view-mousemove", resizerMouseMove); emitEvent.on("main-view-mouseup", resizerMouseUp); return (): void => { document.removeEventListener("mouseup", resizerMouseUp); document.removeEventListener("mousemove", resizerMouseMove); emitEvent.removeAllListeners("main-view-mousemove"); emitEvent.removeAllListeners("main-view-mouseup"); }; }, [resizerMouseMove, resizerMouseUp]); return useMemo( () => (
{_.map(taskList.columns, column => { return (
{column.expander && ( task.allChildren.length > 0 )} options={options.taskList.expander} > )}
{column.label}
); })}
), [ allTasks, calendar.height, options.calendar.gap, options.taskList.expander, resizerMouseDown, resizerMouseUp, style, taskList.columns ] ); }; export default TaskListHeader;