diff --git a/src/components/Bar/bar.tsx b/src/components/Bar/bar.tsx index da386a6..8a89890 100644 --- a/src/components/Bar/bar.tsx +++ b/src/components/Bar/bar.tsx @@ -4,7 +4,7 @@ import { BarProgressHandle } from './bar-progress-handle'; import { BarDateHandle } from './bar-date-handle'; import { BarDisplay } from './bar-display'; import { BarTask } from '../../types/bar-task'; -import { BarEvent } from '../Gantt/gantt-content'; +import { BarAction } from '../Gantt/gantt-content'; import { progressWithByParams, getProgressPoint, @@ -22,7 +22,7 @@ export type BarProps = { | React.MouseEvent | React.MouseEvent | React.MouseEvent, - eventType: BarEvent, + eventType: BarAction, task: BarTask ) => void; handleButtonSVGEvents: ( diff --git a/src/components/Gantt/gantt-content.tsx b/src/components/Gantt/gantt-content.tsx index 7d99cc5..20a4dce 100644 --- a/src/components/Gantt/gantt-content.tsx +++ b/src/components/Gantt/gantt-content.tsx @@ -45,7 +45,7 @@ export type GanttContentProps = { ) => JSX.Element; } & EventOption; -export type BarEvent = +export type BarAction = | 'progress' | 'end' | 'start' @@ -53,6 +53,11 @@ export type BarEvent = | 'mouseenter' | 'mouseleave' | ''; + +type BarEvent = { + action: BarAction; + selectedTask: BarTask | null; +}; export const GanttContent: React.FC = ({ tasks, rowHeight, @@ -78,12 +83,14 @@ export const GanttContent: React.FC = ({ onTaskDelete, getTooltipContent, }) => { - const [barEvent, setBarEvent] = useState(''); - const [selectedTask, setSelectedTask] = useState(null); + const [barEvent, setBarEvent] = useState({ + action: '', + selectedTask: null, + }); + const [isSVGListen, setIsSVGListen] = useState(false); const [barTasks, setBarTasks] = useState([]); const [xStep, setXStep] = useState(0); const [initEventX1Delta, setInitEventX1Delta] = useState(0); - const [isSVGListen, setIsSVGListen] = useState(false); useEffect(() => { const dateDelta = @@ -139,12 +146,14 @@ export const GanttContent: React.FC = ({ * Method handles event in real time(mousemove) and on finish(mouseup) */ const handleMouseSVGChangeEventsSubscribe = async (event: MouseEvent) => { - if (!selectedTask || !barEvent) return; + if (!barEvent.selectedTask || !barEvent.action) return; + + const selectedTask = barEvent.selectedTask; const changedTask = { ...selectedTask } as BarTask; switch (event.type) { //On Event changing case 'mousemove': { - switch (barEvent) { + switch (barEvent.action) { case 'progress': changedTask.progress = progressByX(event.offsetX, selectedTask); break; @@ -198,15 +207,16 @@ export const GanttContent: React.FC = ({ setBarTasks( barTasks.map(t => (t.id === changedTask.id ? changedTask : t)) ); - setSelectedTask(changedTask); + setBarEvent({ ...barEvent, selectedTask: changedTask }); break; } + //On finish Event case 'mouseup': { let eventForExecution: ( task: Task ) => void | Promise = () => {}; - switch (barEvent) { + switch (barEvent.action) { case 'progress': changedTask.progress = progressByX(event.offsetX, selectedTask); if (onProgressChange) { @@ -270,8 +280,7 @@ export const GanttContent: React.FC = ({ break; } - setBarEvent(''); - setSelectedTask(null); + setBarEvent({ action: '', selectedTask: null }); setIsSVGListen(false); svg.current?.removeEventListener( 'mousemove', @@ -289,7 +298,8 @@ export const GanttContent: React.FC = ({ } }; - if (selectedTask && barEvent && !isSVGListen) { + if (barEvent.selectedTask && barEvent.action && !isSVGListen) { + setIsSVGListen(true); svg.current?.addEventListener( 'mousemove', handleMouseSVGChangeEventsSubscribe @@ -298,11 +308,10 @@ export const GanttContent: React.FC = ({ 'mouseup', handleMouseSVGChangeEventsSubscribe ); - setIsSVGListen(true); } }, [ barEvent, - selectedTask, + isSVGListen, xStep, svg, initEventX1Delta, @@ -310,7 +319,6 @@ export const GanttContent: React.FC = ({ onProgressChange, timeStep, onDateChange, - isSVGListen, ]); /** @@ -324,22 +332,22 @@ export const GanttContent: React.FC = ({ | React.MouseEvent | React.MouseEvent | React.MouseEvent, - eventType: BarEvent, + eventType: BarAction, task: BarTask ) => { switch (event.type) { case 'mousedown': - setBarEvent(eventType); - setSelectedTask(task); + setBarEvent({ ...barEvent, selectedTask: task, action: eventType }); setInitEventX1Delta(event.nativeEvent.offsetX - task.x1); event.stopPropagation(); break; case 'mouseleave': - if (!barEvent) setSelectedTask(null); + if (!barEvent.action) + setBarEvent({ ...barEvent, selectedTask: task, action: '' }); break; case 'mouseenter': - if (!selectedTask) { - setSelectedTask(task); + if (!barEvent.selectedTask) { + setBarEvent({ ...barEvent, selectedTask: task, action: '' }); } break; } @@ -399,16 +407,18 @@ export const GanttContent: React.FC = ({ })} - {selectedTask && barEvent !== 'end' && barEvent !== 'start' && ( - - )} + {barEvent.selectedTask && + barEvent.action !== 'end' && + barEvent.action !== 'start' && ( + + )} );