guesstimate/client/src/routes/project/estimation-tab.tsx

70 lines
2.5 KiB
TypeScript
Raw Normal View History

2020-07-09 13:00:42 +02:00
import React, { FunctionComponent, Fragment } from "react";
2020-04-21 14:10:50 +02:00
import { Project } from "../../models/project";
import TaskTable from "./tasks-table";
import TimePreview from "./time-preview";
import FinancialPreview from "./financial-preview";
2020-07-09 13:00:42 +02:00
import { addTask, updateTaskEstimation, removeTask, updateTaskLabel, ProjectReducerActions } from "../../hooks/use-project-reducer";
2020-04-21 14:10:50 +02:00
import { Task, TaskID, EstimationConfidence } from "../../models/task";
2020-04-23 09:15:27 +02:00
import RepartitionPreview from "./repartition-preview";
import { getHideFinancialPreviewOnPrint } from "../../models/params";
2020-04-21 14:10:50 +02:00
export interface EstimationTabProps {
project: Project
dispatch: (action: ProjectReducerActions) => void
}
2020-07-09 13:00:42 +02:00
const EstimationTab: FunctionComponent<EstimationTabProps> = ({ project, dispatch }) => {
2020-04-21 14:10:50 +02:00
const onTaskAdd = (task: Task) => {
dispatch(addTask(task));
};
const onTaskRemove = (taskId: TaskID) => {
dispatch(removeTask(taskId));
}
const onTaskLabelUpdate = (taskId: TaskID, label: string) => {
dispatch(updateTaskLabel(taskId, label));
}
const onEstimationChange = (taskId: TaskID, confidence: EstimationConfidence, value: number) => {
dispatch(updateTaskEstimation(taskId, confidence, value));
};
return (
2020-04-23 09:15:27 +02:00
<Fragment>
2020-07-09 13:00:42 +02:00
<div className="columns">
<div className="column is-9">
2020-04-23 09:15:27 +02:00
<TaskTable
project={project}
onTaskAdd={onTaskAdd}
onTaskRemove={onTaskRemove}
onTaskLabelUpdate={onTaskLabelUpdate}
onEstimationChange={onEstimationChange} />
</div>
2020-07-09 13:00:42 +02:00
<div className="column is-3">
2020-04-23 09:15:27 +02:00
<TimePreview project={project} />
<RepartitionPreview project={project} />
</div>
</div>
2020-07-09 13:00:42 +02:00
<div className="columns">
<div className={`column ${getHideFinancialPreviewOnPrint(project) ? 'noPrint': ''}`}>
2020-04-23 09:15:27 +02:00
<FinancialPreview project={project} />
</div>
</div>
{
Object.keys(project.tasks).length <= 20 ?
2020-07-09 13:00:42 +02:00
<div className="message noPrint">
<div className="message-body">
<p><strong> Attention</strong></p>
<p>Votre projet ne contient pas assez de tâches pour que les niveaux de confiance soient fiables. Un minimum de 20 tâches est conseillé pour obtenir une estimation pertinente.</p>
</div>
</div> :
null
}
<hr />
2020-04-23 09:15:27 +02:00
</Fragment>
2020-04-21 14:10:50 +02:00
);
};
export default EstimationTab;