@red-hat-developer-hub/plugin-cost-management 2.2.2 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/Router.esm.js +14 -8
- package/dist/Router.esm.js.map +1 -1
- package/dist/components/BasePage.esm.js +8 -5
- package/dist/components/BasePage.esm.js.map +1 -1
- package/dist/components/InfoCardTitle.esm.js +2 -2
- package/dist/components/InfoCardTitle.esm.js.map +1 -1
- package/dist/components/PageLayout.esm.js +37 -30
- package/dist/components/PageLayout.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIcon.esm.js +3 -3
- package/dist/components/icon/AnalyticsIcon.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIconFilled.esm.js +2 -2
- package/dist/components/icon/AnalyticsIconFilled.esm.js.map +1 -1
- package/dist/components/icon/AnalyticsIconOutlined.esm.js +2 -2
- package/dist/components/icon/AnalyticsIconOutlined.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIcon.esm.js +3 -3
- package/dist/components/icon/CostManagementIcon.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIconFilled.esm.js +2 -2
- package/dist/components/icon/CostManagementIconFilled.esm.js.map +1 -1
- package/dist/components/icon/CostManagementIconOutlined.esm.js +2 -2
- package/dist/components/icon/CostManagementIconOutlined.esm.js.map +1 -1
- package/dist/index.d.ts +9 -9
- package/dist/pages/openshift/OpenShiftPage.esm.js +255 -207
- package/dist/pages/openshift/OpenShiftPage.esm.js.map +1 -1
- package/dist/pages/openshift/components/AutocompleteComponent.esm.js +43 -40
- package/dist/pages/openshift/components/AutocompleteComponent.esm.js.map +1 -1
- package/dist/pages/openshift/components/DownloadIconButton.esm.js +11 -11
- package/dist/pages/openshift/components/DownloadIconButton.esm.js.map +1 -1
- package/dist/pages/openshift/components/Filters.esm.js +178 -161
- package/dist/pages/openshift/components/Filters.esm.js.map +1 -1
- package/dist/pages/openshift/components/PageHeader.esm.js +11 -6
- package/dist/pages/openshift/components/PageHeader.esm.js.map +1 -1
- package/dist/pages/openshift/components/SelectComponent.esm.js +30 -27
- package/dist/pages/openshift/components/SelectComponent.esm.js.map +1 -1
- package/dist/pages/openshift/components/TableToolbar.esm.js +187 -163
- package/dist/pages/openshift/components/TableToolbar.esm.js.map +1 -1
- package/dist/pages/optimizations/OptimizationsPage.esm.js +60 -56
- package/dist/pages/optimizations/OptimizationsPage.esm.js.map +1 -1
- package/dist/pages/optimizations/components/ComboBox.esm.js +37 -33
- package/dist/pages/optimizations/components/ComboBox.esm.js.map +1 -1
- package/dist/pages/optimizations/components/Filters.esm.js +35 -28
- package/dist/pages/optimizations/components/Filters.esm.js.map +1 -1
- package/dist/pages/optimizations/components/TableToolbar.esm.js +3 -2
- package/dist/pages/optimizations/components/TableToolbar.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/OptimizationsBreakdownPage.esm.js +51 -45
- package/dist/pages/optimizations-breakdown/OptimizationsBreakdownPage.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/OptimizationEngineTab.esm.js +79 -64
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/OptimizationEngineTab.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/CodeInfoCard.esm.js +4 -3
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/CodeInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/ContainerInfoCard.esm.js +28 -20
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/ContainerInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/ChartInfoCard.esm.js +4 -3
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/ChartInfoCard.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/IntlBreakdownChart.esm.js +3 -3
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/IntlBreakdownChart.esm.js.map +1 -1
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/OptimizationsBreakdownChart.esm.js +29 -26
- package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/OptimizationsBreakdownChart.esm.js.map +1 -1
- package/package.json +13 -13
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
1
2
|
import React, { useState, useCallback, useMemo, useEffect } from 'react';
|
|
2
3
|
import { useIntl } from 'react-intl';
|
|
3
4
|
import { makeStyles } from '@material-ui/core/styles';
|
|
4
|
-
import { createContainer, Chart, ChartThemeColor, ChartAxis,
|
|
5
|
+
import { createContainer, Chart, ChartThemeColor, ChartAxis, ChartArea, ChartScatter, ChartBoxPlot, ChartLegend, getInteractiveLegendEvents, ChartLegendTooltip } from '@patternfly/react-charts/victory';
|
|
5
6
|
import { chart_color_blue_100 } from '@patternfly/react-tokens/dist/js/chart_color_blue_100';
|
|
6
7
|
import { chart_color_blue_200 } from '@patternfly/react-tokens/dist/js/chart_color_blue_200';
|
|
7
8
|
import { chart_color_blue_400 } from '@patternfly/react-tokens/dist/js/chart_color_blue_400';
|
|
@@ -58,7 +59,7 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
58
59
|
);
|
|
59
60
|
return cursorVoronoiContainer ? React.cloneElement(cursorVoronoiContainer, {
|
|
60
61
|
disable: !isDataAvailable(series, hiddenSeries),
|
|
61
|
-
labelComponent: /* @__PURE__ */
|
|
62
|
+
labelComponent: /* @__PURE__ */ jsx(
|
|
62
63
|
ChartLegendTooltip,
|
|
63
64
|
{
|
|
64
65
|
legendData,
|
|
@@ -70,15 +71,15 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
70
71
|
const getLimitChart = () => {
|
|
71
72
|
return series?.map((serie, index) => {
|
|
72
73
|
if (serie.childName === "limit") {
|
|
73
|
-
return /* @__PURE__ */
|
|
74
|
+
return /* @__PURE__ */ jsx(
|
|
74
75
|
ChartArea,
|
|
75
76
|
{
|
|
76
77
|
data: !hiddenSeries.has(index) ? serie.data : [{ y: null }],
|
|
77
78
|
interpolation: "monotoneX",
|
|
78
|
-
key: serie.childName,
|
|
79
79
|
name: serie.childName,
|
|
80
80
|
style: serie.style
|
|
81
|
-
}
|
|
81
|
+
},
|
|
82
|
+
serie.childName
|
|
82
83
|
);
|
|
83
84
|
}
|
|
84
85
|
return null;
|
|
@@ -87,15 +88,15 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
87
88
|
const getRequestChart = () => {
|
|
88
89
|
return series?.map((serie, index) => {
|
|
89
90
|
if (serie.childName === "request") {
|
|
90
|
-
return /* @__PURE__ */
|
|
91
|
+
return /* @__PURE__ */ jsx(
|
|
91
92
|
ChartArea,
|
|
92
93
|
{
|
|
93
94
|
data: !hiddenSeries.has(index) ? serie.data : [{ y: null }],
|
|
94
95
|
interpolation: "monotoneX",
|
|
95
|
-
key: serie.childName,
|
|
96
96
|
name: serie.childName,
|
|
97
97
|
style: serie.style
|
|
98
|
-
}
|
|
98
|
+
},
|
|
99
|
+
serie.childName
|
|
99
100
|
);
|
|
100
101
|
}
|
|
101
102
|
return null;
|
|
@@ -104,14 +105,14 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
104
105
|
const getScatterChart = () => {
|
|
105
106
|
return series?.map((serie, index) => {
|
|
106
107
|
if (serie.childName === "scatter") {
|
|
107
|
-
return /* @__PURE__ */
|
|
108
|
+
return /* @__PURE__ */ jsx(
|
|
108
109
|
ChartScatter,
|
|
109
110
|
{
|
|
110
111
|
data: !hiddenSeries.has(index - 1) ? serie.data : [{ y: null }],
|
|
111
|
-
key: serie.childName,
|
|
112
112
|
name: serie.childName,
|
|
113
113
|
style: serie.style
|
|
114
|
-
}
|
|
114
|
+
},
|
|
115
|
+
serie.childName
|
|
115
116
|
);
|
|
116
117
|
}
|
|
117
118
|
return null;
|
|
@@ -120,15 +121,15 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
120
121
|
const getUsageChart = () => {
|
|
121
122
|
return series?.map((serie, index) => {
|
|
122
123
|
if (serie.childName === "usage") {
|
|
123
|
-
return /* @__PURE__ */
|
|
124
|
+
return /* @__PURE__ */ jsx(
|
|
124
125
|
ChartBoxPlot,
|
|
125
126
|
{
|
|
126
127
|
boxWidth: width < 475 ? 15 : void 0,
|
|
127
128
|
data: !hiddenSeries.has(index) ? serie.data : [{ y: [null] }],
|
|
128
|
-
key: serie.childName,
|
|
129
129
|
name: serie.childName,
|
|
130
130
|
style: serie.style
|
|
131
|
-
}
|
|
131
|
+
},
|
|
132
|
+
serie.childName
|
|
132
133
|
);
|
|
133
134
|
}
|
|
134
135
|
return null;
|
|
@@ -193,7 +194,7 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
193
194
|
})
|
|
194
195
|
}) : intl.formatMessage(messages.chartNoData);
|
|
195
196
|
};
|
|
196
|
-
return /* @__PURE__ */
|
|
197
|
+
return /* @__PURE__ */ jsx(
|
|
197
198
|
CursorVoronoiContainer,
|
|
198
199
|
{
|
|
199
200
|
cursorDimension: "x",
|
|
@@ -217,7 +218,7 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
217
218
|
return baseHeight + extraHeight;
|
|
218
219
|
};
|
|
219
220
|
const getLegend = () => {
|
|
220
|
-
return /* @__PURE__ */
|
|
221
|
+
return /* @__PURE__ */ jsx(
|
|
221
222
|
ChartLegend,
|
|
222
223
|
{
|
|
223
224
|
data: getLegendData(series, hiddenSeries),
|
|
@@ -358,10 +359,9 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
358
359
|
};
|
|
359
360
|
}, [containerRef, handleOnResize]);
|
|
360
361
|
const chartHeight = getHeight();
|
|
361
|
-
return /* @__PURE__ */
|
|
362
|
+
return /* @__PURE__ */ jsx("div", { className: classes.chartOverride, ref: containerRef, children: /* @__PURE__ */ jsx("div", { style: { height: chartHeight }, children: /* @__PURE__ */ jsxs(
|
|
362
363
|
Chart,
|
|
363
364
|
{
|
|
364
|
-
key: `chart-${name}`,
|
|
365
365
|
containerComponent: cloneContainer(),
|
|
366
366
|
domain: getDomain(series, hiddenSeries, 1),
|
|
367
367
|
domainPadding: { x: [30, 30] },
|
|
@@ -373,15 +373,18 @@ const OptimizationsBreakdownChart = ({ baseHeight, name, limitData, padding, req
|
|
|
373
373
|
name,
|
|
374
374
|
padding: getPadding(),
|
|
375
375
|
width,
|
|
376
|
-
themeColor: ChartThemeColor.default
|
|
376
|
+
themeColor: ChartThemeColor.default,
|
|
377
|
+
children: [
|
|
378
|
+
/* @__PURE__ */ jsx(ChartAxis, { fixLabelOverlap: true }),
|
|
379
|
+
/* @__PURE__ */ jsx(ChartAxis, { dependentAxis: true, showGrid: true }),
|
|
380
|
+
getRequestChart(),
|
|
381
|
+
getLimitChart(),
|
|
382
|
+
getScatterChart(),
|
|
383
|
+
getUsageChart()
|
|
384
|
+
]
|
|
377
385
|
},
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
getRequestChart(),
|
|
381
|
-
getLimitChart(),
|
|
382
|
-
getScatterChart(),
|
|
383
|
-
getUsageChart()
|
|
384
|
-
)));
|
|
386
|
+
`chart-${name}`
|
|
387
|
+
) }) });
|
|
385
388
|
};
|
|
386
389
|
|
|
387
390
|
export { OptimizationsBreakdownChart, chartStyles };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OptimizationsBreakdownChart.esm.js","sources":["../../../../../../../../../../../../../src/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/OptimizationsBreakdownChart.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useIntl } from 'react-intl';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Chart,\n ChartArea,\n ChartAxis,\n ChartBoxPlot,\n ChartLegend,\n ChartLegendTooltip,\n ChartScatter,\n createContainer,\n getInteractiveLegendEvents,\n ChartThemeColor,\n} from '@patternfly/react-charts/victory';\nimport { chart_color_blue_100 } from '@patternfly/react-tokens/dist/js/chart_color_blue_100';\nimport { chart_color_blue_200 } from '@patternfly/react-tokens/dist/js/chart_color_blue_200';\nimport { chart_color_blue_400 } from '@patternfly/react-tokens/dist/js/chart_color_blue_400';\nimport { chart_color_red_orange_200 } from '@patternfly/react-tokens/dist/js/chart_color_red_orange_200';\nimport { ChartSeries } from './types/ChartSeries';\nimport {\n getDomain,\n getLegendData,\n getResizeObserver,\n initHiddenSeries,\n isDataAvailable,\n isSeriesHidden,\n} from './utils/chart-utils';\nimport messages from './i18n/messages';\nimport { unitsLookupKey } from './utils/format';\nimport { getDateRangeString } from './utils/chart-datum';\n\nconst useOptimizationsBreakdownChartStyles = makeStyles(() => ({\n chartOverride: {\n '& > div > div > svg': {\n overflow: 'visible',\n },\n },\n}));\n\nexport const chartStyles = {\n limit: {\n fill: 'none',\n },\n limitColorScale: [chart_color_red_orange_200.value],\n request: {\n fill: 'none',\n },\n requestColorScale: [chart_color_blue_400.value],\n usageColorScale: [chart_color_blue_100.value, chart_color_blue_200.value],\n};\n\ninterface OptimizationsBreakdownChartOwnProps {\n baseHeight: number;\n limitData?: any;\n name?: string;\n padding?: any;\n requestData?: any;\n usageData?: any;\n}\n\ntype OptimizationsBreakdownChartProps = OptimizationsBreakdownChartOwnProps;\n\nconst OptimizationsBreakdownChart: React.FC<\n OptimizationsBreakdownChartProps\n> = ({ baseHeight, name, limitData, padding, requestData, usageData }) => {\n const [containerRef] = useState(React.createRef<HTMLDivElement>());\n const [cursorVoronoiContainer, setCursorVoronoiContainer] = useState<any>();\n const [extraHeight, setExtraHeight] = useState(0);\n const [hiddenSeries, setHiddenSeries] = useState(new Set<number>());\n const [series, setSeries] = useState<ChartSeries[]>();\n const [width, setWidth] = useState(0);\n\n const intl = useIntl();\n const classes = useOptimizationsBreakdownChartStyles();\n\n // Clone original container. See https://issues.redhat.com/browse/COST-762\n const cloneContainer = () => {\n const legendData = getLegendData(series, hiddenSeries, true);\n // Force extra space for line wrapping\n legendData?.push(\n {\n childName: 'usage',\n name: '',\n symbol: {\n fill: 'none',\n },\n },\n {\n childName: 'usage',\n name: '',\n symbol: {\n fill: 'none',\n },\n },\n );\n return cursorVoronoiContainer\n ? React.cloneElement(cursorVoronoiContainer, {\n disable: !isDataAvailable(series, hiddenSeries),\n labelComponent: (\n <ChartLegendTooltip\n legendData={legendData}\n title={datum => `${datum.x}`}\n />\n ),\n } as any)\n : undefined;\n };\n\n const getLimitChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'limit') {\n return (\n <ChartArea\n data={!hiddenSeries.has(index) ? serie.data : [{ y: null }]}\n interpolation=\"monotoneX\"\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getRequestChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'request') {\n return (\n <ChartArea\n data={!hiddenSeries.has(index) ? serie.data : [{ y: null }]}\n interpolation=\"monotoneX\"\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getScatterChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'scatter') {\n return (\n <ChartScatter\n data={!hiddenSeries.has(index - 1) ? serie.data : [{ y: null }]}\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getUsageChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'usage') {\n return (\n <ChartBoxPlot\n boxWidth={width < 475 ? 15 : undefined}\n data={!hiddenSeries.has(index) ? serie.data : [{ y: [null] }]}\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n // Returns groups of chart names associated with each data series\n const getChartNames = () => {\n const result: (string | string[] | undefined)[] = [];\n\n if (series) {\n series.forEach(serie => {\n // Each group of chart names are hidden / shown together\n if (serie.childName === 'usage') {\n result.push([serie.childName, 'scatter']);\n } else if (serie.childName !== 'scatter') {\n result.push(serie.childName);\n }\n });\n }\n return result as any;\n };\n\n const getPadding = useCallback(() => {\n return padding\n ? padding\n : {\n bottom: 75 + extraHeight, // Maintain chart aspect ratio\n left: 50,\n right: 50,\n top: 10,\n };\n }, [extraHeight, padding]);\n\n // Hide each data series individually\n const handleOnLegendClick = (index: number) => {\n const newHiddenSeries = initHiddenSeries(hiddenSeries, index);\n setHiddenSeries(newHiddenSeries);\n };\n\n // Returns CursorVoronoiContainer component\n const getCursorVoronoiContainer = useCallback(() => {\n // Note: Container order is important\n const CursorVoronoiContainer: any = createContainer('voronoi', 'cursor');\n\n const labelFormatter = (datum: {\n childName: string;\n _min: undefined;\n _max: undefined;\n _median: undefined;\n _q1: undefined;\n _q3: undefined;\n yVal: null;\n units: string;\n y: any[];\n }) => {\n const formatValue = (val: undefined | null) =>\n val !== undefined ? val : '';\n if (datum.childName === 'scatter') {\n return null;\n } else if (\n datum.childName === 'usage' &&\n (datum._min !== undefined ||\n datum._max !== undefined ||\n datum._median !== undefined ||\n datum._q1 !== undefined ||\n datum._q3 !== undefined ||\n datum.yVal !== null)\n ) {\n return intl.formatMessage(messages.chartUsageTooltip, {\n br: '\\n',\n min: formatValue(datum._min !== undefined ? datum._min : datum.yVal),\n max: formatValue(datum._max !== undefined ? datum._max : datum.yVal),\n median: formatValue(\n datum._median !== undefined ? datum._median : datum.yVal,\n ),\n q1: formatValue(datum._q1 !== undefined ? datum._q1 : datum.yVal),\n q3: formatValue(datum._q3 !== undefined ? datum._q3 : datum.yVal),\n units: intl.formatMessage(messages.units, {\n units: unitsLookupKey(datum.units),\n }),\n });\n }\n\n // With box plot, datum.y will be an array\n const yVal = Array.isArray(datum.y) ? datum.y[0] : datum.y;\n let units = datum.units;\n\n /**\n * The recommendations API intentionally omits CPU request and limit units when \"cores\".\n *\n * The yaml format for the resource units needs to adhere to the Kubernetes standard that is outlined here\n * https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n *\n * Example. \"45 millicores\" is represented as \"45m\", 64 MiB is represented as \"64Mi\",\n * 2.3 cores is represented as \"2.3\" (Note cores is not specified)\n */\n if (\n (datum.childName === 'limit' || datum.childName === 'request') &&\n datum.units === ''\n ) {\n units = unitsLookupKey('cores');\n }\n return yVal !== null\n ? intl.formatMessage(messages.valueUnits, {\n value: yVal,\n units: intl.formatMessage(messages.units, {\n units: unitsLookupKey(units),\n }),\n })\n : intl.formatMessage(messages.chartNoData);\n };\n\n return (\n <CursorVoronoiContainer\n cursorDimension=\"x\"\n labels={({ datum }: any) => labelFormatter(datum)}\n mouseFollowTooltips\n voronoiDimension=\"x\"\n voronoiPadding={getPadding()}\n />\n );\n }, [getPadding, intl]);\n\n // Returns onMouseOver, onMouseOut, and onClick events for the interactive legend\n const getEvents = () => {\n const result = getInteractiveLegendEvents({\n chartNames: getChartNames(),\n isHidden: index => isSeriesHidden(hiddenSeries, index),\n legendName: `${name}-legend`,\n onLegendClick: props => handleOnLegendClick(props.index),\n });\n return result;\n };\n\n const getHeight = () => {\n return baseHeight + extraHeight;\n };\n\n const getLegend = () => {\n return (\n <ChartLegend\n data={getLegendData(series, hiddenSeries)}\n gutter={20}\n name={`${name}-legend`}\n y={320}\n />\n );\n };\n\n const handleLegendAllowWrap = (value: number) => {\n if (value !== extraHeight) {\n setExtraHeight(value);\n }\n };\n\n const handleOnResize = useCallback(() => {\n const { clientWidth = 0 } = containerRef.current || {};\n\n if (clientWidth !== width) {\n setWidth(clientWidth);\n }\n }, [containerRef, width]);\n\n const initDatum = useCallback(() => {\n // Show all legends, regardless of data size\n\n const newSeries: ChartSeries[] = [];\n if (requestData && requestData.length) {\n newSeries.push({\n childName: 'request',\n data: requestData,\n legendItem: {\n name: getDateRangeString(\n requestData,\n messages.recommendedRequest,\n true,\n ),\n symbol: {\n fill: chartStyles.requestColorScale[0],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.request),\n },\n style: {\n data: {\n ...chartStyles.request,\n stroke: chartStyles.requestColorScale[0],\n },\n },\n });\n }\n if (limitData && limitData.length) {\n newSeries.push({\n childName: 'limit',\n data: limitData,\n legendItem: {\n name: getDateRangeString(limitData, messages.recommendedLimit, true),\n symbol: {\n fill: chartStyles.limitColorScale[0],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.limit),\n },\n style: {\n data: {\n ...chartStyles.limit,\n stroke: chartStyles.limitColorScale[0],\n },\n },\n });\n }\n if (usageData && usageData.length) {\n const boxPlotData: any[] = [];\n usageData.map((datum: any) => {\n if (datum.y.every((val: any, _i: any, arr: any[]) => val === arr[0])) {\n boxPlotData.push({\n ...datum,\n yVal: datum.y[0],\n y: [null],\n });\n } else {\n boxPlotData.push(datum);\n }\n });\n newSeries.push({\n childName: 'usage',\n data: boxPlotData as any,\n legendItem: {\n name: getDateRangeString(usageData, messages.actualUsage),\n symbol: {\n fill: chartStyles.usageColorScale[1],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.usage),\n },\n style: {\n median: {\n stroke: chartStyles.usageColorScale[0],\n },\n q1: {\n fill: chartStyles.usageColorScale[1],\n },\n q3: {\n fill: chartStyles.usageColorScale[1],\n },\n } as any,\n });\n\n // Show dots in place of box plot when all values are equal\n const scatterData: any[] = [];\n usageData.map((datum: any) => {\n if (datum.y.every((val: any, _i: any, arr: any[]) => val === arr[0])) {\n scatterData.push({\n ...datum,\n y: datum.y[0],\n });\n } else {\n scatterData.push({\n ...datum,\n y: null,\n });\n }\n });\n newSeries.push({\n childName: 'scatter',\n data: scatterData as any,\n style: {\n data: { fill: chartStyles.usageColorScale[1] },\n } as any,\n });\n }\n setSeries(newSeries);\n setCursorVoronoiContainer(getCursorVoronoiContainer());\n setHiddenSeries(new Set());\n }, [getCursorVoronoiContainer, intl, limitData, requestData, usageData]);\n\n useMemo(() => {\n initDatum();\n }, [initDatum]);\n\n useEffect(() => {\n const unobserve = getResizeObserver(containerRef.current, handleOnResize);\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n }, [containerRef, handleOnResize]);\n\n const chartHeight = getHeight();\n\n return (\n <div className={classes.chartOverride} ref={containerRef}>\n <div style={{ height: chartHeight }}>\n <Chart\n key={`chart-${name}`}\n containerComponent={cloneContainer()}\n domain={getDomain(series, hiddenSeries, 1)}\n domainPadding={{ x: [30, 30] }}\n events={getEvents()}\n height={chartHeight}\n legendAllowWrap={handleLegendAllowWrap}\n legendComponent={getLegend()}\n legendPosition=\"bottom\"\n name={name}\n padding={getPadding()}\n width={width}\n // PatternFly will handle theming automatically when pf-v6-theme-dark is applied\n themeColor={ChartThemeColor.default}\n >\n <ChartAxis fixLabelOverlap />\n <ChartAxis dependentAxis showGrid />\n {getRequestChart()}\n {getLimitChart()}\n {getScatterChart()}\n {getUsageChart()}\n </Chart>\n </div>\n </div>\n );\n};\n\nexport { OptimizationsBreakdownChart };\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OptimizationsBreakdownChart.esm.js","sources":["../../../../../../../../../../../../../src/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/intl-breakdown-chart/components/optimizations-breakdown-chart/components/optimizations-breakdown-chart/OptimizationsBreakdownChart.tsx"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n default as React,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { useIntl } from 'react-intl';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n Chart,\n ChartArea,\n ChartAxis,\n ChartBoxPlot,\n ChartLegend,\n ChartLegendTooltip,\n ChartScatter,\n createContainer,\n getInteractiveLegendEvents,\n ChartThemeColor,\n} from '@patternfly/react-charts/victory';\nimport { chart_color_blue_100 } from '@patternfly/react-tokens/dist/js/chart_color_blue_100';\nimport { chart_color_blue_200 } from '@patternfly/react-tokens/dist/js/chart_color_blue_200';\nimport { chart_color_blue_400 } from '@patternfly/react-tokens/dist/js/chart_color_blue_400';\nimport { chart_color_red_orange_200 } from '@patternfly/react-tokens/dist/js/chart_color_red_orange_200';\nimport { ChartSeries } from './types/ChartSeries';\nimport {\n getDomain,\n getLegendData,\n getResizeObserver,\n initHiddenSeries,\n isDataAvailable,\n isSeriesHidden,\n} from './utils/chart-utils';\nimport messages from './i18n/messages';\nimport { unitsLookupKey } from './utils/format';\nimport { getDateRangeString } from './utils/chart-datum';\n\nconst useOptimizationsBreakdownChartStyles = makeStyles(() => ({\n chartOverride: {\n '& > div > div > svg': {\n overflow: 'visible',\n },\n },\n}));\n\nexport const chartStyles = {\n limit: {\n fill: 'none',\n },\n limitColorScale: [chart_color_red_orange_200.value],\n request: {\n fill: 'none',\n },\n requestColorScale: [chart_color_blue_400.value],\n usageColorScale: [chart_color_blue_100.value, chart_color_blue_200.value],\n};\n\ninterface OptimizationsBreakdownChartOwnProps {\n baseHeight: number;\n limitData?: any;\n name?: string;\n padding?: any;\n requestData?: any;\n usageData?: any;\n}\n\ntype OptimizationsBreakdownChartProps = OptimizationsBreakdownChartOwnProps;\n\nconst OptimizationsBreakdownChart: React.FC<\n OptimizationsBreakdownChartProps\n> = ({ baseHeight, name, limitData, padding, requestData, usageData }) => {\n const [containerRef] = useState(React.createRef<HTMLDivElement>());\n const [cursorVoronoiContainer, setCursorVoronoiContainer] = useState<any>();\n const [extraHeight, setExtraHeight] = useState(0);\n const [hiddenSeries, setHiddenSeries] = useState(new Set<number>());\n const [series, setSeries] = useState<ChartSeries[]>();\n const [width, setWidth] = useState(0);\n\n const intl = useIntl();\n const classes = useOptimizationsBreakdownChartStyles();\n\n // Clone original container. See https://issues.redhat.com/browse/COST-762\n const cloneContainer = () => {\n const legendData = getLegendData(series, hiddenSeries, true);\n // Force extra space for line wrapping\n legendData?.push(\n {\n childName: 'usage',\n name: '',\n symbol: {\n fill: 'none',\n },\n },\n {\n childName: 'usage',\n name: '',\n symbol: {\n fill: 'none',\n },\n },\n );\n return cursorVoronoiContainer\n ? React.cloneElement(cursorVoronoiContainer, {\n disable: !isDataAvailable(series, hiddenSeries),\n labelComponent: (\n <ChartLegendTooltip\n legendData={legendData}\n title={datum => `${datum.x}`}\n />\n ),\n } as any)\n : undefined;\n };\n\n const getLimitChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'limit') {\n return (\n <ChartArea\n data={!hiddenSeries.has(index) ? serie.data : [{ y: null }]}\n interpolation=\"monotoneX\"\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getRequestChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'request') {\n return (\n <ChartArea\n data={!hiddenSeries.has(index) ? serie.data : [{ y: null }]}\n interpolation=\"monotoneX\"\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getScatterChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'scatter') {\n return (\n <ChartScatter\n data={!hiddenSeries.has(index - 1) ? serie.data : [{ y: null }]}\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n const getUsageChart = () => {\n return series?.map((serie, index) => {\n if (serie.childName === 'usage') {\n return (\n <ChartBoxPlot\n boxWidth={width < 475 ? 15 : undefined}\n data={!hiddenSeries.has(index) ? serie.data : [{ y: [null] }]}\n key={serie.childName}\n name={serie.childName}\n style={serie.style}\n />\n );\n }\n return null;\n });\n };\n\n // Returns groups of chart names associated with each data series\n const getChartNames = () => {\n const result: (string | string[] | undefined)[] = [];\n\n if (series) {\n series.forEach(serie => {\n // Each group of chart names are hidden / shown together\n if (serie.childName === 'usage') {\n result.push([serie.childName, 'scatter']);\n } else if (serie.childName !== 'scatter') {\n result.push(serie.childName);\n }\n });\n }\n return result as any;\n };\n\n const getPadding = useCallback(() => {\n return padding\n ? padding\n : {\n bottom: 75 + extraHeight, // Maintain chart aspect ratio\n left: 50,\n right: 50,\n top: 10,\n };\n }, [extraHeight, padding]);\n\n // Hide each data series individually\n const handleOnLegendClick = (index: number) => {\n const newHiddenSeries = initHiddenSeries(hiddenSeries, index);\n setHiddenSeries(newHiddenSeries);\n };\n\n // Returns CursorVoronoiContainer component\n const getCursorVoronoiContainer = useCallback(() => {\n // Note: Container order is important\n const CursorVoronoiContainer: any = createContainer('voronoi', 'cursor');\n\n const labelFormatter = (datum: {\n childName: string;\n _min: undefined;\n _max: undefined;\n _median: undefined;\n _q1: undefined;\n _q3: undefined;\n yVal: null;\n units: string;\n y: any[];\n }) => {\n const formatValue = (val: undefined | null) =>\n val !== undefined ? val : '';\n if (datum.childName === 'scatter') {\n return null;\n } else if (\n datum.childName === 'usage' &&\n (datum._min !== undefined ||\n datum._max !== undefined ||\n datum._median !== undefined ||\n datum._q1 !== undefined ||\n datum._q3 !== undefined ||\n datum.yVal !== null)\n ) {\n return intl.formatMessage(messages.chartUsageTooltip, {\n br: '\\n',\n min: formatValue(datum._min !== undefined ? datum._min : datum.yVal),\n max: formatValue(datum._max !== undefined ? datum._max : datum.yVal),\n median: formatValue(\n datum._median !== undefined ? datum._median : datum.yVal,\n ),\n q1: formatValue(datum._q1 !== undefined ? datum._q1 : datum.yVal),\n q3: formatValue(datum._q3 !== undefined ? datum._q3 : datum.yVal),\n units: intl.formatMessage(messages.units, {\n units: unitsLookupKey(datum.units),\n }),\n });\n }\n\n // With box plot, datum.y will be an array\n const yVal = Array.isArray(datum.y) ? datum.y[0] : datum.y;\n let units = datum.units;\n\n /**\n * The recommendations API intentionally omits CPU request and limit units when \"cores\".\n *\n * The yaml format for the resource units needs to adhere to the Kubernetes standard that is outlined here\n * https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/\n *\n * Example. \"45 millicores\" is represented as \"45m\", 64 MiB is represented as \"64Mi\",\n * 2.3 cores is represented as \"2.3\" (Note cores is not specified)\n */\n if (\n (datum.childName === 'limit' || datum.childName === 'request') &&\n datum.units === ''\n ) {\n units = unitsLookupKey('cores');\n }\n return yVal !== null\n ? intl.formatMessage(messages.valueUnits, {\n value: yVal,\n units: intl.formatMessage(messages.units, {\n units: unitsLookupKey(units),\n }),\n })\n : intl.formatMessage(messages.chartNoData);\n };\n\n return (\n <CursorVoronoiContainer\n cursorDimension=\"x\"\n labels={({ datum }: any) => labelFormatter(datum)}\n mouseFollowTooltips\n voronoiDimension=\"x\"\n voronoiPadding={getPadding()}\n />\n );\n }, [getPadding, intl]);\n\n // Returns onMouseOver, onMouseOut, and onClick events for the interactive legend\n const getEvents = () => {\n const result = getInteractiveLegendEvents({\n chartNames: getChartNames(),\n isHidden: index => isSeriesHidden(hiddenSeries, index),\n legendName: `${name}-legend`,\n onLegendClick: props => handleOnLegendClick(props.index),\n });\n return result;\n };\n\n const getHeight = () => {\n return baseHeight + extraHeight;\n };\n\n const getLegend = () => {\n return (\n <ChartLegend\n data={getLegendData(series, hiddenSeries)}\n gutter={20}\n name={`${name}-legend`}\n y={320}\n />\n );\n };\n\n const handleLegendAllowWrap = (value: number) => {\n if (value !== extraHeight) {\n setExtraHeight(value);\n }\n };\n\n const handleOnResize = useCallback(() => {\n const { clientWidth = 0 } = containerRef.current || {};\n\n if (clientWidth !== width) {\n setWidth(clientWidth);\n }\n }, [containerRef, width]);\n\n const initDatum = useCallback(() => {\n // Show all legends, regardless of data size\n\n const newSeries: ChartSeries[] = [];\n if (requestData && requestData.length) {\n newSeries.push({\n childName: 'request',\n data: requestData,\n legendItem: {\n name: getDateRangeString(\n requestData,\n messages.recommendedRequest,\n true,\n ),\n symbol: {\n fill: chartStyles.requestColorScale[0],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.request),\n },\n style: {\n data: {\n ...chartStyles.request,\n stroke: chartStyles.requestColorScale[0],\n },\n },\n });\n }\n if (limitData && limitData.length) {\n newSeries.push({\n childName: 'limit',\n data: limitData,\n legendItem: {\n name: getDateRangeString(limitData, messages.recommendedLimit, true),\n symbol: {\n fill: chartStyles.limitColorScale[0],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.limit),\n },\n style: {\n data: {\n ...chartStyles.limit,\n stroke: chartStyles.limitColorScale[0],\n },\n },\n });\n }\n if (usageData && usageData.length) {\n const boxPlotData: any[] = [];\n usageData.map((datum: any) => {\n if (datum.y.every((val: any, _i: any, arr: any[]) => val === arr[0])) {\n boxPlotData.push({\n ...datum,\n yVal: datum.y[0],\n y: [null],\n });\n } else {\n boxPlotData.push(datum);\n }\n });\n newSeries.push({\n childName: 'usage',\n data: boxPlotData as any,\n legendItem: {\n name: getDateRangeString(usageData, messages.actualUsage),\n symbol: {\n fill: chartStyles.usageColorScale[1],\n type: 'square',\n },\n tooltip: intl.formatMessage(messages.usage),\n },\n style: {\n median: {\n stroke: chartStyles.usageColorScale[0],\n },\n q1: {\n fill: chartStyles.usageColorScale[1],\n },\n q3: {\n fill: chartStyles.usageColorScale[1],\n },\n } as any,\n });\n\n // Show dots in place of box plot when all values are equal\n const scatterData: any[] = [];\n usageData.map((datum: any) => {\n if (datum.y.every((val: any, _i: any, arr: any[]) => val === arr[0])) {\n scatterData.push({\n ...datum,\n y: datum.y[0],\n });\n } else {\n scatterData.push({\n ...datum,\n y: null,\n });\n }\n });\n newSeries.push({\n childName: 'scatter',\n data: scatterData as any,\n style: {\n data: { fill: chartStyles.usageColorScale[1] },\n } as any,\n });\n }\n setSeries(newSeries);\n setCursorVoronoiContainer(getCursorVoronoiContainer());\n setHiddenSeries(new Set());\n }, [getCursorVoronoiContainer, intl, limitData, requestData, usageData]);\n\n useMemo(() => {\n initDatum();\n }, [initDatum]);\n\n useEffect(() => {\n const unobserve = getResizeObserver(containerRef.current, handleOnResize);\n return () => {\n if (unobserve) {\n unobserve();\n }\n };\n }, [containerRef, handleOnResize]);\n\n const chartHeight = getHeight();\n\n return (\n <div className={classes.chartOverride} ref={containerRef}>\n <div style={{ height: chartHeight }}>\n <Chart\n key={`chart-${name}`}\n containerComponent={cloneContainer()}\n domain={getDomain(series, hiddenSeries, 1)}\n domainPadding={{ x: [30, 30] }}\n events={getEvents()}\n height={chartHeight}\n legendAllowWrap={handleLegendAllowWrap}\n legendComponent={getLegend()}\n legendPosition=\"bottom\"\n name={name}\n padding={getPadding()}\n width={width}\n // PatternFly will handle theming automatically when pf-v6-theme-dark is applied\n themeColor={ChartThemeColor.default}\n >\n <ChartAxis fixLabelOverlap />\n <ChartAxis dependentAxis showGrid />\n {getRequestChart()}\n {getLimitChart()}\n {getScatterChart()}\n {getUsageChart()}\n </Chart>\n </div>\n </div>\n );\n};\n\nexport { OptimizationsBreakdownChart };\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/plugin-cost-management",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"backstage": {
|
|
5
5
|
"pluginId": "cost-management",
|
|
6
6
|
"pluginPackages": [
|
|
@@ -12,18 +12,18 @@
|
|
|
12
12
|
},
|
|
13
13
|
"configSchema": "config.schema.json",
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@backstage/core-components": "^0.18.
|
|
16
|
-
"@backstage/core-plugin-api": "^1.12.
|
|
17
|
-
"@backstage/plugin-permission-common": "^0.9.
|
|
18
|
-
"@backstage/plugin-permission-react": "^0.4
|
|
19
|
-
"@backstage/theme": "^0.7.
|
|
15
|
+
"@backstage/core-components": "^0.18.13",
|
|
16
|
+
"@backstage/core-plugin-api": "^1.12.9",
|
|
17
|
+
"@backstage/plugin-permission-common": "^0.9.10",
|
|
18
|
+
"@backstage/plugin-permission-react": "^0.5.4",
|
|
19
|
+
"@backstage/theme": "^0.7.3",
|
|
20
20
|
"@material-table/core": "^3.1.0",
|
|
21
21
|
"@material-ui/core": "^4.12.2",
|
|
22
22
|
"@material-ui/icons": "^4.9.1",
|
|
23
23
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
24
24
|
"@patternfly/react-charts": "^8.3.0",
|
|
25
25
|
"@patternfly/react-tokens": "^6.1.0",
|
|
26
|
-
"@red-hat-developer-hub/plugin-cost-management-common": "^2.
|
|
26
|
+
"@red-hat-developer-hub/plugin-cost-management-common": "^2.3.0",
|
|
27
27
|
"date-fns": "^3.6.0",
|
|
28
28
|
"lodash": "^4.18.1",
|
|
29
29
|
"react-intl": "^6.6.8",
|
|
@@ -46,16 +46,16 @@
|
|
|
46
46
|
"yaml": "^2.4.5"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@backstage/cli": "^0.36.
|
|
50
|
-
"@backstage/core-app-api": "^1.
|
|
51
|
-
"@backstage/dev-utils": "^1.1.
|
|
52
|
-
"@backstage/plugin-search-react": "^1.11.
|
|
53
|
-
"@backstage/test-utils": "^1.7.
|
|
49
|
+
"@backstage/cli": "^0.36.5",
|
|
50
|
+
"@backstage/core-app-api": "^1.20.4",
|
|
51
|
+
"@backstage/dev-utils": "^1.1.26",
|
|
52
|
+
"@backstage/plugin-search-react": "^1.11.7",
|
|
53
|
+
"@backstage/test-utils": "^1.7.21",
|
|
54
54
|
"@testing-library/dom": "^10.0.0",
|
|
55
55
|
"@testing-library/jest-dom": "^6.0.0",
|
|
56
56
|
"@testing-library/react": "^16.0.0",
|
|
57
57
|
"@testing-library/user-event": "^14.0.0",
|
|
58
|
-
"msw": "^2.
|
|
58
|
+
"msw": "^2.15.0",
|
|
59
59
|
"react": "^18.3.1",
|
|
60
60
|
"react-dom": "^18.3.1",
|
|
61
61
|
"react-router-dom": "^6.30.2"
|