import React, { useState, useEffect } from 'react'; import { ResponsiveContainer, LineChart, Line, CartesianGrid, XAxis, YAxis, Tooltip } from 'recharts'; import VSCodeApi from "./VSCodeApi"; import formatDate from 'dateformat'; import { debounce } from 'throttle-debounce'; const Burndown = ({ name, sprints, burndownData, dateFormat, vscode }: { name: string, sprints: KanbnSprint[], burndownData: { series: Array<{ sprint: KanbnSprint, from: string, to: string, dataPoints: Array<{ x: string, y: number, count: number, tasks: Array<{ eventType: string, taskId: string }> }> }> }, dateFormat: string, vscode: VSCodeApi }) => { const hasSprints = sprints.length > 0; const [sprintMode, setSprintMode] = useState(hasSprints); const [sprint, setSprint] = useState((sprintMode && hasSprints) ? sprints[sprints.length - 1].name : ''); const [startDate, setStartDate] = useState( (sprintMode && burndownData.series.length > 0) ? '' : formatDate(burndownData.series[0].from, 'yyyy-mm-dd') ); const [endDate, setEndDate] = useState( (sprintMode && burndownData.series.length > 0) ? '' : formatDate(burndownData.series[0].to, 'yyyy-mm-dd') ); const refreshBurndownData = debounce(500, settings => { vscode.postMessage({ command: 'kanbn.refreshBurndownData', ...Object.assign( { sprintMode, sprint, startDate, endDate }, settings ) }); }); const handleChangeSprint = ({ target: { value }}) => { setSprint(value); refreshBurndownData({ sprint: value }); }; const handleChangeStartDate = ({ target: { value }}) => { setStartDate(value); refreshBurndownData({ startDate: value }); }; const handleChangeEndDate = ({ target: { value }}) => { setEndDate(value); refreshBurndownData({ endDate: value }); }; const handleClickSprintMode = () => { setSprintMode(true); refreshBurndownData({ sprintMode: true }); }; const handleClickDateMode = () => { setSprintMode(false); refreshBurndownData({ sprintMode: false }); }; const chartData = burndownData.series.length > 0 ? burndownData.series[0].dataPoints.map(dataPoint => ({ x: Date.parse(dataPoint.x), y: dataPoint.y, count: dataPoint.count, tasks: dataPoint.tasks, })) : []; const formatXAxis = date => formatDate(date, dateFormat); const renderTooltip = e => { if (e.active && e.payload && e.payload.length) { const data = e.payload[0].payload; return (

{formatDate(data.x, dateFormat)}

Total workload: {data.y}

Active tasks: {data.count}

{data.tasks.map(task => (

{{ created: 'Created', started: 'Started', completed: 'Completed' }[task.eventType]} {task.task.name}

))}
) } return null; }; return (

{name}

{ sprintMode ? : } {hasSprints && }

); }; export default Burndown;