diff --git a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/AnomalyChart.tsx b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/AnomalyChart.tsx index d658b72..6b0767e 100644 --- a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/AnomalyChart.tsx +++ b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/AnomalyChart.tsx @@ -1,4 +1,4 @@ -import { useMemo } from "react"; +import {useMemo, useState} from "react"; import { Area, AreaChart, @@ -325,6 +325,7 @@ interface AnomalyChartProps { setHighlight: (arg0: {} | any) => any; labelKey: string; events: any; + description: string } export const AnomalyChart = ({ @@ -341,7 +342,9 @@ export const AnomalyChart = ({ setHighlight, labelKey, events, + description }: AnomalyChartProps) => { + const [isLabelHovered, setIsLabelHovered] = useState(false); const formatChartData = (data: any) => { const formattedData: any = []; data?.data?.map((obj: any) => { @@ -375,7 +378,7 @@ export const AnomalyChart = ({ } /> ); - }, [groupBy, metric, labelKey]); + }, [groupBy, metric, labelKey,isLabelHovered]); const TooltipMemo = useMemo(() => { return ( @@ -397,7 +400,33 @@ export const AnomalyChart = ({ allowEscapeViewBox={{ x: false, y: true }} /> ); - }, [labelKey, metric, yFormatter]); + }, [labelKey, metric, yFormatter,isLabelHovered]); + + const CustomYLabel = ({ x, y, value, tooltipContent }: any) => { + const handleMouseEnter = (e: React.MouseEvent) => { + setIsLabelHovered(true) + } + + const handleMouseLeave = (e: React.MouseEvent) => { + setIsLabelHovered(false) + } + return ( + + + {value} + + + ); + }; + + + const YAxisMemo = useMemo(() => { return ( @@ -414,11 +443,12 @@ export const AnomalyChart = ({ value={labelKey} offset={15} angle={-90} - position="left" + position="insideLeft" + content={} /> ); - }, [labelKey]); + }, [labelKey,isLabelHovered]); const renderEventContent = ({ viewBox: { x, y } }: any, event: any) => { const d: number = 20; @@ -601,7 +631,7 @@ export const AnomalyChart = ({ /> {YAxisMemo} {TooltipMemo} - {LegendMemo} + {thisChartData?.[0]?.data.length >0 ? !isLabelHovered ? LegendMemo : null : null} { }; const CustomTooltip = ({ - active, - metric, - payload, - label, - yUnit, - valueRounding, - yFormatter = (y: any) => y, - }: any) => { + active, + metric, + payload, + label, + yUnit, + valueRounding, + yFormatter = (y: any) => y, +}: any) => { if (active && payload && payload.length) { document - .querySelectorAll(`div[id^='valueId_']`) - .forEach((el) => (el.innerHTML = "--")); + .querySelectorAll(`div[id^='valueId_']`) + .forEach((el) => (el.innerHTML = "--")); payload?.map((p: any, i: any) => { document.getElementById(`valueId_${metric}_${p.name}`).innerText = - roundNumber(yFormatter(p.value), valueRounding) + ` ${yUnit}`; + roundNumber(yFormatter(p.value), valueRounding) + ` ${yUnit}`; document.getElementById(`labelId_${metric}`).textContent = moment - .unix(label) - .format("MMM D, HH:mm"); + .unix(label) + .format("MMM D, HH:mm"); }); return ( -
- {payload?.map((p: any, i: any) => { - return
; - })} -
+
+ {payload?.map((p: any, i: any) => { + return
; + })} +
); } @@ -69,15 +69,16 @@ const CustomTooltip = ({ }; const RenderLegend = ({ - payload, - metric, - filterChart, - setFilterChart, - setHighlight, - highlight, - chartHeight, - groupBy, - }: any) => { + payload, + metric, + filterChart, + setFilterChart, + setHighlight, + highlight, + chartHeight, + groupBy, + description +}: any) => { let filterBy = filterChart?.[groupBy]?.concat([]) || []; const onLegendClick = (e: any, legendItem: any, legend: any) => { @@ -112,80 +113,82 @@ const RenderLegend = ({ }; return ( -
-
- - - -
-
- {payload?.map((entry: any, index: any) => ( -
-
{ - onLegendClick(null, entry, payload); - }} - className={`l-content`} - onMouseOver={() => { - setHighlight({ ...highlight, [groupBy]: entry.value }); - }} +
+
+ + + +
+
+ {payload?.map((entry: any, index: any) => ( +
+
{ + onLegendClick(null, entry, payload); + }} + className={`l-content`} + onMouseOver={() => { + setHighlight({ ...highlight, [groupBy]: entry.value }); + }} + > +
+ -
- - - -
-
-1 - ? "1" - : ".4", - }} - > - {truncate(entry.value, 56)} -
-
-
+ +
- ))} -
+
-1 + ? "1" + : ".4", + }} + > + {truncate(entry.value, 56)} +
+
+
+
+ ))}
+
); }; export const TimeSeriesChart = ({ - chartData, - title, - groupBy, - metric, - yFormatter = (y: any) => y, - yUnit, - valueRounding, - filterChart, - setFilterChart, - highlight, - setHighlight, - labelKey, - events, - }: any) => { + chartData, + title, + groupBy, + metric, + yFormatter = (y: any) => y, + yUnit, + valueRounding, + filterChart, + setFilterChart, + highlight, + setHighlight, + labelKey, + events, + description +}: any) => { const [showThreshold, setShowThreshold] = useState(false); + const [isLabelHovered, setIsLabelHovered] = useState(false); const handleCheckboxChange = (event: any) => { setShowThreshold(!showThreshold); @@ -219,21 +222,22 @@ export const TimeSeriesChart = ({ const LegendMemo = useMemo(() => { return ( - - } - /> + + } + /> ); }, [ groupBy, @@ -244,62 +248,87 @@ export const TimeSeriesChart = ({ filterChart, setFilterChart, showThreshold, + isLabelHovered ]); const TooltipMemo = useMemo(() => { return ( - - } - cursor={true} - position={{ y: 0 }} - allowEscapeViewBox={{ x: false, y: true }} - /> + + } + cursor={true} + position={{ y: 0 }} + allowEscapeViewBox={{ x: false, y: true }} + /> ); - }, [chartData, filterChart, showThreshold]); + }, [chartData, filterChart, showThreshold, isLabelHovered]); - const YAxisMemo = useMemo(() => { + const CustomYLabel = ({ x, y, value, tooltipContent }: any) => { + const handleMouseEnter = (e: React.MouseEvent) => { + setIsLabelHovered(true) + } + + const handleMouseLeave = (e: React.MouseEvent) => { + setIsLabelHovered(false) + } return ( - roundNumber(y, valueRounding) + ``} - style={{ fontSize: ".9em" }} + + - + {value} + + ); - }, [chartData]); + }; - const XAxisMemo = useMemo(() => { + const YAxisMemo = useMemo(() => { return ( - - moment(unixTime * 1000).format("HH:mm") - } - type="number" + roundNumber(y, valueRounding) + ``} + style={{ fontSize: ".9em" }} + > + + ); + }, [chartData, isLabelHovered]); + + const XAxisMemo = useMemo(() => { + return ( + + moment(unixTime * 1000).format("HH:mm") + } + type="number" + /> ); }, []); @@ -310,54 +339,54 @@ export const TimeSeriesChart = ({ const transform = `translate(${x - r - 0} ${y - d - 10})`; const randomKey = Math.random().toString(); return ( - -
Events
- {Object.keys(event?.events)?.map((k) => { - const eventItem = event.events[k]; - return ( -
- {k} - - {eventItem.count} - -
- ); - })} -
- } + +
Events
+ {Object.keys(event?.events)?.map((k) => { + const eventItem = event.events[k]; + return ( +
+ {k} + + {eventItem.count} + +
+ ); + })} +
+ } + > + - - - - - - + + + + - + + ); }; @@ -365,7 +394,7 @@ export const TimeSeriesChart = ({ const uEvents: any = {}; events?.map((event: any) => { const formattedTime = moment(event.lastTimestamp).format( - "YYYY-MM-DD HH:mm" + "YYYY-MM-DD HH:mm" ); if (!uEvents[formattedTime]) { uEvents[formattedTime] = { @@ -395,143 +424,145 @@ export const TimeSeriesChart = ({ }; return useMemo( - () => ( - <> -
- {concatenatedData?.length > 0 ? ( - <> - - { }} - onMouseLeave={() => { - setHighlight({ ...highlight, [groupBy]: "" }); - }} - margin={{ - top: 30, - right: 30, - left: 40, - bottom: 5, - }} - - > - - {Object.keys(uniqueEvents(events))?.map( - (eventKey: any, i: number) => { - const event = uniqueEvents(events)[eventKey]; - if (!eventKey || !event) { - return; - } - - return ( - renderEventContent(p, event)} - /> - } - /> - ); - } - )} - {XAxisMemo} - {YAxisMemo} - {TooltipMemo} - {data?.length > 0 ? LegendMemo : null} - {data?.map((d: any, i: number) => { - return ( - - ); - })} - - - {(chartData?.thresholds.length > 0) && (
-
+ + ), + [ + title, + events, + XAxisMemo, + YAxisMemo, + TooltipMemo, + LegendMemo, + chartData, + setHighlight, + highlight, + groupBy, + filterChart, + showThreshold, + isLabelHovered + ] ); }; diff --git a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/ChartWrapper.tsx b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/ChartWrapper.tsx index f3912a8..c2fdbf5 100644 --- a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/ChartWrapper.tsx +++ b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Chart/ChartWrapper.tsx @@ -56,6 +56,7 @@ export const ChartWrapper = ({ setFilterChart, highlight, setHighlight, + description }: any) => { const [chartsData, setChartsData] = useState({}); @@ -233,6 +234,7 @@ export const ChartWrapper = ({ setFilterChart={setFilterChart} highlight={highlight} setHighlight={setHighlight} + description={description} /> )} @@ -251,6 +253,7 @@ export const ChartWrapper = ({ setFilterChart={setFilterChart} highlight={highlight} setHighlight={setHighlight} + description={description} /> )} {graphType === "pie" && ( @@ -265,6 +268,7 @@ export const ChartWrapper = ({ setHighlight={setHighlight} chartData={chartsData[metric]} yFormatter={yFormatter} + description={description} /> )} diff --git a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Metrics.tsx b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Metrics.tsx index 70bc498..b0b0e69 100644 --- a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Metrics.tsx +++ b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Metrics.tsx @@ -142,6 +142,7 @@ export const Metrics = ({ project={project} applicationNamespace={applicationNamespace} title={graph.title} + description={graph.description} /> ); })} diff --git a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Pie/Pie.tsx b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Pie/Pie.tsx index 9089d06..169ac44 100644 --- a/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Pie/Pie.tsx +++ b/extensions/resource-metrics/resource-metrics-extention/ui/src/Metrics/Pie/Pie.tsx @@ -4,6 +4,7 @@ import { PieChart, Pie, Tooltip, Cell } from "../../utils/recharts"; import { roundNumber } from "../.."; import { colorArray } from "../Chart/ChartWrapper"; import "./Pie.scss"; +import Tippy from "@tippy.js/react"; const CustomTooltip = ({ active, @@ -55,6 +56,7 @@ export const CustomPie = ({ highlight, groupBy, setHighlight, + description }: any) => { const [formattedData, setFormattedData] = useState([]); const [filteredData, setFilteredData] = useState([]); @@ -138,7 +140,9 @@ export const CustomPie = ({ allowEscapeViewBox={{ x: true, y: true }} /> +
{labelKey}
+
), [