@red-hat-developer-hub/plugin-cost-management 2.0.3-rc.4 → 2.2.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.
Files changed (50) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +1 -1
  3. package/app-config.dynamic.yaml +2 -2
  4. package/dist/Router.esm.js.map +1 -1
  5. package/dist/apis.esm.js.map +1 -1
  6. package/dist/components/BasePage.esm.js.map +1 -1
  7. package/dist/components/InfoCardTitle.esm.js.map +1 -1
  8. package/dist/components/PageLayout.esm.js.map +1 -1
  9. package/dist/components/filtersStyles.esm.js.map +1 -1
  10. package/dist/components/icon/AnalyticsIcon.esm.js.map +1 -1
  11. package/dist/components/icon/AnalyticsIconFilled.esm.js.map +1 -1
  12. package/dist/components/icon/AnalyticsIconOutlined.esm.js.map +1 -1
  13. package/dist/components/icon/CostManagementIcon.esm.js.map +1 -1
  14. package/dist/components/icon/CostManagementIconFilled.esm.js.map +1 -1
  15. package/dist/components/icon/CostManagementIconOutlined.esm.js.map +1 -1
  16. package/dist/constants/currencies.esm.js.map +1 -1
  17. package/dist/hooks/usePatternFlyTheme.esm.js.map +1 -1
  18. package/dist/hooks/useThemeBackgroundColor.esm.js.map +1 -1
  19. package/dist/index.d.ts +2 -2
  20. package/dist/pages/openshift/OpenShiftPage.esm.js.map +1 -1
  21. package/dist/pages/openshift/components/AutocompleteComponent.esm.js.map +1 -1
  22. package/dist/pages/openshift/components/DownloadIconButton.esm.js.map +1 -1
  23. package/dist/pages/openshift/components/Filters.esm.js.map +1 -1
  24. package/dist/pages/openshift/components/PageHeader.esm.js.map +1 -1
  25. package/dist/pages/openshift/components/SelectComponent.esm.js.map +1 -1
  26. package/dist/pages/openshift/components/TableToolbar.esm.js.map +1 -1
  27. package/dist/pages/optimizations/OptimizationsPage.esm.js.map +1 -1
  28. package/dist/pages/optimizations/components/ComboBox.esm.js +8 -12
  29. package/dist/pages/optimizations/components/ComboBox.esm.js.map +1 -1
  30. package/dist/pages/optimizations/components/Filters.esm.js.map +1 -1
  31. package/dist/pages/optimizations/components/TableToolbar.esm.js.map +1 -1
  32. package/dist/pages/optimizations-breakdown/OptimizationsBreakdownPage.esm.js.map +1 -1
  33. package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/OptimizationEngineTab.esm.js.map +1 -1
  34. package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/CodeInfoCard.esm.js.map +1 -1
  35. package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/ContainerInfoCard.esm.js.map +1 -1
  36. package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/ChartInfoCard.esm.js.map +1 -1
  37. package/dist/pages/optimizations-breakdown/components/optimization-engine-tab/components/chart-info-card/components/IntlBreakdownChart.esm.js.map +1 -1
  38. 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
  39. 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/i18n/intl.esm.js.map +1 -1
  40. 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/i18n/messages.esm.js.map +1 -1
  41. 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/utils/chart-data-format.esm.js.map +1 -1
  42. 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/utils/chart-datum.esm.js.map +1 -1
  43. 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/utils/chart-utils.esm.js.map +1 -1
  44. 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/utils/format.esm.js.map +1 -1
  45. package/dist/pages/optimizations-breakdown/models/ChartEnums.esm.js.map +1 -1
  46. package/dist/pages/optimizations-breakdown/models/YamlCodeData.esm.js.map +1 -1
  47. package/dist/plugin.esm.js.map +1 -1
  48. package/dist/routes.esm.js.map +1 -1
  49. package/dist/utils/dates.esm.js.map +1 -1
  50. package/package.json +19 -20
@@ -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 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 +1 @@
1
- {"version":3,"file":"intl.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/i18n/intl.ts"],"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 { createIntl, createIntlCache } from 'react-intl';\n\n// eslint-disable-next-line no-restricted-imports\nimport messages from './data.json';\n\nconst locale = window.navigator.language.split(/[-_]/)[0] || 'en';\nexport const getLocale = () => {\n return locale;\n};\n\nconst cache = createIntlCache();\n\nconst intl = createIntl(\n {\n defaultLocale: 'en',\n locale,\n // eslint-disable-next-line no-console\n onError: console.log,\n messages: messages.en,\n },\n cache,\n);\n\nexport default intl;\n"],"names":["messages"],"mappings":";;;AAqBA,MAAM,MAAA,GAAS,OAAO,SAAU,CAAA,QAAA,CAAS,MAAM,MAAM,CAAA,CAAE,CAAC,CAAK,IAAA,IAAA;AAK7D,MAAM,QAAQ,eAAgB,EAAA;AAE9B,MAAM,IAAO,GAAA,UAAA;AAAA,EACX;AAAA,IACE,aAAe,EAAA,IAAA;AAAA,IACf,MAAA;AAAA;AAAA,IAEA,SAAS,OAAQ,CAAA,GAAA;AAAA,IACjB,UAAUA,YAAS,CAAA;AAAA,GACrB;AAAA,EACA;AACF;;;;"}
1
+ {"version":3,"file":"intl.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/i18n/intl.ts"],"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 { createIntl, createIntlCache } from 'react-intl';\n\n// eslint-disable-next-line no-restricted-imports\nimport messages from './data.json';\n\nconst locale = window.navigator.language.split(/[-_]/)[0] || 'en';\nexport const getLocale = () => {\n return locale;\n};\n\nconst cache = createIntlCache();\n\nconst intl = createIntl(\n {\n defaultLocale: 'en',\n locale,\n // eslint-disable-next-line no-console\n onError: console.log,\n messages: messages.en,\n },\n cache,\n);\n\nexport default intl;\n"],"names":["messages"],"mappings":";;;AAqBA,MAAM,MAAA,GAAS,OAAO,SAAA,CAAU,QAAA,CAAS,MAAM,MAAM,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAK7D,MAAM,QAAQ,eAAA,EAAgB;AAE9B,MAAM,IAAA,GAAO,UAAA;AAAA,EACX;AAAA,IACE,aAAA,EAAe,IAAA;AAAA,IACf,MAAA;AAAA;AAAA,IAEA,SAAS,OAAA,CAAQ,GAAA;AAAA,IACjB,UAAUA,YAAA,CAAS;AAAA,GACrB;AAAA,EACA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.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/i18n/messages.ts"],"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 { defineMessages } from 'react-intl';\n\nexport default defineMessages({\n chartNoData: {\n defaultMessage: 'no data',\n description: 'no data',\n id: 'chartNoData',\n },\n chartCostForecastConeTooltip: {\n defaultMessage: '{value0} - {value1}',\n description: 'Cost forecast confidence min/max tooltip',\n id: 'chartCostForecastConeTooltip',\n },\n currencyAbbreviations: {\n defaultMessage:\n '{symbol, select, ' +\n 'billion {{value} B} ' +\n 'million {{value} M} ' +\n 'quadrillion {{value} q} ' +\n 'thousand {{value} K} ' +\n 'trillion {{value} t} ' +\n 'other {}}',\n description: 'str.match(/([\\\\D]*)([\\\\d.,]+)([\\\\D]*)/)',\n id: 'currencyAbbreviations',\n },\n unitTooltips: {\n defaultMessage:\n '{units, select, ' +\n 'byte_ms {{value} Byte-ms} ' +\n 'core_hours {{value} core-hours} ' +\n 'gb {{value} GB} ' +\n 'gb_hours {{value} GB-hours} ' +\n 'gb_mo {{value} GB-month} ' +\n 'gb_ms {{value} GB-ms} ' +\n 'gibibyte_month {{value} GiB-month} ' +\n 'hour {{value} hours} ' +\n 'hrs {{value} hours} ' +\n 'ms {{value} milliseconds} ' +\n 'vm_hours {{value} VM-hours} ' +\n 'other {{value}}}',\n description: 'return value and unit based on key: \"units\"',\n id: 'unitTooltips',\n },\n chartUsageTooltip: {\n defaultMessage:\n 'Min: {min} {units}, Max: {max} {units}{br}Median: {median} {units}{br}Q1: {q1} {units}, Q3: {q3} {units}',\n description:\n 'Min: {min} {units}, Max: {max} {units}{br}Median: {median} {units}{br}Q1: {q1} {units}, Q3: {q3} {units}',\n id: 'chartUsageTooltip',\n },\n units: {\n defaultMessage:\n '{units, select, ' +\n 'cores {cores} ' +\n 'ei {Ei} ' +\n 'eib {EiB} ' +\n 'gi {Gi} ' +\n 'gib {GiB} ' +\n 'ki {Ki} ' +\n 'kib {KiB} ' +\n 'mi {Mi} ' +\n 'mib {MiB} ' +\n 'm {m} ' +\n 'millicores {millicores} ' +\n 'other {}}',\n description: 'return the proper unit label based on key: \"units\"',\n id: 'units',\n },\n limit: {\n defaultMessage: 'Limit',\n description: 'Limit',\n id: 'limit',\n },\n recommendedLimit: {\n defaultMessage: 'Recommended limit ({dateRange})',\n description: 'Recommended limit (Jan 1-31)',\n id: 'recommendedLimit',\n },\n recommendedRequest: {\n defaultMessage: 'Recommended request ({dateRange})',\n description: 'Recommended request (Jan 1-31)',\n id: 'recommendedRequest',\n },\n request: {\n defaultMessage: 'Request',\n description: 'Request',\n id: 'request',\n },\n actualUsage: {\n defaultMessage: 'Actual usage ({dateRange})',\n description: 'Actual usage (Jan 1-31)',\n id: 'actualUsage',\n },\n usage: {\n defaultMessage: 'Usage',\n description: 'Usage',\n id: 'usage',\n },\n valueUnits: {\n defaultMessage: '{value} {units}',\n description: '{value} {units}',\n id: 'valueUnits',\n },\n});\n"],"names":[],"mappings":";;AAkBA,eAAe,cAAe,CAAA;AAAA,EAC5B,WAAa,EAAA;AAAA,IACX,cAAgB,EAAA,SAAA;AAAA,IAChB,WAAa,EAAA,SAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,4BAA8B,EAAA;AAAA,IAC5B,cAAgB,EAAA,qBAAA;AAAA,IAChB,WAAa,EAAA,0CAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,qBAAuB,EAAA;AAAA,IACrB,cACE,EAAA,sIAAA;AAAA,IAOF,WAAa,EAAA,yCAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,cACE,EAAA,yTAAA;AAAA,IAaF,WAAa,EAAA,6CAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,iBAAmB,EAAA;AAAA,IACjB,cACE,EAAA,0GAAA;AAAA,IACF,WACE,EAAA,0GAAA;AAAA,IACF,EAAI,EAAA;AAAA,GACN;AAAA,EACA,KAAO,EAAA;AAAA,IACL,cACE,EAAA,+IAAA;AAAA,IAaF,WAAa,EAAA,oDAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,KAAO,EAAA;AAAA,IACL,cAAgB,EAAA,OAAA;AAAA,IAChB,WAAa,EAAA,OAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,gBAAkB,EAAA;AAAA,IAChB,cAAgB,EAAA,iCAAA;AAAA,IAChB,WAAa,EAAA,8BAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,kBAAoB,EAAA;AAAA,IAClB,cAAgB,EAAA,mCAAA;AAAA,IAChB,WAAa,EAAA,gCAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,OAAS,EAAA;AAAA,IACP,cAAgB,EAAA,SAAA;AAAA,IAChB,WAAa,EAAA,SAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,WAAa,EAAA;AAAA,IACX,cAAgB,EAAA,4BAAA;AAAA,IAChB,WAAa,EAAA,yBAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,KAAO,EAAA;AAAA,IACL,cAAgB,EAAA,OAAA;AAAA,IAChB,WAAa,EAAA,OAAA;AAAA,IACb,EAAI,EAAA;AAAA,GACN;AAAA,EACA,UAAY,EAAA;AAAA,IACV,cAAgB,EAAA,iBAAA;AAAA,IAChB,WAAa,EAAA,iBAAA;AAAA,IACb,EAAI,EAAA;AAAA;AAER,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"messages.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/i18n/messages.ts"],"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 { defineMessages } from 'react-intl';\n\nexport default defineMessages({\n chartNoData: {\n defaultMessage: 'no data',\n description: 'no data',\n id: 'chartNoData',\n },\n chartCostForecastConeTooltip: {\n defaultMessage: '{value0} - {value1}',\n description: 'Cost forecast confidence min/max tooltip',\n id: 'chartCostForecastConeTooltip',\n },\n currencyAbbreviations: {\n defaultMessage:\n '{symbol, select, ' +\n 'billion {{value} B} ' +\n 'million {{value} M} ' +\n 'quadrillion {{value} q} ' +\n 'thousand {{value} K} ' +\n 'trillion {{value} t} ' +\n 'other {}}',\n description: 'str.match(/([\\\\D]*)([\\\\d.,]+)([\\\\D]*)/)',\n id: 'currencyAbbreviations',\n },\n unitTooltips: {\n defaultMessage:\n '{units, select, ' +\n 'byte_ms {{value} Byte-ms} ' +\n 'core_hours {{value} core-hours} ' +\n 'gb {{value} GB} ' +\n 'gb_hours {{value} GB-hours} ' +\n 'gb_mo {{value} GB-month} ' +\n 'gb_ms {{value} GB-ms} ' +\n 'gibibyte_month {{value} GiB-month} ' +\n 'hour {{value} hours} ' +\n 'hrs {{value} hours} ' +\n 'ms {{value} milliseconds} ' +\n 'vm_hours {{value} VM-hours} ' +\n 'other {{value}}}',\n description: 'return value and unit based on key: \"units\"',\n id: 'unitTooltips',\n },\n chartUsageTooltip: {\n defaultMessage:\n 'Min: {min} {units}, Max: {max} {units}{br}Median: {median} {units}{br}Q1: {q1} {units}, Q3: {q3} {units}',\n description:\n 'Min: {min} {units}, Max: {max} {units}{br}Median: {median} {units}{br}Q1: {q1} {units}, Q3: {q3} {units}',\n id: 'chartUsageTooltip',\n },\n units: {\n defaultMessage:\n '{units, select, ' +\n 'cores {cores} ' +\n 'ei {Ei} ' +\n 'eib {EiB} ' +\n 'gi {Gi} ' +\n 'gib {GiB} ' +\n 'ki {Ki} ' +\n 'kib {KiB} ' +\n 'mi {Mi} ' +\n 'mib {MiB} ' +\n 'm {m} ' +\n 'millicores {millicores} ' +\n 'other {}}',\n description: 'return the proper unit label based on key: \"units\"',\n id: 'units',\n },\n limit: {\n defaultMessage: 'Limit',\n description: 'Limit',\n id: 'limit',\n },\n recommendedLimit: {\n defaultMessage: 'Recommended limit ({dateRange})',\n description: 'Recommended limit (Jan 1-31)',\n id: 'recommendedLimit',\n },\n recommendedRequest: {\n defaultMessage: 'Recommended request ({dateRange})',\n description: 'Recommended request (Jan 1-31)',\n id: 'recommendedRequest',\n },\n request: {\n defaultMessage: 'Request',\n description: 'Request',\n id: 'request',\n },\n actualUsage: {\n defaultMessage: 'Actual usage ({dateRange})',\n description: 'Actual usage (Jan 1-31)',\n id: 'actualUsage',\n },\n usage: {\n defaultMessage: 'Usage',\n description: 'Usage',\n id: 'usage',\n },\n valueUnits: {\n defaultMessage: '{value} {units}',\n description: '{value} {units}',\n id: 'valueUnits',\n },\n});\n"],"names":[],"mappings":";;AAkBA,eAAe,cAAA,CAAe;AAAA,EAC5B,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB,SAAA;AAAA,IAChB,WAAA,EAAa,SAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,4BAAA,EAA8B;AAAA,IAC5B,cAAA,EAAgB,qBAAA;AAAA,IAChB,WAAA,EAAa,0CAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,cAAA,EACE,sIAAA;AAAA,IAOF,WAAA,EAAa,yCAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,cAAA,EACE,yTAAA;AAAA,IAaF,WAAA,EAAa,6CAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,cAAA,EACE,0GAAA;AAAA,IACF,WAAA,EACE,0GAAA;AAAA,IACF,EAAA,EAAI;AAAA,GACN;AAAA,EACA,KAAA,EAAO;AAAA,IACL,cAAA,EACE,+IAAA;AAAA,IAaF,WAAA,EAAa,oDAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,KAAA,EAAO;AAAA,IACL,cAAA,EAAgB,OAAA;AAAA,IAChB,WAAA,EAAa,OAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,cAAA,EAAgB,iCAAA;AAAA,IAChB,WAAA,EAAa,8BAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,kBAAA,EAAoB;AAAA,IAClB,cAAA,EAAgB,mCAAA;AAAA,IAChB,WAAA,EAAa,gCAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,OAAA,EAAS;AAAA,IACP,cAAA,EAAgB,SAAA;AAAA,IAChB,WAAA,EAAa,SAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,WAAA,EAAa;AAAA,IACX,cAAA,EAAgB,4BAAA;AAAA,IAChB,WAAA,EAAa,yBAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,KAAA,EAAO;AAAA,IACL,cAAA,EAAgB,OAAA;AAAA,IAChB,WAAA,EAAa,OAAA;AAAA,IACb,EAAA,EAAI;AAAA,GACN;AAAA,EACA,UAAA,EAAY;AAAA,IACV,cAAA,EAAgB,iBAAA;AAAA,IAChB,WAAA,EAAa,iBAAA;AAAA,IACb,EAAA,EAAI;AAAA;AAER,CAAC,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"chart-data-format.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/utils/chart-data-format.ts"],"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 LongTermRecommendationBoxPlots,\n MediumTermRecommendationBoxPlots,\n RecommendationBoxPlotsRecommendations,\n ShortTermRecommendationBoxPlots,\n} from '@red-hat-developer-hub/plugin-cost-management-common/models';\nimport {\n Interval,\n OptimizationType,\n RecommendationType,\n ResourceType,\n UsageType,\n} from '../../../../../../../../../../../models/ChartEnums';\nimport { format } from 'date-fns';\n\nexport const getRecommendationTerm = (\n interval: Interval,\n recommendations?: RecommendationBoxPlotsRecommendations,\n):\n | ShortTermRecommendationBoxPlots\n | MediumTermRecommendationBoxPlots\n | LongTermRecommendationBoxPlots => {\n let result;\n // eslint-disable-next-line default-case\n switch (interval) {\n case 'shortTerm':\n result = recommendations?.recommendationTerms?.shortTerm;\n break;\n case 'mediumTerm':\n result = recommendations?.recommendationTerms?.mediumTerm;\n break;\n case 'longTerm':\n result = recommendations?.recommendationTerms?.longTerm;\n break;\n }\n\n return result || {};\n};\n\nexport const createUsageDatum = (\n usageType: UsageType,\n currentInterval: Interval,\n recommendations?: RecommendationBoxPlotsRecommendations,\n) => {\n const datum = [];\n\n if (recommendations) {\n const term = getRecommendationTerm(currentInterval, recommendations);\n const plotsData = term?.plots?.plotsData || {};\n\n for (const key of Object.keys(plotsData)) {\n const data = plotsData?.[key]?.[usageType];\n const date = new Date(key);\n const xVal =\n currentInterval === 'shortTerm'\n ? format(date, 'kk:mm')\n : format(date, 'MMM d');\n datum.push({\n key,\n name: usageType,\n units: data?.format,\n x: xVal,\n y: data ? [data.min, data.median, data.max, data.q1, data.q3] : [null],\n });\n }\n }\n\n // Pad dates if plots_data is missing\n if (datum.length === 0 && recommendations?.monitoringEndTime) {\n if (currentInterval === 'shortTerm') {\n const today = new Date(recommendations?.monitoringEndTime);\n for (let hour = 24; hour > 0; hour -= 6) {\n today.setHours(today.getHours() - hour);\n datum.push({\n key: today.toDateString(),\n name: usageType,\n x: format(today, 'kk:mm'),\n y: [null],\n });\n }\n } else {\n for (let day = currentInterval === 'longTerm' ? 15 : 7; day > 0; day--) {\n const today = new Date(recommendations?.monitoringEndTime);\n today.setDate(today.getDate() - day);\n datum.push({\n key: today.toDateString(),\n name: usageType,\n x: format(today, 'MMM d'),\n y: [null],\n });\n }\n }\n }\n return datum;\n};\n\nexport const createRecommendationDatum = (\n currentInterval: Interval,\n usageDatum: any,\n recommendationType: RecommendationType,\n resourceType: ResourceType,\n optimizationType: OptimizationType,\n recommendations?: RecommendationBoxPlotsRecommendations,\n) => {\n const term = getRecommendationTerm(currentInterval, recommendations);\n const values =\n term?.recommendationEngines?.[optimizationType]?.config?.[resourceType]?.[\n recommendationType\n ];\n\n const datum: any[] = [];\n\n if (values) {\n usageDatum.forEach((data: any) => {\n datum.push({\n ...data,\n name: resourceType,\n y: values.amount,\n units: values.format,\n });\n });\n }\n\n return datum.length\n ? [\n {\n ...datum[0],\n key: undefined, // Don't use date here\n x: 0, // Extends threshold lines to chart edge\n },\n ...datum,\n {\n ...datum[0],\n key: undefined, // Don't use date here\n x: 100,\n },\n ]\n : [];\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-data-format.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/utils/chart-data-format.ts"],"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 LongTermRecommendationBoxPlots,\n MediumTermRecommendationBoxPlots,\n RecommendationBoxPlotsRecommendations,\n ShortTermRecommendationBoxPlots,\n} from '@red-hat-developer-hub/plugin-cost-management-common/models';\nimport {\n Interval,\n OptimizationType,\n RecommendationType,\n ResourceType,\n UsageType,\n} from '../../../../../../../../../../../models/ChartEnums';\nimport { format } from 'date-fns';\n\nexport const getRecommendationTerm = (\n interval: Interval,\n recommendations?: RecommendationBoxPlotsRecommendations,\n):\n | ShortTermRecommendationBoxPlots\n | MediumTermRecommendationBoxPlots\n | LongTermRecommendationBoxPlots => {\n let result;\n // eslint-disable-next-line default-case\n switch (interval) {\n case 'shortTerm':\n result = recommendations?.recommendationTerms?.shortTerm;\n break;\n case 'mediumTerm':\n result = recommendations?.recommendationTerms?.mediumTerm;\n break;\n case 'longTerm':\n result = recommendations?.recommendationTerms?.longTerm;\n break;\n }\n\n return result || {};\n};\n\nexport const createUsageDatum = (\n usageType: UsageType,\n currentInterval: Interval,\n recommendations?: RecommendationBoxPlotsRecommendations,\n) => {\n const datum = [];\n\n if (recommendations) {\n const term = getRecommendationTerm(currentInterval, recommendations);\n const plotsData = term?.plots?.plotsData || {};\n\n for (const key of Object.keys(plotsData)) {\n const data = plotsData?.[key]?.[usageType];\n const date = new Date(key);\n const xVal =\n currentInterval === 'shortTerm'\n ? format(date, 'kk:mm')\n : format(date, 'MMM d');\n datum.push({\n key,\n name: usageType,\n units: data?.format,\n x: xVal,\n y: data ? [data.min, data.median, data.max, data.q1, data.q3] : [null],\n });\n }\n }\n\n // Pad dates if plots_data is missing\n if (datum.length === 0 && recommendations?.monitoringEndTime) {\n if (currentInterval === 'shortTerm') {\n const today = new Date(recommendations?.monitoringEndTime);\n for (let hour = 24; hour > 0; hour -= 6) {\n today.setHours(today.getHours() - hour);\n datum.push({\n key: today.toDateString(),\n name: usageType,\n x: format(today, 'kk:mm'),\n y: [null],\n });\n }\n } else {\n for (let day = currentInterval === 'longTerm' ? 15 : 7; day > 0; day--) {\n const today = new Date(recommendations?.monitoringEndTime);\n today.setDate(today.getDate() - day);\n datum.push({\n key: today.toDateString(),\n name: usageType,\n x: format(today, 'MMM d'),\n y: [null],\n });\n }\n }\n }\n return datum;\n};\n\nexport const createRecommendationDatum = (\n currentInterval: Interval,\n usageDatum: any,\n recommendationType: RecommendationType,\n resourceType: ResourceType,\n optimizationType: OptimizationType,\n recommendations?: RecommendationBoxPlotsRecommendations,\n) => {\n const term = getRecommendationTerm(currentInterval, recommendations);\n const values =\n term?.recommendationEngines?.[optimizationType]?.config?.[resourceType]?.[\n recommendationType\n ];\n\n const datum: any[] = [];\n\n if (values) {\n usageDatum.forEach((data: any) => {\n datum.push({\n ...data,\n name: resourceType,\n y: values.amount,\n units: values.format,\n });\n });\n }\n\n return datum.length\n ? [\n {\n ...datum[0],\n key: undefined, // Don't use date here\n x: 0, // Extends threshold lines to chart edge\n },\n ...datum,\n {\n ...datum[0],\n key: undefined, // Don't use date here\n x: 100,\n },\n ]\n : [];\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chart-datum.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/utils/chart-datum.ts"],"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 type { MessageDescriptor } from '@formatjs/intl/src/types';\nimport { formatCurrency, unitsLookupKey } from './format';\nimport messages from '../i18n/messages';\nimport { intl } from '../i18n';\n\nexport interface FormatOptions {\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport interface ChartDatum {\n childName?: string;\n date?: string;\n key: string | number;\n name?: string | number;\n show?: boolean;\n tooltip?: string;\n units: string;\n x: string | number;\n y: number;\n y0?: number;\n}\n\nexport function getDatumDateRange(datums: ChartDatum[]): [Date, Date] {\n // Find the first populated (non-null) day\n let firstDay = 0;\n for (let i = firstDay; i < datums.length; i++) {\n if (datums[i]?.key && datums[i]?.y !== null) {\n firstDay = i;\n break;\n }\n }\n\n // Find the last populated (non-null) day\n let lastDay = datums.length - 1;\n for (let i = lastDay; i >= 0; i--) {\n if (datums[i]?.key && datums[i].y !== null) {\n lastDay = i;\n break;\n }\n }\n\n const start = new Date(datums[firstDay].key);\n const end = new Date(datums[lastDay].key);\n return [start, end];\n}\n\nexport function getDateRangeString(\n datums: ChartDatum[],\n key: MessageDescriptor,\n isSameDate: boolean = false,\n noDataKey: MessageDescriptor = messages.chartNoData,\n) {\n if (!(datums?.length && key)) {\n return intl.formatMessage(noDataKey);\n }\n\n const [start, end] = getDatumDateRange(datums);\n const dateRange = intl.formatDateTimeRange(isSameDate ? end : start, end, {\n day: 'numeric',\n month: 'short',\n });\n return intl.formatMessage(key, {\n dateRange,\n });\n}\n\nfunction getMinOrMaxY<F extends Math['max']>(\n datum: ChartDatum,\n minOrMaxFn: F,\n): number | null {\n let value: number | null;\n\n if (datum.y0 !== undefined) {\n value = minOrMaxFn(datum.y, datum.y0) as number;\n } else {\n if (Array.isArray(datum.y)) {\n if (datum.y[0] !== null) {\n value = minOrMaxFn(...datum.y);\n } else if ((datum as any).yVal) {\n // yVal still remains a mistery...\n // For boxplot, which is hidden via `datum.y[0] = null` when all values are equal\n value = (datum as any).yVal;\n } else {\n value = null;\n }\n } else {\n value = datum.y;\n }\n }\n\n return value;\n}\n\nexport function getMaxMinValues(datums: ChartDatum[]) {\n let max: number | null = null;\n let min: number | null = null;\n if (datums && datums.length) {\n datums.forEach(datum => {\n const maxY = getMinOrMaxY(datum, Math.max);\n const minY = getMinOrMaxY(datum, Math.min);\n\n if (maxY !== null && (max === null || maxY > max)) {\n max = maxY;\n }\n if (minY !== null && (min === null || minY < min)) {\n min = minY;\n }\n });\n }\n return { max, min };\n}\n\nexport function getTooltipContent(\n formatter: (arg0: number, arg1: string, arg2: FormatOptions) => any,\n) {\n return function labelFormatter(\n value: number,\n unit: string,\n options: FormatOptions = {},\n ) {\n const lookup = unitsLookupKey(unit);\n if (lookup) {\n return intl.formatMessage(messages.unitTooltips, {\n units: lookup,\n value: formatter(value, unit, options),\n });\n }\n return formatCurrency(value, unit, options);\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-datum.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/utils/chart-datum.ts"],"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 type { MessageDescriptor } from '@formatjs/intl/src/types';\nimport { formatCurrency, unitsLookupKey } from './format';\nimport messages from '../i18n/messages';\nimport { intl } from '../i18n';\n\nexport interface FormatOptions {\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport interface ChartDatum {\n childName?: string;\n date?: string;\n key: string | number;\n name?: string | number;\n show?: boolean;\n tooltip?: string;\n units: string;\n x: string | number;\n y: number;\n y0?: number;\n}\n\nexport function getDatumDateRange(datums: ChartDatum[]): [Date, Date] {\n // Find the first populated (non-null) day\n let firstDay = 0;\n for (let i = firstDay; i < datums.length; i++) {\n if (datums[i]?.key && datums[i]?.y !== null) {\n firstDay = i;\n break;\n }\n }\n\n // Find the last populated (non-null) day\n let lastDay = datums.length - 1;\n for (let i = lastDay; i >= 0; i--) {\n if (datums[i]?.key && datums[i].y !== null) {\n lastDay = i;\n break;\n }\n }\n\n const start = new Date(datums[firstDay].key);\n const end = new Date(datums[lastDay].key);\n return [start, end];\n}\n\nexport function getDateRangeString(\n datums: ChartDatum[],\n key: MessageDescriptor,\n isSameDate: boolean = false,\n noDataKey: MessageDescriptor = messages.chartNoData,\n) {\n if (!(datums?.length && key)) {\n return intl.formatMessage(noDataKey);\n }\n\n const [start, end] = getDatumDateRange(datums);\n const dateRange = intl.formatDateTimeRange(isSameDate ? end : start, end, {\n day: 'numeric',\n month: 'short',\n });\n return intl.formatMessage(key, {\n dateRange,\n });\n}\n\nfunction getMinOrMaxY<F extends Math['max']>(\n datum: ChartDatum,\n minOrMaxFn: F,\n): number | null {\n let value: number | null;\n\n if (datum.y0 !== undefined) {\n value = minOrMaxFn(datum.y, datum.y0) as number;\n } else {\n if (Array.isArray(datum.y)) {\n if (datum.y[0] !== null) {\n value = minOrMaxFn(...datum.y);\n } else if ((datum as any).yVal) {\n // yVal still remains a mistery...\n // For boxplot, which is hidden via `datum.y[0] = null` when all values are equal\n value = (datum as any).yVal;\n } else {\n value = null;\n }\n } else {\n value = datum.y;\n }\n }\n\n return value;\n}\n\nexport function getMaxMinValues(datums: ChartDatum[]) {\n let max: number | null = null;\n let min: number | null = null;\n if (datums && datums.length) {\n datums.forEach(datum => {\n const maxY = getMinOrMaxY(datum, Math.max);\n const minY = getMinOrMaxY(datum, Math.min);\n\n if (maxY !== null && (max === null || maxY > max)) {\n max = maxY;\n }\n if (minY !== null && (min === null || minY < min)) {\n min = minY;\n }\n });\n }\n return { max, min };\n}\n\nexport function getTooltipContent(\n formatter: (arg0: number, arg1: string, arg2: FormatOptions) => any,\n) {\n return function labelFormatter(\n value: number,\n unit: string,\n options: FormatOptions = {},\n ) {\n const lookup = unitsLookupKey(unit);\n if (lookup) {\n return intl.formatMessage(messages.unitTooltips, {\n units: lookup,\n value: formatter(value, unit, options),\n });\n }\n return formatCurrency(value, unit, options);\n };\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"chart-utils.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/utils/chart-utils.ts"],"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 { getInteractiveLegendItemStyles } from '@patternfly/react-charts/victory';\nimport { intl } from '../i18n';\nimport messages from '../i18n/messages';\nimport type { FormatOptions, Formatter } from './format';\nimport type { DomainTuple, VictoryStyleInterface } from 'victory-core';\n\nimport { getMaxMinValues, getTooltipContent } from './chart-datum';\n\nexport interface ChartData {\n childName?: string;\n units?: string;\n}\n\nexport interface ChartLegendItem {\n childName?: string;\n name?: string;\n symbol?: any;\n tooltip?: string;\n}\n\nexport interface ChartSeries {\n childName?: string;\n data?: [ChartData];\n legendItem?: ChartLegendItem;\n style?: VictoryStyleInterface;\n}\n\n// Returns groups of chart names associated with each data series\nexport const getChartNames = (series: ChartSeries[]) => {\n const result: (string | undefined)[] = [];\n\n if (series) {\n series.forEach(serie => {\n // Each group of chart names are hidden / shown together\n result.push(serie.childName);\n });\n }\n return result;\n};\n\n// Returns true if data series is hidden\nexport const isSeriesHidden = (hiddenSeries: Set<number>, index: number) => {\n return hiddenSeries.has(index);\n};\n\n// Note: A series may be grouped in order to be hidden / shown together\nexport const getDomain = (\n series: ChartSeries[] | undefined,\n hiddenSeries: Set<number>,\n groupedSeriesCount = 0,\n) => {\n const domain: { x?: DomainTuple; y?: DomainTuple } = { y: [0, 1] };\n let maxValue: number | null = null;\n let minValue: number | null = null;\n\n if (series) {\n // Don't use zero domain\n let maybeEmptyHiddenSeries = hiddenSeries;\n if (series.length - groupedSeriesCount === maybeEmptyHiddenSeries.size) {\n domain.x = [0, 1];\n maybeEmptyHiddenSeries = new Set();\n }\n series.forEach((s: any, index) => {\n if (\n !isSeriesHidden(maybeEmptyHiddenSeries, index) &&\n s.data &&\n s.data.length !== 0\n ) {\n const { max, min } = getMaxMinValues(s.data);\n if (max !== null && (maxValue === null || max > maxValue)) {\n maxValue = max;\n }\n if (min !== null && (minValue === null || min < minValue)) {\n minValue = min;\n }\n }\n });\n }\n\n if (maxValue && minValue) {\n const threshold = maxValue * 0.05;\n const max = maxValue > 0 ? Math.ceil(maxValue + threshold) : 0;\n const _min =\n minValue > 0 ? Math.max(0, Math.floor(minValue - threshold)) : 0;\n const min = _min > 0 ? _min : 0;\n\n if (max > 0) {\n domain.y = [min, max];\n }\n }\n\n return domain;\n};\n\n// Returns legend data styled per hiddenSeries\nexport const getLegendData = (\n series?: ChartSeries[],\n hiddenSeries?: Set<number>,\n tooltip: boolean = false,\n) => {\n if (!series) {\n return undefined;\n }\n\n const result: any = [];\n\n series.forEach((s, index) => {\n if (s.legendItem) {\n const data = {\n childName: s.childName,\n ...s.legendItem, // name property\n ...(tooltip && { name: s.legendItem.tooltip }), // Override name property for tooltip\n ...getInteractiveLegendItemStyles(hiddenSeries?.has(index)), // hidden styles\n };\n\n result.push(data);\n }\n });\n\n return result;\n};\n\n// Note: Forecast is expected to use both datum.y and datum.y0\nexport const getTooltipLabel = (\n datum: any,\n formatter: Formatter,\n formatOptions: FormatOptions,\n) => {\n const tooltipFormatter = getTooltipContent(formatter);\n const dy =\n datum.y !== undefined && datum.y !== null\n ? tooltipFormatter(datum.y, datum.units, formatOptions)\n : undefined;\n const dy0 =\n datum.y0 !== undefined && datum.y0 !== null\n ? tooltipFormatter(datum.y0, datum.units, formatOptions)\n : undefined;\n\n if (dy !== undefined && dy0 !== undefined) {\n return intl.formatMessage(messages.chartCostForecastConeTooltip, {\n value0: dy0,\n value1: dy,\n });\n }\n return dy !== undefined ? dy : intl.formatMessage(messages.chartNoData);\n};\n\nexport const getResizeObserver = (\n containerRef: HTMLDivElement | null,\n handleResize: () => void,\n) => {\n const containerElement = containerRef;\n const { ResizeObserver } = window as any;\n let _resizeObserver: any;\n\n if (containerElement && ResizeObserver) {\n const resizeObserver = new ResizeObserver((entries: string | any[]) => {\n // We wrap it in requestAnimationFrame to avoid this error - ResizeObserver loop limit exceeded\n window.requestAnimationFrame(() => {\n if (!Array.isArray(entries) || !entries.length) {\n return;\n }\n handleResize();\n });\n });\n resizeObserver.observe(containerElement);\n _resizeObserver = () => resizeObserver.unobserve(containerElement);\n } else {\n handleResize();\n window.addEventListener('resize', handleResize);\n _resizeObserver = () => window.removeEventListener('resize', handleResize);\n }\n\n return () => {\n if (_resizeObserver) {\n _resizeObserver();\n }\n };\n};\n\nexport const initHiddenSeries = (hiddenSeries: Set<number>, index: number) => {\n const result = new Set(hiddenSeries);\n if (!result.delete(index)) {\n result.add(index);\n }\n return result;\n};\n\n// Returns true if at least one data series is available\nexport const isDataAvailable = (\n series?: ChartSeries[],\n hiddenSeries?: Set<number>,\n) => {\n const unavailable = []; // API data may not be available (e.g., on 1st of month)\n\n if (series) {\n series.forEach((s: any, index) => {\n if (\n (hiddenSeries && isSeriesHidden(hiddenSeries, index)) ||\n (s.data && s.data.length === 0)\n ) {\n unavailable.push(index);\n }\n });\n }\n return unavailable.length !== (series ? series.length : 0);\n};\n\n// Returns true if data series is hidden\nexport const isDataHidden = (\n series: ChartSeries[],\n hiddenSeries: Set<number>,\n data: any,\n) => {\n if (data && data.length) {\n for (const key of hiddenSeries.keys()) {\n let dataChildName;\n let serieChildName;\n\n for (const item of data) {\n if (item.childName) {\n dataChildName = item.childName;\n break;\n }\n }\n\n if (series && key && series[key]?.data) {\n const seriesData = series[key]?.data;\n if (seriesData) {\n for (const item of seriesData) {\n if (item.childName) {\n serieChildName = item.childName;\n break;\n }\n }\n }\n }\n\n if (serieChildName && dataChildName && serieChildName === dataChildName) {\n return true;\n }\n }\n }\n return false;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chart-utils.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/utils/chart-utils.ts"],"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 { getInteractiveLegendItemStyles } from '@patternfly/react-charts/victory';\nimport { intl } from '../i18n';\nimport messages from '../i18n/messages';\nimport type { FormatOptions, Formatter } from './format';\nimport type { DomainTuple, VictoryStyleInterface } from 'victory-core';\n\nimport { getMaxMinValues, getTooltipContent } from './chart-datum';\n\nexport interface ChartData {\n childName?: string;\n units?: string;\n}\n\nexport interface ChartLegendItem {\n childName?: string;\n name?: string;\n symbol?: any;\n tooltip?: string;\n}\n\nexport interface ChartSeries {\n childName?: string;\n data?: [ChartData];\n legendItem?: ChartLegendItem;\n style?: VictoryStyleInterface;\n}\n\n// Returns groups of chart names associated with each data series\nexport const getChartNames = (series: ChartSeries[]) => {\n const result: (string | undefined)[] = [];\n\n if (series) {\n series.forEach(serie => {\n // Each group of chart names are hidden / shown together\n result.push(serie.childName);\n });\n }\n return result;\n};\n\n// Returns true if data series is hidden\nexport const isSeriesHidden = (hiddenSeries: Set<number>, index: number) => {\n return hiddenSeries.has(index);\n};\n\n// Note: A series may be grouped in order to be hidden / shown together\nexport const getDomain = (\n series: ChartSeries[] | undefined,\n hiddenSeries: Set<number>,\n groupedSeriesCount = 0,\n) => {\n const domain: { x?: DomainTuple; y?: DomainTuple } = { y: [0, 1] };\n let maxValue: number | null = null;\n let minValue: number | null = null;\n\n if (series) {\n // Don't use zero domain\n let maybeEmptyHiddenSeries = hiddenSeries;\n if (series.length - groupedSeriesCount === maybeEmptyHiddenSeries.size) {\n domain.x = [0, 1];\n maybeEmptyHiddenSeries = new Set();\n }\n series.forEach((s: any, index) => {\n if (\n !isSeriesHidden(maybeEmptyHiddenSeries, index) &&\n s.data &&\n s.data.length !== 0\n ) {\n const { max, min } = getMaxMinValues(s.data);\n if (max !== null && (maxValue === null || max > maxValue)) {\n maxValue = max;\n }\n if (min !== null && (minValue === null || min < minValue)) {\n minValue = min;\n }\n }\n });\n }\n\n if (maxValue && minValue) {\n const threshold = maxValue * 0.05;\n const max = maxValue > 0 ? Math.ceil(maxValue + threshold) : 0;\n const _min =\n minValue > 0 ? Math.max(0, Math.floor(minValue - threshold)) : 0;\n const min = _min > 0 ? _min : 0;\n\n if (max > 0) {\n domain.y = [min, max];\n }\n }\n\n return domain;\n};\n\n// Returns legend data styled per hiddenSeries\nexport const getLegendData = (\n series?: ChartSeries[],\n hiddenSeries?: Set<number>,\n tooltip: boolean = false,\n) => {\n if (!series) {\n return undefined;\n }\n\n const result: any = [];\n\n series.forEach((s, index) => {\n if (s.legendItem) {\n const data = {\n childName: s.childName,\n ...s.legendItem, // name property\n ...(tooltip && { name: s.legendItem.tooltip }), // Override name property for tooltip\n ...getInteractiveLegendItemStyles(hiddenSeries?.has(index)), // hidden styles\n };\n\n result.push(data);\n }\n });\n\n return result;\n};\n\n// Note: Forecast is expected to use both datum.y and datum.y0\nexport const getTooltipLabel = (\n datum: any,\n formatter: Formatter,\n formatOptions: FormatOptions,\n) => {\n const tooltipFormatter = getTooltipContent(formatter);\n const dy =\n datum.y !== undefined && datum.y !== null\n ? tooltipFormatter(datum.y, datum.units, formatOptions)\n : undefined;\n const dy0 =\n datum.y0 !== undefined && datum.y0 !== null\n ? tooltipFormatter(datum.y0, datum.units, formatOptions)\n : undefined;\n\n if (dy !== undefined && dy0 !== undefined) {\n return intl.formatMessage(messages.chartCostForecastConeTooltip, {\n value0: dy0,\n value1: dy,\n });\n }\n return dy !== undefined ? dy : intl.formatMessage(messages.chartNoData);\n};\n\nexport const getResizeObserver = (\n containerRef: HTMLDivElement | null,\n handleResize: () => void,\n) => {\n const containerElement = containerRef;\n const { ResizeObserver } = window as any;\n let _resizeObserver: any;\n\n if (containerElement && ResizeObserver) {\n const resizeObserver = new ResizeObserver((entries: string | any[]) => {\n // We wrap it in requestAnimationFrame to avoid this error - ResizeObserver loop limit exceeded\n window.requestAnimationFrame(() => {\n if (!Array.isArray(entries) || !entries.length) {\n return;\n }\n handleResize();\n });\n });\n resizeObserver.observe(containerElement);\n _resizeObserver = () => resizeObserver.unobserve(containerElement);\n } else {\n handleResize();\n window.addEventListener('resize', handleResize);\n _resizeObserver = () => window.removeEventListener('resize', handleResize);\n }\n\n return () => {\n if (_resizeObserver) {\n _resizeObserver();\n }\n };\n};\n\nexport const initHiddenSeries = (hiddenSeries: Set<number>, index: number) => {\n const result = new Set(hiddenSeries);\n if (!result.delete(index)) {\n result.add(index);\n }\n return result;\n};\n\n// Returns true if at least one data series is available\nexport const isDataAvailable = (\n series?: ChartSeries[],\n hiddenSeries?: Set<number>,\n) => {\n const unavailable = []; // API data may not be available (e.g., on 1st of month)\n\n if (series) {\n series.forEach((s: any, index) => {\n if (\n (hiddenSeries && isSeriesHidden(hiddenSeries, index)) ||\n (s.data && s.data.length === 0)\n ) {\n unavailable.push(index);\n }\n });\n }\n return unavailable.length !== (series ? series.length : 0);\n};\n\n// Returns true if data series is hidden\nexport const isDataHidden = (\n series: ChartSeries[],\n hiddenSeries: Set<number>,\n data: any,\n) => {\n if (data && data.length) {\n for (const key of hiddenSeries.keys()) {\n let dataChildName;\n let serieChildName;\n\n for (const item of data) {\n if (item.childName) {\n dataChildName = item.childName;\n break;\n }\n }\n\n if (series && key && series[key]?.data) {\n const seriesData = series[key]?.data;\n if (seriesData) {\n for (const item of seriesData) {\n if (item.childName) {\n serieChildName = item.childName;\n break;\n }\n }\n }\n }\n\n if (serieChildName && dataChildName && serieChildName === dataChildName) {\n return true;\n }\n }\n }\n return false;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"format.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/utils/format.ts"],"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 { getLocale, intl } from '../i18n';\nimport messages from '../i18n/messages';\n\nexport interface FormatOptions {\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport type Formatter = (\n value: number,\n units: string,\n options?: FormatOptions,\n) => string;\nexport type PercentageFormatter = (\n value: number,\n options?: FormatOptions,\n) => string;\ntype UnitsFormatter = (value: number, options?: FormatOptions) => string;\n\n// Returns the number of decimals for given string\nexport const countDecimals = (value: string, useLocale: boolean = true) => {\n const decimalSeparator = useLocale\n ? Number('1.1').toLocaleString(getLocale(), {}).substring(1, 2)\n : '.';\n const decimals = value.split(decimalSeparator);\n return decimals[1] ? decimals[1].length : 0;\n};\n\n// Currencies are formatted differently, depending on the locale you're using. For example, the dollar\n// sign may appear on the left or the right of the currency symbol for French Vs German.\n//\n// Using the ISO currency code AUD, $12.34 USD is formatted per the locales below.\n// See ICU currencies https://www.localeplanet.com/icu/currency.html\n//\n// en: A$12.34\n// fr: 12,34 $AU\n// de: 12,34 AU$\n//\n// Note: Some currencies do not have decimals, such as JPY, and some have 3 decimals such as IQD.\n// See https://docs.adyen.com/development-resources/currency-codes\nexport const formatCurrency: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {},\n) => {\n let fValue = value;\n // Don't show negative zero -- https://issues.redhat.com/browse/COST-3087\n if (!value || Number(value).toFixed(2) === '-0.00') {\n fValue = 0;\n }\n // Don't specify default fraction digits here, rely on react-intl instead\n return intl.formatNumber(fValue, {\n style: 'currency',\n currency: units ? units.toLocaleUpperCase('en-US') : 'USD',\n ...options,\n });\n};\n\nexport const formatCurrencyAbbreviation: Formatter = (value, units = 'USD') => {\n let fValue = value;\n if (!value) {\n fValue = 0;\n }\n\n // Derived from https://stackoverflow.com/questions/37799955/how-can-i-format-big-numbers-with-tolocalestring\n const abbreviationFormats = [\n { val: 1e15, symbol: 'quadrillion' },\n { val: 1e12, symbol: 'trillion' },\n { val: 1e9, symbol: 'billion' },\n { val: 1e6, symbol: 'million' },\n { val: 1e3, symbol: 'thousand' },\n ];\n\n // Find the proper format to use\n let format;\n if (abbreviationFormats) {\n format = abbreviationFormats.find(f => fValue >= f.val);\n }\n\n // Apply format and insert symbol next to the numeric portion of the formatted string\n if (format) {\n const { val, symbol } = format;\n return intl.formatMessage(messages.currencyAbbreviations, {\n symbol,\n value: formatCurrency(fValue / val, units, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }),\n });\n }\n\n // If no format was found, format value without abbreviation\n return formatCurrency(value, units, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n};\n\n// Formats cost model rates with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatCurrencyRate: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return formatCurrency(value, units, options);\n};\n\n// Formats without currency symbol\nexport const formatCurrencyRaw: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {},\n) => {\n return formatCurrency(value, units, {\n currencyDisplay: 'code',\n ...options,\n } as any)\n .toString()\n .replace(units, '')\n .trim();\n};\n\n// Formats cost model rates with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatCurrencyRateRaw: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return formatCurrencyRaw(value, units, options);\n};\n\n// Returns i18n key for given units\nexport const unitsLookupKey = (units: string): string => {\n const lookup = units\n ? units.replace(/[- ]/g, '_').toLocaleLowerCase('en-US')\n : '';\n\n switch (lookup) {\n case 'cores':\n case 'ei':\n case 'eib':\n case 'gi':\n case 'gib':\n case 'ki':\n case 'kib':\n case 'm':\n case 'millicores':\n case 'mi':\n case 'mib':\n return lookup;\n default:\n return '';\n }\n};\n\nexport const formatUsage: UnitsFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\nconst unknownTypeFormatter = (value: number, options?: FormatOptions) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Returns formatted units or currency with given currency-code\nexport const formatUnits: Formatter = (value, units, options) => {\n const lookup = unitsLookupKey(units);\n const fValue = value || 0;\n\n switch (lookup) {\n case 'byte_ms':\n case 'core':\n case 'core_hours':\n case 'hour':\n case 'hrs':\n case 'gb':\n case 'gb_hours':\n case 'gb_mo':\n case 'gb_ms':\n case 'gibibyte_month':\n case 'ms':\n case 'tag_mo':\n case 'vm_hours':\n return formatUsage(fValue, options);\n default:\n return unknownTypeFormatter(fValue, options);\n }\n};\n\nexport const formatPercentage: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Formats cost model markup with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatPercentageMarkup: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Format optimization metrics\nexport const formatOptimization: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 20, // Allow the API to set the number of decimal places\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Returns true if given percentage or currency format is valid for current locale\nexport const isCurrencyFormatValid = (value: string) => {\n const decimalSeparator = intl.formatNumber(1.1).toString().replace(/1/g, '');\n\n // ^[0-9] The number must start with 0-9\n // \\d* The number can then have any number of any digits\n // (...)$ look at the next group from the end (...)$\n // (...)*(...)? Look for groups optionally. The first is for the comma, the second is for the decimal.\n // (,\\d{3}){1} Look for one occurrence of a comma followed by exactly three digits\n // \\.\\d Look for a decimal followed by any number of any digits\n //\n // See https://stackoverflow.com/questions/2227370/currency-validation\n const regex =\n decimalSeparator === '.'\n ? /^-?[0-9]\\d*(((,\\d{3}){1})*(\\.\\d*)?)$/\n : /^-?[0-9]\\d*(((\\.\\d{3}){1})*(,\\d*)?)$/;\n\n return regex.test(value);\n};\n\n// Returns true if given percentage is valid for current locale\nexport const isPercentageFormatValid = (value: string) => {\n return isCurrencyFormatValid(value);\n};\n\n// This function normalizes a given currency or percentage.\n//\n// Some locales us a comma as the decimal separator (e.g., \"1.234,56\" in German), which must be\n// replaced for APIs where USD decimal format is expected.\n//\n// Note that the group separator (e.g., \"1,234.56\" in USD) must also be removed when formatting\n// currencies and percentages to display in the browser's locale.\nexport const unFormat = (value: string) => {\n if (!value) {\n return value;\n }\n const groupSeparator = intl.formatNumber(1111).toString().replace(/1/g, '');\n const decimalSeparator = intl.formatNumber(1.1).toString().replace(/1/g, '');\n\n let rawValue = value\n .toString()\n .replace(groupSeparator === ',' ? /,/g : /\\./g, '');\n rawValue = rawValue.replace(decimalSeparator === '.' ? /\\./g : /,/g, '.');\n\n return Number.isNaN(rawValue) ? '0' : rawValue;\n};\n"],"names":[],"mappings":";;;AA4Ja,MAAA,cAAA,GAAiB,CAAC,KAA0B,KAAA;AACvD,EAAM,MAAA,MAAA,GAAS,QACX,KAAM,CAAA,OAAA,CAAQ,SAAS,GAAG,CAAA,CAAE,iBAAkB,CAAA,OAAO,CACrD,GAAA,EAAA;AAEJ,EAAA,QAAQ,MAAQ;AAAA,IACd,KAAK,OAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAO,OAAA,MAAA;AAAA,IACT;AACE,MAAO,OAAA,EAAA;AAAA;AAEb;;;;"}
1
+ {"version":3,"file":"format.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/utils/format.ts"],"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 { getLocale, intl } from '../i18n';\nimport messages from '../i18n/messages';\n\nexport interface FormatOptions {\n minimumFractionDigits?: number;\n maximumFractionDigits?: number;\n}\n\nexport type Formatter = (\n value: number,\n units: string,\n options?: FormatOptions,\n) => string;\nexport type PercentageFormatter = (\n value: number,\n options?: FormatOptions,\n) => string;\ntype UnitsFormatter = (value: number, options?: FormatOptions) => string;\n\n// Returns the number of decimals for given string\nexport const countDecimals = (value: string, useLocale: boolean = true) => {\n const decimalSeparator = useLocale\n ? Number('1.1').toLocaleString(getLocale(), {}).substring(1, 2)\n : '.';\n const decimals = value.split(decimalSeparator);\n return decimals[1] ? decimals[1].length : 0;\n};\n\n// Currencies are formatted differently, depending on the locale you're using. For example, the dollar\n// sign may appear on the left or the right of the currency symbol for French Vs German.\n//\n// Using the ISO currency code AUD, $12.34 USD is formatted per the locales below.\n// See ICU currencies https://www.localeplanet.com/icu/currency.html\n//\n// en: A$12.34\n// fr: 12,34 $AU\n// de: 12,34 AU$\n//\n// Note: Some currencies do not have decimals, such as JPY, and some have 3 decimals such as IQD.\n// See https://docs.adyen.com/development-resources/currency-codes\nexport const formatCurrency: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {},\n) => {\n let fValue = value;\n // Don't show negative zero -- https://issues.redhat.com/browse/COST-3087\n if (!value || Number(value).toFixed(2) === '-0.00') {\n fValue = 0;\n }\n // Don't specify default fraction digits here, rely on react-intl instead\n return intl.formatNumber(fValue, {\n style: 'currency',\n currency: units ? units.toLocaleUpperCase('en-US') : 'USD',\n ...options,\n });\n};\n\nexport const formatCurrencyAbbreviation: Formatter = (value, units = 'USD') => {\n let fValue = value;\n if (!value) {\n fValue = 0;\n }\n\n // Derived from https://stackoverflow.com/questions/37799955/how-can-i-format-big-numbers-with-tolocalestring\n const abbreviationFormats = [\n { val: 1e15, symbol: 'quadrillion' },\n { val: 1e12, symbol: 'trillion' },\n { val: 1e9, symbol: 'billion' },\n { val: 1e6, symbol: 'million' },\n { val: 1e3, symbol: 'thousand' },\n ];\n\n // Find the proper format to use\n let format;\n if (abbreviationFormats) {\n format = abbreviationFormats.find(f => fValue >= f.val);\n }\n\n // Apply format and insert symbol next to the numeric portion of the formatted string\n if (format) {\n const { val, symbol } = format;\n return intl.formatMessage(messages.currencyAbbreviations, {\n symbol,\n value: formatCurrency(fValue / val, units, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }),\n });\n }\n\n // If no format was found, format value without abbreviation\n return formatCurrency(value, units, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n};\n\n// Formats cost model rates with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatCurrencyRate: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return formatCurrency(value, units, options);\n};\n\n// Formats without currency symbol\nexport const formatCurrencyRaw: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {},\n) => {\n return formatCurrency(value, units, {\n currencyDisplay: 'code',\n ...options,\n } as any)\n .toString()\n .replace(units, '')\n .trim();\n};\n\n// Formats cost model rates with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatCurrencyRateRaw: Formatter = (\n value: number,\n units: string,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return formatCurrencyRaw(value, units, options);\n};\n\n// Returns i18n key for given units\nexport const unitsLookupKey = (units: string): string => {\n const lookup = units\n ? units.replace(/[- ]/g, '_').toLocaleLowerCase('en-US')\n : '';\n\n switch (lookup) {\n case 'cores':\n case 'ei':\n case 'eib':\n case 'gi':\n case 'gib':\n case 'ki':\n case 'kib':\n case 'm':\n case 'millicores':\n case 'mi':\n case 'mib':\n return lookup;\n default:\n return '';\n }\n};\n\nexport const formatUsage: UnitsFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\nconst unknownTypeFormatter = (value: number, options?: FormatOptions) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Returns formatted units or currency with given currency-code\nexport const formatUnits: Formatter = (value, units, options) => {\n const lookup = unitsLookupKey(units);\n const fValue = value || 0;\n\n switch (lookup) {\n case 'byte_ms':\n case 'core':\n case 'core_hours':\n case 'hour':\n case 'hrs':\n case 'gb':\n case 'gb_hours':\n case 'gb_mo':\n case 'gb_ms':\n case 'gibibyte_month':\n case 'ms':\n case 'tag_mo':\n case 'vm_hours':\n return formatUsage(fValue, options);\n default:\n return unknownTypeFormatter(fValue, options);\n }\n};\n\nexport const formatPercentage: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Formats cost model markup with 0 to 10 decimals\n// https://issues.redhat.com/browse/COST-1884\nexport const formatPercentageMarkup: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Format optimization metrics\nexport const formatOptimization: PercentageFormatter = (\n value,\n options: FormatOptions = {\n minimumFractionDigits: 0,\n maximumFractionDigits: 20, // Allow the API to set the number of decimal places\n },\n) => {\n return value?.toLocaleString(getLocale(), options);\n};\n\n// Returns true if given percentage or currency format is valid for current locale\nexport const isCurrencyFormatValid = (value: string) => {\n const decimalSeparator = intl.formatNumber(1.1).toString().replace(/1/g, '');\n\n // ^[0-9] The number must start with 0-9\n // \\d* The number can then have any number of any digits\n // (...)$ look at the next group from the end (...)$\n // (...)*(...)? Look for groups optionally. The first is for the comma, the second is for the decimal.\n // (,\\d{3}){1} Look for one occurrence of a comma followed by exactly three digits\n // \\.\\d Look for a decimal followed by any number of any digits\n //\n // See https://stackoverflow.com/questions/2227370/currency-validation\n const regex =\n decimalSeparator === '.'\n ? /^-?[0-9]\\d*(((,\\d{3}){1})*(\\.\\d*)?)$/\n : /^-?[0-9]\\d*(((\\.\\d{3}){1})*(,\\d*)?)$/;\n\n return regex.test(value);\n};\n\n// Returns true if given percentage is valid for current locale\nexport const isPercentageFormatValid = (value: string) => {\n return isCurrencyFormatValid(value);\n};\n\n// This function normalizes a given currency or percentage.\n//\n// Some locales us a comma as the decimal separator (e.g., \"1.234,56\" in German), which must be\n// replaced for APIs where USD decimal format is expected.\n//\n// Note that the group separator (e.g., \"1,234.56\" in USD) must also be removed when formatting\n// currencies and percentages to display in the browser's locale.\nexport const unFormat = (value: string) => {\n if (!value) {\n return value;\n }\n const groupSeparator = intl.formatNumber(1111).toString().replace(/1/g, '');\n const decimalSeparator = intl.formatNumber(1.1).toString().replace(/1/g, '');\n\n let rawValue = value\n .toString()\n .replace(groupSeparator === ',' ? /,/g : /\\./g, '');\n rawValue = rawValue.replace(decimalSeparator === '.' ? /\\./g : /,/g, '.');\n\n return Number.isNaN(rawValue) ? '0' : rawValue;\n};\n"],"names":[],"mappings":";;;AA4JO,MAAM,cAAA,GAAiB,CAAC,KAAA,KAA0B;AACvD,EAAA,MAAM,MAAA,GAAS,QACX,KAAA,CAAM,OAAA,CAAQ,SAAS,GAAG,CAAA,CAAE,iBAAA,CAAkB,OAAO,CAAA,GACrD,EAAA;AAEJ,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,OAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,GAAA;AAAA,IACL,KAAK,YAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,KAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,EAAA;AAAA;AAEb;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChartEnums.esm.js","sources":["../../../../src/pages/optimizations-breakdown/models/ChartEnums.ts"],"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\nexport const enum UsageType {\n cpuUsage = 'cpuUsage',\n memoryUsage = 'memoryUsage',\n}\n\n// eslint-disable-next-line no-shadow\nexport type Interval = 'shortTerm' | 'mediumTerm' | 'longTerm';\n\n// eslint-disable-next-line no-shadow\nexport const enum OptimizationType {\n cost = 'cost',\n performance = 'performance',\n}\n\n// eslint-disable-next-line no-shadow\nexport const enum RecommendationType {\n cpu = 'cpu',\n memory = 'memory',\n}\n\n// eslint-disable-next-line no-shadow\nexport const enum ResourceType {\n limits = 'limits',\n requests = 'requests',\n}\n"],"names":["UsageType","OptimizationType","RecommendationType","ResourceType"],"mappings":"AAgBkB,IAAA,SAAA,qBAAAA,UAAX,KAAA;AACL,EAAAA,WAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,WAAA,aAAc,CAAA,GAAA,aAAA;AAFE,EAAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AASA,IAAA,gBAAA,qBAAAC,iBAAX,KAAA;AACL,EAAAA,kBAAA,MAAO,CAAA,GAAA,MAAA;AACP,EAAAA,kBAAA,aAAc,CAAA,GAAA,aAAA;AAFE,EAAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAMA,IAAA,kBAAA,qBAAAC,mBAAX,KAAA;AACL,EAAAA,oBAAA,KAAM,CAAA,GAAA,KAAA;AACN,EAAAA,oBAAA,QAAS,CAAA,GAAA,QAAA;AAFO,EAAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAMA,IAAA,YAAA,qBAAAC,aAAX,KAAA;AACL,EAAAA,cAAA,QAAS,CAAA,GAAA,QAAA;AACT,EAAAA,cAAA,UAAW,CAAA,GAAA,UAAA;AAFK,EAAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
1
+ {"version":3,"file":"ChartEnums.esm.js","sources":["../../../../src/pages/optimizations-breakdown/models/ChartEnums.ts"],"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\nexport const enum UsageType {\n cpuUsage = 'cpuUsage',\n memoryUsage = 'memoryUsage',\n}\n\n// eslint-disable-next-line no-shadow\nexport type Interval = 'shortTerm' | 'mediumTerm' | 'longTerm';\n\n// eslint-disable-next-line no-shadow\nexport const enum OptimizationType {\n cost = 'cost',\n performance = 'performance',\n}\n\n// eslint-disable-next-line no-shadow\nexport const enum RecommendationType {\n cpu = 'cpu',\n memory = 'memory',\n}\n\n// eslint-disable-next-line no-shadow\nexport const enum ResourceType {\n limits = 'limits',\n requests = 'requests',\n}\n"],"names":["UsageType","OptimizationType","RecommendationType","ResourceType"],"mappings":"AAgBO,IAAW,SAAA,qBAAAA,UAAAA,KAAX;AACL,EAAAA,WAAA,UAAA,CAAA,GAAW,UAAA;AACX,EAAAA,WAAA,aAAA,CAAA,GAAc,aAAA;AAFE,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AASX,IAAW,gBAAA,qBAAAC,iBAAAA,KAAX;AACL,EAAAA,kBAAA,MAAA,CAAA,GAAO,MAAA;AACP,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AAFE,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAMX,IAAW,kBAAA,qBAAAC,mBAAAA,KAAX;AACL,EAAAA,oBAAA,KAAA,CAAA,GAAM,KAAA;AACN,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AAFO,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AAMX,IAAW,YAAA,qBAAAC,aAAAA,KAAX;AACL,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AAFK,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"YamlCodeData.esm.js","sources":["../../../../src/pages/optimizations-breakdown/models/YamlCodeData.ts"],"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 { isEmpty } from 'lodash';\nimport type {\n RecommendationBoxPlots,\n RecommendationsRecommendationsCurrent,\n} from '@red-hat-developer-hub/plugin-cost-management-common/models';\nimport { Interval, OptimizationType } from './ChartEnums';\n\nexport interface YamlCodeData {\n limits: {\n cpu: number | string;\n memory: number | string;\n };\n requests: {\n cpu: number | string;\n memory: number | string;\n };\n}\n\nconst getPercentage = (currentVal: number, recommendedVal: number): number => {\n if (currentVal === 0) {\n return 0;\n }\n const changeValue = recommendedVal - currentVal;\n return parseFloat(((changeValue / currentVal) * 100).toFixed(2));\n};\n\nconst getRecommendedValue = (\n currentValues: RecommendationsRecommendationsCurrent,\n recommendedValues: RecommendationsRecommendationsCurrent,\n key1: 'limits' | 'requests',\n key2: 'cpu' | 'memory',\n): string => {\n let currentVal = currentValues[key1]?.[key2]?.amount || 0;\n const currentFormat = currentValues[key1]?.[key2]?.format || '';\n let recommendedVal = recommendedValues[key1]?.[key2]?.amount || 0;\n const recommendedFormat = recommendedValues[key1]?.[key2]?.format || '';\n\n if (recommendedVal === 0) {\n return '-';\n }\n\n // Convert units if not the same\n if (\n currentFormat &&\n recommendedFormat &&\n currentFormat !== recommendedFormat\n ) {\n if (key2 === 'cpu') {\n // Convert cores to millicores\n //\n // Note: units may be null to omit \"cores\" label for Kubernetes\n const getMultiplier = (units: string) => {\n return units === null || units === 'cores' ? 1000 : 1;\n };\n currentVal = currentVal * getMultiplier(currentFormat || 'cores');\n recommendedVal =\n recommendedVal * getMultiplier(recommendedFormat || 'cores');\n } else if (key2 === 'memory') {\n // Convert Gi, Mi, etc. to bytes\n //\n // See https://medium.com/swlh/understanding-kubernetes-resource-cpu-and-memory-units-30284b3cc866\n //\n // Ei = EiB = Exbibyte. 1Ei = 2⁶⁰ = 1,152,921,504,606,846,976 bytes\n // Pi = PiB = Pebibyte. 1Pi = 2⁵⁰ = 1,125,899,906,842,624 bytes\n // Ti = TiB = Tebibyte. 1Ti = 2⁴⁰ = 1,099,511,627,776 bytes\n // Gi = GiB = Gibibyte. 1Gi = 2³⁰ = 1,073,741,824 bytes\n // Mi = MiB = Mebibyte. 1Mi = 2²⁰ = 1,048,576 bytes\n // Ki = KiB = Kibibyte. 1Ki = 2¹⁰ = 1,024 bytes\n const getMultiplier = (units: string) => {\n switch (units.toLocaleLowerCase('en-US')) {\n case 'ei':\n return Math.pow(2, 60);\n case 'pi':\n return Math.pow(2, 50);\n case 'ti':\n return Math.pow(2, 40);\n case 'gi':\n return Math.pow(2, 30);\n case 'mi':\n return Math.pow(2, 20);\n case 'ki':\n return Math.pow(2, 10);\n default:\n return 1;\n }\n };\n currentVal = currentVal * getMultiplier(currentFormat || 'bytes');\n recommendedVal =\n recommendedVal * getMultiplier(recommendedFormat || 'byes');\n }\n }\n\n // Calculate percentage change\n const percentage: number = getPercentage(currentVal, recommendedVal);\n\n const paddingValue = { cpu: 20, memory: 17 };\n const percentageSign = percentage > 0 ? '+' : '';\n\n const formattedRecommendedValue =\n `${recommendedVal}${recommendedFormat}`.padEnd(paddingValue[key2]);\n const formattedPercentageValue = `# ${percentageSign}${percentage}%`;\n return `${formattedRecommendedValue}${formattedPercentageValue}`;\n};\n\nexport const getRecommendedYAMLCodeData = (\n value: RecommendationBoxPlots,\n duration: Interval,\n type: OptimizationType,\n): YamlCodeData => {\n const currentValues = value?.recommendations?.current;\n const recommendedValues =\n value?.recommendations?.recommendationTerms?.[duration]\n ?.recommendationEngines?.[type]?.config;\n\n if (currentValues && recommendedValues) {\n const cpuLimitsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'limits',\n 'cpu',\n );\n const memoryLimitsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'limits',\n 'memory',\n );\n\n const cpuRequestsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'requests',\n 'cpu',\n );\n const memoryRequestsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'requests',\n 'memory',\n );\n\n const recommendedYAMLCodeData: YamlCodeData = {\n limits: {\n cpu: cpuLimitsValue,\n memory: memoryLimitsValue,\n },\n requests: {\n cpu: cpuRequestsValue,\n memory: memoryRequestsValue,\n },\n };\n\n return recommendedYAMLCodeData;\n }\n\n return {\n limits: {\n cpu: '',\n memory: '',\n },\n requests: {\n cpu: '',\n memory: '',\n },\n };\n};\n\nexport const getCurrentYAMLCodeData = (\n value: RecommendationBoxPlots,\n): YamlCodeData => {\n // extract cpu & memory limits object\n const cpuLimits = value?.recommendations?.current?.limits?.cpu;\n const memoryLimits = value?.recommendations?.current?.limits?.memory;\n\n // extract cpu & memory requests object\n const cpuRequests = value?.recommendations?.current?.requests?.cpu;\n const memoryRequests = value?.recommendations?.current?.requests?.memory;\n\n // limits values\n const cpuLimitsValue = isEmpty(cpuLimits)\n ? '-'\n : `${cpuLimits?.amount}${cpuLimits?.format}`;\n const memoryLimitsValue = isEmpty(memoryLimits)\n ? '-'\n : `${memoryLimits?.amount}${memoryLimits?.format}`;\n\n // requests values\n const cpuRequestsValue = isEmpty(cpuRequests)\n ? '-'\n : `${cpuRequests?.amount}${cpuRequests?.format}`;\n const memoryRequestsValue = isEmpty(memoryRequests)\n ? '-'\n : `${memoryRequests?.amount}${memoryRequests?.format}`;\n\n const currentYAMLCodeData: YamlCodeData = {\n limits: {\n cpu: cpuLimitsValue,\n memory: memoryLimitsValue,\n },\n requests: {\n cpu: cpuRequestsValue,\n memory: memoryRequestsValue,\n },\n };\n\n return currentYAMLCodeData;\n};\n"],"names":[],"mappings":";;AAkCA,MAAM,aAAA,GAAgB,CAAC,UAAA,EAAoB,cAAmC,KAAA;AAC5E,EAAA,IAAI,eAAe,CAAG,EAAA;AACpB,IAAO,OAAA,CAAA;AAAA;AAET,EAAA,MAAM,cAAc,cAAiB,GAAA,UAAA;AACrC,EAAA,OAAO,YAAa,WAAc,GAAA,UAAA,GAAc,GAAK,EAAA,OAAA,CAAQ,CAAC,CAAC,CAAA;AACjE,CAAA;AAEA,MAAM,mBAAsB,GAAA,CAC1B,aACA,EAAA,iBAAA,EACA,MACA,IACW,KAAA;AACX,EAAA,IAAI,aAAa,aAAc,CAAA,IAAI,CAAI,GAAA,IAAI,GAAG,MAAU,IAAA,CAAA;AACxD,EAAA,MAAM,gBAAgB,aAAc,CAAA,IAAI,CAAI,GAAA,IAAI,GAAG,MAAU,IAAA,EAAA;AAC7D,EAAA,IAAI,iBAAiB,iBAAkB,CAAA,IAAI,CAAI,GAAA,IAAI,GAAG,MAAU,IAAA,CAAA;AAChE,EAAA,MAAM,oBAAoB,iBAAkB,CAAA,IAAI,CAAI,GAAA,IAAI,GAAG,MAAU,IAAA,EAAA;AAErE,EAAA,IAAI,mBAAmB,CAAG,EAAA;AACxB,IAAO,OAAA,GAAA;AAAA;AAIT,EACE,IAAA,aAAA,IACA,iBACA,IAAA,aAAA,KAAkB,iBAClB,EAAA;AACA,IAAA,IAAI,SAAS,KAAO,EAAA;AAIlB,MAAM,MAAA,aAAA,GAAgB,CAAC,KAAkB,KAAA;AACvC,QAAA,OAAO,KAAU,KAAA,IAAA,IAAQ,KAAU,KAAA,OAAA,GAAU,GAAO,GAAA,CAAA;AAAA,OACtD;AACA,MAAa,UAAA,GAAA,UAAA,GAAa,aAAc,CAAA,aAAA,IAAiB,OAAO,CAAA;AAChE,MACE,cAAA,GAAA,cAAA,GAAiB,aAAc,CAAA,iBAAA,IAAqB,OAAO,CAAA;AAAA,KAC/D,MAAA,IAAW,SAAS,QAAU,EAAA;AAW5B,MAAM,MAAA,aAAA,GAAgB,CAAC,KAAkB,KAAA;AACvC,QAAQ,QAAA,KAAA,CAAM,iBAAkB,CAAA,OAAO,CAAG;AAAA,UACxC,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB,KAAK,IAAA;AACH,YAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,EAAE,CAAA;AAAA,UACvB;AACE,YAAO,OAAA,CAAA;AAAA;AACX,OACF;AACA,MAAa,UAAA,GAAA,UAAA,GAAa,aAAc,CAAA,aAAA,IAAiB,OAAO,CAAA;AAChE,MACE,cAAA,GAAA,cAAA,GAAiB,aAAc,CAAA,iBAAA,IAAqB,MAAM,CAAA;AAAA;AAC9D;AAIF,EAAM,MAAA,UAAA,GAAqB,aAAc,CAAA,UAAA,EAAY,cAAc,CAAA;AAEnE,EAAA,MAAM,YAAe,GAAA,EAAE,GAAK,EAAA,EAAA,EAAI,QAAQ,EAAG,EAAA;AAC3C,EAAM,MAAA,cAAA,GAAiB,UAAa,GAAA,CAAA,GAAI,GAAM,GAAA,EAAA;AAE9C,EAAM,MAAA,yBAAA,GACJ,GAAG,cAAc,CAAA,EAAG,iBAAiB,CAAG,CAAA,CAAA,MAAA,CAAO,YAAa,CAAA,IAAI,CAAC,CAAA;AACnE,EAAA,MAAM,wBAA2B,GAAA,CAAA,EAAA,EAAK,cAAc,CAAA,EAAG,UAAU,CAAA,CAAA,CAAA;AACjE,EAAO,OAAA,CAAA,EAAG,yBAAyB,CAAA,EAAG,wBAAwB,CAAA,CAAA;AAChE,CAAA;AAEO,MAAM,0BAA6B,GAAA,CACxC,KACA,EAAA,QAAA,EACA,IACiB,KAAA;AACjB,EAAM,MAAA,aAAA,GAAgB,OAAO,eAAiB,EAAA,OAAA;AAC9C,EAAM,MAAA,iBAAA,GACJ,OAAO,eAAiB,EAAA,mBAAA,GAAsB,QAAQ,CAClD,EAAA,qBAAA,GAAwB,IAAI,CAAG,EAAA,MAAA;AAErC,EAAA,IAAI,iBAAiB,iBAAmB,EAAA;AACtC,IAAA,MAAM,cAAiB,GAAA,mBAAA;AAAA,MACrB,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,iBAAoB,GAAA,mBAAA;AAAA,MACxB,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,gBAAmB,GAAA,mBAAA;AAAA,MACvB,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,mBAAsB,GAAA,mBAAA;AAAA,MAC1B,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,uBAAwC,GAAA;AAAA,MAC5C,MAAQ,EAAA;AAAA,QACN,GAAK,EAAA,cAAA;AAAA,QACL,MAAQ,EAAA;AAAA,OACV;AAAA,MACA,QAAU,EAAA;AAAA,QACR,GAAK,EAAA,gBAAA;AAAA,QACL,MAAQ,EAAA;AAAA;AACV,KACF;AAEA,IAAO,OAAA,uBAAA;AAAA;AAGT,EAAO,OAAA;AAAA,IACL,MAAQ,EAAA;AAAA,MACN,GAAK,EAAA,EAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,QAAU,EAAA;AAAA,MACR,GAAK,EAAA,EAAA;AAAA,MACL,MAAQ,EAAA;AAAA;AACV,GACF;AACF;AAEa,MAAA,sBAAA,GAAyB,CACpC,KACiB,KAAA;AAEjB,EAAA,MAAM,SAAY,GAAA,KAAA,EAAO,eAAiB,EAAA,OAAA,EAAS,MAAQ,EAAA,GAAA;AAC3D,EAAA,MAAM,YAAe,GAAA,KAAA,EAAO,eAAiB,EAAA,OAAA,EAAS,MAAQ,EAAA,MAAA;AAG9D,EAAA,MAAM,WAAc,GAAA,KAAA,EAAO,eAAiB,EAAA,OAAA,EAAS,QAAU,EAAA,GAAA;AAC/D,EAAA,MAAM,cAAiB,GAAA,KAAA,EAAO,eAAiB,EAAA,OAAA,EAAS,QAAU,EAAA,MAAA;AAGlE,EAAM,MAAA,cAAA,GAAiB,OAAQ,CAAA,SAAS,CACpC,GAAA,GAAA,GACA,GAAG,SAAW,EAAA,MAAM,CAAG,EAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAC5C,EAAM,MAAA,iBAAA,GAAoB,OAAQ,CAAA,YAAY,CAC1C,GAAA,GAAA,GACA,GAAG,YAAc,EAAA,MAAM,CAAG,EAAA,YAAA,EAAc,MAAM,CAAA,CAAA;AAGlD,EAAM,MAAA,gBAAA,GAAmB,OAAQ,CAAA,WAAW,CACxC,GAAA,GAAA,GACA,GAAG,WAAa,EAAA,MAAM,CAAG,EAAA,WAAA,EAAa,MAAM,CAAA,CAAA;AAChD,EAAM,MAAA,mBAAA,GAAsB,OAAQ,CAAA,cAAc,CAC9C,GAAA,GAAA,GACA,GAAG,cAAgB,EAAA,MAAM,CAAG,EAAA,cAAA,EAAgB,MAAM,CAAA,CAAA;AAEtD,EAAA,MAAM,mBAAoC,GAAA;AAAA,IACxC,MAAQ,EAAA;AAAA,MACN,GAAK,EAAA,cAAA;AAAA,MACL,MAAQ,EAAA;AAAA,KACV;AAAA,IACA,QAAU,EAAA;AAAA,MACR,GAAK,EAAA,gBAAA;AAAA,MACL,MAAQ,EAAA;AAAA;AACV,GACF;AAEA,EAAO,OAAA,mBAAA;AACT;;;;"}
1
+ {"version":3,"file":"YamlCodeData.esm.js","sources":["../../../../src/pages/optimizations-breakdown/models/YamlCodeData.ts"],"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 { isEmpty } from 'lodash';\nimport type {\n RecommendationBoxPlots,\n RecommendationsRecommendationsCurrent,\n} from '@red-hat-developer-hub/plugin-cost-management-common/models';\nimport { Interval, OptimizationType } from './ChartEnums';\n\nexport interface YamlCodeData {\n limits: {\n cpu: number | string;\n memory: number | string;\n };\n requests: {\n cpu: number | string;\n memory: number | string;\n };\n}\n\nconst getPercentage = (currentVal: number, recommendedVal: number): number => {\n if (currentVal === 0) {\n return 0;\n }\n const changeValue = recommendedVal - currentVal;\n return parseFloat(((changeValue / currentVal) * 100).toFixed(2));\n};\n\nconst getRecommendedValue = (\n currentValues: RecommendationsRecommendationsCurrent,\n recommendedValues: RecommendationsRecommendationsCurrent,\n key1: 'limits' | 'requests',\n key2: 'cpu' | 'memory',\n): string => {\n let currentVal = currentValues[key1]?.[key2]?.amount || 0;\n const currentFormat = currentValues[key1]?.[key2]?.format || '';\n let recommendedVal = recommendedValues[key1]?.[key2]?.amount || 0;\n const recommendedFormat = recommendedValues[key1]?.[key2]?.format || '';\n\n if (recommendedVal === 0) {\n return '-';\n }\n\n // Convert units if not the same\n if (\n currentFormat &&\n recommendedFormat &&\n currentFormat !== recommendedFormat\n ) {\n if (key2 === 'cpu') {\n // Convert cores to millicores\n //\n // Note: units may be null to omit \"cores\" label for Kubernetes\n const getMultiplier = (units: string) => {\n return units === null || units === 'cores' ? 1000 : 1;\n };\n currentVal = currentVal * getMultiplier(currentFormat || 'cores');\n recommendedVal =\n recommendedVal * getMultiplier(recommendedFormat || 'cores');\n } else if (key2 === 'memory') {\n // Convert Gi, Mi, etc. to bytes\n //\n // See https://medium.com/swlh/understanding-kubernetes-resource-cpu-and-memory-units-30284b3cc866\n //\n // Ei = EiB = Exbibyte. 1Ei = 2⁶⁰ = 1,152,921,504,606,846,976 bytes\n // Pi = PiB = Pebibyte. 1Pi = 2⁵⁰ = 1,125,899,906,842,624 bytes\n // Ti = TiB = Tebibyte. 1Ti = 2⁴⁰ = 1,099,511,627,776 bytes\n // Gi = GiB = Gibibyte. 1Gi = 2³⁰ = 1,073,741,824 bytes\n // Mi = MiB = Mebibyte. 1Mi = 2²⁰ = 1,048,576 bytes\n // Ki = KiB = Kibibyte. 1Ki = 2¹⁰ = 1,024 bytes\n const getMultiplier = (units: string) => {\n switch (units.toLocaleLowerCase('en-US')) {\n case 'ei':\n return Math.pow(2, 60);\n case 'pi':\n return Math.pow(2, 50);\n case 'ti':\n return Math.pow(2, 40);\n case 'gi':\n return Math.pow(2, 30);\n case 'mi':\n return Math.pow(2, 20);\n case 'ki':\n return Math.pow(2, 10);\n default:\n return 1;\n }\n };\n currentVal = currentVal * getMultiplier(currentFormat || 'bytes');\n recommendedVal =\n recommendedVal * getMultiplier(recommendedFormat || 'byes');\n }\n }\n\n // Calculate percentage change\n const percentage: number = getPercentage(currentVal, recommendedVal);\n\n const paddingValue = { cpu: 20, memory: 17 };\n const percentageSign = percentage > 0 ? '+' : '';\n\n const formattedRecommendedValue =\n `${recommendedVal}${recommendedFormat}`.padEnd(paddingValue[key2]);\n const formattedPercentageValue = `# ${percentageSign}${percentage}%`;\n return `${formattedRecommendedValue}${formattedPercentageValue}`;\n};\n\nexport const getRecommendedYAMLCodeData = (\n value: RecommendationBoxPlots,\n duration: Interval,\n type: OptimizationType,\n): YamlCodeData => {\n const currentValues = value?.recommendations?.current;\n const recommendedValues =\n value?.recommendations?.recommendationTerms?.[duration]\n ?.recommendationEngines?.[type]?.config;\n\n if (currentValues && recommendedValues) {\n const cpuLimitsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'limits',\n 'cpu',\n );\n const memoryLimitsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'limits',\n 'memory',\n );\n\n const cpuRequestsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'requests',\n 'cpu',\n );\n const memoryRequestsValue = getRecommendedValue(\n currentValues,\n recommendedValues,\n 'requests',\n 'memory',\n );\n\n const recommendedYAMLCodeData: YamlCodeData = {\n limits: {\n cpu: cpuLimitsValue,\n memory: memoryLimitsValue,\n },\n requests: {\n cpu: cpuRequestsValue,\n memory: memoryRequestsValue,\n },\n };\n\n return recommendedYAMLCodeData;\n }\n\n return {\n limits: {\n cpu: '',\n memory: '',\n },\n requests: {\n cpu: '',\n memory: '',\n },\n };\n};\n\nexport const getCurrentYAMLCodeData = (\n value: RecommendationBoxPlots,\n): YamlCodeData => {\n // extract cpu & memory limits object\n const cpuLimits = value?.recommendations?.current?.limits?.cpu;\n const memoryLimits = value?.recommendations?.current?.limits?.memory;\n\n // extract cpu & memory requests object\n const cpuRequests = value?.recommendations?.current?.requests?.cpu;\n const memoryRequests = value?.recommendations?.current?.requests?.memory;\n\n // limits values\n const cpuLimitsValue = isEmpty(cpuLimits)\n ? '-'\n : `${cpuLimits?.amount}${cpuLimits?.format}`;\n const memoryLimitsValue = isEmpty(memoryLimits)\n ? '-'\n : `${memoryLimits?.amount}${memoryLimits?.format}`;\n\n // requests values\n const cpuRequestsValue = isEmpty(cpuRequests)\n ? '-'\n : `${cpuRequests?.amount}${cpuRequests?.format}`;\n const memoryRequestsValue = isEmpty(memoryRequests)\n ? '-'\n : `${memoryRequests?.amount}${memoryRequests?.format}`;\n\n const currentYAMLCodeData: YamlCodeData = {\n limits: {\n cpu: cpuLimitsValue,\n memory: memoryLimitsValue,\n },\n requests: {\n cpu: cpuRequestsValue,\n memory: memoryRequestsValue,\n },\n };\n\n return currentYAMLCodeData;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n OptimizationsClient,\n OrchestratorSlimClient,\n CostManagementSlimClient,\n} from '@red-hat-developer-hub/plugin-cost-management-common/clients';\nimport {\n optimizationsApiRef,\n orchestratorSlimApiRef,\n costManagementSlimApiRef,\n} from './apis';\nimport {\n optimizationsBreakdownRouteRef,\n openShiftRouteRef,\n rootRouteRef,\n} from './routes';\n\n/** @public */\nexport const resourceOptimizationPlugin = createPlugin({\n id: 'cost-management',\n apis: [\n createApiFactory({\n api: optimizationsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new OptimizationsClient({\n discoveryApi,\n fetchApi,\n });\n },\n }),\n createApiFactory({\n api: orchestratorSlimApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory({ discoveryApi, fetchApi, identityApi }) {\n return new OrchestratorSlimClient({\n discoveryApi,\n fetchApi,\n identityApi,\n });\n },\n }),\n createApiFactory({\n api: costManagementSlimApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new CostManagementSlimClient({\n discoveryApi,\n fetchApi,\n });\n },\n }),\n ],\n routes: {\n root: rootRouteRef,\n openShift: openShiftRouteRef,\n breakdown: optimizationsBreakdownRouteRef,\n },\n});\n\n/** @public */\nexport const ResourceOptimizationPage = resourceOptimizationPlugin.provide(\n createRoutableExtension({\n name: 'ResourceOptimizationPage',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/** @public */\nexport const OpenShiftPage = resourceOptimizationPlugin.provide(\n createRoutableExtension({\n name: 'OpenShiftPage',\n component: () =>\n import('./pages/openshift/OpenShiftPage').then(m => m.OpenShiftPage),\n mountPoint: openShiftRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAyCO,MAAM,6BAA6B,YAAa,CAAA;AAAA,EACrD,EAAI,EAAA,iBAAA;AAAA,EACJ,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,mBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,mBAAoB,CAAA;AAAA,UAC7B,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD,CAAA;AAAA,IACD,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,sBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA,WAAA;AAAA,QACV,WAAa,EAAA;AAAA,OACf;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAU,aAAe,EAAA;AAC/C,QAAA,OAAO,IAAI,sBAAuB,CAAA;AAAA,UAChC,YAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD,CAAA;AAAA,IACD,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,wBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,QAAU,EAAA;AAAA,OACZ;AAAA,MACA,OAAQ,CAAA,EAAE,YAAc,EAAA,QAAA,EAAY,EAAA;AAClC,QAAA,OAAO,IAAI,wBAAyB,CAAA;AAAA,UAClC,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA;AACH,KACD;AAAA,GACH;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,IACN,SAAW,EAAA,iBAAA;AAAA,IACX,SAAW,EAAA;AAAA;AAEf,CAAC;AAGM,MAAM,2BAA2B,0BAA2B,CAAA,OAAA;AAAA,EACjE,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,0BAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,iBAAU,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACtD,UAAY,EAAA;AAAA,GACb;AACH;AAGO,MAAM,gBAAgB,0BAA2B,CAAA,OAAA;AAAA,EACtD,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,eAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,wCAAiC,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,aAAa,CAAA;AAAA,IACrE,UAAY,EAAA;AAAA,GACb;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n OptimizationsClient,\n OrchestratorSlimClient,\n CostManagementSlimClient,\n} from '@red-hat-developer-hub/plugin-cost-management-common/clients';\nimport {\n optimizationsApiRef,\n orchestratorSlimApiRef,\n costManagementSlimApiRef,\n} from './apis';\nimport {\n optimizationsBreakdownRouteRef,\n openShiftRouteRef,\n rootRouteRef,\n} from './routes';\n\n/** @public */\nexport const resourceOptimizationPlugin = createPlugin({\n id: 'cost-management',\n apis: [\n createApiFactory({\n api: optimizationsApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new OptimizationsClient({\n discoveryApi,\n fetchApi,\n });\n },\n }),\n createApiFactory({\n api: orchestratorSlimApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory({ discoveryApi, fetchApi, identityApi }) {\n return new OrchestratorSlimClient({\n discoveryApi,\n fetchApi,\n identityApi,\n });\n },\n }),\n createApiFactory({\n api: costManagementSlimApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n fetchApi: fetchApiRef,\n },\n factory({ discoveryApi, fetchApi }) {\n return new CostManagementSlimClient({\n discoveryApi,\n fetchApi,\n });\n },\n }),\n ],\n routes: {\n root: rootRouteRef,\n openShift: openShiftRouteRef,\n breakdown: optimizationsBreakdownRouteRef,\n },\n});\n\n/** @public */\nexport const ResourceOptimizationPage = resourceOptimizationPlugin.provide(\n createRoutableExtension({\n name: 'ResourceOptimizationPage',\n component: () => import('./Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/** @public */\nexport const OpenShiftPage = resourceOptimizationPlugin.provide(\n createRoutableExtension({\n name: 'OpenShiftPage',\n component: () =>\n import('./pages/openshift/OpenShiftPage').then(m => m.OpenShiftPage),\n mountPoint: openShiftRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAyCO,MAAM,6BAA6B,YAAA,CAAa;AAAA,EACrD,EAAA,EAAI,iBAAA;AAAA,EACJ,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,mBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,QAAA,OAAO,IAAI,mBAAA,CAAoB;AAAA,UAC7B,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,IACD,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,sBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU,WAAA;AAAA,QACV,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAU,aAAY,EAAG;AAC/C,QAAA,OAAO,IAAI,sBAAA,CAAuB;AAAA,UAChC,YAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,IACD,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,wBAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,CAAQ,EAAE,YAAA,EAAc,QAAA,EAAS,EAAG;AAClC,QAAA,OAAO,IAAI,wBAAA,CAAyB;AAAA,UAClC,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAAA,KACD;AAAA,GACH;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,iBAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf,CAAC;AAGM,MAAM,2BAA2B,0BAAA,CAA2B,OAAA;AAAA,EACjE,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,0BAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,iBAAU,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACtD,UAAA,EAAY;AAAA,GACb;AACH;AAGO,MAAM,gBAAgB,0BAAA,CAA2B,OAAA;AAAA,EACtD,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,eAAA;AAAA,IACN,SAAA,EAAW,MACT,OAAO,wCAAiC,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,aAAa,CAAA;AAAA,IACrE,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'ros.page.optimizations',\n});\n\nexport const openShiftRouteRef = createRouteRef({\n id: 'ros.page.openshift',\n});\n\nexport const optimizationsBreakdownRouteRef = createSubRouteRef({\n id: 'ros.page.breakdown',\n parent: rootRouteRef,\n path: '/:id/*',\n});\n"],"names":[],"mappings":";;AAkBO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,oBAAoB,cAAe,CAAA;AAAA,EAC9C,EAAI,EAAA;AACN,CAAC;AAEM,MAAM,iCAAiC,iBAAkB,CAAA;AAAA,EAC9D,EAAI,EAAA,oBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"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 { createRouteRef, createSubRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'ros.page.optimizations',\n});\n\nexport const openShiftRouteRef = createRouteRef({\n id: 'ros.page.openshift',\n});\n\nexport const optimizationsBreakdownRouteRef = createSubRouteRef({\n id: 'ros.page.breakdown',\n parent: rootRouteRef,\n path: '/:id/*',\n});\n"],"names":[],"mappings":";;AAkBO,MAAM,eAAe,cAAA,CAAe;AAAA,EACzC,EAAA,EAAI;AACN,CAAC;AAEM,MAAM,oBAAoB,cAAA,CAAe;AAAA,EAC9C,EAAA,EAAI;AACN,CAAC;AAEM,MAAM,iCAAiC,iBAAA,CAAkB;AAAA,EAC9D,EAAA,EAAI,oBAAA;AAAA,EACJ,MAAA,EAAQ,YAAA;AAAA,EACR,IAAA,EAAM;AACR,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"dates.esm.js","sources":["../../src/utils/dates.ts"],"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\nexport const getTimeFromNow = (lastDate: string = 'N/A') => {\n if (lastDate === 'N/A') {\n return lastDate;\n }\n\n const intl = new Intl.RelativeTimeFormat('en', { style: 'long' });\n const WEEK_IN_MILLIS = 6.048e8;\n const DAY_IN_MILLIS = 8.64e7;\n const HOUR_IN_MILLIS = 3.6e6;\n const MIN_IN_MILLIS = 6e4;\n const SEC_IN_MILLIS = 1e3;\n\n const getUTCTime = (date: Date) =>\n date.getTime() - date.getTimezoneOffset() * 60000;\n const currentUTCTime = getUTCTime(new Date());\n const lastUTCTime = lastDate\n ? getUTCTime(new Date(lastDate))\n : currentUTCTime;\n const diff = currentUTCTime - lastUTCTime;\n\n if (Math.abs(diff) > WEEK_IN_MILLIS) {\n return intl.format(Math.trunc(-(diff / WEEK_IN_MILLIS)), 'week');\n } else if (Math.abs(diff) > DAY_IN_MILLIS) {\n return intl.format(Math.trunc(-(diff / DAY_IN_MILLIS)), 'day');\n } else if (Math.abs(diff) > HOUR_IN_MILLIS) {\n return intl.format(\n Math.trunc(-(diff % DAY_IN_MILLIS) / HOUR_IN_MILLIS),\n 'hour',\n );\n } else if (Math.abs(diff) > MIN_IN_MILLIS) {\n return intl.format(\n Math.trunc(-(diff % HOUR_IN_MILLIS) / MIN_IN_MILLIS),\n 'minute',\n );\n }\n\n return intl.format(\n Math.trunc(-(diff % MIN_IN_MILLIS) / SEC_IN_MILLIS),\n 'second',\n );\n};\n"],"names":[],"mappings":"AAgBa,MAAA,cAAA,GAAiB,CAAC,QAAA,GAAmB,KAAU,KAAA;AAC1D,EAAA,IAAI,aAAa,KAAO,EAAA;AACtB,IAAO,OAAA,QAAA;AAAA;AAGT,EAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,kBAAA,CAAmB,MAAM,EAAE,KAAA,EAAO,QAAQ,CAAA;AAChE,EAAA,MAAM,cAAiB,GAAA,MAAA;AACvB,EAAA,MAAM,aAAgB,GAAA,KAAA;AACtB,EAAA,MAAM,cAAiB,GAAA,IAAA;AACvB,EAAA,MAAM,aAAgB,GAAA,GAAA;AACtB,EAAA,MAAM,aAAgB,GAAA,GAAA;AAEtB,EAAM,MAAA,UAAA,GAAa,CAAC,IAClB,KAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,mBAAsB,GAAA,GAAA;AAC9C,EAAA,MAAM,cAAiB,GAAA,UAAA,iBAAe,IAAA,IAAA,EAAM,CAAA;AAC5C,EAAA,MAAM,cAAc,QAChB,GAAA,UAAA,CAAW,IAAI,IAAK,CAAA,QAAQ,CAAC,CAC7B,GAAA,cAAA;AACJ,EAAA,MAAM,OAAO,cAAiB,GAAA,WAAA;AAE9B,EAAA,IAAI,IAAK,CAAA,GAAA,CAAI,IAAI,CAAA,GAAI,cAAgB,EAAA;AACnC,IAAO,OAAA,IAAA,CAAK,OAAO,IAAK,CAAA,KAAA,CAAM,EAAE,IAAO,GAAA,cAAA,CAAe,GAAG,MAAM,CAAA;AAAA,GACtD,MAAA,IAAA,IAAA,CAAK,GAAI,CAAA,IAAI,IAAI,aAAe,EAAA;AACzC,IAAO,OAAA,IAAA,CAAK,OAAO,IAAK,CAAA,KAAA,CAAM,EAAE,IAAO,GAAA,aAAA,CAAc,GAAG,KAAK,CAAA;AAAA,GACpD,MAAA,IAAA,IAAA,CAAK,GAAI,CAAA,IAAI,IAAI,cAAgB,EAAA;AAC1C,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA,MACV,IAAK,CAAA,KAAA,CAAM,EAAE,IAAA,GAAO,iBAAiB,cAAc,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,GACS,MAAA,IAAA,IAAA,CAAK,GAAI,CAAA,IAAI,IAAI,aAAe,EAAA;AACzC,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA,MACV,IAAK,CAAA,KAAA,CAAM,EAAE,IAAA,GAAO,kBAAkB,aAAa,CAAA;AAAA,MACnD;AAAA,KACF;AAAA;AAGF,EAAA,OAAO,IAAK,CAAA,MAAA;AAAA,IACV,IAAK,CAAA,KAAA,CAAM,EAAE,IAAA,GAAO,iBAAiB,aAAa,CAAA;AAAA,IAClD;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"dates.esm.js","sources":["../../src/utils/dates.ts"],"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\nexport const getTimeFromNow = (lastDate: string = 'N/A') => {\n if (lastDate === 'N/A') {\n return lastDate;\n }\n\n const intl = new Intl.RelativeTimeFormat('en', { style: 'long' });\n const WEEK_IN_MILLIS = 6.048e8;\n const DAY_IN_MILLIS = 8.64e7;\n const HOUR_IN_MILLIS = 3.6e6;\n const MIN_IN_MILLIS = 6e4;\n const SEC_IN_MILLIS = 1e3;\n\n const getUTCTime = (date: Date) =>\n date.getTime() - date.getTimezoneOffset() * 60000;\n const currentUTCTime = getUTCTime(new Date());\n const lastUTCTime = lastDate\n ? getUTCTime(new Date(lastDate))\n : currentUTCTime;\n const diff = currentUTCTime - lastUTCTime;\n\n if (Math.abs(diff) > WEEK_IN_MILLIS) {\n return intl.format(Math.trunc(-(diff / WEEK_IN_MILLIS)), 'week');\n } else if (Math.abs(diff) > DAY_IN_MILLIS) {\n return intl.format(Math.trunc(-(diff / DAY_IN_MILLIS)), 'day');\n } else if (Math.abs(diff) > HOUR_IN_MILLIS) {\n return intl.format(\n Math.trunc(-(diff % DAY_IN_MILLIS) / HOUR_IN_MILLIS),\n 'hour',\n );\n } else if (Math.abs(diff) > MIN_IN_MILLIS) {\n return intl.format(\n Math.trunc(-(diff % HOUR_IN_MILLIS) / MIN_IN_MILLIS),\n 'minute',\n );\n }\n\n return intl.format(\n Math.trunc(-(diff % MIN_IN_MILLIS) / SEC_IN_MILLIS),\n 'second',\n );\n};\n"],"names":[],"mappings":"AAgBO,MAAM,cAAA,GAAiB,CAAC,QAAA,GAAmB,KAAA,KAAU;AAC1D,EAAA,IAAI,aAAa,KAAA,EAAO;AACtB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,kBAAA,CAAmB,MAAM,EAAE,KAAA,EAAO,QAAQ,CAAA;AAChE,EAAA,MAAM,cAAA,GAAiB,MAAA;AACvB,EAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,EAAA,MAAM,cAAA,GAAiB,IAAA;AACvB,EAAA,MAAM,aAAA,GAAgB,GAAA;AACtB,EAAA,MAAM,aAAA,GAAgB,GAAA;AAEtB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAClB,IAAA,CAAK,SAAQ,GAAI,IAAA,CAAK,mBAAkB,GAAI,GAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,UAAA,iBAAW,IAAI,IAAA,EAAM,CAAA;AAC5C,EAAA,MAAM,cAAc,QAAA,GAChB,UAAA,CAAW,IAAI,IAAA,CAAK,QAAQ,CAAC,CAAA,GAC7B,cAAA;AACJ,EAAA,MAAM,OAAO,cAAA,GAAiB,WAAA;AAE9B,EAAA,IAAI,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI,cAAA,EAAgB;AACnC,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,GAAO,cAAA,CAAe,GAAG,MAAM,CAAA;AAAA,EACjE,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,aAAA,EAAe;AACzC,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,GAAO,aAAA,CAAc,GAAG,KAAK,CAAA;AAAA,EAC/D,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,cAAA,EAAgB;AAC1C,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,GAAO,iBAAiB,cAAc,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF,CAAA,MAAA,IAAW,IAAA,CAAK,GAAA,CAAI,IAAI,IAAI,aAAA,EAAe;AACzC,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,MACV,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,GAAO,kBAAkB,aAAa,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA,CAAK,MAAA;AAAA,IACV,IAAA,CAAK,KAAA,CAAM,EAAE,IAAA,GAAO,iBAAiB,aAAa,CAAA;AAAA,IAClD;AAAA,GACF;AACF;;;;"}