@backstage-community/plugin-cost-insights 0.12.25 → 0.12.27

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 (230) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/alerts/ProjectGrowthAlert.esm.js +24 -0
  3. package/dist/alerts/ProjectGrowthAlert.esm.js.map +1 -0
  4. package/dist/alerts/UnlabeledDataflowAlert.esm.js +25 -0
  5. package/dist/alerts/UnlabeledDataflowAlert.esm.js.map +1 -0
  6. package/dist/api/CostInsightsApi.esm.js +8 -0
  7. package/dist/api/CostInsightsApi.esm.js.map +1 -0
  8. package/dist/components/ActionItems/ActionItemCard.esm.js +46 -0
  9. package/dist/components/ActionItems/ActionItemCard.esm.js.map +1 -0
  10. package/dist/components/ActionItems/ActionItems.esm.js +90 -0
  11. package/dist/components/ActionItems/ActionItems.esm.js.map +1 -0
  12. package/dist/components/AlertInsights/AlertDialog.esm.js +123 -0
  13. package/dist/components/AlertInsights/AlertDialog.esm.js.map +1 -0
  14. package/dist/components/AlertInsights/AlertInsights.esm.js +157 -0
  15. package/dist/components/AlertInsights/AlertInsights.esm.js.map +1 -0
  16. package/dist/components/AlertInsights/AlertInsightsHeader.esm.js +17 -0
  17. package/dist/components/AlertInsights/AlertInsightsHeader.esm.js.map +1 -0
  18. package/dist/components/AlertInsights/AlertInsightsSection.esm.js +57 -0
  19. package/dist/components/AlertInsights/AlertInsightsSection.esm.js.map +1 -0
  20. package/dist/components/AlertInsights/AlertInsightsSectionHeader.esm.js +30 -0
  21. package/dist/components/AlertInsights/AlertInsightsSectionHeader.esm.js.map +1 -0
  22. package/dist/components/AlertInsights/AlertStatusSummary.esm.js +93 -0
  23. package/dist/components/AlertInsights/AlertStatusSummary.esm.js.map +1 -0
  24. package/dist/components/AlertInsights/AlertStatusSummaryButton.esm.js +35 -0
  25. package/dist/components/AlertInsights/AlertStatusSummaryButton.esm.js.map +1 -0
  26. package/dist/components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js +47 -0
  27. package/dist/components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js.map +1 -0
  28. package/dist/components/BarChart/BarChart.esm.js +167 -0
  29. package/dist/components/BarChart/BarChart.esm.js.map +1 -0
  30. package/dist/components/BarChart/BarChartLabel.esm.js +31 -0
  31. package/dist/components/BarChart/BarChartLabel.esm.js.map +1 -0
  32. package/dist/components/BarChart/BarChartLegend.esm.js +47 -0
  33. package/dist/components/BarChart/BarChartLegend.esm.js.map +1 -0
  34. package/dist/components/BarChart/BarChartStepper.esm.js +91 -0
  35. package/dist/components/BarChart/BarChartStepper.esm.js.map +1 -0
  36. package/dist/components/BarChart/BarChartStepperButton.esm.js +27 -0
  37. package/dist/components/BarChart/BarChartStepperButton.esm.js.map +1 -0
  38. package/dist/components/BarChart/BarChartSteps.esm.js +25 -0
  39. package/dist/components/BarChart/BarChartSteps.esm.js.map +1 -0
  40. package/dist/components/BarChart/BarChartTick.esm.js +29 -0
  41. package/dist/components/BarChart/BarChartTick.esm.js.map +1 -0
  42. package/dist/components/BarChart/BarChartTooltip.esm.js +30 -0
  43. package/dist/components/BarChart/BarChartTooltip.esm.js.map +1 -0
  44. package/dist/components/BarChart/BarChartTooltipItem.esm.js +24 -0
  45. package/dist/components/BarChart/BarChartTooltipItem.esm.js.map +1 -0
  46. package/dist/components/CopyUrlToClipboard/CopyUrlToClipboard.esm.js +44 -0
  47. package/dist/components/CopyUrlToClipboard/CopyUrlToClipboard.esm.js.map +1 -0
  48. package/dist/components/CostGrowth/CostGrowth.esm.js +55 -0
  49. package/dist/components/CostGrowth/CostGrowth.esm.js.map +1 -0
  50. package/dist/components/CostGrowth/CostGrowthIndicator.esm.js +31 -0
  51. package/dist/components/CostGrowth/CostGrowthIndicator.esm.js.map +1 -0
  52. package/dist/components/CostInsightsHeader/CostInsightsHeader.esm.js +57 -0
  53. package/dist/components/CostInsightsHeader/CostInsightsHeader.esm.js.map +1 -0
  54. package/dist/components/CostInsightsLayout/CostInsightsLayout.esm.js +35 -0
  55. package/dist/components/CostInsightsLayout/CostInsightsLayout.esm.js.map +1 -0
  56. package/dist/components/CostInsightsNavigation/CostInsightsNavigation.esm.js +87 -0
  57. package/dist/components/CostInsightsNavigation/CostInsightsNavigation.esm.js.map +1 -0
  58. package/dist/components/CostInsightsPage/CostInsightsPage.esm.js +229 -0
  59. package/dist/components/CostInsightsPage/CostInsightsPage.esm.js.map +1 -0
  60. package/dist/components/CostInsightsPage/CostInsightsPageRoot.esm.js +15 -0
  61. package/dist/components/CostInsightsPage/CostInsightsPageRoot.esm.js.map +1 -0
  62. package/dist/components/CostInsightsPage/CostInsightsThemeProvider.esm.js +24 -0
  63. package/dist/components/CostInsightsPage/CostInsightsThemeProvider.esm.js.map +1 -0
  64. package/dist/components/CostInsightsPage/index.esm.js +2 -0
  65. package/dist/components/CostInsightsPage/index.esm.js.map +1 -0
  66. package/dist/components/CostInsightsPage/selector.esm.js +15 -0
  67. package/dist/components/CostInsightsPage/selector.esm.js.map +1 -0
  68. package/dist/components/CostInsightsTabs/CostInsightsTabs.esm.js +89 -0
  69. package/dist/components/CostInsightsTabs/CostInsightsTabs.esm.js.map +1 -0
  70. package/dist/components/CostInsightsTabs/selector.esm.js +17 -0
  71. package/dist/components/CostInsightsTabs/selector.esm.js.map +1 -0
  72. package/dist/components/CostOverviewCard/CostOverviewBreakdownChart.esm.js +196 -0
  73. package/dist/components/CostOverviewCard/CostOverviewBreakdownChart.esm.js.map +1 -0
  74. package/dist/components/CostOverviewCard/CostOverviewCard.esm.js +99 -0
  75. package/dist/components/CostOverviewCard/CostOverviewCard.esm.js.map +1 -0
  76. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js +157 -0
  77. package/dist/components/CostOverviewCard/CostOverviewChart.esm.js.map +1 -0
  78. package/dist/components/CostOverviewCard/CostOverviewHeader.esm.js +25 -0
  79. package/dist/components/CostOverviewCard/CostOverviewHeader.esm.js.map +1 -0
  80. package/dist/components/CostOverviewCard/CostOverviewLegend.esm.js +54 -0
  81. package/dist/components/CostOverviewCard/CostOverviewLegend.esm.js.map +1 -0
  82. package/dist/components/CostOverviewCard/selector.esm.js +22 -0
  83. package/dist/components/CostOverviewCard/selector.esm.js.map +1 -0
  84. package/dist/components/CurrencySelect/CurrencySelect.esm.js +52 -0
  85. package/dist/components/CurrencySelect/CurrencySelect.esm.js.map +1 -0
  86. package/dist/{esm/index-BPzWHt3A.esm.js → components/EntityCosts/EntityCosts.esm.js} +14 -80
  87. package/dist/{esm/index-BPzWHt3A.esm.js.map → components/EntityCosts/EntityCosts.esm.js.map} +1 -1
  88. package/dist/components/EntityCosts/index.esm.js +2 -0
  89. package/dist/components/EntityCosts/index.esm.js.map +1 -0
  90. package/dist/{esm/index-BA6m_qFS.esm.js → components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.esm.js} +2 -79
  91. package/dist/components/LabelDataflowInstructionsPage/LabelDataflowInstructionsPage.esm.js.map +1 -0
  92. package/dist/components/LabelDataflowInstructionsPage/index.esm.js +2 -0
  93. package/dist/components/LabelDataflowInstructionsPage/index.esm.js.map +1 -0
  94. package/dist/components/LegendItem/LegendItem.esm.js +44 -0
  95. package/dist/components/LegendItem/LegendItem.esm.js.map +1 -0
  96. package/dist/components/MetricSelect/MetricSelect.esm.js +37 -0
  97. package/dist/components/MetricSelect/MetricSelect.esm.js.map +1 -0
  98. package/dist/components/PeriodSelect/PeriodSelect.esm.js +72 -0
  99. package/dist/components/PeriodSelect/PeriodSelect.esm.js.map +1 -0
  100. package/dist/components/ProductInsights/ProductInsights.esm.js +98 -0
  101. package/dist/components/ProductInsights/ProductInsights.esm.js.map +1 -0
  102. package/dist/components/ProductInsightsCard/ProductEntityDialog.esm.js +42 -0
  103. package/dist/components/ProductInsightsCard/ProductEntityDialog.esm.js.map +1 -0
  104. package/dist/components/ProductInsightsCard/ProductEntityTable.esm.js +139 -0
  105. package/dist/components/ProductInsightsCard/ProductEntityTable.esm.js.map +1 -0
  106. package/dist/components/ProductInsightsCard/ProductInsightsCard.esm.js +83 -0
  107. package/dist/components/ProductInsightsCard/ProductInsightsCard.esm.js.map +1 -0
  108. package/dist/components/ProductInsightsCard/ProductInsightsCardList.esm.js +34 -0
  109. package/dist/components/ProductInsightsCard/ProductInsightsCardList.esm.js.map +1 -0
  110. package/dist/components/ProductInsightsCard/ProductInsightsChart.esm.js +148 -0
  111. package/dist/components/ProductInsightsCard/ProductInsightsChart.esm.js.map +1 -0
  112. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertCard.esm.js +20 -0
  113. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertCard.esm.js.map +1 -0
  114. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.esm.js +46 -0
  115. package/dist/components/ProjectGrowthAlertCard/ProjectGrowthAlertChart.esm.js.map +1 -0
  116. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js +111 -0
  117. package/dist/components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js.map +1 -0
  118. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js +2 -0
  119. package/dist/components/ProjectGrowthInstructionsPage/index.esm.js.map +1 -0
  120. package/dist/components/ProjectSelect/ProjectSelect.esm.js +47 -0
  121. package/dist/components/ProjectSelect/ProjectSelect.esm.js.map +1 -0
  122. package/dist/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.esm.js +41 -0
  123. package/dist/components/UnlabeledDataflowAlertCard/UnlabeledDataflowAlertCard.esm.js.map +1 -0
  124. package/dist/components/WhyCostsMatter/WhyCostsMatter.esm.js +21 -0
  125. package/dist/components/WhyCostsMatter/WhyCostsMatter.esm.js.map +1 -0
  126. package/dist/example/alerts/KubernetesMigrationAlert.esm.js +86 -0
  127. package/dist/example/alerts/KubernetesMigrationAlert.esm.js.map +1 -0
  128. package/dist/example/client.esm.js +194 -0
  129. package/dist/example/client.esm.js.map +1 -0
  130. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.esm.js +33 -0
  131. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.esm.js.map +1 -0
  132. package/dist/{esm/index-BTIHr4n_.esm.js → example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.esm.js} +69 -48
  133. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.esm.js.map +1 -0
  134. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.esm.js +107 -0
  135. package/dist/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.esm.js.map +1 -0
  136. package/dist/example/forms/KubernetesMigrationDismissForm.esm.js +57 -0
  137. package/dist/example/forms/KubernetesMigrationDismissForm.esm.js.map +1 -0
  138. package/dist/forms/AlertAcceptForm.esm.js +27 -0
  139. package/dist/forms/AlertAcceptForm.esm.js.map +1 -0
  140. package/dist/forms/AlertDismissForm.esm.js +100 -0
  141. package/dist/forms/AlertDismissForm.esm.js.map +1 -0
  142. package/dist/forms/AlertSnoozeForm.esm.js +52 -0
  143. package/dist/forms/AlertSnoozeForm.esm.js.map +1 -0
  144. package/dist/hooks/useConfig.esm.js +153 -0
  145. package/dist/hooks/useConfig.esm.js.map +1 -0
  146. package/dist/hooks/useCurrency.esm.js +26 -0
  147. package/dist/hooks/useCurrency.esm.js.map +1 -0
  148. package/dist/hooks/useFilters.esm.js +67 -0
  149. package/dist/hooks/useFilters.esm.js.map +1 -0
  150. package/dist/hooks/useGroups.esm.js +55 -0
  151. package/dist/hooks/useGroups.esm.js.map +1 -0
  152. package/dist/hooks/useLastCompleteBillingDate.esm.js +65 -0
  153. package/dist/hooks/useLastCompleteBillingDate.esm.js.map +1 -0
  154. package/dist/hooks/useLoading.esm.js +54 -0
  155. package/dist/hooks/useLoading.esm.js.map +1 -0
  156. package/dist/hooks/useScroll.esm.js +24 -0
  157. package/dist/hooks/useScroll.esm.js.map +1 -0
  158. package/dist/index.esm.js +37 -22
  159. package/dist/index.esm.js.map +1 -1
  160. package/dist/plugin.esm.js +55 -0
  161. package/dist/plugin.esm.js.map +1 -0
  162. package/dist/testUtils/filters.esm.js +8 -0
  163. package/dist/testUtils/filters.esm.js.map +1 -0
  164. package/dist/testUtils/loading.esm.js +14 -0
  165. package/dist/testUtils/loading.esm.js.map +1 -0
  166. package/dist/testUtils/mockData.esm.js +485 -0
  167. package/dist/testUtils/mockData.esm.js.map +1 -0
  168. package/dist/testUtils/products.esm.js +49 -0
  169. package/dist/testUtils/products.esm.js.map +1 -0
  170. package/dist/testUtils/providers.esm.js +41 -0
  171. package/dist/testUtils/providers.esm.js.map +1 -0
  172. package/dist/testUtils/testUtils.esm.js +142 -0
  173. package/dist/testUtils/testUtils.esm.js.map +1 -0
  174. package/dist/types/Alert.esm.js +66 -0
  175. package/dist/types/Alert.esm.js.map +1 -0
  176. package/dist/types/ChangeStatistic.esm.js +15 -0
  177. package/dist/types/ChangeStatistic.esm.js.map +1 -0
  178. package/dist/types/CurrencyType.esm.js +10 -0
  179. package/dist/types/CurrencyType.esm.js.map +1 -0
  180. package/dist/types/DateFormat.esm.js +4 -0
  181. package/dist/types/DateFormat.esm.js.map +1 -0
  182. package/dist/types/Duration.esm.js +10 -0
  183. package/dist/types/Duration.esm.js.map +1 -0
  184. package/dist/types/Icon.esm.js +12 -0
  185. package/dist/types/Icon.esm.js.map +1 -0
  186. package/dist/utils/alerts.esm.js +72 -0
  187. package/dist/utils/alerts.esm.js.map +1 -0
  188. package/dist/utils/assert.esm.js +29 -0
  189. package/dist/utils/assert.esm.js.map +1 -0
  190. package/dist/utils/change.esm.js +58 -0
  191. package/dist/utils/change.esm.js.map +1 -0
  192. package/dist/utils/charts.esm.js +9 -0
  193. package/dist/utils/charts.esm.js.map +1 -0
  194. package/dist/utils/config.esm.js +19 -0
  195. package/dist/utils/config.esm.js.map +1 -0
  196. package/dist/utils/currency.esm.js +56 -0
  197. package/dist/utils/currency.esm.js.map +1 -0
  198. package/dist/utils/duration.esm.js +55 -0
  199. package/dist/utils/duration.esm.js.map +1 -0
  200. package/dist/utils/filters.esm.js +14 -0
  201. package/dist/utils/filters.esm.js.map +1 -0
  202. package/dist/utils/formatters.esm.js +103 -0
  203. package/dist/utils/formatters.esm.js.map +1 -0
  204. package/dist/utils/grammar.esm.js +14 -0
  205. package/dist/utils/grammar.esm.js.map +1 -0
  206. package/dist/utils/graphs.esm.js +48 -0
  207. package/dist/utils/graphs.esm.js.map +1 -0
  208. package/dist/utils/history.esm.js +32 -0
  209. package/dist/utils/history.esm.js.map +1 -0
  210. package/dist/utils/loading.esm.js +51 -0
  211. package/dist/utils/loading.esm.js.map +1 -0
  212. package/dist/utils/navigation.esm.js +56 -0
  213. package/dist/utils/navigation.esm.js.map +1 -0
  214. package/dist/utils/scroll.esm.js +38 -0
  215. package/dist/utils/scroll.esm.js.map +1 -0
  216. package/dist/utils/sort.esm.js +10 -0
  217. package/dist/utils/sort.esm.js.map +1 -0
  218. package/dist/utils/styles.esm.js +562 -0
  219. package/dist/utils/styles.esm.js.map +1 -0
  220. package/dist/utils/sum.esm.js +4 -0
  221. package/dist/utils/sum.esm.js.map +1 -0
  222. package/package.json +17 -12
  223. package/dist/esm/index-BA6m_qFS.esm.js.map +0 -1
  224. package/dist/esm/index-BFM2mP6Z.esm.js +0 -4084
  225. package/dist/esm/index-BFM2mP6Z.esm.js.map +0 -1
  226. package/dist/esm/index-BTIHr4n_.esm.js.map +0 -1
  227. package/dist/esm/index-DaitkcPN.esm.js +0 -1136
  228. package/dist/esm/index-DaitkcPN.esm.js.map +0 -1
  229. package/dist/esm/selector-D7iXJwd9.esm.js +0 -594
  230. package/dist/esm/selector-D7iXJwd9.esm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-DaitkcPN.esm.js","sources":["../../src/components/ActionItems/ActionItemCard.tsx","../../src/components/ActionItems/ActionItems.tsx","../../src/components/AlertInsights/AlertDialog.tsx","../../src/components/AlertInsights/AlertStatusSummary.tsx","../../src/components/AlertInsights/AlertStatusSummaryButton.tsx","../../src/components/AlertInsights/AlertInsightsHeader.tsx","../../src/components/AlertInsights/AlertInsightsSectionHeader.tsx","../../src/components/AlertInsights/AlertInsightsSection.tsx","../../src/components/AlertInsights/AlertInsights.tsx","../../src/components/CopyUrlToClipboard/CopyUrlToClipboard.tsx","../../src/components/CostInsightsHeader/CostInsightsHeader.tsx","../../src/components/CurrencySelect/CurrencySelect.tsx","../../src/components/WhyCostsMatter/WhyCostsMatter.tsx","../../src/components/ProductInsightsCard/ProductInsightsCard.tsx","../../src/components/ProductInsightsCard/ProductInsightsCardList.tsx","../../src/components/ProductInsights/ProductInsights.tsx","../../src/components/ProjectSelect/ProjectSelect.tsx","../../src/components/CostInsightsPage/CostInsightsPage.tsx","../../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 */\nimport React, { MouseEventHandler } from 'react';\nimport classnames from 'classnames';\nimport Card from '@material-ui/core/Card';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport { useScroll } from '../../hooks';\nimport { Alert } from '../../types';\nimport { useActionItemCardStyles as useStyles } from '../../utils/styles';\n\ntype ActionItemCardProps = {\n alert: Alert;\n number?: number;\n avatar?: JSX.Element;\n disableScroll?: boolean;\n};\n\nexport const ActionItemCard = ({\n alert,\n avatar,\n number,\n disableScroll = false,\n}: ActionItemCardProps) => {\n const classes = useStyles();\n const rootClasses = classnames(classes.root, {\n [classes.activeRoot]: !disableScroll,\n });\n const [, setScroll] = useScroll();\n\n const onActionItemClick: MouseEventHandler = () => {\n if (!disableScroll && number) {\n setScroll(`alert-${number}`);\n }\n };\n\n return (\n <Card className={classes.card} raised={false} onClick={onActionItemClick}>\n <CardHeader\n classes={{\n root: rootClasses,\n action: classes.action,\n title: classes.title,\n }}\n title={alert.title}\n subheader={alert.subtitle}\n avatar={avatar}\n />\n </Card>\n );\n};\n","/*\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 React, { Fragment, MouseEventHandler } from 'react';\nimport Avatar from '@material-ui/core/Avatar';\nimport { IconButtonProps } from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport IconButton from '@material-ui/core/IconButton';\nimport Badge from '@material-ui/core/Badge';\nimport Box from '@material-ui/core/Box';\nimport Paper from '@material-ui/core/Paper';\nimport Divider from '@material-ui/core/Divider';\nimport { default as SnoozeIcon } from '@material-ui/icons/AccessTime';\nimport { default as AcceptIcon } from '@material-ui/icons/Check';\nimport { default as DismissIcon } from '@material-ui/icons/Delete';\nimport { ActionItemCard } from './ActionItemCard';\nimport { Alert, AlertStatus } from '../../types';\nimport { useScroll, ScrollType } from '../../hooks';\nimport { useActionItemCardStyles as useStyles } from '../../utils/styles';\n\ntype AlertStatusButtonProps = {\n title: string;\n amount: number;\n icon: JSX.Element;\n onClick: MouseEventHandler;\n} & IconButtonProps;\n\nconst AlertStatusButton = ({\n title,\n amount,\n icon,\n onClick,\n ...buttonProps\n}: AlertStatusButtonProps) => (\n <Tooltip title={title}>\n <IconButton\n onClick={onClick}\n role=\"button\"\n aria-hidden={false}\n {...buttonProps}\n >\n <Badge badgeContent={amount}>{icon}</Badge>\n </IconButton>\n </Tooltip>\n);\n\ntype ActionItemsProps = {\n active: Alert[];\n snoozed: Alert[];\n accepted: Alert[];\n dismissed: Alert[];\n};\n\nexport const ActionItems = ({\n active,\n snoozed,\n accepted,\n dismissed,\n}: ActionItemsProps) => {\n const classes = useStyles();\n const [, setScroll] = useScroll();\n\n const isSnoozedButtonDisplayed = !!snoozed.length;\n const isAcceptedButtonDisplayed = !!accepted.length;\n const isDismissedButtonDisplayed = !!dismissed.length;\n const isStatusButtonGroupDisplayed = !!active.length;\n\n const onStatusButtonClick: MouseEventHandler = () =>\n setScroll(ScrollType.AlertSummary);\n\n return (\n <>\n <Paper>\n {active.map((alert, index) => (\n <Fragment key={`alert-${index}`}>\n <ActionItemCard\n alert={alert}\n number={index + 1}\n avatar={<Avatar className={classes.avatar}>{index + 1}</Avatar>}\n />\n {index < active.length - 1 && <Divider />}\n </Fragment>\n ))}\n </Paper>\n {isStatusButtonGroupDisplayed && (\n <Box display=\"flex\" justifyContent=\"flex-end\" mt={2}>\n {isAcceptedButtonDisplayed && (\n <AlertStatusButton\n title=\"Accepted\"\n aria-label={AlertStatus.Accepted}\n icon={<AcceptIcon />}\n amount={accepted.length}\n onClick={onStatusButtonClick}\n />\n )}\n {isSnoozedButtonDisplayed && (\n <AlertStatusButton\n title=\"Snoozed\"\n aria-label={AlertStatus.Snoozed}\n amount={snoozed.length}\n icon={<SnoozeIcon />}\n onClick={onStatusButtonClick}\n />\n )}\n {isDismissedButtonDisplayed && (\n <AlertStatusButton\n title=\"Dismissed\"\n aria-label={AlertStatus.Dismissed}\n icon={<DismissIcon />}\n amount={dismissed.length}\n onClick={onStatusButtonClick}\n />\n )}\n </Box>\n )}\n </>\n );\n};\n","/*\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 React, { useEffect, useRef, useState } from 'react';\nimport { capitalize } from '@material-ui/core/utils';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Divider from '@material-ui/core/Divider';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport IconButton from '@material-ui/core/IconButton';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport Typography from '@material-ui/core/Typography';\nimport { default as CloseIcon } from '@material-ui/icons/Close';\nimport { useAlertDialogStyles as useStyles } from '../../utils/styles';\nimport { Alert, AlertStatus } from '../../types';\nimport { Maybe } from '@backstage-community/plugin-cost-insights-common';\nimport { choose, formOf } from '../../utils/alerts';\n\nconst DEFAULT_FORM_ID = 'alert-form';\n\ntype AlertDialogProps = {\n open: boolean;\n group: string;\n alert: Maybe<Alert>;\n status: Maybe<AlertStatus>;\n onClose: () => void;\n onSubmit: (data: any) => void;\n};\n\nexport const AlertDialog = ({\n open,\n group,\n alert,\n status,\n onClose,\n onSubmit,\n}: AlertDialogProps) => {\n const classes = useStyles();\n const [isSubmitDisabled, setSubmitDisabled] = useState(true);\n const formRef = useRef<Maybe<HTMLFormElement>>(null);\n\n useEffect(() => {\n setSubmitDisabled(open);\n }, [open]);\n\n function disableSubmit(isDisabled: boolean) {\n setSubmitDisabled(isDisabled);\n }\n\n function onDialogClose() {\n onClose();\n setSubmitDisabled(true);\n }\n\n const [action, actioned] = choose(\n status,\n [\n ['snooze', 'snoozed'],\n ['accept', 'accepted'],\n ['dismiss', 'dismissed'],\n ],\n ['', ''],\n );\n\n const TransitionProps = {\n mountOnEnter: true,\n unmountOnExit: true,\n onEntered() {\n if (formRef.current) {\n formRef.current.id = DEFAULT_FORM_ID;\n }\n },\n };\n\n const Form = formOf(alert, status);\n\n return (\n <Dialog\n open={open}\n onClose={onDialogClose}\n scroll=\"body\"\n maxWidth=\"lg\"\n TransitionProps={TransitionProps}\n >\n <Box display=\"flex\" justifyContent=\"flex-end\">\n <IconButton\n className={classes.icon}\n disableRipple\n aria-label=\"Close\"\n onClick={onDialogClose}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n <DialogContent className={classes.content}>\n <Box mb={1.5}>\n <Typography variant=\"h5\">\n <b>{capitalize(action)} this action item?</b>\n </Typography>\n <Typography variant=\"h6\" color=\"textSecondary\">\n <b>\n This action item will be {actioned} for all of {group}.\n </b>\n </Typography>\n </Box>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n bgcolor=\"alertBackground\"\n p={2}\n mb={1.5}\n borderRadius={4}\n >\n <Typography>\n <b>{alert?.title}</b>\n </Typography>\n <Typography color=\"textSecondary\">{alert?.subtitle}</Typography>\n </Box>\n {Form && (\n <Form\n ref={formRef}\n alert={alert}\n onSubmit={onSubmit}\n disableSubmit={disableSubmit}\n />\n )}\n </DialogContent>\n <Divider />\n <DialogActions className={classes.actions} disableSpacing>\n {Form ? (\n <Button\n type=\"submit\"\n color=\"primary\"\n variant=\"contained\"\n aria-label={action}\n form={DEFAULT_FORM_ID}\n disabled={isSubmitDisabled}\n >\n {capitalize(action)}\n </Button>\n ) : (\n <Button\n type=\"button\"\n color=\"primary\"\n variant=\"contained\"\n aria-label={action}\n onClick={() => onSubmit(null)}\n >\n {capitalize(action)}\n </Button>\n )}\n </DialogActions>\n </Dialog>\n );\n};\n","/*\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 React, { Fragment } from 'react';\nimport Avatar from '@material-ui/core/Avatar';\nimport Box from '@material-ui/core/Box';\nimport Collapse from '@material-ui/core/Collapse';\nimport Divider from '@material-ui/core/Divider';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport { default as AcceptIcon } from '@material-ui/icons/Check';\nimport { default as DismissIcon } from '@material-ui/icons/Delete';\nimport { default as SnoozeIcon } from '@material-ui/icons/AccessTime';\nimport { ActionItemCard } from '../ActionItems';\nimport { Alert, AlertStatus } from '../../types';\nimport { useActionItemCardStyles as useStyles } from '../../utils/styles';\n\ntype AlertGroupProps = {\n alerts: Alert[];\n status: AlertStatus;\n title: string;\n icon: JSX.Element;\n};\n\nconst AlertGroup = ({ alerts, status, title, icon }: AlertGroupProps) => {\n const classes = useStyles();\n return (\n <Box p={1}>\n {alerts.map((alert, index) => (\n <Fragment key={`alert-${status}-${index}`}>\n <ActionItemCard\n disableScroll\n alert={alert}\n avatar={\n <Tooltip title={title}>\n <Avatar className={classes.avatar}>{icon}</Avatar>\n </Tooltip>\n }\n />\n {index < alerts.length - 1 && <Divider />}\n </Fragment>\n ))}\n </Box>\n );\n};\n\ntype AlertStatusSummaryProps = {\n open: boolean;\n snoozed: Alert[];\n accepted: Alert[];\n dismissed: Alert[];\n};\n\nexport const AlertStatusSummary = ({\n open,\n snoozed,\n accepted,\n dismissed,\n}: AlertStatusSummaryProps) => {\n const isSnoozedListDisplayed = !!snoozed.length;\n const isAcceptedListDisplayed = !!accepted.length;\n const isDismissedListDisplayed = !!dismissed.length;\n\n return (\n <Collapse in={open}>\n {isAcceptedListDisplayed && (\n <AlertGroup\n title=\"Accepted\"\n alerts={accepted}\n status={AlertStatus.Accepted}\n icon={\n <AcceptIcon\n role=\"img\"\n aria-hidden={false}\n aria-label={AlertStatus.Accepted}\n />\n }\n />\n )}\n {isSnoozedListDisplayed && (\n <AlertGroup\n title=\"Snoozed\"\n alerts={snoozed}\n status={AlertStatus.Snoozed}\n icon={\n <SnoozeIcon\n role=\"img\"\n aria-hidden={false}\n aria-label={AlertStatus.Snoozed}\n />\n }\n />\n )}\n {isDismissedListDisplayed && (\n <AlertGroup\n title=\"Dismissed\"\n alerts={dismissed}\n status={AlertStatus.Dismissed}\n icon={\n <DismissIcon\n role=\"img\"\n aria-hidden={false}\n aria-label={AlertStatus.Dismissed}\n />\n }\n />\n )}\n </Collapse>\n );\n};\n","/*\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 React, { useState, MouseEventHandler, PropsWithChildren } from 'react';\nimport classnames from 'classnames';\nimport Button from '@material-ui/core/Button';\nimport { default as ExpandMoreIcon } from '@material-ui/icons/ExpandMore';\nimport { useAlertStatusSummaryButtonStyles as useStyles } from '../../utils/styles';\n\ntype AlertStatusSummaryButtonProps = {\n onClick: MouseEventHandler;\n};\n\nexport const AlertStatusSummaryButton = ({\n children,\n onClick,\n}: PropsWithChildren<AlertStatusSummaryButtonProps>) => {\n const classes = useStyles();\n const [clicked, setClicked] = useState(false);\n const iconClassName = classnames(classes.icon, {\n [classes.clicked]: clicked,\n });\n\n const handleOnClick: MouseEventHandler = e => {\n setClicked(prevClicked => !prevClicked);\n onClick(e);\n };\n\n return (\n <Button\n variant=\"text\"\n color=\"primary\"\n disableElevation\n aria-label=\"expand\"\n endIcon={<ExpandMoreIcon className={iconClassName} />}\n onClick={handleOnClick}\n >\n {children}\n </Button>\n );\n};\n","/*\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 React from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { useCostInsightsStyles as useStyles } from '../../utils/styles';\nimport { ScrollAnchor } from '../../utils/scroll';\nimport { DefaultNavigation } from '../../utils/navigation';\n\ntype AlertInsightsHeaderProps = {\n title: string;\n subtitle: string;\n};\n\nexport const AlertInsightsHeader = ({\n title,\n subtitle,\n}: AlertInsightsHeaderProps) => {\n const classes = useStyles();\n\n return (\n <Box mb={6} position=\"relative\">\n <ScrollAnchor id={DefaultNavigation.AlertInsightsHeader} />\n <Typography variant=\"h4\" align=\"center\">\n {title}{' '}\n <Typography component=\"span\" role=\"img\" aria-label=\"direct-hit\">\n 🎯\n </Typography>\n </Typography>\n <Typography className={classes.h6Subtle} align=\"center\" gutterBottom>\n {subtitle}\n </Typography>\n </Box>\n );\n};\n","/*\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 React from 'react';\nimport Avatar from '@material-ui/core/Avatar';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport { useAlertInsightsSectionStyles as useStyles } from '../../utils/styles';\nimport { ScrollAnchor } from '../../utils/scroll';\nimport { Alert } from '../../types';\n\ntype AlertInsightsSectionHeaderProps = {\n alert: Alert;\n number: number;\n};\n\nexport const AlertInsightsSectionHeader = ({\n alert,\n number,\n}: AlertInsightsSectionHeaderProps) => {\n const classes = useStyles();\n\n const isViewInstructionsButtonDisplayed = !!alert.url;\n\n return (\n <Box position=\"relative\" mb={3} textAlign=\"left\">\n <ScrollAnchor id={`alert-${number}`} />\n <Grid\n container\n spacing={2}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n >\n <Grid item>\n <Box display=\"flex\" alignItems=\"center\">\n <Box mr={2}>\n <Avatar className={classes.button}>{number}</Avatar>\n </Box>\n <Box>\n <Typography variant=\"h5\">{alert.title}</Typography>\n <Typography gutterBottom>{alert.subtitle}</Typography>\n </Box>\n </Box>\n </Grid>\n {isViewInstructionsButtonDisplayed && (\n <Grid item>\n <Button variant=\"text\" color=\"primary\" href={alert.url}>\n {alert.buttonText || 'View Instructions'}\n </Button>\n </Grid>\n )}\n </Grid>\n </Box>\n );\n};\n","/*\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 React from 'react';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport { default as SnoozeIcon } from '@material-ui/icons/AccessTime';\nimport { default as AcceptIcon } from '@material-ui/icons/Check';\nimport { default as DismissIcon } from '@material-ui/icons/Delete';\nimport { AlertInsightsSectionHeader } from './AlertInsightsSectionHeader';\nimport { Alert } from '../../types';\nimport {\n isSnoozeEnabled,\n isAcceptEnabled,\n isDismissEnabled,\n} from '../../utils/alerts';\n\ntype AlertInsightsSectionProps = {\n alert: Alert;\n number: number;\n onSnooze: (alert: Alert) => void;\n onAccept: (alert: Alert) => void;\n onDismiss: (alert: Alert) => void;\n};\n\nexport const AlertInsightsSection = ({\n alert,\n number,\n onSnooze,\n onAccept,\n onDismiss,\n}: AlertInsightsSectionProps) => {\n const isSnoozeButtonDisplayed = isSnoozeEnabled(alert);\n const isAcceptButtonDisplayed = isAcceptEnabled(alert);\n const isDismissButtonDisplayed = isDismissEnabled(alert);\n const isButtonGroupDisplayed =\n isSnoozeButtonDisplayed ||\n isAcceptButtonDisplayed ||\n isDismissButtonDisplayed;\n\n return (\n <Box display=\"flex\" flexDirection=\"column\" mb={6}>\n <AlertInsightsSectionHeader alert={alert} number={number} />\n {isButtonGroupDisplayed && (\n <Box display=\"flex\" alignItems=\"center\" mb={4}>\n {isAcceptButtonDisplayed && (\n <Box mr={1}>\n <Button\n color=\"primary\"\n variant=\"contained\"\n aria-label=\"accept\"\n onClick={() => onAccept(alert)}\n startIcon={<AcceptIcon />}\n >\n Accept\n </Button>\n </Box>\n )}\n {isSnoozeButtonDisplayed && (\n <Box mr={1}>\n <Button\n color=\"default\"\n variant=\"outlined\"\n aria-label=\"snooze\"\n disableElevation\n onClick={() => onSnooze(alert)}\n startIcon={<SnoozeIcon />}\n >\n Snooze\n </Button>\n </Box>\n )}\n {isDismissButtonDisplayed && (\n <Button\n color=\"secondary\"\n variant=\"outlined\"\n aria-label=\"dismiss\"\n disableElevation\n onClick={() => onDismiss(alert)}\n startIcon={<DismissIcon />}\n >\n Dismiss\n </Button>\n )}\n </Box>\n )}\n {alert.element}\n </Box>\n );\n};\n","/*\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 React, { useEffect, useState } from 'react';\nimport pluralize from 'pluralize';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Snackbar from '@material-ui/core/Snackbar';\nimport { default as MuiAlert } from '@material-ui/lab/Alert';\nimport { AlertDialog } from './AlertDialog';\nimport { AlertStatusSummary } from './AlertStatusSummary';\nimport { AlertStatusSummaryButton } from './AlertStatusSummaryButton';\nimport { AlertInsightsHeader } from './AlertInsightsHeader';\nimport { AlertInsightsSection } from './AlertInsightsSection';\nimport {\n useScroll,\n useLoading,\n ScrollType,\n MapLoadingToProps,\n} from '../../hooks';\nimport { DefaultLoadingAction } from '../../utils/loading';\nimport { Alert, AlertOptions, AlertStatus } from '../../types';\nimport { Maybe } from '@backstage-community/plugin-cost-insights-common';\nimport {\n isStatusSnoozed,\n isStatusAccepted,\n isStatusDismissed,\n sumOfAllAlerts,\n} from '../../utils/alerts';\nimport { ScrollAnchor } from '../../utils/scroll';\n\ntype MapLoadingtoAlerts = (isLoading: boolean) => void;\n\nconst mapLoadingToAlerts: MapLoadingToProps<MapLoadingtoAlerts> =\n ({ dispatch }) =>\n (isLoading: boolean) =>\n dispatch({ [DefaultLoadingAction.CostInsightsAlerts]: isLoading });\n\ntype AlertInsightsProps = {\n group: string;\n active: Alert[];\n snoozed: Alert[];\n accepted: Alert[];\n dismissed: Alert[];\n onChange: (alerts: Alert[]) => void;\n};\n\nexport const AlertInsights = ({\n group,\n active,\n snoozed,\n accepted,\n dismissed,\n onChange,\n}: AlertInsightsProps) => {\n const [scroll] = useScroll();\n const [alert, setAlert] = useState<Maybe<Alert>>(null);\n const dispatchLoadingAlerts = useLoading(mapLoadingToAlerts);\n const [status, setStatus] = useState<Maybe<AlertStatus>>(null);\n // Allow users to pass null values for data.\n const [data, setData] = useState<Maybe<any>>(undefined);\n const [error, setError] = useState<Maybe<Error>>(null);\n const [isDialogOpen, setDialogOpen] = useState(false);\n const [isSummaryOpen, setSummaryOpen] = useState(false);\n const [isSnackbarOpen, setSnackbarOpen] = useState(false);\n\n useEffect(() => {\n async function callAlertHook(\n options: AlertOptions,\n callback: (options: AlertOptions) => Promise<Alert[]>,\n ) {\n setAlert(null);\n setStatus(null);\n setData(undefined);\n setDialogOpen(false);\n dispatchLoadingAlerts(true);\n try {\n const alerts: Alert[] = await callback(options);\n onChange(alerts);\n } catch (e) {\n setError(e);\n } finally {\n dispatchLoadingAlerts(false);\n }\n }\n\n const options: AlertOptions = { data, group };\n const onSnoozed = alert?.onSnoozed?.bind(alert);\n const onAccepted = alert?.onAccepted?.bind(alert);\n const onDismissed = alert?.onDismissed?.bind(alert);\n\n if (data !== undefined) {\n if (isStatusSnoozed(status) && onSnoozed) {\n callAlertHook(options, onSnoozed);\n } else if (isStatusAccepted(status) && onAccepted) {\n callAlertHook(options, onAccepted);\n } else if (isStatusDismissed(status) && onDismissed) {\n callAlertHook(options, onDismissed);\n }\n }\n }, [group, data, alert, status, onChange, dispatchLoadingAlerts]);\n\n useEffect(() => {\n if (scroll === ScrollType.AlertSummary) {\n setSummaryOpen(true);\n }\n }, [scroll]);\n\n useEffect(() => {\n setDialogOpen(!!status);\n }, [status]);\n\n useEffect(() => {\n setSnackbarOpen(!!error);\n }, [error]);\n\n function onSnooze(alertToSnooze: Alert) {\n setAlert(alertToSnooze);\n setStatus(AlertStatus.Snoozed);\n }\n\n function onAccept(alertToAccept: Alert) {\n setAlert(alertToAccept);\n setStatus(AlertStatus.Accepted);\n }\n\n function onDismiss(alertToDismiss: Alert) {\n setAlert(alertToDismiss);\n setStatus(AlertStatus.Dismissed);\n }\n\n function onSnackbarClose() {\n setError(null);\n }\n\n function onDialogClose() {\n setAlert(null);\n setStatus(null);\n }\n\n function onDialogFormSubmit(formData: any) {\n setData(formData);\n }\n\n function onSummaryButtonClick() {\n setSummaryOpen(prevOpen => !prevOpen);\n }\n\n const total = [accepted, snoozed, dismissed].reduce(sumOfAllAlerts, 0);\n\n const isAlertStatusSummaryDisplayed = !!total;\n const isAlertInsightSectionDisplayed = !!active.length;\n\n return (\n <Grid container direction=\"column\" spacing={2}>\n <Grid item>\n <AlertInsightsHeader\n title=\"Your team's action items\"\n subtitle={\n isAlertInsightSectionDisplayed\n ? 'This section outlines suggested action items your team can address to improve cloud costs.'\n : \"All of your team's action items are hidden. Maybe it's time to give them another look?\"\n }\n />\n </Grid>\n {isAlertInsightSectionDisplayed && (\n <Grid item container direction=\"column\" spacing={4}>\n {active.map((activeAlert, index) => (\n <Grid item key={`alert-insights-section-${index}`}>\n <AlertInsightsSection\n alert={activeAlert}\n number={index + 1}\n onSnooze={onSnooze}\n onAccept={onAccept}\n onDismiss={onDismiss}\n />\n </Grid>\n ))}\n </Grid>\n )}\n {isAlertStatusSummaryDisplayed && (\n <Grid item>\n <Box position=\"relative\" display=\"flex\" justifyContent=\"flex-end\">\n <ScrollAnchor id={ScrollType.AlertSummary} />\n <AlertStatusSummaryButton onClick={onSummaryButtonClick}>\n {pluralize('Hidden Action Item', total)}\n </AlertStatusSummaryButton>\n </Box>\n <AlertStatusSummary\n open={isSummaryOpen}\n snoozed={snoozed}\n accepted={accepted}\n dismissed={dismissed}\n />\n </Grid>\n )}\n <AlertDialog\n group={group}\n open={isDialogOpen}\n alert={alert}\n status={status}\n onClose={onDialogClose}\n onSubmit={onDialogFormSubmit}\n />\n <Snackbar\n open={isSnackbarOpen}\n autoHideDuration={6_000}\n anchorOrigin={{ vertical: 'top', horizontal: 'center' }}\n onClose={onSnackbarClose}\n >\n <MuiAlert onClose={onSnackbarClose} severity=\"error\">\n {error?.message}\n </MuiAlert>\n </Snackbar>\n </Grid>\n );\n};\n","/*\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 React, { 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","/*\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 React from 'react';\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","/*\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 React from 'react';\nimport InputLabel from '@material-ui/core/InputLabel';\nimport Select, { SelectProps } from '@material-ui/core/Select';\nimport FormControl from '@material-ui/core/FormControl';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport { Currency, CurrencyType } from '../../types';\nimport { findAlways } from '../../utils/assert';\nimport { useSelectStyles as useStyles } from '../../utils/styles';\n\nconst NULL_VALUE = 'engineers';\n\ntype CurrencySelectProps = {\n currency: Currency;\n currencies: Currency[];\n onSelect: (currency: Currency) => void;\n};\n\nexport const CurrencySelect = ({\n currency,\n currencies,\n onSelect,\n}: CurrencySelectProps) => {\n const classes = useStyles();\n\n const getOption = (value: unknown) => {\n const kind = (value === NULL_VALUE ? null : value) as CurrencyType;\n return findAlways(currencies, c => c.kind === kind);\n };\n\n const handleOnChange: SelectProps['onChange'] = e => {\n const option = getOption(e.target.value);\n onSelect(option);\n };\n\n const renderValue: SelectProps['renderValue'] = value => {\n const option = getOption(value);\n return <b>{option.label}</b>;\n };\n\n return (\n <FormControl variant=\"outlined\">\n <InputLabel shrink>Convert to:</InputLabel>\n <Select\n className={classes.select}\n variant=\"outlined\"\n labelWidth={100}\n onChange={handleOnChange}\n value={currency.kind || NULL_VALUE}\n renderValue={renderValue}\n >\n {currencies.map((c: Currency) => (\n <MenuItem\n className={classes.menuItem}\n key={c.kind || NULL_VALUE}\n value={c.kind || NULL_VALUE}\n >\n <Typography component=\"span\" role=\"img\" aria-label={c.label}>\n {c.label}\n </Typography>\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n","/*\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 React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Container from '@material-ui/core/Container';\nimport Divider from '@material-ui/core/Divider';\n\nexport const WhyCostsMatter = () => {\n return (\n <Box mt={10} mb={4}>\n <Container maxWidth=\"md\">\n <Box mt={2} mb={2}>\n <Typography variant=\"h5\" align=\"center\" gutterBottom>\n Why cloud costs matter\n </Typography>\n </Box>\n <Grid container alignContent=\"space-around\" spacing={3} wrap=\"nowrap\">\n <Grid item>\n <Typography variant=\"h6\">\n Sustainability{' '}\n <Typography component=\"span\" role=\"img\" aria-label=\"globe\">\n 🌎\n </Typography>\n </Typography>\n <Typography>\n Reducing cloud usage improves our carbon footprint.\n </Typography>\n </Grid>\n <Grid item>\n <Divider orientation=\"vertical\" />\n </Grid>\n <Grid item>\n <Typography variant=\"h6\">\n Revenue{' '}\n <Typography\n component=\"span\"\n role=\"img\"\n aria-label=\"money-with-wings\"\n >\n 💸\n </Typography>\n </Typography>\n <Typography>\n Keeping cloud costs well-tuned prevents infrastructure from eating\n into revenue.\n </Typography>\n </Grid>\n <Grid item>\n <Divider orientation=\"vertical\" />\n </Grid>\n <Grid item>\n <Typography variant=\"h6\">\n Innovation{' '}\n <Typography component=\"span\" role=\"img\" aria-label=\"medal\">\n 🥇\n </Typography>\n </Typography>\n <Typography>\n The more we save, the more we can reinvest in speed and\n innovation.\n </Typography>\n </Grid>\n </Grid>\n </Container>\n </Box>\n );\n};\n","/*\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 React, {\n PropsWithChildren,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport pluralize from 'pluralize';\nimport Typography from '@material-ui/core/Typography';\nimport { default as Alert } from '@material-ui/lab/Alert';\nimport { PeriodSelect } from '../PeriodSelect';\nimport { ProductInsightsChart } from './ProductInsightsChart';\nimport { useProductInsightsCardStyles as useStyles } from '../../utils/styles';\nimport { DefaultLoadingAction } from '../../utils/loading';\nimport { Duration } from '../../types';\nimport {\n Entity,\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\nimport {\n MapLoadingToProps,\n useLastCompleteBillingDate,\n useLoading,\n} from '../../hooks';\nimport { findAnyKey } from '../../utils/assert';\nimport { ScrollAnchor } from '../../utils/scroll';\nimport { InfoCard } from '@backstage/core-components';\n\ntype LoadingProps = (isLoading: boolean) => void;\n\nexport type ProductInsightsCardProps = {\n product: Product;\n initialState: {\n entity: Maybe<Entity>;\n duration: Duration;\n };\n onSelectAsync: (product: Product, duration: Duration) => Promise<Entity>;\n};\n\nconst mapLoadingToProps: MapLoadingToProps<LoadingProps> =\n ({ dispatch }) =>\n (isLoading: boolean) =>\n dispatch({ [DefaultLoadingAction.CostInsightsProducts]: isLoading });\n\nexport const ProductInsightsCard = ({\n initialState,\n product,\n onSelectAsync,\n}: PropsWithChildren<ProductInsightsCardProps>) => {\n const classes = useStyles();\n const mountedRef = useRef(false);\n const [error, setError] = useState<Maybe<Error>>(null);\n const dispatchLoading = useLoading(mapLoadingToProps);\n const lastCompleteBillingDate = useLastCompleteBillingDate();\n const [entity, setEntity] = useState<Maybe<Entity>>(initialState.entity);\n const [duration, setDuration] = useState<Duration>(initialState.duration);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n const dispatchLoadingProduct = useCallback(dispatchLoading, []);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n useEffect(() => {\n async function handleOnSelectAsync() {\n dispatchLoadingProduct(true);\n try {\n const e = await onSelectAsync(product, duration);\n setEntity(e);\n } catch (e) {\n setEntity(null);\n setError(e);\n } finally {\n dispatchLoadingProduct(false);\n }\n }\n\n if (mountedRef.current) {\n handleOnSelectAsync();\n } else {\n mountedRef.current = true;\n }\n }, [product, duration, onSelectAsync, dispatchLoadingProduct]);\n\n // Only a single entities Record for the root product entity is supported\n const entityKey = findAnyKey(entity?.entities);\n const entities = entityKey ? entity!.entities[entityKey] : [];\n\n const subheader =\n entityKey && entities.length\n ? `${pluralize(entityKey, entities.length, true)}, sorted by cost`\n : null;\n const headerProps = {\n classes: classes,\n action: <PeriodSelect duration={duration} onSelect={setDuration} />,\n };\n\n if (error || !entity) {\n return (\n <InfoCard title={product.name} headerProps={headerProps}>\n <ScrollAnchor id={product.kind} />\n <Alert severity=\"error\">\n {error\n ? error.message\n : `Error: Could not fetch product insights for ${product.name}`}\n </Alert>\n </InfoCard>\n );\n }\n\n return (\n <InfoCard\n title={product.name}\n subheader={subheader}\n headerProps={headerProps}\n >\n <ScrollAnchor id={product.kind} />\n {entities.length ? (\n <ProductInsightsChart\n entity={entity}\n duration={duration}\n billingDate={lastCompleteBillingDate}\n />\n ) : (\n <Typography>\n There are no {product.name} costs within this time frame for your\n team's projects.\n </Typography>\n )}\n </InfoCard>\n );\n};\n","/*\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 React from 'react';\nimport Box from '@material-ui/core/Box';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport Collapse from '@material-ui/core/Collapse';\nimport { ProductInsightsCard } from './ProductInsightsCard';\nimport { Duration } from '../../types';\nimport {\n Entity,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { ProductState } from '../../utils/loading';\n\ntype ProductInsightsCardListProps = {\n initialStates: ProductState[];\n onSelectAsync: (product: Product, duration: Duration) => Promise<Entity>;\n};\n\nexport const ProductInsightsCardList = ({\n initialStates,\n onSelectAsync,\n}: ProductInsightsCardListProps) => {\n if (!initialStates.length) {\n return (\n <Box display=\"flex\" justifyContent=\"space-around\" alignItems=\"center\">\n <CircularProgress />\n </Box>\n );\n }\n\n return (\n <Collapse in timeout={1000}>\n {initialStates.map(({ product, entity, duration }) => (\n <Box\n key={product.kind}\n mb={6}\n position=\"relative\"\n data-testid={`product-list-item-${product.kind}`}\n >\n <ProductInsightsCard\n product={product}\n onSelectAsync={onSelectAsync}\n initialState={{ entity: entity, duration: duration }}\n />\n </Box>\n ))}\n </Collapse>\n );\n};\n","/*\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 React, { useCallback, useEffect, useRef, useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { default as Alert } from '@material-ui/lab/Alert';\nimport { costInsightsApiRef } from '../../api';\nimport { ProductInsightsCardList } from '../ProductInsightsCard/ProductInsightsCardList';\nimport { Duration } from '../../types';\nimport {\n Entity,\n Maybe,\n Product,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { intervalsOf, DEFAULT_DURATION } from '../../utils/duration';\nimport {\n DefaultLoadingAction,\n initialStatesOf,\n settledResponseOf,\n ProductState,\n} from '../../utils/loading';\nimport { totalAggregationSort } from '../../utils/sort';\nimport {\n useLoading,\n useLastCompleteBillingDate,\n MapLoadingToProps,\n} from '../../hooks';\nimport { useApi } from '@backstage/core-plugin-api';\n\ntype LoadingProps = (isLoading: boolean) => void;\n\nconst mapLoadingToProps: MapLoadingToProps<LoadingProps> =\n ({ dispatch }) =>\n (isLoading: boolean) =>\n dispatch({ [DefaultLoadingAction.CostInsightsProducts]: isLoading });\n\ntype ProductInsightsProps = {\n group: string;\n project: Maybe<string>;\n products: Product[];\n onLoaded: (entities: Product[]) => void;\n};\n\nexport const ProductInsights = ({\n group,\n project,\n products,\n onLoaded,\n}: ProductInsightsProps) => {\n const client = useApi(costInsightsApiRef);\n const onceRef = useRef(false);\n const [initialStates, setStates] = useState<ProductState[]>([]);\n const [error, setError] = useState<Maybe<Error>>(null);\n const lastCompleteBillingDate = useLastCompleteBillingDate();\n const dispatchLoading = useLoading(mapLoadingToProps);\n\n /* eslint-disable react-hooks/exhaustive-deps */\n // See @CostInsightsPage\n const dispatchLoadingProducts = useCallback(dispatchLoading, []);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n const onSelectAsyncMemo = useCallback(\n async function onSelectAsync(\n product: Product,\n duration: Duration,\n ): Promise<Entity> {\n return client.getProductInsights({\n group: group,\n project: project,\n product: product.kind,\n intervals: intervalsOf(duration, lastCompleteBillingDate),\n });\n },\n [client, group, project, lastCompleteBillingDate],\n );\n\n useEffect(() => {\n async function getAllProductInsights() {\n try {\n dispatchLoadingProducts(true);\n const responses = await Promise.allSettled(\n products.map(product =>\n client.getProductInsights({\n group: group,\n project: project,\n product: product.kind,\n intervals: intervalsOf(DEFAULT_DURATION, lastCompleteBillingDate),\n }),\n ),\n ).then(settledResponseOf);\n\n const updatedInitialStates = initialStatesOf(products, responses).sort(\n totalAggregationSort,\n );\n setStates(updatedInitialStates);\n } catch (e) {\n setError(e);\n } finally {\n dispatchLoadingProducts(false);\n }\n }\n\n getAllProductInsights();\n }, [\n client,\n group,\n project,\n products,\n lastCompleteBillingDate,\n dispatchLoadingProducts,\n ]);\n\n useEffect(\n function handleOnLoaded() {\n if (onceRef.current) {\n const initialProducts = initialStates.map(state => state.product);\n onLoaded(initialProducts);\n } else {\n onceRef.current = true;\n }\n },\n [initialStates, onLoaded],\n );\n\n return (\n <Box px={3} py={6}>\n <Box mt={0} mb={5} textAlign=\"center\">\n <Typography variant=\"h4\" gutterBottom>\n Your team's product usage\n </Typography>\n </Box>\n {error ? (\n <Alert severity=\"error\">{error.message}</Alert>\n ) : (\n <ProductInsightsCardList\n initialStates={initialStates}\n onSelectAsync={onSelectAsyncMemo}\n />\n )}\n </Box>\n );\n};\n","/*\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 React from 'react';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Select from '@material-ui/core/Select';\nimport {\n Maybe,\n Project,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { useSelectStyles as useStyles } from '../../utils/styles';\n\ntype ProjectSelectProps = {\n project: Maybe<string>;\n projects: Array<Project>;\n onSelect: (project: Maybe<string>) => void;\n};\n\nexport const ProjectSelect = ({\n project,\n projects,\n onSelect,\n}: ProjectSelectProps) => {\n const classes = useStyles();\n\n const projectOptions = projects\n .filter(p => p.id)\n .sort((a, b) =>\n ((a.name ?? a.id) as string).localeCompare((b.name ?? b.id) as string),\n );\n\n const handleOnChange = (e: React.ChangeEvent<{ value: unknown }>) => {\n onSelect(e.target.value as string);\n };\n\n const renderValue = (value: unknown) => {\n const proj = value as string;\n const projectObj = projects.find(p => p.id === proj);\n return (\n <b data-testid={`selected-${proj}`}>\n {proj === 'all' ? 'All Projects' : projectObj?.name ?? proj}\n </b>\n );\n };\n\n return (\n <Select\n className={classes.select}\n variant=\"outlined\"\n value={project ?? 'all'}\n renderValue={renderValue}\n onChange={handleOnChange}\n data-testid=\"project-filter-select\"\n >\n {[{ id: 'all' }, ...projectOptions].map(proj => (\n <MenuItem\n className={`${classes.menuItem} compact`}\n key={proj.id}\n value={proj.id}\n data-testid={`option-${proj.id}`}\n >\n {proj.id === 'all' ? 'All Projects' : proj.name ?? proj.id}\n </MenuItem>\n ))}\n </Select>\n );\n};\n","/*\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 React, { 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 );\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","/*\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 React from 'react';\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":["useStyles","options","MuiAlert","mapLoadingToProps","MaterialAlert"],"mappings":"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"}