@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
@@ -0,0 +1,194 @@
1
+ import { DateTime } from 'luxon';
2
+ import '../types/Alert.esm.js';
3
+ import { DEFAULT_DATE_FORMAT } from '../types/DateFormat.esm.js';
4
+ import { KubernetesMigrationAlert } from './alerts/KubernetesMigrationAlert.esm.js';
5
+ import { ProjectGrowthAlert } from '../alerts/ProjectGrowthAlert.esm.js';
6
+ import { UnlabeledDataflowAlert } from '../alerts/UnlabeledDataflowAlert.esm.js';
7
+ import '../testUtils/products.esm.js';
8
+ import '../testUtils/filters.esm.js';
9
+ import '../testUtils/loading.esm.js';
10
+ import 'react';
11
+ import '../hooks/useConfig.esm.js';
12
+ import '../hooks/useCurrency.esm.js';
13
+ import '../hooks/useFilters.esm.js';
14
+ import '../hooks/useGroups.esm.js';
15
+ import '../hooks/useLoading.esm.js';
16
+ import '../hooks/useScroll.esm.js';
17
+ import '../hooks/useLastCompleteBillingDate.esm.js';
18
+ import '../utils/currency.esm.js';
19
+ import { aggregationFor, changeOf, trendlineOf, getGroupedProducts, getGroupedProjects, entityOf } from '../testUtils/testUtils.esm.js';
20
+
21
+ class ExampleCostInsightsClient {
22
+ request(_, res) {
23
+ return new Promise((resolve) => setTimeout(resolve, 0, res));
24
+ }
25
+ getLastCompleteBillingDate() {
26
+ return Promise.resolve(
27
+ DateTime.now().minus({ days: 1 }).toFormat(DEFAULT_DATE_FORMAT)
28
+ );
29
+ }
30
+ async getUserGroups(userId) {
31
+ const groups = await this.request({ userId }, [
32
+ { id: "group-a", name: "Group A" },
33
+ { id: "group-b", name: "Group B" }
34
+ ]);
35
+ return groups;
36
+ }
37
+ async getGroupProjects(group) {
38
+ const projects = await this.request({ group }, [
39
+ { id: "project-a" },
40
+ { id: "project-b" },
41
+ { id: "project-c" }
42
+ ]);
43
+ return projects;
44
+ }
45
+ async getDailyMetricData(metric, intervals) {
46
+ const aggregation = aggregationFor(intervals, 1e5).map((entry) => ({
47
+ ...entry,
48
+ amount: Math.round(entry.amount)
49
+ }));
50
+ const cost = await this.request(
51
+ { metric, intervals },
52
+ {
53
+ format: "number",
54
+ aggregation,
55
+ change: changeOf(aggregation),
56
+ trendline: trendlineOf(aggregation)
57
+ }
58
+ );
59
+ return cost;
60
+ }
61
+ async getCatalogEntityDailyCost(entityRef, intervals) {
62
+ const aggregation = aggregationFor(intervals, 8e3);
63
+ const groupDailyCost = await this.request(
64
+ { entityRef, intervals },
65
+ {
66
+ aggregation,
67
+ change: changeOf(aggregation),
68
+ trendline: trendlineOf(aggregation),
69
+ // Optional field providing cost groupings / breakdowns keyed by the type. In this example,
70
+ // daily cost grouped by cloud product OR by project / billing account.
71
+ groupedCosts: {
72
+ product: getGroupedProducts(intervals),
73
+ project: getGroupedProjects(intervals)
74
+ }
75
+ }
76
+ );
77
+ return groupDailyCost;
78
+ }
79
+ async getGroupDailyCost(group, intervals) {
80
+ const aggregation = aggregationFor(intervals, 8e3);
81
+ const groupDailyCost = await this.request(
82
+ { group, intervals },
83
+ {
84
+ aggregation,
85
+ change: changeOf(aggregation),
86
+ trendline: trendlineOf(aggregation),
87
+ // Optional field providing cost groupings / breakdowns keyed by the type. In this example,
88
+ // daily cost grouped by cloud product OR by project / billing account.
89
+ groupedCosts: {
90
+ product: getGroupedProducts(intervals),
91
+ project: getGroupedProjects(intervals)
92
+ }
93
+ }
94
+ );
95
+ return groupDailyCost;
96
+ }
97
+ async getProjectDailyCost(project, intervals) {
98
+ const aggregation = aggregationFor(intervals, 1500);
99
+ const projectDailyCost = await this.request(
100
+ { project, intervals },
101
+ {
102
+ id: "project-a",
103
+ aggregation,
104
+ change: changeOf(aggregation),
105
+ trendline: trendlineOf(aggregation),
106
+ // Optional field providing cost groupings / breakdowns keyed by the type. In this example,
107
+ // daily project cost grouped by cloud product.
108
+ groupedCosts: {
109
+ product: getGroupedProducts(intervals)
110
+ }
111
+ }
112
+ );
113
+ return projectDailyCost;
114
+ }
115
+ async getProductInsights(options) {
116
+ const productInsights = await this.request(
117
+ options,
118
+ entityOf(options.product)
119
+ );
120
+ return productInsights;
121
+ }
122
+ async getAlerts(group) {
123
+ const projectGrowthData = {
124
+ project: "example-project",
125
+ periodStart: "2020-Q2",
126
+ periodEnd: "2020-Q3",
127
+ aggregation: [6e4, 12e4],
128
+ change: {
129
+ ratio: 1,
130
+ amount: 6e4
131
+ },
132
+ products: [
133
+ { id: "Compute Engine", aggregation: [58e3, 118e3] },
134
+ { id: "Cloud Dataflow", aggregation: [1200, 1500] },
135
+ { id: "Cloud Storage", aggregation: [800, 500] }
136
+ ]
137
+ };
138
+ const unlabeledDataflowData = {
139
+ periodStart: "2020-09-01",
140
+ periodEnd: "2020-09-30",
141
+ labeledCost: 6200,
142
+ unlabeledCost: 7e3,
143
+ projects: [
144
+ {
145
+ id: "example-project-1",
146
+ unlabeledCost: 5e3,
147
+ labeledCost: 3e3
148
+ },
149
+ {
150
+ id: "example-project-2",
151
+ unlabeledCost: 2e3,
152
+ labeledCost: 3200
153
+ }
154
+ ]
155
+ };
156
+ const today = DateTime.now();
157
+ const alerts = await this.request({ group }, [
158
+ new ProjectGrowthAlert(projectGrowthData),
159
+ new UnlabeledDataflowAlert(unlabeledDataflowData),
160
+ new KubernetesMigrationAlert(this, {
161
+ startDate: today.minus({ days: 30 }).toFormat(DEFAULT_DATE_FORMAT),
162
+ endDate: today.toFormat(DEFAULT_DATE_FORMAT),
163
+ change: {
164
+ ratio: 0,
165
+ amount: 0
166
+ },
167
+ services: [
168
+ {
169
+ id: "service-a",
170
+ aggregation: [2e4, 1e4],
171
+ change: {
172
+ ratio: -0.5,
173
+ amount: -1e4
174
+ },
175
+ entities: {}
176
+ },
177
+ {
178
+ id: "service-b",
179
+ aggregation: [3e4, 15e3],
180
+ change: {
181
+ ratio: -0.5,
182
+ amount: -15e3
183
+ },
184
+ entities: {}
185
+ }
186
+ ]
187
+ })
188
+ ]);
189
+ return alerts;
190
+ }
191
+ }
192
+
193
+ export { ExampleCostInsightsClient };
194
+ //# sourceMappingURL=client.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.esm.js","sources":["../../src/example/client.ts"],"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/* eslint-disable no-restricted-imports */\n\nimport { DateTime } from 'luxon';\nimport { CostInsightsApi, ProductInsightsOptions } from '../api';\nimport {\n Alert,\n DEFAULT_DATE_FORMAT,\n ProjectGrowthData,\n UnlabeledDataflowData,\n} from '../types';\nimport {\n Entity,\n Group,\n MetricData,\n Project,\n Cost,\n} from '@backstage-community/plugin-cost-insights-common';\nimport { KubernetesMigrationAlert } from './alerts';\nimport { ProjectGrowthAlert, UnlabeledDataflowAlert } from '../alerts';\nimport {\n aggregationFor,\n changeOf,\n entityOf,\n getGroupedProducts,\n getGroupedProjects,\n trendlineOf,\n} from '../testUtils';\n\n/** @public */\nexport class ExampleCostInsightsClient implements CostInsightsApi {\n private request(_: any, res: any): Promise<any> {\n return new Promise(resolve => setTimeout(resolve, 0, res));\n }\n\n getLastCompleteBillingDate(): Promise<string> {\n return Promise.resolve(\n DateTime.now().minus({ days: 1 }).toFormat(DEFAULT_DATE_FORMAT),\n );\n }\n\n async getUserGroups(userId: string): Promise<Group[]> {\n const groups: Group[] = await this.request({ userId }, [\n { id: 'group-a', name: 'Group A' },\n { id: 'group-b', name: 'Group B' },\n ]);\n\n return groups;\n }\n\n async getGroupProjects(group: string): Promise<Project[]> {\n const projects: Project[] = await this.request({ group }, [\n { id: 'project-a' },\n { id: 'project-b' },\n { id: 'project-c' },\n ]);\n\n return projects;\n }\n\n async getDailyMetricData(\n metric: string,\n intervals: string,\n ): Promise<MetricData> {\n const aggregation = aggregationFor(intervals, 100_000).map(entry => ({\n ...entry,\n amount: Math.round(entry.amount),\n }));\n\n const cost: MetricData = await this.request(\n { metric, intervals },\n {\n format: 'number',\n aggregation: aggregation,\n change: changeOf(aggregation),\n trendline: trendlineOf(aggregation),\n },\n );\n\n return cost;\n }\n\n async getCatalogEntityDailyCost(\n entityRef: string,\n intervals: string,\n ): Promise<Cost> {\n const aggregation = aggregationFor(intervals, 8_000);\n const groupDailyCost: Cost = await this.request(\n { entityRef, intervals },\n {\n aggregation: aggregation,\n change: changeOf(aggregation),\n trendline: trendlineOf(aggregation),\n // Optional field providing cost groupings / breakdowns keyed by the type. In this example,\n // daily cost grouped by cloud product OR by project / billing account.\n groupedCosts: {\n product: getGroupedProducts(intervals),\n project: getGroupedProjects(intervals),\n },\n },\n );\n\n return groupDailyCost;\n }\n\n async getGroupDailyCost(group: string, intervals: string): Promise<Cost> {\n const aggregation = aggregationFor(intervals, 8_000);\n const groupDailyCost: Cost = await this.request(\n { group, intervals },\n {\n aggregation: aggregation,\n change: changeOf(aggregation),\n trendline: trendlineOf(aggregation),\n // Optional field providing cost groupings / breakdowns keyed by the type. In this example,\n // daily cost grouped by cloud product OR by project / billing account.\n groupedCosts: {\n product: getGroupedProducts(intervals),\n project: getGroupedProjects(intervals),\n },\n },\n );\n\n return groupDailyCost;\n }\n\n async getProjectDailyCost(project: string, intervals: string): Promise<Cost> {\n const aggregation = aggregationFor(intervals, 1_500);\n const projectDailyCost: Cost = await this.request(\n { project, intervals },\n {\n id: 'project-a',\n aggregation: aggregation,\n change: changeOf(aggregation),\n trendline: trendlineOf(aggregation),\n // Optional field providing cost groupings / breakdowns keyed by the type. In this example,\n // daily project cost grouped by cloud product.\n groupedCosts: {\n product: getGroupedProducts(intervals),\n },\n },\n );\n\n return projectDailyCost;\n }\n\n async getProductInsights(options: ProductInsightsOptions): Promise<Entity> {\n const productInsights: Entity = await this.request(\n options,\n entityOf(options.product),\n );\n\n return productInsights;\n }\n\n async getAlerts(group: string): Promise<Alert[]> {\n const projectGrowthData: ProjectGrowthData = {\n project: 'example-project',\n periodStart: '2020-Q2',\n periodEnd: '2020-Q3',\n aggregation: [60_000, 120_000],\n change: {\n ratio: 1,\n amount: 60_000,\n },\n products: [\n { id: 'Compute Engine', aggregation: [58_000, 118_000] },\n { id: 'Cloud Dataflow', aggregation: [1200, 1500] },\n { id: 'Cloud Storage', aggregation: [800, 500] },\n ],\n };\n\n const unlabeledDataflowData: UnlabeledDataflowData = {\n periodStart: '2020-09-01',\n periodEnd: '2020-09-30',\n labeledCost: 6_200,\n unlabeledCost: 7_000,\n projects: [\n {\n id: 'example-project-1',\n unlabeledCost: 5_000,\n labeledCost: 3_000,\n },\n {\n id: 'example-project-2',\n unlabeledCost: 2_000,\n labeledCost: 3_200,\n },\n ],\n };\n\n const today = DateTime.now();\n const alerts: Alert[] = await this.request({ group }, [\n new ProjectGrowthAlert(projectGrowthData),\n new UnlabeledDataflowAlert(unlabeledDataflowData),\n new KubernetesMigrationAlert(this, {\n startDate: today.minus({ days: 30 }).toFormat(DEFAULT_DATE_FORMAT),\n endDate: today.toFormat(DEFAULT_DATE_FORMAT),\n change: {\n ratio: 0,\n amount: 0,\n },\n services: [\n {\n id: 'service-a',\n aggregation: [20_000, 10_000],\n change: {\n ratio: -0.5,\n amount: -10_000,\n },\n entities: {},\n },\n {\n id: 'service-b',\n aggregation: [30_000, 15_000],\n change: {\n ratio: -0.5,\n amount: -15_000,\n },\n entities: {},\n },\n ],\n }),\n ]);\n\n return alerts;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import Box from '@material-ui/core/Box';
3
+ import { KubernetesMigrationBarChartLegend } from './KubernetesMigrationBarChartLegend.esm.js';
4
+ import { KubernetesMigrationBarChart } from './KubernetesMigrationBarChart.esm.js';
5
+ import { InfoCard } from '@backstage/core-components';
6
+
7
+ const KubernetesMigrationAlertCard = ({
8
+ data,
9
+ title,
10
+ subheader,
11
+ currentProduct,
12
+ comparedProduct
13
+ }) => {
14
+ return /* @__PURE__ */ React.createElement(InfoCard, { title, subheader }, /* @__PURE__ */ React.createElement(Box, { display: "flex", flexDirection: "column" }, /* @__PURE__ */ React.createElement(Box, { paddingY: 1 }, /* @__PURE__ */ React.createElement(
15
+ KubernetesMigrationBarChartLegend,
16
+ {
17
+ startDate: data.startDate,
18
+ change: data.change,
19
+ currentProduct,
20
+ comparedProduct
21
+ }
22
+ )), /* @__PURE__ */ React.createElement(Box, { paddingY: 1 }, /* @__PURE__ */ React.createElement(
23
+ KubernetesMigrationBarChart,
24
+ {
25
+ services: data.services,
26
+ currentProduct,
27
+ comparedProduct
28
+ }
29
+ ))));
30
+ };
31
+
32
+ export { KubernetesMigrationAlertCard };
33
+ //# sourceMappingURL=KubernetesMigrationAlertCard.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KubernetesMigrationAlertCard.esm.js","sources":["../../../../src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationAlertCard.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 React from 'react';\nimport Box from '@material-ui/core/Box';\nimport { KubernetesMigrationBarChartLegend } from './KubernetesMigrationBarChartLegend';\nimport { KubernetesMigrationBarChart } from './KubernetesMigrationBarChart';\nimport { KubernetesMigrationData } from '../../alerts';\nimport { InfoCard } from '@backstage/core-components';\n\ntype KubernetesMigrationAlertProps = {\n data: KubernetesMigrationData;\n title: string;\n subheader: string;\n currentProduct: string;\n comparedProduct: string;\n};\n\nexport const KubernetesMigrationAlertCard = ({\n data,\n title,\n subheader,\n currentProduct,\n comparedProduct,\n}: KubernetesMigrationAlertProps) => {\n return (\n <InfoCard title={title} subheader={subheader}>\n <Box display=\"flex\" flexDirection=\"column\">\n <Box paddingY={1}>\n <KubernetesMigrationBarChartLegend\n startDate={data.startDate}\n change={data.change}\n currentProduct={currentProduct}\n comparedProduct={comparedProduct}\n />\n </Box>\n <Box paddingY={1}>\n <KubernetesMigrationBarChart\n services={data.services}\n currentProduct={currentProduct}\n comparedProduct={comparedProduct}\n />\n </Box>\n </Box>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;AA+BO,MAAM,+BAA+B,CAAC;AAAA,EAC3C,IAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,cAAA;AAAA,EACA,eAAA;AACF,CAAqC,KAAA;AACnC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,KAAc,EAAA,SAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,OAAQ,EAAA,MAAA,EAAO,aAAc,EAAA,QAAA,EAAA,kBAC/B,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,UAAU,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,iCAAA;AAAA,IAAA;AAAA,MACC,WAAW,IAAK,CAAA,SAAA;AAAA,MAChB,QAAQ,IAAK,CAAA,MAAA;AAAA,MACb,cAAA;AAAA,MACA,eAAA;AAAA,KAAA;AAAA,GAEJ,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,UAAU,CACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,2BAAA;AAAA,IAAA;AAAA,MACC,UAAU,IAAK,CAAA,QAAA;AAAA,MACf,cAAA;AAAA,MACA,eAAA;AAAA,KAAA;AAAA,GAEJ,CACF,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -1,14 +1,9 @@
1
- export { P as ProjectGrowthInstructionsPage } from './index-BFM2mP6Z.esm.js';
2
- import '@backstage/core-plugin-api';
3
- import 'react';
4
- import 'pluralize';
5
- import '@material-ui/core/Typography';
6
- import '@material-ui/core/Box';
7
- import '@material-ui/core/styles';
1
+ import React from 'react';
8
2
  import '@material-ui/core/Avatar';
9
3
  import '@material-ui/core/Tooltip';
10
4
  import '@material-ui/core/IconButton';
11
5
  import '@material-ui/core/Badge';
6
+ import '@material-ui/core/Box';
12
7
  import '@material-ui/core/Paper';
13
8
  import '@material-ui/core/Divider';
14
9
  import '@material-ui/icons/AccessTime';
@@ -17,67 +12,93 @@ import '@material-ui/icons/Delete';
17
12
  import 'classnames';
18
13
  import '@material-ui/core/Card';
19
14
  import '@material-ui/core/CardHeader';
20
- import '@material-ui/icons/MonetizationOn';
21
- import '@material-ui/icons/Whatshot';
22
- import '@material-ui/icons/Settings';
23
- import '@material-ui/icons/AccountTree';
24
- import '@material-ui/icons/Storage';
25
- import '@material-ui/icons/Search';
26
- import '@material-ui/icons/CloudQueue';
27
- import '@material-ui/icons/School';
28
- import '@material-ui/icons/ViewHeadline';
29
- import '@material-ui/lab/Alert';
30
- import 'react-router-dom';
31
- import 'qs';
32
- import 'yup';
33
- import '@material-ui/core/Backdrop';
34
- import '@material-ui/core/CircularProgress';
35
- import 'luxon';
36
- import '@material-ui/core/styles/colorManipulator';
37
- import '@backstage/catalog-model';
15
+ import '../../../hooks/useConfig.esm.js';
16
+ import '../../../hooks/useCurrency.esm.js';
17
+ import '../../../hooks/useFilters.esm.js';
18
+ import '../../../hooks/useGroups.esm.js';
19
+ import '../../../hooks/useLoading.esm.js';
20
+ import '../../../hooks/useScroll.esm.js';
21
+ import '../../../hooks/useLastCompleteBillingDate.esm.js';
22
+ import '../../../utils/styles.esm.js';
23
+ import '../../../types/Alert.esm.js';
24
+ import 'pluralize';
38
25
  import '@material-ui/core/Grid';
39
26
  import '@material-ui/core/Snackbar';
27
+ import '@material-ui/lab/Alert';
40
28
  import '@material-ui/core/utils';
41
29
  import '@material-ui/core/Button';
42
30
  import '@material-ui/core/Dialog';
43
31
  import '@material-ui/core/DialogActions';
44
32
  import '@material-ui/core/DialogContent';
33
+ import '@material-ui/core/Typography';
45
34
  import '@material-ui/icons/Close';
46
- import '@material-ui/core/Checkbox';
47
- import '@material-ui/core/FormControl';
48
- import '@material-ui/core/FormControlLabel';
49
- import '@material-ui/core/RadioGroup';
50
- import '@material-ui/core/Radio';
35
+ import '../../../utils/alerts.esm.js';
51
36
  import '@material-ui/core/Collapse';
52
- import '@material-ui/core/TextField';
53
37
  import '@material-ui/icons/ExpandMore';
54
- import '@material-ui/core/Container';
55
- import '@material-ui/icons/ChevronLeft';
56
- import '@backstage/core-components';
57
- import 'recharts';
58
- import '@material-ui/core/Slide';
59
- import '@material-ui/icons/ChevronRight';
60
- import '@material-ui/core/ButtonBase';
38
+ import '@material-ui/icons/MonetizationOn';
39
+ import '@material-ui/icons/Whatshot';
40
+ import '@material-ui/icons/Settings';
41
+ import '@material-ui/icons/AccountTree';
42
+ import '@material-ui/icons/Storage';
43
+ import '@material-ui/icons/Search';
44
+ import '@material-ui/icons/CloudQueue';
45
+ import '@material-ui/icons/School';
46
+ import '@material-ui/icons/ViewHeadline';
47
+ import '../../../utils/duration.esm.js';
48
+ import '../../../components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js';
49
+ import { BarChart } from '../../../components/BarChart/BarChart.esm.js';
50
+ import { useTheme } from '@material-ui/core/styles';
61
51
  import '@material-ui/icons/Lens';
62
52
  import '@material-ui/icons/HelpOutlineOutlined';
53
+ import 'luxon';
54
+ import 'react-router-dom';
63
55
  import 'react-use/esm/useCopyToClipboard';
64
56
  import '@material-ui/icons/AssignmentOutlined';
65
57
  import '@material-ui/icons/AssignmentTurnedInOutlined';
66
58
  import '@material-ui/icons/SentimentVeryDissatisfied';
59
+ import '../../../utils/currency.esm.js';
67
60
  import '@material-ui/icons/ArrowDropUp';
68
61
  import '@material-ui/icons/ArrowDropDown';
69
62
  import 'react-use/esm/useAsync';
70
- import '@material-ui/core/Menu';
71
- import '@material-ui/core/MenuItem';
72
- import '@material-ui/core/Tab';
73
- import '@material-ui/core/Tabs';
74
- import '@material-ui/core/MenuList';
75
- import '@material-ui/core/ListItemIcon';
76
- import '@material-ui/core/ListItemText';
63
+ import '@backstage/core-plugin-api';
64
+ import '../../../components/CostInsightsLayout/CostInsightsLayout.esm.js';
65
+ import '../../../components/CostInsightsNavigation/CostInsightsNavigation.esm.js';
66
+ import '@material-ui/core/Container';
67
+ import '../../../api/CostInsightsApi.esm.js';
77
68
  import '@material-ui/core/InputLabel';
78
69
  import '@material-ui/core/Select';
70
+ import '@material-ui/core/FormControl';
71
+ import '@material-ui/core/MenuItem';
79
72
  import '@material-ui/core/CardContent';
73
+ import '@material-ui/core/Tab';
74
+ import '@material-ui/core/Tabs';
75
+ import 'recharts';
76
+ import '@material-ui/core/styles/colorManipulator';
80
77
  import '@material-ui/icons/Fullscreen';
81
- import '@material-ui/core/FormGroup';
82
- import 'regression';
83
- //# sourceMappingURL=index-BTIHr4n_.esm.js.map
78
+ import '@material-ui/core/CircularProgress';
79
+ import '@backstage/core-components';
80
+ import '@material-ui/core/Menu';
81
+ import '../../../components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js';
82
+
83
+ const KubernetesMigrationBarChart = ({
84
+ currentProduct,
85
+ comparedProduct,
86
+ services
87
+ }) => {
88
+ const theme = useTheme();
89
+ const options = {
90
+ previousFill: theme.palette.magenta,
91
+ currentFill: theme.palette.yellow,
92
+ previousName: comparedProduct,
93
+ currentName: currentProduct
94
+ };
95
+ const resources = services.map((service) => ({
96
+ name: service.id,
97
+ previous: service.aggregation[0],
98
+ current: service.aggregation[1]
99
+ }));
100
+ return /* @__PURE__ */ React.createElement(BarChart, { resources, options });
101
+ };
102
+
103
+ export { KubernetesMigrationBarChart };
104
+ //# sourceMappingURL=KubernetesMigrationBarChart.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KubernetesMigrationBarChart.esm.js","sources":["../../../../src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChart.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 React from 'react';\nimport { BarChart } from '../../../components';\nimport {\n BarChartOptions,\n CostInsightsTheme,\n ResourceData,\n} from '../../../types';\nimport { Entity } from '@backstage-community/plugin-cost-insights-common';\nimport { useTheme } from '@material-ui/core/styles';\n\ntype MigrationBarChartProps = {\n currentProduct: string;\n comparedProduct: string;\n services: Array<Entity>;\n};\n\nexport const KubernetesMigrationBarChart = ({\n currentProduct,\n comparedProduct,\n services,\n}: MigrationBarChartProps) => {\n const theme = useTheme<CostInsightsTheme>();\n\n const options: BarChartOptions = {\n previousFill: theme.palette.magenta,\n currentFill: theme.palette.yellow,\n previousName: comparedProduct,\n currentName: currentProduct,\n };\n\n const resources: ResourceData[] = services.map(service => ({\n name: service.id,\n previous: service.aggregation[0],\n current: service.aggregation[1],\n }));\n\n return <BarChart resources={resources} options={options} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCO,MAAM,8BAA8B,CAAC;AAAA,EAC1C,cAAA;AAAA,EACA,eAAA;AAAA,EACA,QAAA;AACF,CAA8B,KAAA;AAC5B,EAAA,MAAM,QAAQ,QAA4B,EAAA,CAAA;AAE1C,EAAA,MAAM,OAA2B,GAAA;AAAA,IAC/B,YAAA,EAAc,MAAM,OAAQ,CAAA,OAAA;AAAA,IAC5B,WAAA,EAAa,MAAM,OAAQ,CAAA,MAAA;AAAA,IAC3B,YAAc,EAAA,eAAA;AAAA,IACd,WAAa,EAAA,cAAA;AAAA,GACf,CAAA;AAEA,EAAM,MAAA,SAAA,GAA4B,QAAS,CAAA,GAAA,CAAI,CAAY,OAAA,MAAA;AAAA,IACzD,MAAM,OAAQ,CAAA,EAAA;AAAA,IACd,QAAA,EAAU,OAAQ,CAAA,WAAA,CAAY,CAAC,CAAA;AAAA,IAC/B,OAAA,EAAS,OAAQ,CAAA,WAAA,CAAY,CAAC,CAAA;AAAA,GAC9B,CAAA,CAAA,CAAA;AAEF,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,SAAA,EAAsB,OAAkB,EAAA,CAAA,CAAA;AAC3D;;;;"}
@@ -0,0 +1,107 @@
1
+ import React from 'react';
2
+ import Box from '@material-ui/core/Box';
3
+ import { useTheme } from '@material-ui/core/styles';
4
+ import '@material-ui/core/Avatar';
5
+ import '@material-ui/core/Tooltip';
6
+ import '@material-ui/core/IconButton';
7
+ import '@material-ui/core/Badge';
8
+ import '@material-ui/core/Paper';
9
+ import '@material-ui/core/Divider';
10
+ import '@material-ui/icons/AccessTime';
11
+ import '@material-ui/icons/Check';
12
+ import '@material-ui/icons/Delete';
13
+ import 'classnames';
14
+ import '@material-ui/core/Card';
15
+ import '@material-ui/core/CardHeader';
16
+ import '../../../hooks/useConfig.esm.js';
17
+ import '../../../hooks/useCurrency.esm.js';
18
+ import '../../../hooks/useFilters.esm.js';
19
+ import '../../../hooks/useGroups.esm.js';
20
+ import '../../../hooks/useLoading.esm.js';
21
+ import '../../../hooks/useScroll.esm.js';
22
+ import '../../../hooks/useLastCompleteBillingDate.esm.js';
23
+ import '../../../utils/styles.esm.js';
24
+ import '../../../types/Alert.esm.js';
25
+ import { Duration } from '../../../types/Duration.esm.js';
26
+ import 'pluralize';
27
+ import '@material-ui/core/Grid';
28
+ import '@material-ui/core/Snackbar';
29
+ import '@material-ui/lab/Alert';
30
+ import '@material-ui/core/utils';
31
+ import '@material-ui/core/Button';
32
+ import '@material-ui/core/Dialog';
33
+ import '@material-ui/core/DialogActions';
34
+ import '@material-ui/core/DialogContent';
35
+ import '@material-ui/core/Typography';
36
+ import '@material-ui/icons/Close';
37
+ import '../../../utils/alerts.esm.js';
38
+ import '@material-ui/core/Collapse';
39
+ import '@material-ui/icons/ExpandMore';
40
+ import '@material-ui/icons/MonetizationOn';
41
+ import '@material-ui/icons/Whatshot';
42
+ import '@material-ui/icons/Settings';
43
+ import '@material-ui/icons/AccountTree';
44
+ import '@material-ui/icons/Storage';
45
+ import '@material-ui/icons/Search';
46
+ import '@material-ui/icons/CloudQueue';
47
+ import '@material-ui/icons/School';
48
+ import '@material-ui/icons/ViewHeadline';
49
+ import '../../../utils/duration.esm.js';
50
+ import '../../../components/AlertInstructionsLayout/AlertInstructionsLayout.esm.js';
51
+ import 'recharts';
52
+ import '@material-ui/core/Slide';
53
+ import '@material-ui/icons/ChevronLeft';
54
+ import '@material-ui/icons/ChevronRight';
55
+ import '../../../components/BarChart/BarChartStepperButton.esm.js';
56
+ import '@material-ui/core/ButtonBase';
57
+ import '@material-ui/icons/Lens';
58
+ import { monthOf } from '../../../utils/formatters.esm.js';
59
+ import { LegendItem } from '../../../components/LegendItem/LegendItem.esm.js';
60
+ import 'react-router-dom';
61
+ import 'react-use/esm/useCopyToClipboard';
62
+ import '@material-ui/icons/AssignmentOutlined';
63
+ import '@material-ui/icons/AssignmentTurnedInOutlined';
64
+ import '@material-ui/icons/SentimentVeryDissatisfied';
65
+ import { CostGrowth } from '../../../components/CostGrowth/CostGrowth.esm.js';
66
+ import '@material-ui/icons/ArrowDropUp';
67
+ import '@material-ui/icons/ArrowDropDown';
68
+ import 'luxon';
69
+ import 'react-use/esm/useAsync';
70
+ import '@backstage/core-plugin-api';
71
+ import '../../../components/CostInsightsLayout/CostInsightsLayout.esm.js';
72
+ import '../../../components/CostInsightsNavigation/CostInsightsNavigation.esm.js';
73
+ import '@material-ui/core/Container';
74
+ import '../../../api/CostInsightsApi.esm.js';
75
+ import '@material-ui/core/InputLabel';
76
+ import '@material-ui/core/Select';
77
+ import '@material-ui/core/FormControl';
78
+ import '@material-ui/core/MenuItem';
79
+ import '@material-ui/core/CardContent';
80
+ import '@material-ui/core/Tab';
81
+ import '@material-ui/core/Tabs';
82
+ import '@material-ui/core/styles/colorManipulator';
83
+ import '@material-ui/icons/Fullscreen';
84
+ import '@material-ui/core/CircularProgress';
85
+ import '@backstage/core-components';
86
+ import '@material-ui/core/Menu';
87
+ import '../../../components/ProjectGrowthInstructionsPage/ProjectGrowthInstructionsPage.esm.js';
88
+
89
+ const KubernetesMigrationBarChartLegend = ({
90
+ currentProduct,
91
+ comparedProduct,
92
+ change,
93
+ startDate
94
+ }) => {
95
+ const theme = useTheme();
96
+ return /* @__PURE__ */ React.createElement(Box, { display: "flex", flexDirection: "row" }, /* @__PURE__ */ React.createElement(Box, { marginRight: 2 }, /* @__PURE__ */ React.createElement(
97
+ LegendItem,
98
+ {
99
+ title: monthOf(startDate),
100
+ markerColor: theme.palette.magenta
101
+ },
102
+ currentProduct
103
+ )), /* @__PURE__ */ React.createElement(Box, { marginRight: 2 }, /* @__PURE__ */ React.createElement(LegendItem, { title: "Estimated Cost", markerColor: theme.palette.yellow }, comparedProduct)), /* @__PURE__ */ React.createElement(LegendItem, { title: "Total Savings" }, /* @__PURE__ */ React.createElement(CostGrowth, { change, duration: Duration.P30D })));
104
+ };
105
+
106
+ export { KubernetesMigrationBarChartLegend };
107
+ //# sourceMappingURL=KubernetesMigrationBarChartLegend.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KubernetesMigrationBarChartLegend.esm.js","sources":["../../../../src/example/components/KubernetesMigrationAlertCard/KubernetesMigrationBarChartLegend.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 React from 'react';\nimport Box from '@material-ui/core/Box';\nimport { useTheme } from '@material-ui/core/styles';\nimport { CostGrowth, LegendItem } from '../../../components';\nimport { CostInsightsTheme, Duration } from '../../../types';\nimport { ChangeStatistic } from '@backstage-community/plugin-cost-insights-common';\nimport { monthOf } from '../../../utils/formatters';\n\nexport type MigrationBarChartLegendProps = {\n change: ChangeStatistic;\n startDate: string;\n currentProduct: string;\n comparedProduct: string;\n};\n\nexport const KubernetesMigrationBarChartLegend = ({\n currentProduct,\n comparedProduct,\n change,\n startDate,\n}: MigrationBarChartLegendProps) => {\n const theme = useTheme<CostInsightsTheme>();\n return (\n <Box display=\"flex\" flexDirection=\"row\">\n <Box marginRight={2}>\n <LegendItem\n title={monthOf(startDate)}\n markerColor={theme.palette.magenta}\n >\n {currentProduct}\n </LegendItem>\n </Box>\n <Box marginRight={2}>\n <LegendItem title=\"Estimated Cost\" markerColor={theme.palette.yellow}>\n {comparedProduct}\n </LegendItem>\n </Box>\n <LegendItem title=\"Total Savings\">\n <CostGrowth change={change} duration={Duration.P30D} />\n </LegendItem>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BO,MAAM,oCAAoC,CAAC;AAAA,EAChD,cAAA;AAAA,EACA,eAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AACF,CAAoC,KAAA;AAClC,EAAA,MAAM,QAAQ,QAA4B,EAAA,CAAA;AAC1C,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAI,OAAQ,EAAA,MAAA,EAAO,eAAc,KAChC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAI,EAAA,EAAA,WAAA,EAAa,CAChB,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,QAAQ,SAAS,CAAA;AAAA,MACxB,WAAA,EAAa,MAAM,OAAQ,CAAA,OAAA;AAAA,KAAA;AAAA,IAE1B,cAAA;AAAA,GAEL,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,WAAa,EAAA,CAAA,EAAA,kBACf,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,KAAM,EAAA,gBAAA,EAAiB,WAAa,EAAA,KAAA,CAAM,OAAQ,CAAA,MAAA,EAAA,EAC3D,eACH,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,eAChB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,MAAA,EAAgB,QAAU,EAAA,QAAA,CAAS,IAAM,EAAA,CACvD,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,57 @@
1
+ import React, { forwardRef, useState, useEffect } from 'react';
2
+ import Checkbox from '@material-ui/core/Checkbox';
3
+ import FormControl from '@material-ui/core/FormControl';
4
+ import FormControlLabel from '@material-ui/core/FormControlLabel';
5
+ import FormGroup from '@material-ui/core/FormGroup';
6
+ import Typography from '@material-ui/core/Typography';
7
+ import { findAlways } from '../../utils/assert.esm.js';
8
+
9
+ const KubernetesMigrationDismissForm = forwardRef(({ onSubmit, disableSubmit, alert }, ref) => {
10
+ const [services, setServices] = useState(alert.data.services);
11
+ const onFormSubmit = (e) => {
12
+ e.preventDefault();
13
+ onSubmit({ services });
14
+ };
15
+ const onCheckboxChange = (e, checked) => {
16
+ if (checked) {
17
+ const service = findAlways(
18
+ alert.data.services,
19
+ (s) => s.id === e.target.value
20
+ );
21
+ setServices((prevServices) => prevServices.concat(service));
22
+ } else {
23
+ setServices(
24
+ (prevServices) => prevServices.filter((p) => p.id !== e.target.value)
25
+ );
26
+ }
27
+ };
28
+ useEffect(() => {
29
+ if (services.length) {
30
+ disableSubmit(false);
31
+ } else {
32
+ disableSubmit(true);
33
+ }
34
+ }, [services, disableSubmit]);
35
+ return (
36
+ /* All custom forms must accept a ref and implement an onSubmit handler. */
37
+ /* @__PURE__ */ React.createElement("form", { ref, onSubmit: onFormSubmit }, /* @__PURE__ */ React.createElement(FormControl, { component: "fieldset", fullWidth: true }, /* @__PURE__ */ React.createElement(Typography, { color: "textPrimary" }, /* @__PURE__ */ React.createElement("b", null, "Or choose which services to dismiss this alert for.")), /* @__PURE__ */ React.createElement(FormGroup, null, alert.data.services.map((service, index) => /* @__PURE__ */ React.createElement(
38
+ FormControlLabel,
39
+ {
40
+ key: `example-option-${index}`,
41
+ label: service.id,
42
+ value: service.id,
43
+ control: /* @__PURE__ */ React.createElement(
44
+ Checkbox,
45
+ {
46
+ color: "primary",
47
+ checked: services.some((p) => p.id === service.id),
48
+ onChange: onCheckboxChange
49
+ }
50
+ )
51
+ }
52
+ )))))
53
+ );
54
+ });
55
+
56
+ export { KubernetesMigrationDismissForm };
57
+ //# sourceMappingURL=KubernetesMigrationDismissForm.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KubernetesMigrationDismissForm.esm.js","sources":["../../../src/example/forms/KubernetesMigrationDismissForm.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 React, {\n useEffect,\n useState,\n forwardRef,\n FormEventHandler,\n ChangeEvent,\n} from 'react';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport FormControl from '@material-ui/core/FormControl';\nimport FormControlLabel from '@material-ui/core/FormControlLabel';\nimport FormGroup from '@material-ui/core/FormGroup';\nimport Typography from '@material-ui/core/Typography';\nimport { AlertFormProps } from '../../types';\nimport { Entity } from '@backstage-community/plugin-cost-insights-common';\nimport { KubernetesMigrationAlert } from '../alerts';\nimport { findAlways } from '../../utils/assert';\n\nexport type KubernetesMigrationDismissFormData = {\n services: Entity[];\n};\n\nexport type KubernetesMigrationDismissFormProps = AlertFormProps<\n KubernetesMigrationAlert,\n KubernetesMigrationDismissFormData\n>;\n\nexport const KubernetesMigrationDismissForm = forwardRef<\n HTMLFormElement,\n KubernetesMigrationDismissFormProps\n>(({ onSubmit, disableSubmit, alert }, ref) => {\n const [services, setServices] = useState<Entity[]>(alert.data.services);\n\n const onFormSubmit: FormEventHandler = e => {\n /* Remember to prevent default form behavior */\n e.preventDefault();\n onSubmit({ services: services });\n };\n\n const onCheckboxChange = (\n e: ChangeEvent<HTMLInputElement>,\n checked: boolean,\n ) => {\n if (checked) {\n const service = findAlways(\n alert.data.services,\n s => s.id === e.target.value,\n );\n setServices(prevServices => prevServices.concat(service));\n } else {\n setServices(prevServices =>\n prevServices.filter(p => p.id !== e.target.value),\n );\n }\n };\n\n /* Submit button is disabled by default. Use props.disableSubmit to toggle disabled state. */\n useEffect(() => {\n if (services.length) {\n disableSubmit(false);\n } else {\n disableSubmit(true);\n }\n }, [services, disableSubmit]);\n\n return (\n /* All custom forms must accept a ref and implement an onSubmit handler. */\n <form ref={ref} onSubmit={onFormSubmit}>\n <FormControl component=\"fieldset\" fullWidth>\n <Typography color=\"textPrimary\">\n <b>Or choose which services to dismiss this alert for.</b>\n </Typography>\n <FormGroup>\n {alert.data.services.map((service, index) => (\n <FormControlLabel\n key={`example-option-${index}`}\n label={service.id}\n value={service.id}\n control={\n <Checkbox\n color=\"primary\"\n checked={services.some(p => p.id === service.id)}\n onChange={onCheckboxChange}\n />\n }\n />\n ))}\n </FormGroup>\n </FormControl>\n </form>\n );\n});\n"],"names":[],"mappings":";;;;;;;;AA0Ca,MAAA,8BAAA,GAAiC,WAG5C,CAAC,EAAE,UAAU,aAAe,EAAA,KAAA,IAAS,GAAQ,KAAA;AAC7C,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,QAAmB,CAAA,KAAA,CAAM,KAAK,QAAQ,CAAA,CAAA;AAEtE,EAAA,MAAM,eAAiC,CAAK,CAAA,KAAA;AAE1C,IAAA,CAAA,CAAE,cAAe,EAAA,CAAA;AACjB,IAAS,QAAA,CAAA,EAAE,UAAoB,CAAA,CAAA;AAAA,GACjC,CAAA;AAEA,EAAM,MAAA,gBAAA,GAAmB,CACvB,CAAA,EACA,OACG,KAAA;AACH,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,MAAM,OAAU,GAAA,UAAA;AAAA,QACd,MAAM,IAAK,CAAA,QAAA;AAAA,QACX,CAAK,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,CAAA,CAAE,MAAO,CAAA,KAAA;AAAA,OACzB,CAAA;AACA,MAAA,WAAA,CAAY,CAAgB,YAAA,KAAA,YAAA,CAAa,MAAO,CAAA,OAAO,CAAC,CAAA,CAAA;AAAA,KACnD,MAAA;AACL,MAAA,WAAA;AAAA,QAAY,CAAA,YAAA,KACV,aAAa,MAAO,CAAA,CAAA,CAAA,KAAK,EAAE,EAAO,KAAA,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,OAClD,CAAA;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,MAAQ,EAAA;AACnB,MAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AAAA,KACd,MAAA;AACL,MAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,KACpB;AAAA,GACC,EAAA,CAAC,QAAU,EAAA,aAAa,CAAC,CAAA,CAAA;AAE5B,EAAA;AAAA;AAAA,oBAEG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAK,GAAU,EAAA,QAAA,EAAU,YACxB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAU,UAAW,EAAA,SAAA,EAAS,IACzC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,KAAA,EAAM,aAChB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAE,EAAA,IAAA,EAAA,qDAAmD,CACxD,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,EACE,KAAM,CAAA,IAAA,CAAK,QAAS,CAAA,GAAA,CAAI,CAAC,OAAA,EAAS,KACjC,qBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,gBAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAK,kBAAkB,KAAK,CAAA,CAAA;AAAA,QAC5B,OAAO,OAAQ,CAAA,EAAA;AAAA,QACf,OAAO,OAAQ,CAAA,EAAA;AAAA,QACf,OACE,kBAAA,KAAA,CAAA,aAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,KAAM,EAAA,SAAA;AAAA,YACN,SAAS,QAAS,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,EAAA,KAAO,QAAQ,EAAE,CAAA;AAAA,YAC/C,QAAU,EAAA,gBAAA;AAAA,WAAA;AAAA,SACZ;AAAA,OAAA;AAAA,KAGL,CACH,CACF,CACF,CAAA;AAAA,IAAA;AAEJ,CAAC;;;;"}
@@ -0,0 +1,27 @@
1
+ import React, { forwardRef, useState } from 'react';
2
+ import Checkbox from '@material-ui/core/Checkbox';
3
+ import FormControl from '@material-ui/core/FormControl';
4
+ import FormControlLabel from '@material-ui/core/FormControlLabel';
5
+
6
+ const AlertAcceptForm = forwardRef(({ onSubmit, disableSubmit }, ref) => {
7
+ const [checked, setChecked] = useState(false);
8
+ const onFormSubmit = (e) => {
9
+ e.preventDefault();
10
+ onSubmit(null);
11
+ };
12
+ const onChecked = (_, isChecked) => {
13
+ setChecked(isChecked);
14
+ disableSubmit(!isChecked);
15
+ };
16
+ return /* @__PURE__ */ React.createElement("form", { ref, onSubmit: onFormSubmit }, /* @__PURE__ */ React.createElement(FormControl, { component: "fieldset", fullWidth: true }, /* @__PURE__ */ React.createElement(
17
+ FormControlLabel,
18
+ {
19
+ label: "My team can commit to making this change soon, or has already.",
20
+ value: checked,
21
+ control: /* @__PURE__ */ React.createElement(Checkbox, { color: "primary", checked, onChange: onChecked })
22
+ }
23
+ )));
24
+ });
25
+
26
+ export { AlertAcceptForm };
27
+ //# sourceMappingURL=AlertAcceptForm.esm.js.map