on select changes

This commit is contained in:
unknown 2020-09-15 23:23:09 +03:00
parent 895c49ce68
commit 6b7d57378c
7 changed files with 52 additions and 14 deletions

View File

@ -112,7 +112,7 @@ npm start
- TooltipContent: [`React.FC<{ task: Task; fontSize: string; fontFamily: string; }>;`](https://github.com/MaTeMaTuK/gantt-task-react/blob/main/src/components/other/tooltip.tsx#L56) - TooltipContent: [`React.FC<{ task: Task; fontSize: string; fontFamily: string; }>;`](https://github.com/MaTeMaTuK/gantt-task-react/blob/main/src/components/other/tooltip.tsx#L56)
- TaskListHeader: `React.FC<{ headerHeight: number; rowWidth: string; fontFamily: string; fontSize: string;}>;` - TaskListHeader: `React.FC<{ headerHeight: number; rowWidth: string; fontFamily: string; fontSize: string;}>;`
- TaskListTable: `React.FC<{ rowHeight: number; rowWidth: string; fontFamily: string; fontSize: string; locale: string; tasks: Task[]; }>;` - TaskListTable: `React.FC<{ rowHeight: number; rowWidth: string; fontFamily: string; fontSize: string; locale: string; tasks: Task[]; selectedTaskId: string setSelectedTask: (taskId: string) => void; }>;`
### Task ### Task

View File

@ -1,6 +1,6 @@
{ {
"name": "gantt-task-react", "name": "gantt-task-react",
"version": "0.2.0", "version": "0.2.1",
"description": "Interactive Gantt Chart for React with TypeScript.", "description": "Interactive Gantt Chart for React with TypeScript.",
"author": "MaTeMaTuK <maksym.vikarii@gmail.com>", "author": "MaTeMaTuK <maksym.vikarii@gmail.com>",
"homepage": "https://github.com/MaTeMaTuK/gantt-task-react", "homepage": "https://github.com/MaTeMaTuK/gantt-task-react",

View File

@ -45,6 +45,7 @@ export const Gantt: React.SFC<GanttProps> = ({
}) => { }) => {
const wrapperRef = useRef<HTMLDivElement>(null); const wrapperRef = useRef<HTMLDivElement>(null);
const [ganttTasks, setGanttTasks] = useState<Task[]>(tasks); const [ganttTasks, setGanttTasks] = useState<Task[]>(tasks);
const [selectedTask, setSelectedTask] = useState<string>("");
const [scrollY, setScrollY] = useState(0); const [scrollY, setScrollY] = useState(0);
const [scrollX, setScrollX] = useState(0); const [scrollX, setScrollX] = useState(0);
const [ignoreScrollEvent, setIgnoreScrollEvent] = useState(false); const [ignoreScrollEvent, setIgnoreScrollEvent] = useState(false);
@ -158,6 +159,31 @@ export const Gantt: React.SFC<GanttProps> = ({
setGanttTasks(tasks); setGanttTasks(tasks);
}; };
/**
* Task select event
*/
const handleSelectedTask = (taskId: string) => {
const newSelectedTask = ganttTasks.find(t => t.id === taskId);
if (newSelectedTask) {
if (onSelect) {
const oldSelectedTask = ganttTasks.find(t => t.id === selectedTask);
if (oldSelectedTask) {
onSelect(oldSelectedTask, false);
}
onSelect(newSelectedTask, true);
}
setSelectedTask(newSelectedTask.id);
} else {
if (onSelect) {
const oldSelectedTask = ganttTasks.find(t => t.id === selectedTask);
if (oldSelectedTask) {
onSelect(oldSelectedTask, false);
}
}
setSelectedTask("");
}
};
const gridProps: GridProps = { const gridProps: GridProps = {
columnWidth, columnWidth,
gridWidth, gridWidth,
@ -177,6 +203,8 @@ export const Gantt: React.SFC<GanttProps> = ({
}; };
const barProps: TaskGanttContentProps = { const barProps: TaskGanttContentProps = {
tasks: ganttTasks, tasks: ganttTasks,
selectedTask,
setSelectedTask: handleSelectedTask,
rowHeight, rowHeight,
barCornerRadius, barCornerRadius,
columnWidth, columnWidth,
@ -198,7 +226,6 @@ export const Gantt: React.SFC<GanttProps> = ({
onProgressChange, onProgressChange,
onDoubleClick, onDoubleClick,
onTaskDelete, onTaskDelete,
onSelect,
TooltipContent, TooltipContent,
}; };
@ -213,6 +240,8 @@ export const Gantt: React.SFC<GanttProps> = ({
scrollY, scrollY,
ganttHeight, ganttHeight,
horizontalContainerClass: styles.horizontalContainer, horizontalContainerClass: styles.horizontalContainer,
selectedTaskId: selectedTask,
setSelectedTask,
TaskListHeader, TaskListHeader,
TaskListTable, TaskListTable,
}; };

View File

@ -26,6 +26,7 @@ export type BarEvent = {
export type TaskGanttContentProps = { export type TaskGanttContentProps = {
tasks: Task[]; tasks: Task[];
dates: Date[]; dates: Date[];
selectedTask: string;
rowHeight: number; rowHeight: number;
barCornerRadius: number; barCornerRadius: number;
columnWidth: number; columnWidth: number;
@ -42,6 +43,7 @@ export type TaskGanttContentProps = {
arrowIndent: number; arrowIndent: number;
fontSize: string; fontSize: string;
fontFamily: string; fontFamily: string;
setSelectedTask: (taskId: string) => void;
TooltipContent: React.FC<{ TooltipContent: React.FC<{
task: Task; task: Task;
fontSize: string; fontSize: string;
@ -53,6 +55,7 @@ export type TaskGanttContentProps = {
export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
tasks, tasks,
dates, dates,
selectedTask,
rowHeight, rowHeight,
barCornerRadius, barCornerRadius,
columnWidth, columnWidth,
@ -69,12 +72,12 @@ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
arrowIndent, arrowIndent,
fontFamily, fontFamily,
fontSize, fontSize,
setSelectedTask,
onTasksChange, onTasksChange,
onDateChange, onDateChange,
onProgressChange, onProgressChange,
onDoubleClick, onDoubleClick,
onTaskDelete, onTaskDelete,
onSelect,
TooltipContent, TooltipContent,
}) => { }) => {
const point = svg?.current?.createSVGPoint(); const point = svg?.current?.createSVGPoint();
@ -82,7 +85,6 @@ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
action: "", action: "",
}); });
const [barTasks, setBarTasks] = useState<BarTask[]>([]); const [barTasks, setBarTasks] = useState<BarTask[]>([]);
const [selectedTask, setSelectedTask] = useState<BarTask | null>(null);
const [failedTask, setFailedTask] = useState<BarTask | null>(null); const [failedTask, setFailedTask] = useState<BarTask | null>(null);
const [xStep, setXStep] = useState(0); const [xStep, setXStep] = useState(0);
const [initEventX1Delta, setInitEventX1Delta] = useState(0); const [initEventX1Delta, setInitEventX1Delta] = useState(0);
@ -268,13 +270,7 @@ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
) => { ) => {
if (!event) { if (!event) {
if (action === "select") { if (action === "select") {
if (selectedTask && onSelect) { setSelectedTask(task.id);
onSelect(selectedTask, false);
}
setSelectedTask(task);
if (onSelect) {
onSelect(task, true);
}
} }
} }
// Keyboard events // Keyboard events
@ -286,7 +282,7 @@ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
if (result !== undefined && result) { if (result !== undefined && result) {
const newTasks = barTasks.filter(t => t.id !== task.id); const newTasks = barTasks.filter(t => t.id !== task.id);
onTasksChange(newTasks); onTasksChange(newTasks);
!!onSelect && onSelect(task, false); setSelectedTask("");
} }
} catch (error) { } catch (error) {
console.error("Error on Delete. " + error); console.error("Error on Delete. " + error);
@ -360,7 +356,7 @@ export const TaskGanttContent: React.FC<TaskGanttContentProps> = ({
isDelete={!task.isDisabled} isDelete={!task.isDisabled}
onEventStart={handleBarEventStart} onEventStart={handleBarEventStart}
key={task.id} key={task.id}
isSelected={task.id === selectedTask?.id} isSelected={task.id === selectedTask}
/> />
); );
})} })}

View File

@ -9,6 +9,8 @@ export const TaskListTableDefault: React.FC<{
fontSize: string; fontSize: string;
locale: string; locale: string;
tasks: Task[]; tasks: Task[];
selectedTaskId: string;
setSelectedTask: (taskId: string) => void;
}> = ({ rowHeight, rowWidth, tasks, fontFamily, fontSize, locale }) => { }> = ({ rowHeight, rowWidth, tasks, fontFamily, fontSize, locale }) => {
const dateTimeOptions = { const dateTimeOptions = {
weekday: "short", weekday: "short",

View File

@ -12,6 +12,8 @@ export type TaskListProps = {
locale: string; locale: string;
tasks: Task[]; tasks: Task[];
horizontalContainerClass?: string; horizontalContainerClass?: string;
selectedTaskId: string;
setSelectedTask: (taskId: string) => void;
TaskListHeader: React.FC<{ TaskListHeader: React.FC<{
headerHeight: number; headerHeight: number;
rowWidth: string; rowWidth: string;
@ -25,6 +27,8 @@ export type TaskListProps = {
fontSize: string; fontSize: string;
locale: string; locale: string;
tasks: Task[]; tasks: Task[];
selectedTaskId: string;
setSelectedTask: (taskId: string) => void;
}>; }>;
}; };
@ -36,6 +40,8 @@ export const TaskList: React.FC<TaskListProps> = ({
rowHeight, rowHeight,
scrollY, scrollY,
tasks, tasks,
selectedTaskId,
setSelectedTask,
locale, locale,
ganttHeight, ganttHeight,
horizontalContainerClass, horizontalContainerClass,
@ -62,7 +68,10 @@ export const TaskList: React.FC<TaskListProps> = ({
fontSize, fontSize,
tasks, tasks,
locale, locale,
selectedTaskId,
setSelectedTask,
}; };
return ( return (
<div> <div>
<TaskListHeader {...headerProps} /> <TaskListHeader {...headerProps} />

View File

@ -106,6 +106,8 @@ export interface StylingOption {
fontSize: string; fontSize: string;
locale: string; locale: string;
tasks: Task[]; tasks: Task[];
selectedTaskId: string;
setSelectedTask: (taskId: string) => void;
}>; }>;
} }