@tduniec/backstage-plugin-time-saver
Version:
This plugin provides an implementation of charts and statistics related to your time savings that are coming from usage of your templates. Plugins is built from frontend and backend part. This part of plugin `frontend` is responsible of providing views wi
107 lines (104 loc) • 2.93 kB
JavaScript
import { jsx } from 'react/jsx-runtime';
import { useState, useEffect } from 'react';
import { Chart, LineElement, PointElement, Title, Tooltip, Legend } from 'chart.js';
import { Line } from 'react-chartjs-2';
import { useApi, configApiRef, fetchApiRef } from '@backstage/core-plugin-api';
import { createUrlWithDates, getRandomColor } from '../utils.esm.js';
import CircularProgress from '@material-ui/core/CircularProgress';
import { useTheme } from '@material-ui/core';
Chart.register(LineElement, PointElement, Title, Tooltip, Legend);
function TeamWiseTimeSummaryLinearChart({
team,
dates
}) {
const configApi = useApi(configApiRef);
const fetchApi = useApi(fetchApiRef);
const [data, setData] = useState(
null
);
const theme = useTheme();
useEffect(() => {
fetchApi.fetch(
createUrlWithDates(
`${configApi.getString(
"backend.baseUrl"
)}/api/time-saver/getTimeSummary/team`,
dates
)
).then((response) => response.json()).then((dt) => {
dt.stats.sort(
(a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()
);
setData(dt);
}).catch();
}, [configApi, team, fetchApi, dates]);
if (!data) {
return /* @__PURE__ */ jsx(CircularProgress, {});
}
let filteredData;
if (team) {
filteredData = {
stats: data.stats.filter((stat) => stat.team === team)
};
} else {
filteredData = data;
}
const uniqueTeams = Array.from(
new Set(filteredData.stats.map((stat) => stat.team))
);
const options = {
plugins: {
title: {
display: true,
text: "Time Summary by Team",
color: theme.palette.text.primary
}
},
responsive: true,
scales: {
x: [
{
type: "time",
time: {
unit: "day",
tooltipFormat: "YYYY-MM-DD",
displayFormats: {
day: "YYYY-MM-DD"
},
bounds: "data"
},
scaleLabel: {
display: true,
labelString: "Date"
}
}
],
y: [
{
stacked: true,
beginAtZero: true,
scaleLabel: {
display: true,
labelString: "Total Time Saved"
}
}
]
}
};
const uniqueDates = Array.from(new Set(data.stats.map((stat) => stat.date)));
const allData = {
labels: uniqueDates,
datasets: uniqueTeams.map((tm) => {
const templateData = filteredData.stats.filter((stat) => stat.team === tm).map((stat) => ({ x: stat.date, y: stat.totalTimeSaved }));
return {
label: tm,
data: templateData,
fill: false,
borderColor: getRandomColor()
};
})
};
return /* @__PURE__ */ jsx(Line, { options, data: allData });
}
export { TeamWiseTimeSummaryLinearChart };
//# sourceMappingURL=TeamWiseTimeSummaryLinearComponent.esm.js.map