@backstage-community/plugin-cost-insights 0.27.0 → 0.29.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 (134) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/alerts/ProjectGrowthAlert.esm.js.map +1 -1
  3. package/dist/alerts/UnlabeledDataflowAlert.esm.js.map +1 -1
  4. package/dist/alpha/plugin.esm.js +1 -1
  5. package/dist/alpha/plugin.esm.js.map +1 -1
  6. package/dist/alpha/router.esm.js.map +1 -1
  7. package/dist/alpha.d.ts +31 -10
  8. package/dist/api/CostInsightsApi.esm.js.map +1 -1
  9. package/dist/components/ActionItems/ActionItemCard.esm.js.map +1 -1
  10. package/dist/components/ActionItems/ActionItems.esm.js.map +1 -1
  11. package/dist/components/AlertInsights/AlertDialog.esm.js.map +1 -1
  12. package/dist/components/AlertInsights/AlertInsights.esm.js.map +1 -1
  13. package/dist/components/AlertInsights/AlertInsightsHeader.esm.js.map +1 -1
  14. package/dist/components/AlertInsights/AlertInsightsSection.esm.js.map +1 -1
  15. package/dist/components/AlertInsights/AlertInsightsSectionHeader.esm.js.map +1 -1
  16. package/dist/components/AlertInsights/AlertStatusSummary.esm.js.map +1 -1
  17. package/dist/components/AlertInsights/AlertStatusSummaryButton.esm.js.map +1 -1
  18. package/dist/components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js.map +1 -1
  19. package/dist/components/BarChart/BarChart.esm.js.map +1 -1
  20. package/dist/components/BarChart/BarChartLabel.esm.js.map +1 -1
  21. package/dist/components/BarChart/BarChartLegend.esm.js.map +1 -1
  22. package/dist/components/BarChart/BarChartStepper.esm.js.map +1 -1
  23. package/dist/components/BarChart/BarChartStepperButton.esm.js.map +1 -1
  24. package/dist/components/BarChart/BarChartSteps.esm.js.map +1 -1
  25. package/dist/components/BarChart/BarChartTick.esm.js.map +1 -1
  26. package/dist/components/BarChart/BarChartTooltip.esm.js.map +1 -1
  27. package/dist/components/BarChart/BarChartTooltipItem.esm.js.map +1 -1
  28. package/dist/components/CopyUrlToClipboard/CopyUrlToClipboard.esm.js.map +1 -1
  29. package/dist/components/CostGrowth/CostGrowth.esm.js.map +1 -1
  30. package/dist/components/CostGrowth/CostGrowthIndicator.esm.js.map +1 -1
  31. package/dist/components/CostInsightsHeader/CostInsightsHeader.esm.js.map +1 -1
  32. package/dist/components/CostInsightsLayout/CostInsightsLayout.esm.js.map +1 -1
  33. package/dist/components/CostInsightsNavigation/CostInsightsNavigation.esm.js.map +1 -1
  34. package/dist/components/CostInsightsPage/CostInsightsPage.esm.js.map +1 -1
  35. package/dist/components/CostInsightsPage/CostInsightsPageRoot.esm.js.map +1 -1
  36. package/dist/components/CostInsightsPage/CostInsightsThemeProvider.esm.js.map +1 -1
  37. package/dist/components/CostInsightsPage/index.esm.js +5 -1
  38. package/dist/components/CostInsightsPage/index.esm.js.map +1 -1
  39. package/dist/components/CostInsightsPage/selector.esm.js +1 -1
  40. package/dist/components/CostInsightsPage/selector.esm.js.map +1 -1
  41. package/dist/components/CostInsightsTabs/CostInsightsTabs.esm.js.map +1 -1
  42. package/dist/components/CostInsightsTabs/selector.esm.js.map +1 -1
  43. package/dist/components/CostOverviewCard/CostOverviewBreakdownChart.esm.js.map +1 -1
  44. package/dist/components/CostOverviewCard/CostOverviewCard.esm.js.map +1 -1
  45. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js +1 -1
  46. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js.map +1 -1
  47. package/dist/components/CostOverviewCard/CostOverviewHeader.esm.js.map +1 -1
  48. package/dist/components/CostOverviewCard/CostOverviewLegend.esm.js.map +1 -1
  49. package/dist/components/CostOverviewCard/selector.esm.js.map +1 -1
  50. package/dist/components/CurrencySelect/CurrencySelect.esm.js.map +1 -1
  51. package/dist/components/EntityCosts/EntityCosts.esm.js.map +1 -1
  52. package/dist/components/EntityCosts/index.esm.js +5 -1
  53. package/dist/components/EntityCosts/index.esm.js.map +1 -1
  54. package/dist/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.esm.js.map +1 -1
  55. package/dist/components/LabelDataflowInstructionsPage/index.esm.js +5 -1
  56. package/dist/components/LabelDataflowInstructionsPage/index.esm.js.map +1 -1
  57. package/dist/components/LegendItem/LegendItem.esm.js.map +1 -1
  58. package/dist/components/MetricSelect/MetricSelect.esm.js.map +1 -1
  59. package/dist/components/PeriodSelect/DateRangePicker.esm.js.map +1 -1
  60. package/dist/components/ProductInsights/ProductInsights.esm.js.map +1 -1
  61. package/dist/components/ProductInsightsCard/ProductEntityDialog.esm.js.map +1 -1
  62. package/dist/components/ProductInsightsCard/ProductEntityTable.esm.js.map +1 -1
  63. package/dist/components/ProductInsightsCard/ProductInsightsCard.esm.js.map +1 -1
  64. package/dist/components/ProductInsightsCard/ProductInsightsCardList.esm.js.map +1 -1
  65. package/dist/components/ProductInsightsCard/ProductInsightsChart.esm.js.map +1 -1
  66. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertCard.esm.js.map +1 -1
  67. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.esm.js.map +1 -1
  68. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js +0 -1
  69. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js.map +1 -1
  70. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js +5 -1
  71. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js.map +1 -1
  72. package/dist/components/ProjectSelect/ProjectSelect.esm.js.map +1 -1
  73. package/dist/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.esm.js.map +1 -1
  74. package/dist/components/WhyCostsMatter/WhyCostsMatter.esm.js.map +1 -1
  75. package/dist/example/alerts/KubernetesMigrationAlert.esm.js.map +1 -1
  76. package/dist/example/client.esm.js +1 -1
  77. package/dist/example/client.esm.js.map +1 -1
  78. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.esm.js.map +1 -1
  79. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.esm.js.map +1 -1
  80. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.esm.js.map +1 -1
  81. package/dist/example/forms/KubernetesMigrationDismissForm.esm.js.map +1 -1
  82. package/dist/forms/AlertAcceptForm.esm.js.map +1 -1
  83. package/dist/forms/AlertDismissForm.esm.js.map +1 -1
  84. package/dist/forms/AlertSnoozeForm.esm.js.map +1 -1
  85. package/dist/hooks/useConfig.esm.js +2 -2
  86. package/dist/hooks/useConfig.esm.js.map +1 -1
  87. package/dist/hooks/useCurrency.esm.js +1 -1
  88. package/dist/hooks/useCurrency.esm.js.map +1 -1
  89. package/dist/hooks/useFilters.esm.js +1 -1
  90. package/dist/hooks/useFilters.esm.js.map +1 -1
  91. package/dist/hooks/useGroups.esm.js +1 -1
  92. package/dist/hooks/useGroups.esm.js.map +1 -1
  93. package/dist/hooks/useLastCompleteBillingDate.esm.js +1 -1
  94. package/dist/hooks/useLastCompleteBillingDate.esm.js.map +1 -1
  95. package/dist/hooks/useLoading.esm.js +1 -1
  96. package/dist/hooks/useLoading.esm.js.map +1 -1
  97. package/dist/hooks/useScroll.esm.js +1 -1
  98. package/dist/hooks/useScroll.esm.js.map +1 -1
  99. package/dist/index.d.ts +0 -1
  100. package/dist/plugin.esm.js +1 -1
  101. package/dist/plugin.esm.js.map +1 -1
  102. package/dist/routes.esm.js.map +1 -1
  103. package/dist/testUtils/filters.esm.js.map +1 -1
  104. package/dist/testUtils/loading.esm.js.map +1 -1
  105. package/dist/testUtils/mockData.esm.js.map +1 -1
  106. package/dist/testUtils/products.esm.js.map +1 -1
  107. package/dist/testUtils/providers.esm.js.map +1 -1
  108. package/dist/testUtils/testUtils.esm.js.map +1 -1
  109. package/dist/types/Alert.esm.js.map +1 -1
  110. package/dist/types/ChangeStatistic.esm.js.map +1 -1
  111. package/dist/types/CurrencyType.esm.js.map +1 -1
  112. package/dist/types/DateFormat.esm.js.map +1 -1
  113. package/dist/types/Duration.esm.js.map +1 -1
  114. package/dist/types/Icon.esm.js.map +1 -1
  115. package/dist/utils/alerts.esm.js.map +1 -1
  116. package/dist/utils/assert.esm.js.map +1 -1
  117. package/dist/utils/change.esm.js.map +1 -1
  118. package/dist/utils/charts.esm.js.map +1 -1
  119. package/dist/utils/config.esm.js.map +1 -1
  120. package/dist/utils/currency.esm.js.map +1 -1
  121. package/dist/utils/duration.esm.js.map +1 -1
  122. package/dist/utils/filters.esm.js.map +1 -1
  123. package/dist/utils/formatters.esm.js.map +1 -1
  124. package/dist/utils/grammar.esm.js.map +1 -1
  125. package/dist/utils/graphs.esm.js +1 -1
  126. package/dist/utils/graphs.esm.js.map +1 -1
  127. package/dist/utils/history.esm.js.map +1 -1
  128. package/dist/utils/loading.esm.js.map +1 -1
  129. package/dist/utils/navigation.esm.js.map +1 -1
  130. package/dist/utils/scroll.esm.js.map +1 -1
  131. package/dist/utils/sort.esm.js.map +1 -1
  132. package/dist/utils/styles.esm.js.map +1 -1
  133. package/dist/utils/sum.esm.js.map +1 -1
  134. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"BarChart.esm.js","sources":["../../../src/components/BarChart/BarChart.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useState, useCallback } from 'react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Tooltip as RechartsTooltip,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts';\nimport Box from '@material-ui/core/Box';\nimport { useTheme } from '@material-ui/core/styles';\nimport { BarChartTick } from './BarChartTick';\nimport { BarChartStepper } from './BarChartStepper';\nimport { BarChartTooltip } from './BarChartTooltip';\nimport { BarChartTooltipItem } from './BarChartTooltipItem';\nimport { currencyFormatter } from '../../utils/formatters';\nimport {\n ResourceData,\n DataKey,\n CostInsightsTheme,\n BarChartOptions,\n} from '../../types';\nimport { notEmpty } from '../../utils/assert';\nimport { useBarChartStyles } from '../../utils/styles';\nimport { resourceSort } from '../../utils/sort';\nimport { isInvalid, titleOf, tooltipItemOf } from '../../utils/graphs';\nimport { TooltipRenderer } from '../../types';\nimport { useConfig } from '../../hooks';\n\nconst defaultTooltip = (baseCurrency: Intl.NumberFormat) => {\n const tooltip: TooltipRenderer = ({ label, payload = [] }) => {\n if (isInvalid({ label, payload })) return null;\n\n const title = titleOf(label);\n const items = payload.map(tooltipItemOf(baseCurrency)).filter(notEmpty);\n return (\n <BarChartTooltip title={title}>\n {items.map((item, index) => (\n <BarChartTooltipItem key={`${item.label}-${index}`} item={item} />\n ))}\n </BarChartTooltip>\n );\n };\n return tooltip;\n};\n\n/** @public */\nexport type BarChartProps = {\n resources: ResourceData[];\n responsive?: boolean;\n displayAmount?: number;\n options?: Partial<BarChartOptions>;\n tooltip?: TooltipRenderer;\n onClick?: (...args: any[]) => void;\n onMouseMove?: (...args: any[]) => void;\n};\n\n/** @public */\nexport const BarChart = (props: BarChartProps) => {\n const { baseCurrency } = useConfig();\n\n const {\n resources,\n responsive = true,\n displayAmount = 6,\n options = {},\n tooltip = defaultTooltip(baseCurrency),\n onClick,\n onMouseMove,\n } = props;\n\n const theme = useTheme<CostInsightsTheme>();\n const styles = useBarChartStyles(theme);\n const [activeChart, setActiveChart] = useState(false);\n const [stepWindow, setStepWindow] = useState(() => [0, displayAmount]);\n\n const data = Object.assign(\n {\n previousFill: theme.palette.lightBlue,\n currentFill: theme.palette.darkBlue,\n previousName: 'Previous',\n currentName: 'Current',\n },\n options,\n );\n\n const [stepStart, stepEnd] = stepWindow;\n const steps = Math.ceil(resources.length / displayAmount);\n const disableStepper = resources.length <= displayAmount;\n\n const sortedResources = resources\n .sort(resourceSort)\n .slice(stepStart, stepEnd);\n\n // Pin the domain to the largest value in the series.\n // Intentionally redundant - This could simply be derived from the first element in the already sorted list,\n // but that may not be the case in the future when custom sorting is implemented.\n const globalResourcesMax = resources.reduce(\n (max, r: ResourceData) => Math.max(max, r.current, r.previous),\n 0,\n );\n\n const onStepChange = useCallback(\n (activeStep: number) => {\n const start = activeStep * displayAmount;\n const end = start + displayAmount;\n if (end > resources.length) {\n setStepWindow([start, resources.length]);\n } else {\n setStepWindow([start, end]);\n }\n },\n [setStepWindow, resources, displayAmount],\n );\n\n return (\n <Box\n position=\"relative\"\n onMouseLeave={() => setActiveChart(false)}\n onMouseEnter={() => setActiveChart(true)}\n data-testid=\"bar-chart-wrapper\"\n >\n {/* Setting fixed values for height and width generates a console warning in testing but enables ResponsiveContainer to render its children. */}\n <ResponsiveContainer\n height={styles.container.height}\n width={responsive ? '100%' : styles.container.width}\n >\n <RechartsBarChart\n style={{ cursor: onClick ? 'pointer' : null }}\n onClick={onClick}\n onMouseMove={onMouseMove}\n data={sortedResources}\n margin={styles.barChart.margin}\n barSize={45}\n data-testid=\"bar-chart\"\n >\n {tooltip && (\n <RechartsTooltip\n filterNull\n cursor={styles.cursor}\n animationDuration={100}\n content={tooltip}\n />\n )}\n <CartesianGrid\n vertical={false}\n stroke={styles.cartesianGrid.stroke}\n />\n <XAxis\n dataKey={DataKey.Name}\n tickLine={false}\n interval={0}\n height={styles.xAxis.height}\n tick={BarChartTick}\n />\n <YAxis\n tickFormatter={currencyFormatter(baseCurrency).format}\n domain={[() => 0, globalResourcesMax]}\n tick={styles.axis}\n />\n <Bar\n dataKey={DataKey.Previous}\n name={data.previousName}\n fill={data.previousFill}\n isAnimationActive={false}\n />\n <Bar\n dataKey={DataKey.Current}\n name={data.currentName}\n fill={data.currentFill}\n isAnimationActive={false}\n />\n </RechartsBarChart>\n </ResponsiveContainer>\n {!disableStepper && (\n <BarChartStepper\n steps={steps}\n disableScroll={!activeChart}\n onChange={onStepChange}\n />\n )}\n </Box>\n );\n};\n"],"names":["RechartsBarChart","RechartsTooltip"],"mappings":"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"}
1
+ {"version":3,"file":"BarChart.esm.js","sources":["../../../src/components/BarChart/BarChart.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useState, useCallback } from 'react';\nimport {\n Bar,\n BarChart as RechartsBarChart,\n CartesianGrid,\n Tooltip as RechartsTooltip,\n ResponsiveContainer,\n XAxis,\n YAxis,\n} from 'recharts';\nimport Box from '@material-ui/core/Box';\nimport { useTheme } from '@material-ui/core/styles';\nimport { BarChartTick } from './BarChartTick';\nimport { BarChartStepper } from './BarChartStepper';\nimport { BarChartTooltip } from './BarChartTooltip';\nimport { BarChartTooltipItem } from './BarChartTooltipItem';\nimport { currencyFormatter } from '../../utils/formatters';\nimport {\n ResourceData,\n DataKey,\n CostInsightsTheme,\n BarChartOptions,\n} from '../../types';\nimport { notEmpty } from '../../utils/assert';\nimport { useBarChartStyles } from '../../utils/styles';\nimport { resourceSort } from '../../utils/sort';\nimport { isInvalid, titleOf, tooltipItemOf } from '../../utils/graphs';\nimport { TooltipRenderer } from '../../types';\nimport { useConfig } from '../../hooks';\n\nconst defaultTooltip = (baseCurrency: Intl.NumberFormat) => {\n const tooltip: TooltipRenderer = ({ label, payload = [] }) => {\n if (isInvalid({ label, payload })) return null;\n\n const title = titleOf(label);\n const items = payload.map(tooltipItemOf(baseCurrency)).filter(notEmpty);\n return (\n <BarChartTooltip title={title}>\n {items.map((item, index) => (\n <BarChartTooltipItem key={`${item.label}-${index}`} item={item} />\n ))}\n </BarChartTooltip>\n );\n };\n return tooltip;\n};\n\n/** @public */\nexport type BarChartProps = {\n resources: ResourceData[];\n responsive?: boolean;\n displayAmount?: number;\n options?: Partial<BarChartOptions>;\n tooltip?: TooltipRenderer;\n onClick?: (...args: any[]) => void;\n onMouseMove?: (...args: any[]) => void;\n};\n\n/** @public */\nexport const BarChart = (props: BarChartProps) => {\n const { baseCurrency } = useConfig();\n\n const {\n resources,\n responsive = true,\n displayAmount = 6,\n options = {},\n tooltip = defaultTooltip(baseCurrency),\n onClick,\n onMouseMove,\n } = props;\n\n const theme = useTheme<CostInsightsTheme>();\n const styles = useBarChartStyles(theme);\n const [activeChart, setActiveChart] = useState(false);\n const [stepWindow, setStepWindow] = useState(() => [0, displayAmount]);\n\n const data = Object.assign(\n {\n previousFill: theme.palette.lightBlue,\n currentFill: theme.palette.darkBlue,\n previousName: 'Previous',\n currentName: 'Current',\n },\n options,\n );\n\n const [stepStart, stepEnd] = stepWindow;\n const steps = Math.ceil(resources.length / displayAmount);\n const disableStepper = resources.length <= displayAmount;\n\n const sortedResources = resources\n .sort(resourceSort)\n .slice(stepStart, stepEnd);\n\n // Pin the domain to the largest value in the series.\n // Intentionally redundant - This could simply be derived from the first element in the already sorted list,\n // but that may not be the case in the future when custom sorting is implemented.\n const globalResourcesMax = resources.reduce(\n (max, r: ResourceData) => Math.max(max, r.current, r.previous),\n 0,\n );\n\n const onStepChange = useCallback(\n (activeStep: number) => {\n const start = activeStep * displayAmount;\n const end = start + displayAmount;\n if (end > resources.length) {\n setStepWindow([start, resources.length]);\n } else {\n setStepWindow([start, end]);\n }\n },\n [setStepWindow, resources, displayAmount],\n );\n\n return (\n <Box\n position=\"relative\"\n onMouseLeave={() => setActiveChart(false)}\n onMouseEnter={() => setActiveChart(true)}\n data-testid=\"bar-chart-wrapper\"\n >\n {/* Setting fixed values for height and width generates a console warning in testing but enables ResponsiveContainer to render its children. */}\n <ResponsiveContainer\n height={styles.container.height}\n width={responsive ? '100%' : styles.container.width}\n >\n <RechartsBarChart\n style={{ cursor: onClick ? 'pointer' : null }}\n onClick={onClick}\n onMouseMove={onMouseMove}\n data={sortedResources}\n margin={styles.barChart.margin}\n barSize={45}\n data-testid=\"bar-chart\"\n >\n {tooltip && (\n <RechartsTooltip\n filterNull\n cursor={styles.cursor}\n animationDuration={100}\n content={tooltip}\n />\n )}\n <CartesianGrid\n vertical={false}\n stroke={styles.cartesianGrid.stroke}\n />\n <XAxis\n dataKey={DataKey.Name}\n tickLine={false}\n interval={0}\n height={styles.xAxis.height}\n tick={BarChartTick}\n />\n <YAxis\n tickFormatter={currencyFormatter(baseCurrency).format}\n domain={[() => 0, globalResourcesMax]}\n tick={styles.axis}\n />\n <Bar\n dataKey={DataKey.Previous}\n name={data.previousName}\n fill={data.previousFill}\n isAnimationActive={false}\n />\n <Bar\n dataKey={DataKey.Current}\n name={data.currentName}\n fill={data.currentFill}\n isAnimationActive={false}\n />\n </RechartsBarChart>\n </ResponsiveContainer>\n {!disableStepper && (\n <BarChartStepper\n steps={steps}\n disableScroll={!activeChart}\n onChange={onStepChange}\n />\n )}\n </Box>\n );\n};\n"],"names":["RechartsBarChart","RechartsTooltip"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartLabel.esm.js","sources":["../../../src/components/BarChart/BarChartLabel.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { PropsWithChildren } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { useBarChartLabelStyles } from '../../utils/styles';\n\ntype BarChartLabelProps = {\n x: number;\n y: number;\n height: number;\n width: number;\n details?: JSX.Element;\n};\n\nexport const BarChartLabel = ({\n x,\n y,\n height,\n width,\n details,\n children,\n}: PropsWithChildren<BarChartLabelProps>) => {\n const classes = useBarChartLabelStyles();\n const translateX = width * -0.5;\n\n return (\n <foreignObject\n className={classes.foreignObject}\n style={{ transform: `translateX(${translateX}px)` }}\n x={x}\n y={y}\n height={height}\n width={width}\n >\n <Box display=\"flex\" flexDirection=\"column\" justifyContent=\"center\">\n <Typography className={classes.label} gutterBottom>\n {children}\n </Typography>\n {details}\n </Box>\n </foreignObject>\n );\n};\n"],"names":[],"mappings":";;;;;AA6BO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,CAAA;AAAA,EACA,CAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAA6C,KAAA;AAC3C,EAAA,MAAM,UAAU,sBAAuB,EAAA;AACvC,EAAA,MAAM,aAAa,KAAQ,GAAA,CAAA,GAAA;AAE3B,EACE,uBAAA,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAQ,CAAA,aAAA;AAAA,MACnB,KAAO,EAAA,EAAE,SAAW,EAAA,CAAA,WAAA,EAAc,UAAU,CAAM,GAAA,CAAA,EAAA;AAAA,MAClD,CAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MAEA,+BAAC,GAAI,EAAA,EAAA,OAAA,EAAQ,QAAO,aAAc,EAAA,QAAA,EAAS,gBAAe,QACxD,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAW,SAAW,EAAA,OAAA,CAAQ,KAAO,EAAA,YAAA,EAAY,MAC/C,QACH,EAAA,CAAA;AAAA,QACC;AAAA,OACH,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartLabel.esm.js","sources":["../../../src/components/BarChart/BarChartLabel.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { PropsWithChildren } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { useBarChartLabelStyles } from '../../utils/styles';\n\ntype BarChartLabelProps = {\n x: number;\n y: number;\n height: number;\n width: number;\n details?: JSX.Element;\n};\n\nexport const BarChartLabel = ({\n x,\n y,\n height,\n width,\n details,\n children,\n}: PropsWithChildren<BarChartLabelProps>) => {\n const classes = useBarChartLabelStyles();\n const translateX = width * -0.5;\n\n return (\n <foreignObject\n className={classes.foreignObject}\n style={{ transform: `translateX(${translateX}px)` }}\n x={x}\n y={y}\n height={height}\n width={width}\n >\n <Box display=\"flex\" flexDirection=\"column\" justifyContent=\"center\">\n <Typography className={classes.label} gutterBottom>\n {children}\n </Typography>\n {details}\n </Box>\n </foreignObject>\n );\n};\n"],"names":[],"mappings":";;;;;AA6BO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,CAAA;AAAA,EACA,CAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,KAA6C;AAC3C,EAAA,MAAM,UAAU,sBAAA,EAAuB;AACvC,EAAA,MAAM,aAAa,KAAA,GAAQ,IAAA;AAE3B,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,WAAW,OAAA,CAAQ,aAAA;AAAA,MACnB,KAAA,EAAO,EAAE,SAAA,EAAW,CAAA,WAAA,EAAc,UAAU,CAAA,GAAA,CAAA,EAAM;AAAA,MAClD,CAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MAEA,+BAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,QAAO,aAAA,EAAc,QAAA,EAAS,gBAAe,QAAA,EACxD,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,cAAW,SAAA,EAAW,OAAA,CAAQ,KAAA,EAAO,YAAA,EAAY,MAC/C,QAAA,EACH,CAAA;AAAA,QACC;AAAA,OAAA,EACH;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartLegend.esm.js","sources":["../../../src/components/BarChart/BarChartLegend.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { PropsWithChildren } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useTheme } from '@material-ui/core/styles';\nimport { LegendItem } from '../LegendItem';\nimport { currencyFormatter } from '../../utils/formatters';\nimport { CostInsightsTheme } from '../../types';\nimport { useBarChartLayoutStyles as useStyles } from '../../utils/styles';\nimport { useConfig } from '../../hooks';\n\n/** @public */\nexport type BarChartLegendOptions = {\n previousName: string;\n previousFill: string;\n currentName: string;\n currentFill: string;\n hideMarker?: boolean;\n};\n\n/** @public */\nexport type BarChartLegendProps = {\n costStart: number;\n costEnd: number;\n options?: Partial<BarChartLegendOptions>;\n};\n\n/** @public */\nexport const BarChartLegend = (\n props: PropsWithChildren<BarChartLegendProps>,\n) => {\n const { costStart, costEnd, options = {}, children } = props;\n\n const theme = useTheme<CostInsightsTheme>();\n const classes = useStyles();\n const { baseCurrency } = useConfig();\n\n const data = Object.assign(\n {\n previousName: 'Previous',\n previousFill: theme.palette.lightBlue,\n currentName: 'Current',\n currentFill: theme.palette.darkBlue,\n },\n options,\n );\n\n return (\n <Box className={classes.legend} display=\"flex\" flexDirection=\"row\">\n <Box marginRight={2}>\n <LegendItem\n title={data.previousName}\n markerColor={options.hideMarker ? undefined : data.previousFill}\n >\n {currencyFormatter(baseCurrency).format(costStart)}\n </LegendItem>\n </Box>\n <Box marginRight={2}>\n <LegendItem\n title={data.currentName}\n markerColor={options.hideMarker ? undefined : data.currentFill}\n >\n {currencyFormatter(baseCurrency).format(costEnd)}\n </LegendItem>\n </Box>\n {children}\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;;;;;;;;AA0Ca,MAAA,cAAA,GAAiB,CAC5B,KACG,KAAA;AACH,EAAA,MAAM,EAAE,SAAW,EAAA,OAAA,EAAS,UAAU,EAAC,EAAG,UAAa,GAAA,KAAA;AAEvD,EAAA,MAAM,QAAQ,QAA4B,EAAA;AAC1C,EAAA,MAAM,UAAUA,uBAAU,EAAA;AAC1B,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,SAAU,EAAA;AAEnC,EAAA,MAAM,OAAO,MAAO,CAAA,MAAA;AAAA,IAClB;AAAA,MACE,YAAc,EAAA,UAAA;AAAA,MACd,YAAA,EAAc,MAAM,OAAQ,CAAA,SAAA;AAAA,MAC5B,WAAa,EAAA,SAAA;AAAA,MACb,WAAA,EAAa,MAAM,OAAQ,CAAA;AAAA,KAC7B;AAAA,IACA;AAAA,GACF;AAEA,EACE,uBAAA,IAAA,CAAC,OAAI,SAAW,EAAA,OAAA,CAAQ,QAAQ,OAAQ,EAAA,MAAA,EAAO,eAAc,KAC3D,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,GAAA,EAAA,EAAI,aAAa,CAChB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAK,CAAA,YAAA;AAAA,QACZ,WAAa,EAAA,OAAA,CAAQ,UAAa,GAAA,KAAA,CAAA,GAAY,IAAK,CAAA,YAAA;AAAA,QAElD,QAAkB,EAAA,iBAAA,CAAA,YAAY,CAAE,CAAA,MAAA,CAAO,SAAS;AAAA;AAAA,KAErD,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,GAAI,EAAA,EAAA,WAAA,EAAa,CAChB,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAK,CAAA,WAAA;AAAA,QACZ,WAAa,EAAA,OAAA,CAAQ,UAAa,GAAA,KAAA,CAAA,GAAY,IAAK,CAAA,WAAA;AAAA,QAElD,QAAkB,EAAA,iBAAA,CAAA,YAAY,CAAE,CAAA,MAAA,CAAO,OAAO;AAAA;AAAA,KAEnD,EAAA,CAAA;AAAA,IACC;AAAA,GACH,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartLegend.esm.js","sources":["../../../src/components/BarChart/BarChartLegend.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { PropsWithChildren } from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useTheme } from '@material-ui/core/styles';\nimport { LegendItem } from '../LegendItem';\nimport { currencyFormatter } from '../../utils/formatters';\nimport { CostInsightsTheme } from '../../types';\nimport { useBarChartLayoutStyles as useStyles } from '../../utils/styles';\nimport { useConfig } from '../../hooks';\n\n/** @public */\nexport type BarChartLegendOptions = {\n previousName: string;\n previousFill: string;\n currentName: string;\n currentFill: string;\n hideMarker?: boolean;\n};\n\n/** @public */\nexport type BarChartLegendProps = {\n costStart: number;\n costEnd: number;\n options?: Partial<BarChartLegendOptions>;\n};\n\n/** @public */\nexport const BarChartLegend = (\n props: PropsWithChildren<BarChartLegendProps>,\n) => {\n const { costStart, costEnd, options = {}, children } = props;\n\n const theme = useTheme<CostInsightsTheme>();\n const classes = useStyles();\n const { baseCurrency } = useConfig();\n\n const data = Object.assign(\n {\n previousName: 'Previous',\n previousFill: theme.palette.lightBlue,\n currentName: 'Current',\n currentFill: theme.palette.darkBlue,\n },\n options,\n );\n\n return (\n <Box className={classes.legend} display=\"flex\" flexDirection=\"row\">\n <Box marginRight={2}>\n <LegendItem\n title={data.previousName}\n markerColor={options.hideMarker ? undefined : data.previousFill}\n >\n {currencyFormatter(baseCurrency).format(costStart)}\n </LegendItem>\n </Box>\n <Box marginRight={2}>\n <LegendItem\n title={data.currentName}\n markerColor={options.hideMarker ? undefined : data.currentFill}\n >\n {currencyFormatter(baseCurrency).format(costEnd)}\n </LegendItem>\n </Box>\n {children}\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;;;;;;;;AA0CO,MAAM,cAAA,GAAiB,CAC5B,KAAA,KACG;AACH,EAAA,MAAM,EAAE,SAAA,EAAW,OAAA,EAAS,UAAU,EAAC,EAAG,UAAS,GAAI,KAAA;AAEvD,EAAA,MAAM,QAAQ,QAAA,EAA4B;AAC1C,EAAA,MAAM,UAAUA,uBAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,SAAA,EAAU;AAEnC,EAAA,MAAM,OAAO,MAAA,CAAO,MAAA;AAAA,IAClB;AAAA,MACE,YAAA,EAAc,UAAA;AAAA,MACd,YAAA,EAAc,MAAM,OAAA,CAAQ,SAAA;AAAA,MAC5B,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa,MAAM,OAAA,CAAQ;AAAA,KAC7B;AAAA,IACA;AAAA,GACF;AAEA,EAAA,uBACE,IAAA,CAAC,OAAI,SAAA,EAAW,OAAA,CAAQ,QAAQ,OAAA,EAAQ,MAAA,EAAO,eAAc,KAAA,EAC3D,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,GAAA,EAAA,EAAI,aAAa,CAAA,EAChB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,YAAA;AAAA,QACZ,WAAA,EAAa,OAAA,CAAQ,UAAA,GAAa,MAAA,GAAY,IAAA,CAAK,YAAA;AAAA,QAElD,QAAA,EAAA,iBAAA,CAAkB,YAAY,CAAA,CAAE,MAAA,CAAO,SAAS;AAAA;AAAA,KACnD,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,GAAA,EAAA,EAAI,WAAA,EAAa,CAAA,EAChB,QAAA,kBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAO,IAAA,CAAK,WAAA;AAAA,QACZ,WAAA,EAAa,OAAA,CAAQ,UAAA,GAAa,MAAA,GAAY,IAAA,CAAK,WAAA;AAAA,QAElD,QAAA,EAAA,iBAAA,CAAkB,YAAY,CAAA,CAAE,MAAA,CAAO,OAAO;AAAA;AAAA,KACjD,EACF,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartStepper.esm.js","sources":["../../../src/components/BarChart/BarChartStepper.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useEffect, useState } from 'react';\nimport Paper from '@material-ui/core/Paper';\nimport Slide from '@material-ui/core/Slide';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport { BarChartStepperButton } from './BarChartStepperButton';\nimport { BarChartSteps } from './BarChartSteps';\nimport { useBarChartStepperStyles } from '../../utils/styles';\n\ntype BarChartStepperProps = {\n disableScroll: boolean;\n steps: number;\n onChange: (activeStep: number) => void;\n};\n\nexport const BarChartStepper = ({\n steps,\n disableScroll,\n onChange,\n}: BarChartStepperProps) => {\n const classes = useBarChartStepperStyles();\n const [activeStep, setActiveStep] = useState(0);\n\n /*\n * This calc determines how many active steps to display in the stepper.\n * If the chart is displaying a large amount of resources,\n * the total dots are truncated to 10. As the user clicks forward,\n * eventually, there might be resources \"left over\" in excess of the ten dot limit.\n * Once the user has reached that threshold, the difference should appear constant\n * as the user clicks through the remaining resources and no extra dots should be displayed.\n */\n\n const diff = steps % 10;\n const stepsRemaining = steps - activeStep <= diff ? diff : steps;\n const displayedStep = activeStep % 10;\n\n useEffect(() => {\n onChange(activeStep);\n }, [activeStep, onChange]);\n\n const handleNext = () => {\n setActiveStep(prevStep => prevStep + 1);\n };\n\n const handleBack = () => {\n setActiveStep(prevStep => prevStep - 1);\n };\n\n const handleClick = (index: number) => {\n setActiveStep(prevStep => {\n const offset = index - (prevStep % 10);\n return prevStep + offset;\n });\n };\n\n return (\n <Paper\n data-testid=\"bar-chart-stepper\"\n square\n elevation={0}\n className={classes.paper}\n >\n <Slide\n direction=\"right\"\n in={!disableScroll && activeStep !== 0}\n mountOnEnter\n unmountOnExit\n >\n <BarChartStepperButton\n name=\"back\"\n className={classes.backButton}\n onClick={handleBack}\n >\n <ChevronLeftIcon />\n </BarChartStepperButton>\n </Slide>\n <BarChartSteps\n steps={Math.min(10, stepsRemaining)}\n activeStep={displayedStep}\n onClick={handleClick}\n />\n <Slide\n direction=\"left\"\n in={!disableScroll && activeStep < steps - 1}\n mountOnEnter\n unmountOnExit\n >\n <BarChartStepperButton\n name=\"next\"\n className={classes.nextButton}\n onClick={handleNext}\n >\n <ChevronRightIcon />\n </BarChartStepperButton>\n </Slide>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA+BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAA4B,KAAA;AAC1B,EAAA,MAAM,UAAU,wBAAyB,EAAA;AACzC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,CAAC,CAAA;AAW9C,EAAA,MAAM,OAAO,KAAQ,GAAA,EAAA;AACrB,EAAA,MAAM,cAAiB,GAAA,KAAA,GAAQ,UAAc,IAAA,IAAA,GAAO,IAAO,GAAA,KAAA;AAC3D,EAAA,MAAM,gBAAgB,UAAa,GAAA,EAAA;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,UAAU,CAAA;AAAA,GAClB,EAAA,CAAC,UAAY,EAAA,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,aAAa,MAAM;AACvB,IAAc,aAAA,CAAA,CAAA,QAAA,KAAY,WAAW,CAAC,CAAA;AAAA,GACxC;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAc,aAAA,CAAA,CAAA,QAAA,KAAY,WAAW,CAAC,CAAA;AAAA,GACxC;AAEA,EAAM,MAAA,WAAA,GAAc,CAAC,KAAkB,KAAA;AACrC,IAAA,aAAA,CAAc,CAAY,QAAA,KAAA;AACxB,MAAM,MAAA,MAAA,GAAS,QAAS,QAAW,GAAA,EAAA;AACnC,MAAA,OAAO,QAAW,GAAA,MAAA;AAAA,KACnB,CAAA;AAAA,GACH;AAEA,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,mBAAA;AAAA,MACZ,MAAM,EAAA,IAAA;AAAA,MACN,SAAW,EAAA,CAAA;AAAA,MACX,WAAW,OAAQ,CAAA,KAAA;AAAA,MAEnB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAU,EAAA,OAAA;AAAA,YACV,EAAA,EAAI,CAAC,aAAA,IAAiB,UAAe,KAAA,CAAA;AAAA,YACrC,YAAY,EAAA,IAAA;AAAA,YACZ,aAAa,EAAA,IAAA;AAAA,YAEb,QAAA,kBAAA,GAAA;AAAA,cAAC,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAK,EAAA,MAAA;AAAA,gBACL,WAAW,OAAQ,CAAA,UAAA;AAAA,gBACnB,OAAS,EAAA,UAAA;AAAA,gBAET,8BAAC,eAAgB,EAAA,EAAA;AAAA;AAAA;AACnB;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAO,EAAA,IAAA,CAAK,GAAI,CAAA,EAAA,EAAI,cAAc,CAAA;AAAA,YAClC,UAAY,EAAA,aAAA;AAAA,YACZ,OAAS,EAAA;AAAA;AAAA,SACX;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAU,EAAA,MAAA;AAAA,YACV,EAAI,EAAA,CAAC,aAAiB,IAAA,UAAA,GAAa,KAAQ,GAAA,CAAA;AAAA,YAC3C,YAAY,EAAA,IAAA;AAAA,YACZ,aAAa,EAAA,IAAA;AAAA,YAEb,QAAA,kBAAA,GAAA;AAAA,cAAC,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAK,EAAA,MAAA;AAAA,gBACL,WAAW,OAAQ,CAAA,UAAA;AAAA,gBACnB,OAAS,EAAA,UAAA;AAAA,gBAET,8BAAC,gBAAiB,EAAA,EAAA;AAAA;AAAA;AACpB;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartStepper.esm.js","sources":["../../../src/components/BarChart/BarChartStepper.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useEffect, useState } from 'react';\nimport Paper from '@material-ui/core/Paper';\nimport Slide from '@material-ui/core/Slide';\nimport ChevronLeftIcon from '@material-ui/icons/ChevronLeft';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport { BarChartStepperButton } from './BarChartStepperButton';\nimport { BarChartSteps } from './BarChartSteps';\nimport { useBarChartStepperStyles } from '../../utils/styles';\n\ntype BarChartStepperProps = {\n disableScroll: boolean;\n steps: number;\n onChange: (activeStep: number) => void;\n};\n\nexport const BarChartStepper = ({\n steps,\n disableScroll,\n onChange,\n}: BarChartStepperProps) => {\n const classes = useBarChartStepperStyles();\n const [activeStep, setActiveStep] = useState(0);\n\n /*\n * This calc determines how many active steps to display in the stepper.\n * If the chart is displaying a large amount of resources,\n * the total dots are truncated to 10. As the user clicks forward,\n * eventually, there might be resources \"left over\" in excess of the ten dot limit.\n * Once the user has reached that threshold, the difference should appear constant\n * as the user clicks through the remaining resources and no extra dots should be displayed.\n */\n\n const diff = steps % 10;\n const stepsRemaining = steps - activeStep <= diff ? diff : steps;\n const displayedStep = activeStep % 10;\n\n useEffect(() => {\n onChange(activeStep);\n }, [activeStep, onChange]);\n\n const handleNext = () => {\n setActiveStep(prevStep => prevStep + 1);\n };\n\n const handleBack = () => {\n setActiveStep(prevStep => prevStep - 1);\n };\n\n const handleClick = (index: number) => {\n setActiveStep(prevStep => {\n const offset = index - (prevStep % 10);\n return prevStep + offset;\n });\n };\n\n return (\n <Paper\n data-testid=\"bar-chart-stepper\"\n square\n elevation={0}\n className={classes.paper}\n >\n <Slide\n direction=\"right\"\n in={!disableScroll && activeStep !== 0}\n mountOnEnter\n unmountOnExit\n >\n <BarChartStepperButton\n name=\"back\"\n className={classes.backButton}\n onClick={handleBack}\n >\n <ChevronLeftIcon />\n </BarChartStepperButton>\n </Slide>\n <BarChartSteps\n steps={Math.min(10, stepsRemaining)}\n activeStep={displayedStep}\n onClick={handleClick}\n />\n <Slide\n direction=\"left\"\n in={!disableScroll && activeStep < steps - 1}\n mountOnEnter\n unmountOnExit\n >\n <BarChartStepperButton\n name=\"next\"\n className={classes.nextButton}\n onClick={handleNext}\n >\n <ChevronRightIcon />\n </BarChartStepperButton>\n </Slide>\n </Paper>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA+BO,MAAM,kBAAkB,CAAC;AAAA,EAC9B,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA4B;AAC1B,EAAA,MAAM,UAAU,wBAAA,EAAyB;AACzC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,CAAC,CAAA;AAW9C,EAAA,MAAM,OAAO,KAAA,GAAQ,EAAA;AACrB,EAAA,MAAM,cAAA,GAAiB,KAAA,GAAQ,UAAA,IAAc,IAAA,GAAO,IAAA,GAAO,KAAA;AAC3D,EAAA,MAAM,gBAAgB,UAAA,GAAa,EAAA;AAEnC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,UAAU,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEzB,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,aAAA,CAAc,CAAA,QAAA,KAAY,WAAW,CAAC,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,aAAA,CAAc,CAAA,QAAA,KAAY,WAAW,CAAC,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAkB;AACrC,IAAA,aAAA,CAAc,CAAA,QAAA,KAAY;AACxB,MAAA,MAAM,MAAA,GAAS,QAAS,QAAA,GAAW,EAAA;AACnC,MAAA,OAAO,QAAA,GAAW,MAAA;AAAA,IACpB,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,mBAAA;AAAA,MACZ,MAAA,EAAM,IAAA;AAAA,MACN,SAAA,EAAW,CAAA;AAAA,MACX,WAAW,OAAA,CAAQ,KAAA;AAAA,MAEnB,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,OAAA;AAAA,YACV,EAAA,EAAI,CAAC,aAAA,IAAiB,UAAA,KAAe,CAAA;AAAA,YACrC,YAAA,EAAY,IAAA;AAAA,YACZ,aAAA,EAAa,IAAA;AAAA,YAEb,QAAA,kBAAA,GAAA;AAAA,cAAC,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,WAAW,OAAA,CAAQ,UAAA;AAAA,gBACnB,OAAA,EAAS,UAAA;AAAA,gBAET,8BAAC,eAAA,EAAA,EAAgB;AAAA;AAAA;AACnB;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,cAAc,CAAA;AAAA,YAClC,UAAA,EAAY,aAAA;AAAA,YACZ,OAAA,EAAS;AAAA;AAAA,SACX;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,MAAA;AAAA,YACV,EAAA,EAAI,CAAC,aAAA,IAAiB,UAAA,GAAa,KAAA,GAAQ,CAAA;AAAA,YAC3C,YAAA,EAAY,IAAA;AAAA,YACZ,aAAA,EAAa,IAAA;AAAA,YAEb,QAAA,kBAAA,GAAA;AAAA,cAAC,qBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,MAAA;AAAA,gBACL,WAAW,OAAA,CAAQ,UAAA;AAAA,gBACnB,OAAA,EAAS,UAAA;AAAA,gBAET,8BAAC,gBAAA,EAAA,EAAiB;AAAA;AAAA;AACpB;AAAA;AACF;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartStepperButton.esm.js","sources":["../../../src/components/BarChart/BarChartStepperButton.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { forwardRef, PropsWithChildren, Ref } from 'react';\nimport ButtonBase, { ButtonBaseProps } from '@material-ui/core/ButtonBase';\nimport { useBarChartStepperButtonStyles as useStyles } from '../../utils/styles';\n\ninterface BarChartStepperButtonProps extends ButtonBaseProps {\n name: string;\n}\n\nexport const BarChartStepperButton = forwardRef(\n (\n {\n name,\n children,\n ...buttonBaseProps\n }: PropsWithChildren<BarChartStepperButtonProps>,\n ref: Ref<HTMLButtonElement>,\n ) => {\n const classes = useStyles();\n return (\n <ButtonBase\n ref={ref}\n classes={classes}\n disableRipple\n data-testid={`bar-chart-stepper-button-${name}`}\n {...buttonBaseProps}\n >\n {children}\n </ButtonBase>\n );\n },\n);\n"],"names":["useStyles"],"mappings":";;;;;AAwBO,MAAM,qBAAwB,GAAA,UAAA;AAAA,EACnC,CACE;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GACG,KAAA;AACH,IAAA,MAAM,UAAUA,8BAAU,EAAA;AAC1B,IACE,uBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAa,EAAA,IAAA;AAAA,QACb,aAAA,EAAa,4BAA4B,IAAI,CAAA,CAAA;AAAA,QAC5C,GAAG,eAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA;AAGN;;;;"}
1
+ {"version":3,"file":"BarChartStepperButton.esm.js","sources":["../../../src/components/BarChart/BarChartStepperButton.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { forwardRef, PropsWithChildren, Ref } from 'react';\nimport ButtonBase, { ButtonBaseProps } from '@material-ui/core/ButtonBase';\nimport { useBarChartStepperButtonStyles as useStyles } from '../../utils/styles';\n\ninterface BarChartStepperButtonProps extends ButtonBaseProps {\n name: string;\n}\n\nexport const BarChartStepperButton = forwardRef(\n (\n {\n name,\n children,\n ...buttonBaseProps\n }: PropsWithChildren<BarChartStepperButtonProps>,\n ref: Ref<HTMLButtonElement>,\n ) => {\n const classes = useStyles();\n return (\n <ButtonBase\n ref={ref}\n classes={classes}\n disableRipple\n data-testid={`bar-chart-stepper-button-${name}`}\n {...buttonBaseProps}\n >\n {children}\n </ButtonBase>\n );\n },\n);\n"],"names":["useStyles"],"mappings":";;;;;AAwBO,MAAM,qBAAA,GAAwB,UAAA;AAAA,EACnC,CACE;AAAA,IACE,IAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,UAAUA,8BAAA,EAAU;AAC1B,IAAA,uBACE,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA,EAAa,IAAA;AAAA,QACb,aAAA,EAAa,4BAA4B,IAAI,CAAA,CAAA;AAAA,QAC5C,GAAG,eAAA;AAAA,QAEH;AAAA;AAAA,KACH;AAAA,EAEJ;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartSteps.esm.js","sources":["../../../src/components/BarChart/BarChartSteps.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 * as React from 'react';\nimport ButtonBase from '@material-ui/core/ButtonBase';\nimport { useBarChartStepperStyles as useStyles } from '../../utils/styles';\n\nexport type BarChartStepsProps = {\n steps: number;\n activeStep: number;\n onClick: (index: number) => void;\n};\n\nexport const BarChartSteps = ({\n steps,\n activeStep,\n onClick,\n}: BarChartStepsProps) => {\n const classes = useStyles();\n const handleOnClick =\n (index: number) =>\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.preventDefault();\n onClick(index);\n };\n\n return (\n <div className={classes.steps}>\n {[...new Array(steps)].map((_, index) => (\n <ButtonBase key={index} centerRipple onClick={handleOnClick(index)}>\n <div\n data-testid=\"bar-chart-step\"\n className={`${classes.step} ${\n index === activeStep ? classes.stepActive : ''\n }`}\n />\n </ButtonBase>\n ))}\n </div>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;AA0BO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAA0B,KAAA;AACxB,EAAA,MAAM,UAAUA,wBAAU,EAAA;AAC1B,EAAA,MAAM,aACJ,GAAA,CAAC,KACD,KAAA,CAAC,KAA2D,KAAA;AAC1D,IAAA,KAAA,CAAM,cAAe,EAAA;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GACf;AAEF,EACE,uBAAA,GAAA,CAAC,SAAI,SAAW,EAAA,OAAA,CAAQ,OACrB,QAAC,EAAA,CAAA,GAAG,IAAI,KAAA,CAAM,KAAK,CAAC,EAAE,GAAI,CAAA,CAAC,CAAG,EAAA,KAAA,qBAC5B,GAAA,CAAA,UAAA,EAAA,EAAuB,cAAY,IAAC,EAAA,OAAA,EAAS,aAAc,CAAA,KAAK,CAC/D,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,gBAAA;AAAA,MACZ,SAAA,EAAW,GAAG,OAAQ,CAAA,IAAI,IACxB,KAAU,KAAA,UAAA,GAAa,OAAQ,CAAA,UAAA,GAAa,EAC9C,CAAA;AAAA;AAAA,GACF,EAAA,EANe,KAOjB,CACD,CACH,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartSteps.esm.js","sources":["../../../src/components/BarChart/BarChartSteps.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 * as React from 'react';\nimport ButtonBase from '@material-ui/core/ButtonBase';\nimport { useBarChartStepperStyles as useStyles } from '../../utils/styles';\n\nexport type BarChartStepsProps = {\n steps: number;\n activeStep: number;\n onClick: (index: number) => void;\n};\n\nexport const BarChartSteps = ({\n steps,\n activeStep,\n onClick,\n}: BarChartStepsProps) => {\n const classes = useStyles();\n const handleOnClick =\n (index: number) =>\n (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n event.preventDefault();\n onClick(index);\n };\n\n return (\n <div className={classes.steps}>\n {[...new Array(steps)].map((_, index) => (\n <ButtonBase key={index} centerRipple onClick={handleOnClick(index)}>\n <div\n data-testid=\"bar-chart-step\"\n className={`${classes.step} ${\n index === activeStep ? classes.stepActive : ''\n }`}\n />\n </ButtonBase>\n ))}\n </div>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;AA0BO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,KAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,KAA0B;AACxB,EAAA,MAAM,UAAUA,wBAAA,EAAU;AAC1B,EAAA,MAAM,aAAA,GACJ,CAAC,KAAA,KACD,CAAC,KAAA,KAA2D;AAC1D,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA;AAEF,EAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EAAW,OAAA,CAAQ,OACrB,QAAA,EAAA,CAAC,GAAG,IAAI,KAAA,CAAM,KAAK,CAAC,EAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBAC7B,GAAA,CAAC,UAAA,EAAA,EAAuB,cAAY,IAAA,EAAC,OAAA,EAAS,aAAA,CAAc,KAAK,CAAA,EAC/D,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAY,gBAAA;AAAA,MACZ,SAAA,EAAW,GAAG,OAAA,CAAQ,IAAI,IACxB,KAAA,KAAU,UAAA,GAAa,OAAA,CAAQ,UAAA,GAAa,EAC9C,CAAA;AAAA;AAAA,GACF,EAAA,EANe,KAOjB,CACD,CAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartTick.esm.js","sources":["../../../src/components/BarChart/BarChartTick.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { BarChartLabel } from './BarChartLabel';\n\ntype BarChartTickProps = {\n x: number;\n y: number;\n height: number;\n width: number;\n payload: {\n value: any;\n };\n visibleTicksCount: number;\n details?: JSX.Element;\n};\n\nexport const BarChartTick = ({\n x,\n y,\n height,\n width,\n payload,\n visibleTicksCount,\n details,\n}: BarChartTickProps) => {\n const gutterWidth = 5;\n const labelWidth = width / visibleTicksCount - gutterWidth * 2;\n return (\n <BarChartLabel\n x={x}\n y={y}\n height={height}\n width={labelWidth}\n details={details}\n >\n {!payload.value ? 'Unlabeled' : payload.value}\n </BarChartLabel>\n );\n};\n"],"names":[],"mappings":";;;AA8BO,MAAM,eAAe,CAAC;AAAA,EAC3B,CAAA;AAAA,EACA,CAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAyB,KAAA;AACvB,EAAA,MAAM,WAAc,GAAA,CAAA;AACpB,EAAM,MAAA,UAAA,GAAa,KAAQ,GAAA,iBAAA,GAAoB,WAAc,GAAA,CAAA;AAC7D,EACE,uBAAA,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,CAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAO,EAAA,UAAA;AAAA,MACP,OAAA;AAAA,MAEC,QAAC,EAAA,CAAA,OAAA,CAAQ,KAAQ,GAAA,WAAA,GAAc,OAAQ,CAAA;AAAA;AAAA,GAC1C;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartTick.esm.js","sources":["../../../src/components/BarChart/BarChartTick.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { BarChartLabel } from './BarChartLabel';\n\ntype BarChartTickProps = {\n x: number;\n y: number;\n height: number;\n width: number;\n payload: {\n value: any;\n };\n visibleTicksCount: number;\n details?: JSX.Element;\n};\n\nexport const BarChartTick = ({\n x,\n y,\n height,\n width,\n payload,\n visibleTicksCount,\n details,\n}: BarChartTickProps) => {\n const gutterWidth = 5;\n const labelWidth = width / visibleTicksCount - gutterWidth * 2;\n return (\n <BarChartLabel\n x={x}\n y={y}\n height={height}\n width={labelWidth}\n details={details}\n >\n {!payload.value ? 'Unlabeled' : payload.value}\n </BarChartLabel>\n );\n};\n"],"names":[],"mappings":";;;AA8BO,MAAM,eAAe,CAAC;AAAA,EAC3B,CAAA;AAAA,EACA,CAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,WAAA,GAAc,CAAA;AACpB,EAAA,MAAM,UAAA,GAAa,KAAA,GAAQ,iBAAA,GAAoB,WAAA,GAAc,CAAA;AAC7D,EAAA,uBACE,GAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,CAAA;AAAA,MACA,CAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA,EAAO,UAAA;AAAA,MACP,OAAA;AAAA,MAEC,QAAA,EAAA,CAAC,OAAA,CAAQ,KAAA,GAAQ,WAAA,GAAc,OAAA,CAAQ;AAAA;AAAA,GAC1C;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartTooltip.esm.js","sources":["../../../src/components/BarChart/BarChartTooltip.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { ReactNode, PropsWithChildren } from 'react';\nimport classnames from 'classnames';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport { useTooltipStyles as useStyles } from '../../utils/styles';\n\n/** @public */\nexport type BarChartTooltipProps = {\n title: string;\n content?: ReactNode | string;\n subtitle?: ReactNode;\n topRight?: ReactNode;\n actions?: ReactNode;\n};\n\n/** @public */\nexport const BarChartTooltip = (\n props: PropsWithChildren<BarChartTooltipProps>,\n) => {\n const { title, content, subtitle, topRight, actions, children } = props;\n\n const classes = useStyles();\n const titleClassName = classnames(classes.truncate, {\n [classes.maxWidth]: topRight === undefined,\n });\n\n return (\n <Box className={classes.tooltip} display=\"flex\" flexDirection=\"column\">\n <Box\n display=\"flex\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"baseline\"\n px={2}\n pt={2}\n >\n <Box display=\"flex\" flexDirection=\"column\">\n <Typography className={titleClassName} variant=\"h6\">\n {title}\n </Typography>\n {subtitle && (\n <Typography className={classes.subtitle} variant=\"subtitle1\">\n {subtitle}\n </Typography>\n )}\n </Box>\n {topRight && <Box ml={2}>{topRight}</Box>}\n </Box>\n {content && (\n <Box px={2} pt={2} className={classes.maxWidth}>\n <Typography variant=\"body1\" paragraph>\n {content}\n </Typography>\n </Box>\n )}\n <Box display=\"flex\" flexDirection=\"column\" p={2}>\n {children}\n </Box>\n {actions && (\n <>\n <Divider className={classes.divider} variant=\"fullWidth\" />\n <Box display=\"flex\" flexDirection=\"column\" p={2}>\n {actions}\n </Box>\n </>\n )}\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;AAiCa,MAAA,eAAA,GAAkB,CAC7B,KACG,KAAA;AACH,EAAA,MAAM,EAAE,KAAO,EAAA,OAAA,EAAS,UAAU,QAAU,EAAA,OAAA,EAAS,UAAa,GAAA,KAAA;AAElE,EAAA,MAAM,UAAUA,gBAAU,EAAA;AAC1B,EAAM,MAAA,cAAA,GAAiB,UAAW,CAAA,OAAA,CAAQ,QAAU,EAAA;AAAA,IAClD,CAAC,OAAA,CAAQ,QAAQ,GAAG,QAAa,KAAA,KAAA;AAAA,GAClC,CAAA;AAED,EACE,uBAAA,IAAA,CAAC,OAAI,SAAW,EAAA,OAAA,CAAQ,SAAS,OAAQ,EAAA,MAAA,EAAO,eAAc,QAC5D,EAAA,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,OAAQ,EAAA,MAAA;AAAA,QACR,aAAc,EAAA,KAAA;AAAA,QACd,cAAe,EAAA,eAAA;AAAA,QACf,UAAW,EAAA,UAAA;AAAA,QACX,EAAI,EAAA,CAAA;AAAA,QACJ,EAAI,EAAA,CAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAQ,MAAO,EAAA,aAAA,EAAc,QAChC,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAW,EAAA,EAAA,SAAA,EAAW,cAAgB,EAAA,OAAA,EAAQ,MAC5C,QACH,EAAA,KAAA,EAAA,CAAA;AAAA,YACC,QAAA,wBACE,UAAW,EAAA,EAAA,SAAA,EAAW,QAAQ,QAAU,EAAA,OAAA,EAAQ,aAC9C,QACH,EAAA,QAAA,EAAA;AAAA,WAEJ,EAAA,CAAA;AAAA,UACC,QAAY,oBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,EAAA,EAAI,GAAI,QAAS,EAAA,QAAA,EAAA;AAAA;AAAA;AAAA,KACrC;AAAA,IACC,2BACE,GAAA,CAAA,GAAA,EAAA,EAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CAAG,EAAA,SAAA,EAAW,OAAQ,CAAA,QAAA,EACpC,8BAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAQ,SAAS,EAAA,IAAA,EAClC,mBACH,CACF,EAAA,CAAA;AAAA,oBAEF,GAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,eAAc,QAAS,EAAA,CAAA,EAAG,GAC3C,QACH,EAAA,CAAA;AAAA,IACC,2BAEG,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAQ,EAAA,EAAA,SAAA,EAAW,OAAQ,CAAA,OAAA,EAAS,SAAQ,WAAY,EAAA,CAAA;AAAA,sBACzD,GAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,eAAc,QAAS,EAAA,CAAA,EAAG,GAC3C,QACH,EAAA,OAAA,EAAA;AAAA,KACF,EAAA;AAAA,GAEJ,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartTooltip.esm.js","sources":["../../../src/components/BarChart/BarChartTooltip.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { ReactNode, PropsWithChildren } from 'react';\nimport classnames from 'classnames';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport Typography from '@material-ui/core/Typography';\nimport { useTooltipStyles as useStyles } from '../../utils/styles';\n\n/** @public */\nexport type BarChartTooltipProps = {\n title: string;\n content?: ReactNode | string;\n subtitle?: ReactNode;\n topRight?: ReactNode;\n actions?: ReactNode;\n};\n\n/** @public */\nexport const BarChartTooltip = (\n props: PropsWithChildren<BarChartTooltipProps>,\n) => {\n const { title, content, subtitle, topRight, actions, children } = props;\n\n const classes = useStyles();\n const titleClassName = classnames(classes.truncate, {\n [classes.maxWidth]: topRight === undefined,\n });\n\n return (\n <Box className={classes.tooltip} display=\"flex\" flexDirection=\"column\">\n <Box\n display=\"flex\"\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n alignItems=\"baseline\"\n px={2}\n pt={2}\n >\n <Box display=\"flex\" flexDirection=\"column\">\n <Typography className={titleClassName} variant=\"h6\">\n {title}\n </Typography>\n {subtitle && (\n <Typography className={classes.subtitle} variant=\"subtitle1\">\n {subtitle}\n </Typography>\n )}\n </Box>\n {topRight && <Box ml={2}>{topRight}</Box>}\n </Box>\n {content && (\n <Box px={2} pt={2} className={classes.maxWidth}>\n <Typography variant=\"body1\" paragraph>\n {content}\n </Typography>\n </Box>\n )}\n <Box display=\"flex\" flexDirection=\"column\" p={2}>\n {children}\n </Box>\n {actions && (\n <>\n <Divider className={classes.divider} variant=\"fullWidth\" />\n <Box display=\"flex\" flexDirection=\"column\" p={2}>\n {actions}\n </Box>\n </>\n )}\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;AAiCO,MAAM,eAAA,GAAkB,CAC7B,KAAA,KACG;AACH,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,UAAU,QAAA,EAAU,OAAA,EAAS,UAAS,GAAI,KAAA;AAElE,EAAA,MAAM,UAAUA,gBAAA,EAAU;AAC1B,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAAA,IAClD,CAAC,OAAA,CAAQ,QAAQ,GAAG,QAAA,KAAa;AAAA,GAClC,CAAA;AAED,EAAA,uBACE,IAAA,CAAC,OAAI,SAAA,EAAW,OAAA,CAAQ,SAAS,OAAA,EAAQ,MAAA,EAAO,eAAc,QAAA,EAC5D,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAc,KAAA;AAAA,QACd,cAAA,EAAe,eAAA;AAAA,QACf,UAAA,EAAW,UAAA;AAAA,QACX,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,GAAA,EAAA,EAAI,OAAA,EAAQ,MAAA,EAAO,aAAA,EAAc,QAAA,EAChC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAW,cAAA,EAAgB,OAAA,EAAQ,MAC5C,QAAA,EAAA,KAAA,EACH,CAAA;AAAA,YACC,QAAA,wBACE,UAAA,EAAA,EAAW,SAAA,EAAW,QAAQ,QAAA,EAAU,OAAA,EAAQ,aAC9C,QAAA,EAAA,QAAA,EACH;AAAA,WAAA,EAEJ,CAAA;AAAA,UACC,QAAA,oBAAY,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,GAAI,QAAA,EAAA,QAAA,EAAS;AAAA;AAAA;AAAA,KACrC;AAAA,IACC,2BACC,GAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,EAAG,SAAA,EAAW,OAAA,CAAQ,QAAA,EACpC,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,SAAQ,SAAA,EAAS,IAAA,EAClC,mBACH,CAAA,EACF,CAAA;AAAA,oBAEF,GAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,eAAc,QAAA,EAAS,CAAA,EAAG,GAC3C,QAAA,EACH,CAAA;AAAA,IACC,2BACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,OAAA,EAAS,SAAQ,WAAA,EAAY,CAAA;AAAA,sBACzD,GAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,eAAc,QAAA,EAAS,CAAA,EAAG,GAC3C,QAAA,EAAA,OAAA,EACH;AAAA,KAAA,EACF;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"BarChartTooltipItem.esm.js","sources":["../../../src/components/BarChart/BarChartTooltipItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport LensIcon from '@material-ui/icons/Lens';\nimport { useTooltipStyles as useStyles } from '../../utils/styles';\n\n/** @public */\nexport type TooltipItem = {\n fill: string;\n label?: string;\n value?: string;\n};\n\n/** @public */\nexport type BarChartTooltipItemProps = {\n item: TooltipItem;\n};\n\n/** @public */\nexport const BarChartTooltipItem = (props: BarChartTooltipItemProps) => {\n const { item } = props;\n\n const classes = useStyles();\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n minHeight={25}\n >\n <Box display=\"flex\" alignContent=\"center\" marginRight=\".5em\">\n <Box display=\"flex\" alignItems=\"center\" marginRight=\".5em\">\n <LensIcon className={classes.lensIcon} style={{ fill: item.fill }} />\n </Box>\n <Typography>{item.label}</Typography>\n </Box>\n <Typography display=\"block\">{item.value}</Typography>\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;AAkCa,MAAA,mBAAA,GAAsB,CAAC,KAAoC,KAAA;AACtE,EAAM,MAAA,EAAE,MAAS,GAAA,KAAA;AAEjB,EAAA,MAAM,UAAUA,gBAAU,EAAA;AAE1B,EACE,uBAAA,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,UAAW,EAAA,QAAA;AAAA,MACX,cAAe,EAAA,eAAA;AAAA,MACf,SAAW,EAAA,EAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,YAAa,EAAA,QAAA,EAAS,aAAY,MACpD,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,YAAW,QAAS,EAAA,WAAA,EAAY,QAClD,QAAC,kBAAA,GAAA,CAAA,QAAA,EAAA,EAAS,SAAW,EAAA,OAAA,CAAQ,UAAU,KAAO,EAAA,EAAE,MAAM,IAAK,CAAA,IAAA,IAAQ,CACrE,EAAA,CAAA;AAAA,0BACA,GAAA,CAAC,UAAY,EAAA,EAAA,QAAA,EAAA,IAAA,CAAK,KAAM,EAAA;AAAA,SAC1B,EAAA,CAAA;AAAA,wBACC,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAS,eAAK,KAAM,EAAA;AAAA;AAAA;AAAA,GAC1C;AAEJ;;;;"}
1
+ {"version":3,"file":"BarChartTooltipItem.esm.js","sources":["../../../src/components/BarChart/BarChartTooltipItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport LensIcon from '@material-ui/icons/Lens';\nimport { useTooltipStyles as useStyles } from '../../utils/styles';\n\n/** @public */\nexport type TooltipItem = {\n fill: string;\n label?: string;\n value?: string;\n};\n\n/** @public */\nexport type BarChartTooltipItemProps = {\n item: TooltipItem;\n};\n\n/** @public */\nexport const BarChartTooltipItem = (props: BarChartTooltipItemProps) => {\n const { item } = props;\n\n const classes = useStyles();\n\n return (\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"space-between\"\n minHeight={25}\n >\n <Box display=\"flex\" alignContent=\"center\" marginRight=\".5em\">\n <Box display=\"flex\" alignItems=\"center\" marginRight=\".5em\">\n <LensIcon className={classes.lensIcon} style={{ fill: item.fill }} />\n </Box>\n <Typography>{item.label}</Typography>\n </Box>\n <Typography display=\"block\">{item.value}</Typography>\n </Box>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;AAkCO,MAAM,mBAAA,GAAsB,CAAC,KAAA,KAAoC;AACtE,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AAEjB,EAAA,MAAM,UAAUA,gBAAA,EAAU;AAE1B,EAAA,uBACE,IAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,MAAA;AAAA,MACR,UAAA,EAAW,QAAA;AAAA,MACX,cAAA,EAAe,eAAA;AAAA,MACf,SAAA,EAAW,EAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,YAAA,EAAa,QAAA,EAAS,aAAY,MAAA,EACpD,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,OAAI,OAAA,EAAQ,MAAA,EAAO,YAAW,QAAA,EAAS,WAAA,EAAY,QAClD,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,SAAA,EAAW,OAAA,CAAQ,UAAU,KAAA,EAAO,EAAE,MAAM,IAAA,CAAK,IAAA,IAAQ,CAAA,EACrE,CAAA;AAAA,0BACA,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM;AAAA,SAAA,EAC1B,CAAA;AAAA,wBACA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAS,eAAK,KAAA,EAAM;AAAA;AAAA;AAAA,GAC1C;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CopyUrlToClipboard.esm.js","sources":["../../../src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useCopyToClipboard from 'react-use/esm/useCopyToClipboard';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport IconButton from '@material-ui/core/IconButton';\nimport AssignmentOutlinedIcon from '@material-ui/icons/AssignmentOutlined';\nimport AssignmentTurnedInOutlinedIcon from '@material-ui/icons/AssignmentTurnedInOutlined';\nimport SentimentVeryDissatisfiedIcon from '@material-ui/icons/SentimentVeryDissatisfied';\n\nconst ClipboardMessage = {\n default: 'Copy URL to clipboard',\n success: 'Copied!',\n error: \"Couldn't copy to clipboard\",\n};\n\nexport const CopyUrlToClipboard = () => {\n const location = useLocation();\n const [state, copyToClipboard] = useCopyToClipboard();\n const [copied, setCopied] = useState(false);\n\n const origin = window.location.origin;\n const pathname = location.pathname;\n const search = location.search;\n const url = `${origin}${pathname}${search}`;\n\n useEffect(() => {\n if (state.error) {\n setCopied(false);\n } else if (state.value) {\n setCopied(true);\n setTimeout(setCopied, 1500, false);\n }\n }, [state]);\n\n let text = ClipboardMessage.default;\n let Icon = AssignmentOutlinedIcon;\n\n if (state.error) {\n text = ClipboardMessage.error;\n Icon = SentimentVeryDissatisfiedIcon;\n } else if (copied) {\n text = ClipboardMessage.success;\n Icon = AssignmentTurnedInOutlinedIcon;\n }\n\n return (\n <Tooltip title={text} arrow>\n <IconButton onClick={() => copyToClipboard(url)}>\n <Icon />\n </IconButton>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAyBA,MAAM,gBAAmB,GAAA;AAAA,EACvB,OAAS,EAAA,uBAAA;AAAA,EACT,OAAS,EAAA,SAAA;AAAA,EACT,KAAO,EAAA;AACT,CAAA;AAEO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,eAAe,CAAA,GAAI,kBAAmB,EAAA;AACpD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAM,MAAA,MAAA,GAAS,OAAO,QAAS,CAAA,MAAA;AAC/B,EAAA,MAAM,WAAW,QAAS,CAAA,QAAA;AAC1B,EAAA,MAAM,SAAS,QAAS,CAAA,MAAA;AACxB,EAAA,MAAM,MAAM,CAAG,EAAA,MAAM,CAAG,EAAA,QAAQ,GAAG,MAAM,CAAA,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAM,KAAO,EAAA;AACf,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,KACjB,MAAA,IAAW,MAAM,KAAO,EAAA;AACtB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAW,UAAA,CAAA,SAAA,EAAW,MAAM,KAAK,CAAA;AAAA;AACnC,GACF,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,OAAO,gBAAiB,CAAA,OAAA;AAC5B,EAAA,IAAI,IAAO,GAAA,sBAAA;AAEX,EAAA,IAAI,MAAM,KAAO,EAAA;AACf,IAAA,IAAA,GAAO,gBAAiB,CAAA,KAAA;AACxB,IAAO,IAAA,GAAA,6BAAA;AAAA,aACE,MAAQ,EAAA;AACjB,IAAA,IAAA,GAAO,gBAAiB,CAAA,OAAA;AACxB,IAAO,IAAA,GAAA,8BAAA;AAAA;AAGT,EAAA,2BACG,OAAQ,EAAA,EAAA,KAAA,EAAO,IAAM,EAAA,KAAA,EAAK,MACzB,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,OAAS,EAAA,MAAM,gBAAgB,GAAG,CAAA,EAC5C,QAAC,kBAAA,GAAA,CAAA,IAAA,EAAA,EAAK,GACR,CACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"CopyUrlToClipboard.esm.js","sources":["../../../src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport useCopyToClipboard from 'react-use/esm/useCopyToClipboard';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport IconButton from '@material-ui/core/IconButton';\nimport AssignmentOutlinedIcon from '@material-ui/icons/AssignmentOutlined';\nimport AssignmentTurnedInOutlinedIcon from '@material-ui/icons/AssignmentTurnedInOutlined';\nimport SentimentVeryDissatisfiedIcon from '@material-ui/icons/SentimentVeryDissatisfied';\n\nconst ClipboardMessage = {\n default: 'Copy URL to clipboard',\n success: 'Copied!',\n error: \"Couldn't copy to clipboard\",\n};\n\nexport const CopyUrlToClipboard = () => {\n const location = useLocation();\n const [state, copyToClipboard] = useCopyToClipboard();\n const [copied, setCopied] = useState(false);\n\n const origin = window.location.origin;\n const pathname = location.pathname;\n const search = location.search;\n const url = `${origin}${pathname}${search}`;\n\n useEffect(() => {\n if (state.error) {\n setCopied(false);\n } else if (state.value) {\n setCopied(true);\n setTimeout(setCopied, 1500, false);\n }\n }, [state]);\n\n let text = ClipboardMessage.default;\n let Icon = AssignmentOutlinedIcon;\n\n if (state.error) {\n text = ClipboardMessage.error;\n Icon = SentimentVeryDissatisfiedIcon;\n } else if (copied) {\n text = ClipboardMessage.success;\n Icon = AssignmentTurnedInOutlinedIcon;\n }\n\n return (\n <Tooltip title={text} arrow>\n <IconButton onClick={() => copyToClipboard(url)}>\n <Icon />\n </IconButton>\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AAyBA,MAAM,gBAAA,GAAmB;AAAA,EACvB,OAAA,EAAS,uBAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO;AACT,CAAA;AAEO,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,CAAC,KAAA,EAAO,eAAe,CAAA,GAAI,kBAAA,EAAmB;AACpD,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1C,EAAA,MAAM,MAAA,GAAS,OAAO,QAAA,CAAS,MAAA;AAC/B,EAAA,MAAM,WAAW,QAAA,CAAS,QAAA;AAC1B,EAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,EAAA,MAAM,MAAM,CAAA,EAAG,MAAM,CAAA,EAAG,QAAQ,GAAG,MAAM,CAAA,CAAA;AAEzC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,MAAM,KAAA,EAAO;AACf,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,MAAM,KAAA,EAAO;AACtB,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,UAAA,CAAW,SAAA,EAAW,MAAM,KAAK,CAAA;AAAA,IACnC;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,OAAO,gBAAA,CAAiB,OAAA;AAC5B,EAAA,IAAI,IAAA,GAAO,sBAAA;AAEX,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,IAAA,GAAO,gBAAA,CAAiB,KAAA;AACxB,IAAA,IAAA,GAAO,6BAAA;AAAA,EACT,WAAW,MAAA,EAAQ;AACjB,IAAA,IAAA,GAAO,gBAAA,CAAiB,OAAA;AACxB,IAAA,IAAA,GAAO,8BAAA;AAAA,EACT;AAEA,EAAA,2BACG,OAAA,EAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,KAAA,EAAK,MACzB,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,MAAM,gBAAgB,GAAG,CAAA,EAC5C,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,GACR,CAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostGrowth.esm.js","sources":["../../../src/components/CostGrowth/CostGrowth.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 classnames from 'classnames';\nimport Typography from '@material-ui/core/Typography';\nimport { CurrencyType, Duration, GrowthType } from '../../types';\nimport { ChangeStatistic } from '@backstage-community/plugin-cost-insights-common';\nimport { rateOf } from '../../utils/currency';\nimport { growthOf } from '../../utils/change';\nimport { useCostGrowthStyles as useStyles } from '../../utils/styles';\nimport { formatPercent, formatCurrency } from '../../utils/formatters';\nimport { indefiniteArticleOf } from '../../utils/grammar';\nimport { useConfig, useCurrency } from '../../hooks';\nimport { notEmpty } from '../../utils/assert';\nimport { DateTime } from 'luxon';\n\n/** @public */\nexport type CostGrowthProps = {\n change: ChangeStatistic;\n duration: Duration;\n customDateRange?: { start: string; end: string };\n};\n\n/** @public */\nexport const CostGrowth = (props: CostGrowthProps) => {\n const { change, duration, customDateRange } = props;\n\n const styles = useStyles();\n const { engineerCost, engineerThreshold } = useConfig();\n const [currency] = useCurrency();\n\n // Only display costs in absolute values\n const amount = Math.abs(change.amount);\n const ratio = Math.abs(change.ratio ?? NaN);\n\n // Calculate customDays if we have a custom date range\n // For custom ranges, we use floor division to get the first period length\n // (the rate calculation uses the average period length)\n let customDays: number | undefined;\n if (duration === Duration.CUSTOM && customDateRange) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n // Use floor division for consistent period calculation\n customDays = Math.floor(totalDays / 2);\n }\n\n const rate = rateOf(engineerCost, duration, customDays);\n const engineers = amount / rate;\n const converted = amount / (currency.rate ?? rate);\n\n // If a ratio cannot be calculated, don't format.\n const growth = notEmpty(change.ratio)\n ? growthOf({ ratio: change.ratio, amount: engineers }, engineerThreshold)\n : null;\n // Determine if growth is significant enough to highlight\n const classes = classnames({\n [styles.excess]: growth === GrowthType.Excess,\n [styles.savings]: growth === GrowthType.Savings,\n });\n\n if (engineers < engineerThreshold) {\n return (\n <Typography component=\"span\" className={classes}>\n Negligible\n </Typography>\n );\n }\n\n if (currency.kind === CurrencyType.USD) {\n // Do not display percentage if ratio cannot be calculated\n if (isNaN(ratio)) {\n return (\n <Typography component=\"span\" className={classes}>\n ~{currency.prefix}\n {formatCurrency(converted)}\n </Typography>\n );\n }\n\n return (\n <Typography component=\"span\" className={classes}>\n {formatPercent(ratio)} or ~{currency.prefix}\n {formatCurrency(converted)}\n </Typography>\n );\n }\n\n if (amount < 1) {\n return (\n <Typography component=\"span\" className={classes}>\n less than {indefiniteArticleOf(['a', 'an'], currency.unit)}\n </Typography>\n );\n }\n\n // Do not display percentage if ratio cannot be calculated\n if (isNaN(ratio)) {\n return (\n <Typography component=\"span\" className={classes}>\n ~{formatCurrency(converted, currency.unit)}\n </Typography>\n );\n }\n\n return (\n <Typography component=\"span\" className={classes}>\n {formatPercent(ratio)} or ~{formatCurrency(converted, currency.unit)}\n </Typography>\n );\n};\n"],"names":["useStyles"],"mappings":"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"}
1
+ {"version":3,"file":"CostGrowth.esm.js","sources":["../../../src/components/CostGrowth/CostGrowth.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 classnames from 'classnames';\nimport Typography from '@material-ui/core/Typography';\nimport { CurrencyType, Duration, GrowthType } from '../../types';\nimport { ChangeStatistic } from '@backstage-community/plugin-cost-insights-common';\nimport { rateOf } from '../../utils/currency';\nimport { growthOf } from '../../utils/change';\nimport { useCostGrowthStyles as useStyles } from '../../utils/styles';\nimport { formatPercent, formatCurrency } from '../../utils/formatters';\nimport { indefiniteArticleOf } from '../../utils/grammar';\nimport { useConfig, useCurrency } from '../../hooks';\nimport { notEmpty } from '../../utils/assert';\nimport { DateTime } from 'luxon';\n\n/** @public */\nexport type CostGrowthProps = {\n change: ChangeStatistic;\n duration: Duration;\n customDateRange?: { start: string; end: string };\n};\n\n/** @public */\nexport const CostGrowth = (props: CostGrowthProps) => {\n const { change, duration, customDateRange } = props;\n\n const styles = useStyles();\n const { engineerCost, engineerThreshold } = useConfig();\n const [currency] = useCurrency();\n\n // Only display costs in absolute values\n const amount = Math.abs(change.amount);\n const ratio = Math.abs(change.ratio ?? NaN);\n\n // Calculate customDays if we have a custom date range\n // For custom ranges, we use floor division to get the first period length\n // (the rate calculation uses the average period length)\n let customDays: number | undefined;\n if (duration === Duration.CUSTOM && customDateRange) {\n const startDate = DateTime.fromISO(customDateRange.start);\n const endDate = DateTime.fromISO(customDateRange.end);\n const totalDays = Math.round(endDate.diff(startDate, 'days').days) + 1;\n // Use floor division for consistent period calculation\n customDays = Math.floor(totalDays / 2);\n }\n\n const rate = rateOf(engineerCost, duration, customDays);\n const engineers = amount / rate;\n const converted = amount / (currency.rate ?? rate);\n\n // If a ratio cannot be calculated, don't format.\n const growth = notEmpty(change.ratio)\n ? growthOf({ ratio: change.ratio, amount: engineers }, engineerThreshold)\n : null;\n // Determine if growth is significant enough to highlight\n const classes = classnames({\n [styles.excess]: growth === GrowthType.Excess,\n [styles.savings]: growth === GrowthType.Savings,\n });\n\n if (engineers < engineerThreshold) {\n return (\n <Typography component=\"span\" className={classes}>\n Negligible\n </Typography>\n );\n }\n\n if (currency.kind === CurrencyType.USD) {\n // Do not display percentage if ratio cannot be calculated\n if (isNaN(ratio)) {\n return (\n <Typography component=\"span\" className={classes}>\n ~{currency.prefix}\n {formatCurrency(converted)}\n </Typography>\n );\n }\n\n return (\n <Typography component=\"span\" className={classes}>\n {formatPercent(ratio)} or ~{currency.prefix}\n {formatCurrency(converted)}\n </Typography>\n );\n }\n\n if (amount < 1) {\n return (\n <Typography component=\"span\" className={classes}>\n less than {indefiniteArticleOf(['a', 'an'], currency.unit)}\n </Typography>\n );\n }\n\n // Do not display percentage if ratio cannot be calculated\n if (isNaN(ratio)) {\n return (\n <Typography component=\"span\" className={classes}>\n ~{formatCurrency(converted, currency.unit)}\n </Typography>\n );\n }\n\n return (\n <Typography component=\"span\" className={classes}>\n {formatPercent(ratio)} or ~{formatCurrency(converted, currency.unit)}\n </Typography>\n );\n};\n"],"names":["useStyles"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostGrowthIndicator.esm.js","sources":["../../../src/components/CostGrowth/CostGrowthIndicator.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 classnames from 'classnames';\nimport Typography, { TypographyProps } from '@material-ui/core/Typography';\nimport { default as ArrowDropUp } from '@material-ui/icons/ArrowDropUp';\nimport { default as ArrowDropDown } from '@material-ui/icons/ArrowDropDown';\nimport { growthOf } from '../../utils/change';\nimport { GrowthType } from '../../types';\nimport { useCostGrowthStyles as useStyles } from '../../utils/styles';\nimport {\n ChangeStatistic,\n Maybe,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { useConfig } from '../../hooks';\n\n/** @public */\nexport type CostGrowthIndicatorProps = TypographyProps & {\n change: ChangeStatistic;\n formatter?: (\n change: ChangeStatistic,\n options?: { absolute: boolean },\n ) => Maybe<string>;\n};\n\n/** @public */\nexport const CostGrowthIndicator = (props: CostGrowthIndicatorProps) => {\n const { engineerThreshold } = useConfig();\n const { change, formatter, className, ...extraProps } = props;\n\n const classes = useStyles();\n\n const growth = growthOf(change, engineerThreshold);\n\n const classNames = classnames(classes.indicator, className, {\n [classes.excess]: growth === GrowthType.Excess,\n [classes.savings]: growth === GrowthType.Savings,\n });\n\n return (\n <Typography className={classNames} component=\"span\" {...extraProps}>\n {formatter ? formatter(change, { absolute: true }) : change.ratio}\n {growth === GrowthType.Excess && <ArrowDropUp aria-label=\"excess\" />}\n {growth === GrowthType.Savings && <ArrowDropDown aria-label=\"savings\" />}\n </Typography>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;;;;;;;;;;;AAuCa,MAAA,mBAAA,GAAsB,CAAC,KAAoC,KAAA;AACtE,EAAM,MAAA,EAAE,iBAAkB,EAAA,GAAI,SAAU,EAAA;AACxC,EAAA,MAAM,EAAE,MAAQ,EAAA,SAAA,EAAW,SAAW,EAAA,GAAG,YAAe,GAAA,KAAA;AAExD,EAAA,MAAM,UAAUA,mBAAU,EAAA;AAE1B,EAAM,MAAA,MAAA,GAAS,QAAS,CAAA,MAAA,EAAQ,iBAAiB,CAAA;AAEjD,EAAA,MAAM,UAAa,GAAA,UAAA,CAAW,OAAQ,CAAA,SAAA,EAAW,SAAW,EAAA;AAAA,IAC1D,CAAC,OAAA,CAAQ,MAAM,GAAG,WAAW,UAAW,CAAA,MAAA;AAAA,IACxC,CAAC,OAAA,CAAQ,OAAO,GAAG,WAAW,UAAW,CAAA;AAAA,GAC1C,CAAA;AAED,EAAA,4BACG,UAAW,EAAA,EAAA,SAAA,EAAW,YAAY,SAAU,EAAA,MAAA,EAAQ,GAAG,UACrD,EAAA,QAAA,EAAA;AAAA,IAAA,SAAA,GAAY,UAAU,MAAQ,EAAA,EAAE,UAAU,IAAK,EAAC,IAAI,MAAO,CAAA,KAAA;AAAA,IAC3D,WAAW,UAAW,CAAA,MAAA,oBAAW,GAAA,CAAA,WAAA,EAAA,EAAY,cAAW,QAAS,EAAA,CAAA;AAAA,IACjE,WAAW,UAAW,CAAA,OAAA,oBAAY,GAAA,CAAA,aAAA,EAAA,EAAc,cAAW,SAAU,EAAA;AAAA,GACxE,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"CostGrowthIndicator.esm.js","sources":["../../../src/components/CostGrowth/CostGrowthIndicator.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 classnames from 'classnames';\nimport Typography, { TypographyProps } from '@material-ui/core/Typography';\nimport { default as ArrowDropUp } from '@material-ui/icons/ArrowDropUp';\nimport { default as ArrowDropDown } from '@material-ui/icons/ArrowDropDown';\nimport { growthOf } from '../../utils/change';\nimport { GrowthType } from '../../types';\nimport { useCostGrowthStyles as useStyles } from '../../utils/styles';\nimport {\n ChangeStatistic,\n Maybe,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { useConfig } from '../../hooks';\n\n/** @public */\nexport type CostGrowthIndicatorProps = TypographyProps & {\n change: ChangeStatistic;\n formatter?: (\n change: ChangeStatistic,\n options?: { absolute: boolean },\n ) => Maybe<string>;\n};\n\n/** @public */\nexport const CostGrowthIndicator = (props: CostGrowthIndicatorProps) => {\n const { engineerThreshold } = useConfig();\n const { change, formatter, className, ...extraProps } = props;\n\n const classes = useStyles();\n\n const growth = growthOf(change, engineerThreshold);\n\n const classNames = classnames(classes.indicator, className, {\n [classes.excess]: growth === GrowthType.Excess,\n [classes.savings]: growth === GrowthType.Savings,\n });\n\n return (\n <Typography className={classNames} component=\"span\" {...extraProps}>\n {formatter ? formatter(change, { absolute: true }) : change.ratio}\n {growth === GrowthType.Excess && <ArrowDropUp aria-label=\"excess\" />}\n {growth === GrowthType.Savings && <ArrowDropDown aria-label=\"savings\" />}\n </Typography>\n );\n};\n"],"names":["useStyles"],"mappings":";;;;;;;;;;;;;;;;;AAuCO,MAAM,mBAAA,GAAsB,CAAC,KAAA,KAAoC;AACtE,EAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,SAAA,EAAU;AACxC,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,GAAG,YAAW,GAAI,KAAA;AAExD,EAAA,MAAM,UAAUA,mBAAA,EAAU;AAE1B,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,iBAAiB,CAAA;AAEjD,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,SAAA,EAAW,SAAA,EAAW;AAAA,IAC1D,CAAC,OAAA,CAAQ,MAAM,GAAG,WAAW,UAAA,CAAW,MAAA;AAAA,IACxC,CAAC,OAAA,CAAQ,OAAO,GAAG,WAAW,UAAA,CAAW;AAAA,GAC1C,CAAA;AAED,EAAA,4BACG,UAAA,EAAA,EAAW,SAAA,EAAW,YAAY,SAAA,EAAU,MAAA,EAAQ,GAAG,UAAA,EACrD,QAAA,EAAA;AAAA,IAAA,SAAA,GAAY,UAAU,MAAA,EAAQ,EAAE,UAAU,IAAA,EAAM,IAAI,MAAA,CAAO,KAAA;AAAA,IAC3D,WAAW,UAAA,CAAW,MAAA,oBAAU,GAAA,CAAC,WAAA,EAAA,EAAY,cAAW,QAAA,EAAS,CAAA;AAAA,IACjE,WAAW,UAAA,CAAW,OAAA,oBAAW,GAAA,CAAC,aAAA,EAAA,EAAc,cAAW,SAAA,EAAU;AAAA,GAAA,EACxE,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostInsightsHeader.esm.js","sources":["../../../src/components/CostInsightsHeader/CostInsightsHeader.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 Typography from '@material-ui/core/Typography';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCostInsightsStyles } from '../../utils/styles';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\n\nfunction useDisplayName(): string {\n const identityApi = useApi(identityApiRef);\n const state = useAsync(() => identityApi.getProfileInfo(), [identityApi]);\n return state.loading ? '' : state.value?.displayName || 'Mysterious Stranger';\n}\n\ntype CostInsightsHeaderProps = {\n groupId: string;\n groups: Group[];\n hasCostData: boolean;\n alerts: number;\n};\n\nconst CostInsightsHeaderNoData = ({\n groupId,\n groups,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const hasMultipleGroups = groups.length > 1;\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"flushed-face\">\n 😳\n </Typography>{' '}\n Well this is awkward\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> <b>{ownerName}</b> doesn't seem to have any\n cloud costs.\n </Typography>\n {hasMultipleGroups && (\n <Typography align=\"center\" gutterBottom>\n Maybe we picked the wrong team, choose another from the menu above?\n </Typography>\n )}\n </>\n );\n};\n\nconst CostInsightsHeaderAlerts = ({\n groupId,\n groups,\n alerts,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"magnifying-glass\">\n 🔎\n </Typography>{' '}\n You have {alerts} thing{alerts > 1 && 's'} to look into\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> We've identified{' '}\n {alerts > 1 ? 'a few things ' : 'one thing '}\n <b>{ownerName}</b> should look into next.\n </Typography>\n </>\n );\n};\n\nconst CostInsightsHeaderNoAlerts = ({\n groupId,\n groups,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" gutterBottom align=\"center\">\n <Typography component=\"span\" role=\"img\" aria-label=\"thumbs-up\">\n 👍\n </Typography>{' '}\n Your team is doing great\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> <b>{ownerName}</b> is doing well. No major\n changes this month.\n </Typography>\n </>\n );\n};\n\nexport const CostInsightsHeaderNoGroups = () => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"flushed-face\">\n 😳\n </Typography>{' '}\n Well this is awkward\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> It doesn't look like you belong to any teams.\n </Typography>\n </>\n );\n};\n\nexport const CostInsightsHeader = (props: CostInsightsHeaderProps) => {\n if (!props.hasCostData) {\n return <CostInsightsHeaderNoData {...props} />;\n }\n if (props.alerts) {\n return <CostInsightsHeaderAlerts {...props} />;\n }\n return <CostInsightsHeaderNoAlerts {...props} />;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CostInsightsHeader.esm.js","sources":["../../../src/components/CostInsightsHeader/CostInsightsHeader.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 Typography from '@material-ui/core/Typography';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCostInsightsStyles } from '../../utils/styles';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\n\nfunction useDisplayName(): string {\n const identityApi = useApi(identityApiRef);\n const state = useAsync(() => identityApi.getProfileInfo(), [identityApi]);\n return state.loading ? '' : state.value?.displayName || 'Mysterious Stranger';\n}\n\ntype CostInsightsHeaderProps = {\n groupId: string;\n groups: Group[];\n hasCostData: boolean;\n alerts: number;\n};\n\nconst CostInsightsHeaderNoData = ({\n groupId,\n groups,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const hasMultipleGroups = groups.length > 1;\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"flushed-face\">\n 😳\n </Typography>{' '}\n Well this is awkward\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> <b>{ownerName}</b> doesn't seem to have any\n cloud costs.\n </Typography>\n {hasMultipleGroups && (\n <Typography align=\"center\" gutterBottom>\n Maybe we picked the wrong team, choose another from the menu above?\n </Typography>\n )}\n </>\n );\n};\n\nconst CostInsightsHeaderAlerts = ({\n groupId,\n groups,\n alerts,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"magnifying-glass\">\n 🔎\n </Typography>{' '}\n You have {alerts} thing{alerts > 1 && 's'} to look into\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> We've identified{' '}\n {alerts > 1 ? 'a few things ' : 'one thing '}\n <b>{ownerName}</b> should look into next.\n </Typography>\n </>\n );\n};\n\nconst CostInsightsHeaderNoAlerts = ({\n groupId,\n groups,\n}: CostInsightsHeaderProps) => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n const ownerName = groups.find(({ id }) => id === groupId)?.name ?? groupId;\n\n return (\n <>\n <Typography variant=\"h4\" gutterBottom align=\"center\">\n <Typography component=\"span\" role=\"img\" aria-label=\"thumbs-up\">\n 👍\n </Typography>{' '}\n Your team is doing great\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> <b>{ownerName}</b> is doing well. No major\n changes this month.\n </Typography>\n </>\n );\n};\n\nexport const CostInsightsHeaderNoGroups = () => {\n const displayName = useDisplayName();\n const classes = useCostInsightsStyles();\n return (\n <>\n <Typography variant=\"h4\" align=\"center\" gutterBottom>\n <Typography component=\"span\" role=\"img\" aria-label=\"flushed-face\">\n 😳\n </Typography>{' '}\n Well this is awkward\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n <b>Hey, {displayName}!</b> It doesn't look like you belong to any teams.\n </Typography>\n </>\n );\n};\n\nexport const CostInsightsHeader = (props: CostInsightsHeaderProps) => {\n if (!props.hasCostData) {\n return <CostInsightsHeaderNoData {...props} />;\n }\n if (props.alerts) {\n return <CostInsightsHeaderAlerts {...props} />;\n }\n return <CostInsightsHeaderNoAlerts {...props} />;\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostInsightsLayout.esm.js","sources":["../../../src/components/CostInsightsLayout/CostInsightsLayout.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 */\nimport { PropsWithChildren } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { CostInsightsTabs } from '../CostInsightsTabs';\nimport { Header, Page } from '@backstage/core-components';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n gridArea: 'pageContent',\n },\n header: {\n boxShadow: 'none',\n },\n content: {\n padding: theme.spacing(4),\n },\n}));\n\ntype CostInsightsLayoutProps = {\n title?: string;\n groups: Group[];\n};\n\nexport const CostInsightsLayout = ({\n title = 'Cost Insights',\n groups,\n children,\n}: PropsWithChildren<CostInsightsLayoutProps>) => {\n const classes = useStyles();\n return (\n <Page themeId=\"tool\">\n <Header\n style={{ boxShadow: 'none' }}\n title=\"Cost Insights\"\n pageTitleOverride={title}\n type=\"Tool\"\n />\n <div className={classes.root}>\n <CostInsightsTabs groups={groups} />\n <div className={classes.content}>{children}</div>\n </div>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;AAqBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,IAAM,EAAA;AAAA,IACJ,QAAU,EAAA;AAAA,GACZ;AAAA,EACA,MAAQ,EAAA;AAAA,IACN,SAAW,EAAA;AAAA,GACb;AAAA,EACA,OAAS,EAAA;AAAA,IACP,OAAA,EAAS,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA;AAE5B,CAAE,CAAA,CAAA;AAOK,MAAM,qBAAqB,CAAC;AAAA,EACjC,KAAQ,GAAA,eAAA;AAAA,EACR,MAAA;AAAA,EACA;AACF,CAAkD,KAAA;AAChD,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,SAAA,EAAW,MAAO,EAAA;AAAA,QAC3B,KAAM,EAAA,eAAA;AAAA,QACN,iBAAmB,EAAA,KAAA;AAAA,QACnB,IAAK,EAAA;AAAA;AAAA,KACP;AAAA,oBACC,IAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,IACtB,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,oBAAiB,MAAgB,EAAA,CAAA;AAAA,sBACjC,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,SAAU,QAAS,EAAA;AAAA,KAC7C,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"CostInsightsLayout.esm.js","sources":["../../../src/components/CostInsightsLayout/CostInsightsLayout.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 */\nimport { PropsWithChildren } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Group } from '@backstage-community/plugin-cost-insights-common';\nimport { CostInsightsTabs } from '../CostInsightsTabs';\nimport { Header, Page } from '@backstage/core-components';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n gridArea: 'pageContent',\n },\n header: {\n boxShadow: 'none',\n },\n content: {\n padding: theme.spacing(4),\n },\n}));\n\ntype CostInsightsLayoutProps = {\n title?: string;\n groups: Group[];\n};\n\nexport const CostInsightsLayout = ({\n title = 'Cost Insights',\n groups,\n children,\n}: PropsWithChildren<CostInsightsLayoutProps>) => {\n const classes = useStyles();\n return (\n <Page themeId=\"tool\">\n <Header\n style={{ boxShadow: 'none' }}\n title=\"Cost Insights\"\n pageTitleOverride={title}\n type=\"Tool\"\n />\n <div className={classes.root}>\n <CostInsightsTabs groups={groups} />\n <div className={classes.content}>{children}</div>\n </div>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;AAqBA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,SAAA,EAAW;AAAA,GACb;AAAA,EACA,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAE5B,CAAA,CAAE,CAAA;AAOK,MAAM,qBAAqB,CAAC;AAAA,EACjC,KAAA,GAAQ,eAAA;AAAA,EACR,MAAA;AAAA,EACA;AACF,CAAA,KAAkD;AAChD,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,SAAA,EAAW,MAAA,EAAO;AAAA,QAC3B,KAAA,EAAM,eAAA;AAAA,QACN,iBAAA,EAAmB,KAAA;AAAA,QACnB,IAAA,EAAK;AAAA;AAAA,KACP;AAAA,oBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,IAAA,EACtB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,oBAAiB,MAAA,EAAgB,CAAA;AAAA,sBAClC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,OAAA,CAAQ,SAAU,QAAA,EAAS;AAAA,KAAA,EAC7C;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostInsightsNavigation.esm.js","sources":["../../../src/components/CostInsightsNavigation/CostInsightsNavigation.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { memo, cloneElement, useEffect, useState } from 'react';\nimport Collapse from '@material-ui/core/Collapse';\nimport MenuList from '@material-ui/core/MenuList';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Typography from '@material-ui/core/Typography';\nimport Badge from '@material-ui/core/Badge';\nimport { useNavigationStyles as useStyles } from '../../utils/styles';\nimport { useConfig, useScroll } from '../../hooks';\nimport { findAlways } from '../../utils/assert';\nimport {\n DefaultNavigation,\n NavigationItem,\n getDefaultNavigationItems,\n} from '../../utils/navigation';\nimport {\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\n\ntype CostInsightsNavigationProps = {\n alerts: number;\n products: Maybe<Product[]>;\n};\n\nconst NavigationMenuItem = ({ navigation, icon, title }: NavigationItem) => {\n const classes = useStyles();\n const [, setScroll] = useScroll();\n return (\n <MenuItem\n data-testid={`menu-item-${navigation}`}\n className={classes.menuItem}\n onClick={() => setScroll(navigation)}\n >\n <ListItemIcon className={classes.listItemIcon}>{icon}</ListItemIcon>\n <ListItemText\n primary={<Typography className={classes.title}>{title}</Typography>}\n />\n </MenuItem>\n );\n};\n\nexport const CostInsightsNavigation = memo(\n ({ alerts, products }: CostInsightsNavigationProps) => {\n const classes = useStyles();\n const { icons } = useConfig();\n const [isOpen, setOpen] = useState(false);\n\n const defaultNavigationItems = getDefaultNavigationItems(alerts);\n const productNavigationItems: NavigationItem[] =\n products?.map(product => ({\n title: product.name,\n navigation: product.kind,\n icon: findAlways(icons, i => i.kind === product.kind).component,\n })) ?? [];\n\n useEffect(\n function toggleProductMenuItems() {\n if (products?.length) {\n setOpen(true);\n } else {\n setOpen(false);\n }\n },\n [products],\n );\n\n return (\n <MenuList className={classes.menuList}>\n {defaultNavigationItems.map(item => (\n <NavigationMenuItem\n key={`navigation-menu-item-${item.navigation}`}\n navigation={item.navigation}\n title={item.title}\n icon={\n item.navigation === DefaultNavigation.AlertInsightsHeader ? (\n <Badge badgeContent={alerts} color=\"secondary\">\n {cloneElement(item.icon, {\n className: classes.navigationIcon,\n })}\n </Badge>\n ) : (\n cloneElement(item.icon, {\n className: classes.navigationIcon,\n })\n )\n }\n />\n ))}\n <Collapse in={isOpen} timeout={850}>\n {productNavigationItems.map((item: NavigationItem) => (\n <NavigationMenuItem\n key={`navigation-menu-item-${item.navigation}`}\n navigation={item.navigation}\n icon={cloneElement(item.icon, {\n className: classes.navigationIcon,\n })}\n title={item.title}\n />\n ))}\n </Collapse>\n </MenuList>\n );\n },\n);\n"],"names":["useStyles"],"mappings":"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"}
1
+ {"version":3,"file":"CostInsightsNavigation.esm.js","sources":["../../../src/components/CostInsightsNavigation/CostInsightsNavigation.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { memo, cloneElement, useEffect, useState } from 'react';\nimport Collapse from '@material-ui/core/Collapse';\nimport MenuList from '@material-ui/core/MenuList';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Typography from '@material-ui/core/Typography';\nimport Badge from '@material-ui/core/Badge';\nimport { useNavigationStyles as useStyles } from '../../utils/styles';\nimport { useConfig, useScroll } from '../../hooks';\nimport { findAlways } from '../../utils/assert';\nimport {\n DefaultNavigation,\n NavigationItem,\n getDefaultNavigationItems,\n} from '../../utils/navigation';\nimport {\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\n\ntype CostInsightsNavigationProps = {\n alerts: number;\n products: Maybe<Product[]>;\n};\n\nconst NavigationMenuItem = ({ navigation, icon, title }: NavigationItem) => {\n const classes = useStyles();\n const [, setScroll] = useScroll();\n return (\n <MenuItem\n data-testid={`menu-item-${navigation}`}\n className={classes.menuItem}\n onClick={() => setScroll(navigation)}\n >\n <ListItemIcon className={classes.listItemIcon}>{icon}</ListItemIcon>\n <ListItemText\n primary={<Typography className={classes.title}>{title}</Typography>}\n />\n </MenuItem>\n );\n};\n\nexport const CostInsightsNavigation = memo(\n ({ alerts, products }: CostInsightsNavigationProps) => {\n const classes = useStyles();\n const { icons } = useConfig();\n const [isOpen, setOpen] = useState(false);\n\n const defaultNavigationItems = getDefaultNavigationItems(alerts);\n const productNavigationItems: NavigationItem[] =\n products?.map(product => ({\n title: product.name,\n navigation: product.kind,\n icon: findAlways(icons, i => i.kind === product.kind).component,\n })) ?? [];\n\n useEffect(\n function toggleProductMenuItems() {\n if (products?.length) {\n setOpen(true);\n } else {\n setOpen(false);\n }\n },\n [products],\n );\n\n return (\n <MenuList className={classes.menuList}>\n {defaultNavigationItems.map(item => (\n <NavigationMenuItem\n key={`navigation-menu-item-${item.navigation}`}\n navigation={item.navigation}\n title={item.title}\n icon={\n item.navigation === DefaultNavigation.AlertInsightsHeader ? (\n <Badge badgeContent={alerts} color=\"secondary\">\n {cloneElement(item.icon, {\n className: classes.navigationIcon,\n })}\n </Badge>\n ) : (\n cloneElement(item.icon, {\n className: classes.navigationIcon,\n })\n )\n }\n />\n ))}\n <Collapse in={isOpen} timeout={850}>\n {productNavigationItems.map((item: NavigationItem) => (\n <NavigationMenuItem\n key={`navigation-menu-item-${item.navigation}`}\n navigation={item.navigation}\n icon={cloneElement(item.icon, {\n className: classes.navigationIcon,\n })}\n title={item.title}\n />\n ))}\n </Collapse>\n </MenuList>\n );\n },\n);\n"],"names":["useStyles"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostInsightsPage.esm.js","sources":["../../../src/components/CostInsightsPage/CostInsightsPage.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useCallback, useEffect, useMemo, useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport Container from '@material-ui/core/Container';\nimport Divider from '@material-ui/core/Divider';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { default as MaterialAlert } from '@material-ui/lab/Alert';\nimport { costInsightsApiRef } from '../../api';\nimport { ActionItems } from '../ActionItems';\nimport { AlertInsights } from '../AlertInsights';\nimport { CostInsightsLayout } from '../CostInsightsLayout';\nimport { CopyUrlToClipboard } from '../CopyUrlToClipboard';\nimport { CurrencySelect } from '../CurrencySelect';\nimport { WhyCostsMatter } from '../WhyCostsMatter';\nimport {\n CostInsightsHeader,\n CostInsightsHeaderNoGroups,\n} from '../CostInsightsHeader';\nimport { CostInsightsNavigation } from '../CostInsightsNavigation';\nimport { CostOverviewCard } from '../CostOverviewCard';\nimport { ProductInsights } from '../ProductInsights';\n/* https://github.com/backstage/backstage/issues/2574 */\n// import { CostInsightsSupportButton } from '../CostInsightsSupportButton';\nimport {\n useConfig,\n useCurrency,\n useFilters,\n useGroups,\n useLastCompleteBillingDate,\n useLoading,\n} from '../../hooks';\nimport { Alert } from '../../types';\nimport {\n Cost,\n Maybe,\n MetricData,\n Product,\n Project,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { mapLoadingToProps } from './selector';\nimport { ProjectSelect } from '../ProjectSelect';\nimport { intervalsOf } from '../../utils/duration';\nimport { useSubtleTypographyStyles } from '../../utils/styles';\nimport {\n isAlertActive,\n isAlertAccepted,\n isAlertDismissed,\n isAlertSnoozed,\n} from '../../utils/alerts';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const CostInsightsPage = () => {\n const classes = useSubtleTypographyStyles();\n const client = useApi(costInsightsApiRef);\n const config = useConfig();\n const groups = useGroups();\n const lastCompleteBillingDate = useLastCompleteBillingDate();\n const [alerts, setAlerts] = useState<Alert[]>([]);\n const [currency, setCurrency] = useCurrency();\n const [projects, setProjects] = useState<Maybe<Project[]>>(null);\n const [products, setProducts] = useState<Maybe<Product[]>>(null);\n const [dailyCost, setDailyCost] = useState<Maybe<Cost>>(null);\n const [metricData, setMetricData] = useState<Maybe<MetricData>>(null);\n const [error, setError] = useState<Maybe<Error>>(null);\n\n const { pageFilters, setPageFilters } = useFilters(p => p);\n\n const active = useMemo(() => alerts.filter(isAlertActive), [alerts]);\n const snoozed = useMemo(() => alerts.filter(isAlertSnoozed), [alerts]);\n const accepted = useMemo(() => alerts.filter(isAlertAccepted), [alerts]);\n const dismissed = useMemo(() => alerts.filter(isAlertDismissed), [alerts]);\n\n const isProductsDisplayed = !!config.products?.length;\n const isActionItemsDisplayed = !!active.length;\n const isAlertInsightsDisplayed = !!alerts.length;\n\n const {\n loadingActions,\n loadingGroups,\n loadingBillingDate,\n loadingInitial,\n dispatchInitial,\n dispatchInsights,\n dispatchNone,\n dispatchReset,\n } = useLoading(mapLoadingToProps);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n // The dispatchLoading functions are derived from loading state using mapLoadingToProps, to\n // provide nicer props for the component. These are re-derived whenever loading state changes,\n // which causes an infinite loop as product panels load and re-trigger the useEffect below.\n // Since the functions don't change, we can memoize - but we trigger the same loop if we satisfy\n // exhaustive-deps by including the function itself in dependencies.\n\n const dispatchLoadingInitial = useCallback(dispatchInitial, []);\n const dispatchLoadingInsights = useCallback(dispatchInsights, []);\n const dispatchLoadingNone = useCallback(dispatchNone, []);\n const dispatchLoadingReset = useCallback(dispatchReset, []);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n const setProject = (project: Maybe<string>) =>\n setPageFilters({\n ...pageFilters,\n project: project === 'all' ? null : project,\n });\n\n useEffect(() => {\n async function getInsights() {\n setError(null);\n try {\n if (pageFilters.group) {\n dispatchLoadingInsights(true);\n const intervals = intervalsOf(\n pageFilters.duration,\n lastCompleteBillingDate,\n 2,\n pageFilters.customDateRange,\n false, // Don't use comparison mode for the main cost overview graph\n );\n const [\n fetchedProjects,\n fetchedAlerts,\n fetchedMetricData,\n fetchedDailyCost,\n ] = await Promise.all([\n client.getGroupProjects(pageFilters.group),\n client.getAlerts(pageFilters.group),\n pageFilters.metric\n ? client.getDailyMetricData(pageFilters.metric, intervals)\n : null,\n pageFilters.project\n ? client.getProjectDailyCost(pageFilters.project, intervals)\n : client.getGroupDailyCost(pageFilters.group, intervals),\n ]);\n setProjects(fetchedProjects);\n setAlerts(fetchedAlerts);\n setMetricData(fetchedMetricData);\n setDailyCost(fetchedDailyCost);\n } else {\n dispatchLoadingNone(loadingActions);\n }\n } catch (e) {\n setError(e);\n dispatchLoadingNone(loadingActions);\n } finally {\n dispatchLoadingInitial(false);\n dispatchLoadingInsights(false);\n }\n }\n\n // Wait for metadata to finish loading\n if (!(loadingGroups && loadingBillingDate)) {\n getInsights();\n }\n }, [\n client,\n pageFilters,\n loadingActions,\n loadingGroups,\n loadingBillingDate,\n dispatchLoadingInsights,\n dispatchLoadingInitial,\n dispatchLoadingNone,\n lastCompleteBillingDate,\n ]);\n\n if (loadingInitial) {\n return <Progress />;\n }\n\n if (error) {\n return <MaterialAlert severity=\"error\">{error.message}</MaterialAlert>;\n }\n\n // Loaded but no groups found for the user\n if (!pageFilters.group) {\n return (\n <CostInsightsLayout groups={groups}>\n <Box textAlign=\"right\">\n <CopyUrlToClipboard />\n {/* <CostInsightsSupportButton /> */}\n </Box>\n <Container maxWidth=\"lg\">\n <CostInsightsHeaderNoGroups />\n </Container>\n <Divider />\n <Container maxWidth=\"lg\">\n <WhyCostsMatter />\n </Container>\n </CostInsightsLayout>\n );\n }\n\n if (!dailyCost) {\n return (\n <MaterialAlert severity=\"error\">{`Error: Could not fetch cost insights data for team ${pageFilters.group}`}</MaterialAlert>\n );\n }\n\n const onProjectSelect = (project: Maybe<string>) => {\n setProject(project);\n dispatchLoadingReset(loadingActions);\n };\n\n const CostOverviewBanner = () => (\n <Box\n px={3}\n pt={6}\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n minHeight={40}\n >\n <Box>\n <Typography variant=\"h4\">Cost Overview</Typography>\n <Typography classes={classes}>\n Billing data as of {lastCompleteBillingDate}\n </Typography>\n </Box>\n <Box display=\"flex\">\n <Box mr={1}>\n <CurrencySelect\n currency={currency}\n currencies={config.currencies}\n onSelect={setCurrency}\n />\n </Box>\n <ProjectSelect\n project={pageFilters.project}\n projects={projects || []}\n onSelect={onProjectSelect}\n />\n </Box>\n </Box>\n );\n\n return (\n <CostInsightsLayout groups={groups}>\n <Grid container wrap=\"nowrap\">\n {(isProductsDisplayed || isActionItemsDisplayed) && (\n <Grid item>\n <Box position=\"sticky\" top={20}>\n <CostInsightsNavigation\n products={products}\n alerts={active.length}\n />\n </Box>\n </Grid>\n )}\n <Grid item xs>\n <Box\n display=\"flex\"\n flexDirection=\"row\"\n justifyContent=\"flex-end\"\n mb={2}\n >\n <CopyUrlToClipboard />\n {/* <CostInsightsSupportButton /> */}\n </Box>\n <Container maxWidth=\"lg\" disableGutters>\n <Grid container direction=\"column\">\n <Grid item xs>\n <CostInsightsHeader\n groupId={pageFilters.group}\n groups={groups}\n hasCostData={!!dailyCost.aggregation.length}\n alerts={active.length}\n />\n </Grid>\n <Collapse in={isActionItemsDisplayed} enter={false}>\n <Grid item xs>\n <Box px={3} py={6}>\n <ActionItems\n active={active}\n snoozed={snoozed}\n accepted={accepted}\n dismissed={dismissed}\n />\n </Box>\n </Grid>\n <Divider />\n </Collapse>\n <Grid item xs>\n <CostOverviewBanner />\n </Grid>\n <Grid item xs>\n <Box px={3} py={6}>\n {!!dailyCost.aggregation.length && (\n <CostOverviewCard\n dailyCostData={dailyCost}\n metricData={metricData}\n />\n )}\n <WhyCostsMatter />\n </Box>\n </Grid>\n <Collapse in={isAlertInsightsDisplayed} enter={false}>\n <Grid item xs>\n <Box px={6} py={6} mx={-3} bgcolor=\"alertBackground\">\n <AlertInsights\n group={pageFilters.group}\n active={active}\n snoozed={snoozed}\n accepted={accepted}\n dismissed={dismissed}\n onChange={setAlerts}\n />\n </Box>\n </Grid>\n </Collapse>\n {!isAlertInsightsDisplayed && isProductsDisplayed && <Divider />}\n {isProductsDisplayed && (\n <Grid item xs>\n <Box px={3} py={6}>\n <ProductInsights\n group={pageFilters.group}\n project={pageFilters.project}\n products={config.products}\n onLoaded={setProducts}\n />\n </Box>\n </Grid>\n )}\n </Grid>\n </Container>\n </Grid>\n </Grid>\n </CostInsightsLayout>\n );\n};\n"],"names":["MaterialAlert"],"mappings":"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"}
1
+ {"version":3,"file":"CostInsightsPage.esm.js","sources":["../../../src/components/CostInsightsPage/CostInsightsPage.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { useCallback, useEffect, useMemo, useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport Container from '@material-ui/core/Container';\nimport Divider from '@material-ui/core/Divider';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { default as MaterialAlert } from '@material-ui/lab/Alert';\nimport { costInsightsApiRef } from '../../api';\nimport { ActionItems } from '../ActionItems';\nimport { AlertInsights } from '../AlertInsights';\nimport { CostInsightsLayout } from '../CostInsightsLayout';\nimport { CopyUrlToClipboard } from '../CopyUrlToClipboard';\nimport { CurrencySelect } from '../CurrencySelect';\nimport { WhyCostsMatter } from '../WhyCostsMatter';\nimport {\n CostInsightsHeader,\n CostInsightsHeaderNoGroups,\n} from '../CostInsightsHeader';\nimport { CostInsightsNavigation } from '../CostInsightsNavigation';\nimport { CostOverviewCard } from '../CostOverviewCard';\nimport { ProductInsights } from '../ProductInsights';\n/* https://github.com/backstage/backstage/issues/2574 */\n// import { CostInsightsSupportButton } from '../CostInsightsSupportButton';\nimport {\n useConfig,\n useCurrency,\n useFilters,\n useGroups,\n useLastCompleteBillingDate,\n useLoading,\n} from '../../hooks';\nimport { Alert } from '../../types';\nimport {\n Cost,\n Maybe,\n MetricData,\n Product,\n Project,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { mapLoadingToProps } from './selector';\nimport { ProjectSelect } from '../ProjectSelect';\nimport { intervalsOf } from '../../utils/duration';\nimport { useSubtleTypographyStyles } from '../../utils/styles';\nimport {\n isAlertActive,\n isAlertAccepted,\n isAlertDismissed,\n isAlertSnoozed,\n} from '../../utils/alerts';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const CostInsightsPage = () => {\n const classes = useSubtleTypographyStyles();\n const client = useApi(costInsightsApiRef);\n const config = useConfig();\n const groups = useGroups();\n const lastCompleteBillingDate = useLastCompleteBillingDate();\n const [alerts, setAlerts] = useState<Alert[]>([]);\n const [currency, setCurrency] = useCurrency();\n const [projects, setProjects] = useState<Maybe<Project[]>>(null);\n const [products, setProducts] = useState<Maybe<Product[]>>(null);\n const [dailyCost, setDailyCost] = useState<Maybe<Cost>>(null);\n const [metricData, setMetricData] = useState<Maybe<MetricData>>(null);\n const [error, setError] = useState<Maybe<Error>>(null);\n\n const { pageFilters, setPageFilters } = useFilters(p => p);\n\n const active = useMemo(() => alerts.filter(isAlertActive), [alerts]);\n const snoozed = useMemo(() => alerts.filter(isAlertSnoozed), [alerts]);\n const accepted = useMemo(() => alerts.filter(isAlertAccepted), [alerts]);\n const dismissed = useMemo(() => alerts.filter(isAlertDismissed), [alerts]);\n\n const isProductsDisplayed = !!config.products?.length;\n const isActionItemsDisplayed = !!active.length;\n const isAlertInsightsDisplayed = !!alerts.length;\n\n const {\n loadingActions,\n loadingGroups,\n loadingBillingDate,\n loadingInitial,\n dispatchInitial,\n dispatchInsights,\n dispatchNone,\n dispatchReset,\n } = useLoading(mapLoadingToProps);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n // The dispatchLoading functions are derived from loading state using mapLoadingToProps, to\n // provide nicer props for the component. These are re-derived whenever loading state changes,\n // which causes an infinite loop as product panels load and re-trigger the useEffect below.\n // Since the functions don't change, we can memoize - but we trigger the same loop if we satisfy\n // exhaustive-deps by including the function itself in dependencies.\n\n const dispatchLoadingInitial = useCallback(dispatchInitial, []);\n const dispatchLoadingInsights = useCallback(dispatchInsights, []);\n const dispatchLoadingNone = useCallback(dispatchNone, []);\n const dispatchLoadingReset = useCallback(dispatchReset, []);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n const setProject = (project: Maybe<string>) =>\n setPageFilters({\n ...pageFilters,\n project: project === 'all' ? null : project,\n });\n\n useEffect(() => {\n async function getInsights() {\n setError(null);\n try {\n if (pageFilters.group) {\n dispatchLoadingInsights(true);\n const intervals = intervalsOf(\n pageFilters.duration,\n lastCompleteBillingDate,\n 2,\n pageFilters.customDateRange,\n false, // Don't use comparison mode for the main cost overview graph\n );\n const [\n fetchedProjects,\n fetchedAlerts,\n fetchedMetricData,\n fetchedDailyCost,\n ] = await Promise.all([\n client.getGroupProjects(pageFilters.group),\n client.getAlerts(pageFilters.group),\n pageFilters.metric\n ? client.getDailyMetricData(pageFilters.metric, intervals)\n : null,\n pageFilters.project\n ? client.getProjectDailyCost(pageFilters.project, intervals)\n : client.getGroupDailyCost(pageFilters.group, intervals),\n ]);\n setProjects(fetchedProjects);\n setAlerts(fetchedAlerts);\n setMetricData(fetchedMetricData);\n setDailyCost(fetchedDailyCost);\n } else {\n dispatchLoadingNone(loadingActions);\n }\n } catch (e) {\n setError(e);\n dispatchLoadingNone(loadingActions);\n } finally {\n dispatchLoadingInitial(false);\n dispatchLoadingInsights(false);\n }\n }\n\n // Wait for metadata to finish loading\n if (!(loadingGroups && loadingBillingDate)) {\n getInsights();\n }\n }, [\n client,\n pageFilters,\n loadingActions,\n loadingGroups,\n loadingBillingDate,\n dispatchLoadingInsights,\n dispatchLoadingInitial,\n dispatchLoadingNone,\n lastCompleteBillingDate,\n ]);\n\n if (loadingInitial) {\n return <Progress />;\n }\n\n if (error) {\n return <MaterialAlert severity=\"error\">{error.message}</MaterialAlert>;\n }\n\n // Loaded but no groups found for the user\n if (!pageFilters.group) {\n return (\n <CostInsightsLayout groups={groups}>\n <Box textAlign=\"right\">\n <CopyUrlToClipboard />\n {/* <CostInsightsSupportButton /> */}\n </Box>\n <Container maxWidth=\"lg\">\n <CostInsightsHeaderNoGroups />\n </Container>\n <Divider />\n <Container maxWidth=\"lg\">\n <WhyCostsMatter />\n </Container>\n </CostInsightsLayout>\n );\n }\n\n if (!dailyCost) {\n return (\n <MaterialAlert severity=\"error\">{`Error: Could not fetch cost insights data for team ${pageFilters.group}`}</MaterialAlert>\n );\n }\n\n const onProjectSelect = (project: Maybe<string>) => {\n setProject(project);\n dispatchLoadingReset(loadingActions);\n };\n\n const CostOverviewBanner = () => (\n <Box\n px={3}\n pt={6}\n display=\"flex\"\n justifyContent=\"space-between\"\n alignItems=\"center\"\n minHeight={40}\n >\n <Box>\n <Typography variant=\"h4\">Cost Overview</Typography>\n <Typography classes={classes}>\n Billing data as of {lastCompleteBillingDate}\n </Typography>\n </Box>\n <Box display=\"flex\">\n <Box mr={1}>\n <CurrencySelect\n currency={currency}\n currencies={config.currencies}\n onSelect={setCurrency}\n />\n </Box>\n <ProjectSelect\n project={pageFilters.project}\n projects={projects || []}\n onSelect={onProjectSelect}\n />\n </Box>\n </Box>\n );\n\n return (\n <CostInsightsLayout groups={groups}>\n <Grid container wrap=\"nowrap\">\n {(isProductsDisplayed || isActionItemsDisplayed) && (\n <Grid item>\n <Box position=\"sticky\" top={20}>\n <CostInsightsNavigation\n products={products}\n alerts={active.length}\n />\n </Box>\n </Grid>\n )}\n <Grid item xs>\n <Box\n display=\"flex\"\n flexDirection=\"row\"\n justifyContent=\"flex-end\"\n mb={2}\n >\n <CopyUrlToClipboard />\n {/* <CostInsightsSupportButton /> */}\n </Box>\n <Container maxWidth=\"lg\" disableGutters>\n <Grid container direction=\"column\">\n <Grid item xs>\n <CostInsightsHeader\n groupId={pageFilters.group}\n groups={groups}\n hasCostData={!!dailyCost.aggregation.length}\n alerts={active.length}\n />\n </Grid>\n <Collapse in={isActionItemsDisplayed} enter={false}>\n <Grid item xs>\n <Box px={3} py={6}>\n <ActionItems\n active={active}\n snoozed={snoozed}\n accepted={accepted}\n dismissed={dismissed}\n />\n </Box>\n </Grid>\n <Divider />\n </Collapse>\n <Grid item xs>\n <CostOverviewBanner />\n </Grid>\n <Grid item xs>\n <Box px={3} py={6}>\n {!!dailyCost.aggregation.length && (\n <CostOverviewCard\n dailyCostData={dailyCost}\n metricData={metricData}\n />\n )}\n <WhyCostsMatter />\n </Box>\n </Grid>\n <Collapse in={isAlertInsightsDisplayed} enter={false}>\n <Grid item xs>\n <Box px={6} py={6} mx={-3} bgcolor=\"alertBackground\">\n <AlertInsights\n group={pageFilters.group}\n active={active}\n snoozed={snoozed}\n accepted={accepted}\n dismissed={dismissed}\n onChange={setAlerts}\n />\n </Box>\n </Grid>\n </Collapse>\n {!isAlertInsightsDisplayed && isProductsDisplayed && <Divider />}\n {isProductsDisplayed && (\n <Grid item xs>\n <Box px={3} py={6}>\n <ProductInsights\n group={pageFilters.group}\n project={pageFilters.project}\n products={config.products}\n onLoaded={setProducts}\n />\n </Box>\n </Grid>\n )}\n </Grid>\n </Container>\n </Grid>\n </Grid>\n </CostInsightsLayout>\n );\n};\n"],"names":["MaterialAlert"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CostInsightsPageRoot.esm.js","sources":["../../../src/components/CostInsightsPage/CostInsightsPageRoot.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { CostInsightsPage } from './CostInsightsPage';\nimport { FilterProvider } from '../../hooks/useFilters';\nimport { LoadingProvider } from '../../hooks/useLoading';\nimport { GroupsProvider } from '../../hooks/useGroups';\nimport { CurrencyProvider } from '../../hooks/useCurrency';\nimport { ScrollProvider } from '../../hooks/useScroll';\nimport { ConfigProvider } from '../../hooks/useConfig';\nimport { BillingDateProvider } from '../../hooks/useLastCompleteBillingDate';\nimport { CostInsightsThemeProvider } from './CostInsightsThemeProvider';\n\nexport const CostInsightsPageRoot = () => (\n <CostInsightsThemeProvider>\n <ConfigProvider>\n <LoadingProvider>\n <GroupsProvider>\n <BillingDateProvider>\n <FilterProvider>\n <ScrollProvider>\n <CurrencyProvider>\n <CostInsightsPage />\n </CurrencyProvider>\n </ScrollProvider>\n </FilterProvider>\n </BillingDateProvider>\n </GroupsProvider>\n </LoadingProvider>\n </ConfigProvider>\n </CostInsightsThemeProvider>\n);\n"],"names":[],"mappings":";;;;;;;;;;;AA0Ba,MAAA,oBAAA,GAAuB,sBAClC,GAAA,CAAC,yBACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,cACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,eACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,cACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,mBACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,cACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,cACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,gBACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,gBAAiB,EAAA,EAAA,CAAA,EACpB,CACF,EAAA,CAAA,EACF,CACF,EAAA,CAAA,EACF,CACF,EAAA,CAAA,EACF,CACF,EAAA;;;;"}
1
+ {"version":3,"file":"CostInsightsPageRoot.esm.js","sources":["../../../src/components/CostInsightsPage/CostInsightsPageRoot.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\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 { CostInsightsPage } from './CostInsightsPage';\nimport { FilterProvider } from '../../hooks/useFilters';\nimport { LoadingProvider } from '../../hooks/useLoading';\nimport { GroupsProvider } from '../../hooks/useGroups';\nimport { CurrencyProvider } from '../../hooks/useCurrency';\nimport { ScrollProvider } from '../../hooks/useScroll';\nimport { ConfigProvider } from '../../hooks/useConfig';\nimport { BillingDateProvider } from '../../hooks/useLastCompleteBillingDate';\nimport { CostInsightsThemeProvider } from './CostInsightsThemeProvider';\n\nexport const CostInsightsPageRoot = () => (\n <CostInsightsThemeProvider>\n <ConfigProvider>\n <LoadingProvider>\n <GroupsProvider>\n <BillingDateProvider>\n <FilterProvider>\n <ScrollProvider>\n <CurrencyProvider>\n <CostInsightsPage />\n </CurrencyProvider>\n </ScrollProvider>\n </FilterProvider>\n </BillingDateProvider>\n </GroupsProvider>\n </LoadingProvider>\n </ConfigProvider>\n </CostInsightsThemeProvider>\n);\n"],"names":[],"mappings":";;;;;;;;;;;AA0BO,MAAM,oBAAA,GAAuB,sBAClC,GAAA,CAAC,yBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EAAiB,CAAA,EACpB,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF;;;;"}