@electrolux-oss/plugin-infrawallet 0.1.12 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/api/InfraWalletApi.esm.js.map +1 -1
  2. package/dist/api/InfraWalletApiClient.esm.js +35 -13
  3. package/dist/api/InfraWalletApiClient.esm.js.map +1 -1
  4. package/dist/api/functions.esm.js +5 -4
  5. package/dist/api/functions.esm.js.map +1 -1
  6. package/dist/components/Budgets/Budgets.esm.js +184 -0
  7. package/dist/components/Budgets/Budgets.esm.js.map +1 -0
  8. package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js +32 -23
  9. package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js.map +1 -1
  10. package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js +41 -42
  11. package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js.map +1 -1
  12. package/dist/components/CustomCostsComponent/BulkInsertButton.esm.js +195 -0
  13. package/dist/components/CustomCostsComponent/BulkInsertButton.esm.js.map +1 -0
  14. package/dist/components/CustomCostsComponent/CustomCostsComponent.esm.js +369 -0
  15. package/dist/components/CustomCostsComponent/CustomCostsComponent.esm.js.map +1 -0
  16. package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js +95 -87
  17. package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js.map +1 -1
  18. package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js +16 -16
  19. package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js.map +1 -1
  20. package/dist/components/FiltersComponent/FiltersComponent.esm.js +72 -66
  21. package/dist/components/FiltersComponent/FiltersComponent.esm.js.map +1 -1
  22. package/dist/components/InfraWalletIcon.esm.js +10 -10
  23. package/dist/components/InfraWalletIcon.esm.js.map +1 -1
  24. package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js +15 -17
  25. package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js.map +1 -1
  26. package/dist/components/PieChartComponent/PieChartComponent.esm.js +5 -5
  27. package/dist/components/PieChartComponent/PieChartComponent.esm.js.map +1 -1
  28. package/dist/components/ProviderIcons/ProviderIcons.esm.js +62 -63
  29. package/dist/components/ProviderIcons/ProviderIcons.esm.js.map +1 -1
  30. package/dist/components/ReportsComponent/ReportsComponent.esm.js +37 -26
  31. package/dist/components/ReportsComponent/ReportsComponent.esm.js.map +1 -1
  32. package/dist/components/Router.esm.js +2 -3
  33. package/dist/components/Router.esm.js.map +1 -1
  34. package/dist/components/SettingsComponent/SettingsComponent.esm.js +4 -7
  35. package/dist/components/SettingsComponent/SettingsComponent.esm.js.map +1 -1
  36. package/dist/components/TopbarComponent/TopbarComponent.esm.js +16 -17
  37. package/dist/components/TopbarComponent/TopbarComponent.esm.js.map +1 -1
  38. package/dist/components/index.esm.js +22 -26
  39. package/dist/components/index.esm.js.map +1 -1
  40. package/package.json +19 -14
@@ -1,46 +1,20 @@
1
1
  import { Progress, InfoCard } from '@backstage/core-components';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { useEntity } from '@backstage/plugin-catalog-react';
4
- import { Tabs, Tab, Box, Typography, Table, TableHead, TableRow, TableCell, TableBody } from '@material-ui/core';
5
- import { makeStyles } from '@material-ui/core/styles';
6
4
  import Alert from '@mui/material/Alert';
7
- import React, { useState, useEffect } from 'react';
5
+ import Box from '@mui/material/Box';
6
+ import Tab from '@mui/material/Tab';
7
+ import Table from '@mui/material/Table';
8
+ import TableBody from '@mui/material/TableBody';
9
+ import TableCell from '@mui/material/TableCell';
10
+ import TableHead from '@mui/material/TableHead';
11
+ import TableRow from '@mui/material/TableRow';
12
+ import Tabs from '@mui/material/Tabs';
13
+ import Typography from '@mui/material/Typography';
14
+ import React__default, { useState, useEffect } from 'react';
8
15
  import { ResponsiveContainer, LineChart, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Line } from 'recharts';
9
16
  import { infraWalletApiRef } from '../../api/InfraWalletApi.esm.js';
10
17
 
11
- const useStyles = makeStyles({
12
- increase: {
13
- color: "#ae2e24",
14
- backgroundColor: "#ffeceb",
15
- borderRadius: "4px",
16
- padding: "2px 4px",
17
- fontSize: "0.82em",
18
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Open Sans", "Helvetica Neue", sans-serif'
19
- },
20
- decrease: {
21
- color: "#216e4e",
22
- backgroundColor: "#dcfff1",
23
- borderRadius: "4px",
24
- padding: "2px 4px",
25
- fontSize: "0.82em",
26
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Open Sans", "Helvetica Neue", sans-serif'
27
- },
28
- noChange: {
29
- color: "#0052cc",
30
- backgroundColor: "#e9f2ff",
31
- borderRadius: "4px",
32
- padding: "2px 4px",
33
- fontSize: "0.82em",
34
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Open Sans", "Helvetica Neue", sans-serif'
35
- },
36
- regular: {
37
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Open Sans", "Helvetica Neue", sans-serif'
38
- },
39
- bold: {
40
- fontWeight: "bold",
41
- fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Ubuntu, "Open Sans", "Helvetica Neue", sans-serif'
42
- }
43
- });
44
18
  const COLORS = [
45
19
  "#8884d8",
46
20
  "#82ca9d",
@@ -54,8 +28,6 @@ const COLORS = [
54
28
  "#00ffff"
55
29
  ];
56
30
  const EntityInfraWalletCard = () => {
57
- var _a, _b;
58
- const classes = useStyles();
59
31
  const { entity } = useEntity();
60
32
  const infrawalletApi = useApi(infraWalletApiRef);
61
33
  const [costData, setCostData] = useState(null);
@@ -128,13 +100,13 @@ const EntityInfraWalletCard = () => {
128
100
  fetchCostData();
129
101
  }, [entity, infrawalletApi]);
130
102
  if (loading) {
131
- return /* @__PURE__ */ React.createElement(Progress, null);
103
+ return /* @__PURE__ */ React__default.createElement(Progress, null);
132
104
  }
133
105
  if (error) {
134
- return /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, error);
106
+ return /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, error);
135
107
  }
136
108
  if (!costData || costData.length === 0) {
137
- return /* @__PURE__ */ React.createElement(Alert, { severity: "info" }, "No cost data available for this entity.");
109
+ return /* @__PURE__ */ React__default.createElement(Alert, { severity: "info" }, "No cost data available for this entity.");
138
110
  }
139
111
  const periods = /* @__PURE__ */ new Set();
140
112
  costData.forEach((report) => {
@@ -149,14 +121,20 @@ const EntityInfraWalletCard = () => {
149
121
  });
150
122
  const currentPeriod = sortedPeriods[sortedPeriods.length - 1];
151
123
  const previousPeriod = sortedPeriods.length > 1 ? sortedPeriods[sortedPeriods.length - 2] : null;
152
- const totalCost = ((_a = totalCostsByPeriod.find((item) => item.period === currentPeriod)) == null ? void 0 : _a.total) || 0;
153
- const previousTotalCost = previousPeriod ? ((_b = totalCostsByPeriod.find((item) => item.period === previousPeriod)) == null ? void 0 : _b.total) || 0 : 0;
124
+ const totalCost = totalCostsByPeriod.find((item) => item.period === currentPeriod)?.total || 0;
125
+ const previousTotalCost = previousPeriod ? totalCostsByPeriod.find((item) => item.period === previousPeriod)?.total || 0 : 0;
154
126
  const percentageChange = previousTotalCost !== 0 ? (totalCost - previousTotalCost) / previousTotalCost * 100 : 0;
155
127
  const percentageChangeFormatted = Math.abs(percentageChange).toFixed(2);
128
+ let color = "#0052cc";
129
+ let backgroundColor = "#e9f2ff";
156
130
  let mark = "";
157
131
  if (percentageChange < 0) {
132
+ color = "#216e4e";
133
+ backgroundColor = "#dcfff1";
158
134
  mark = "\u25BC";
159
135
  } else if (percentageChange > 0) {
136
+ color = "#ae2e24";
137
+ backgroundColor = "#ffeceb";
160
138
  mark = "\u25B2";
161
139
  }
162
140
  const projects = Array.from(
@@ -168,7 +146,7 @@ const EntityInfraWalletCard = () => {
168
146
  )
169
147
  );
170
148
  if (projects.length === 0) {
171
- return /* @__PURE__ */ React.createElement(Alert, { severity: "warning" }, "No project data available to display in the chart.");
149
+ return /* @__PURE__ */ React__default.createElement(Alert, { severity: "warning" }, "No project data available to display in the chart.");
172
150
  }
173
151
  const chartData = sortedPeriods.map((period) => {
174
152
  const dataPoint = { period };
@@ -181,28 +159,34 @@ const EntityInfraWalletCard = () => {
181
159
  });
182
160
  return dataPoint;
183
161
  });
184
- const perServiceCosts = costData.reduce((acc, report) => {
185
- const service = report.service;
186
- const cost = report.reports[currentPeriod] || 0;
187
- if (typeof service === "string") {
188
- if (!acc[service]) {
189
- acc[service] = 0;
162
+ const perServiceCosts = costData.reduce(
163
+ (acc, report) => {
164
+ const service = report.service;
165
+ const cost = report.reports[currentPeriod] || 0;
166
+ if (typeof service === "string") {
167
+ if (!acc[service]) {
168
+ acc[service] = 0;
169
+ }
170
+ acc[service] += cost;
190
171
  }
191
- acc[service] += cost;
192
- }
193
- return acc;
194
- }, {});
195
- const prevPerServiceCosts = previousPeriod ? costData.reduce((acc, report) => {
196
- const service = report.service;
197
- const cost = report.reports[previousPeriod] || 0;
198
- if (typeof service === "string") {
199
- if (!acc[service]) {
200
- acc[service] = 0;
172
+ return acc;
173
+ },
174
+ {}
175
+ );
176
+ const prevPerServiceCosts = previousPeriod ? costData.reduce(
177
+ (acc, report) => {
178
+ const service = report.service;
179
+ const cost = report.reports[previousPeriod] || 0;
180
+ if (typeof service === "string") {
181
+ if (!acc[service]) {
182
+ acc[service] = 0;
183
+ }
184
+ acc[service] += cost;
201
185
  }
202
- acc[service] += cost;
203
- }
204
- return acc;
205
- }, {}) : {};
186
+ return acc;
187
+ },
188
+ {}
189
+ ) : {};
206
190
  const serviceRows = Object.entries(perServiceCosts).map(([service, cost]) => {
207
191
  const prevCost = prevPerServiceCosts[service] || 0;
208
192
  const change = prevCost !== 0 ? (cost - prevCost) / prevCost * 100 : 0;
@@ -212,28 +196,26 @@ const EntityInfraWalletCard = () => {
212
196
  change
213
197
  };
214
198
  });
215
- const getChangeClass = (change) => {
216
- if (change > 0) {
217
- return classes.increase;
218
- }
219
- if (change === 0) {
220
- return classes.noChange;
221
- }
222
- return classes.decrease;
223
- };
224
- const getChangeMark = (change) => {
225
- if (change < 0) {
226
- return "\u25BC";
227
- }
228
- if (change > 0) {
229
- return "\u25B2";
230
- }
231
- return "";
232
- };
233
199
  const handleTabChange = (_event, newValue) => {
234
200
  setTabIndex(newValue);
235
201
  };
236
- return /* @__PURE__ */ React.createElement(InfoCard, { title: "InfraWallet" }, /* @__PURE__ */ React.createElement(Tabs, { value: tabIndex, onChange: handleTabChange, "aria-label": "Cost Tabs" }, /* @__PURE__ */ React.createElement(Tab, { label: "Total Cost" }), /* @__PURE__ */ React.createElement(Tab, { label: "Service Breakdown" })), tabIndex === 0 && /* @__PURE__ */ React.createElement(Box, { p: 2 }, /* @__PURE__ */ React.createElement(Box, { display: "flex", alignItems: "center" }, previousTotalCost > 0 && /* @__PURE__ */ React.createElement(Box, { className: getChangeClass(percentageChange), mr: 1 }, mark, " ", percentageChangeFormatted, "%"), /* @__PURE__ */ React.createElement(Typography, { variant: "h6", className: classes.bold }, "Current Month: $", totalCost.toFixed(2))), /* @__PURE__ */ React.createElement(ResponsiveContainer, { width: "100%", height: 300 }, /* @__PURE__ */ React.createElement(LineChart, { data: chartData }, /* @__PURE__ */ React.createElement(CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ React.createElement(XAxis, { dataKey: "period" }), /* @__PURE__ */ React.createElement(YAxis, null), /* @__PURE__ */ React.createElement(Tooltip, null), /* @__PURE__ */ React.createElement(Legend, null), projects.map((project, index) => /* @__PURE__ */ React.createElement(
202
+ return /* @__PURE__ */ React__default.createElement(InfoCard, { title: "InfraWallet" }, /* @__PURE__ */ React__default.createElement(Tabs, { value: tabIndex, onChange: handleTabChange, "aria-label": "Cost Tabs" }, /* @__PURE__ */ React__default.createElement(Tab, { label: "Total Cost" }), /* @__PURE__ */ React__default.createElement(Tab, { label: "Service Breakdown" })), tabIndex === 0 && /* @__PURE__ */ React__default.createElement(Box, { p: 2 }, /* @__PURE__ */ React__default.createElement(Box, { display: "flex", alignItems: "center" }, previousTotalCost > 0 && /* @__PURE__ */ React__default.createElement(
203
+ Box,
204
+ {
205
+ sx: {
206
+ fontSize: "0.82em",
207
+ paddingInline: "2px",
208
+ borderRadius: "4px",
209
+ color,
210
+ backgroundColor
211
+ },
212
+ mr: 1
213
+ },
214
+ mark,
215
+ " ",
216
+ percentageChangeFormatted,
217
+ "%"
218
+ ), /* @__PURE__ */ React__default.createElement(Typography, { variant: "h6", sx: { fontWeight: "bold" } }, "Current Month: $", totalCost.toFixed(2))), /* @__PURE__ */ React__default.createElement(ResponsiveContainer, { width: "100%", height: 300 }, /* @__PURE__ */ React__default.createElement(LineChart, { data: chartData }, /* @__PURE__ */ React__default.createElement(CartesianGrid, { strokeDasharray: "3 3" }), /* @__PURE__ */ React__default.createElement(XAxis, { dataKey: "period" }), /* @__PURE__ */ React__default.createElement(YAxis, null), /* @__PURE__ */ React__default.createElement(Tooltip, null), /* @__PURE__ */ React__default.createElement(Legend, null), projects.map((project, index) => /* @__PURE__ */ React__default.createElement(
237
219
  Line,
238
220
  {
239
221
  key: project,
@@ -242,11 +224,37 @@ const EntityInfraWalletCard = () => {
242
224
  stroke: COLORS[index % COLORS.length],
243
225
  activeDot: { r: 8 }
244
226
  }
245
- ))))), tabIndex === 1 && /* @__PURE__ */ React.createElement(Box, { p: 2 }, /* @__PURE__ */ React.createElement(Table, { size: "small" }, /* @__PURE__ */ React.createElement(TableHead, null, /* @__PURE__ */ React.createElement(TableRow, null, /* @__PURE__ */ React.createElement(TableCell, { className: classes.bold }, "Service"), /* @__PURE__ */ React.createElement(TableCell, { align: "right", className: classes.bold }, "Monthly Cost"), /* @__PURE__ */ React.createElement(TableCell, { align: "right", className: classes.bold }, "Monthly Change"))), /* @__PURE__ */ React.createElement(TableBody, null, serviceRows.map((row) => {
246
- const serviceChangeClass = getChangeClass(row.change);
247
- const serviceMark = getChangeMark(row.change);
227
+ ))))), tabIndex === 1 && /* @__PURE__ */ React__default.createElement(Box, { p: 2 }, /* @__PURE__ */ React__default.createElement(Table, { size: "small" }, /* @__PURE__ */ React__default.createElement(TableHead, null, /* @__PURE__ */ React__default.createElement(TableRow, null, /* @__PURE__ */ React__default.createElement(TableCell, { sx: { fontWeight: "bold" } }, "Service"), /* @__PURE__ */ React__default.createElement(TableCell, { align: "right", sx: { fontWeight: "bold" } }, "Monthly Cost"), /* @__PURE__ */ React__default.createElement(TableCell, { align: "right", sx: { fontWeight: "bold" } }, "Monthly Change"))), /* @__PURE__ */ React__default.createElement(TableBody, null, serviceRows.map((row) => {
228
+ let serviceColor = "#0052cc";
229
+ let serviceBackgroundColor = "#e9f2ff";
230
+ let serviceMark = "";
231
+ if (row.change < 0) {
232
+ serviceColor = "#216e4e";
233
+ serviceBackgroundColor = "#dcfff1";
234
+ serviceMark = "\u25BC";
235
+ } else if (row.change > 0) {
236
+ serviceColor = "#ae2e24";
237
+ serviceBackgroundColor = "#ffeceb";
238
+ serviceMark = "\u25B2";
239
+ }
248
240
  const changeFormatted = Math.abs(row.change).toFixed(2);
249
- return /* @__PURE__ */ React.createElement(TableRow, { key: row.service }, /* @__PURE__ */ React.createElement(TableCell, { component: "th", scope: "row" }, row.service), /* @__PURE__ */ React.createElement(TableCell, { align: "right" }, "$", row.cost.toFixed(2)), /* @__PURE__ */ React.createElement(TableCell, { align: "right" }, /* @__PURE__ */ React.createElement(Box, { className: serviceChangeClass, display: "inline" }, serviceMark, " ", changeFormatted, "%")));
241
+ return /* @__PURE__ */ React__default.createElement(TableRow, { key: row.service }, /* @__PURE__ */ React__default.createElement(TableCell, { component: "th", scope: "row" }, row.service), /* @__PURE__ */ React__default.createElement(TableCell, { align: "right" }, "$", row.cost.toFixed(2)), /* @__PURE__ */ React__default.createElement(TableCell, { align: "right" }, /* @__PURE__ */ React__default.createElement(
242
+ Box,
243
+ {
244
+ sx: {
245
+ fontSize: "0.82em",
246
+ paddingInline: "2px",
247
+ borderRadius: "4px",
248
+ color: serviceColor,
249
+ backgroundColor: serviceBackgroundColor
250
+ },
251
+ display: "inline"
252
+ },
253
+ serviceMark,
254
+ " ",
255
+ changeFormatted,
256
+ "%"
257
+ )));
250
258
  })))));
251
259
  };
252
260
 
@@ -1 +1 @@
1
- {"version":3,"file":"EntityInfraWalletCard.esm.js","sources":["../../../src/components/EntityInfraWalletCard/EntityInfraWalletCard.tsx"],"sourcesContent":["import { InfoCard, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { Box, Tab, Table, TableBody, TableCell, TableHead, TableRow, Tabs, Typography } from '@material-ui/core';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Alert from '@mui/material/Alert';\nimport React, { useEffect, useState } from 'react';\nimport { CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { Report, Tag } from '../../api/types';\n\nconst useStyles = makeStyles({\n increase: {\n color: '#ae2e24',\n backgroundColor: '#ffeceb',\n borderRadius: '4px',\n padding: '2px 4px',\n fontSize: '0.82em',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Ubuntu, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n },\n decrease: {\n color: '#216e4e',\n backgroundColor: '#dcfff1',\n borderRadius: '4px',\n padding: '2px 4px',\n fontSize: '0.82em',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Ubuntu, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n },\n noChange: {\n color: '#0052cc',\n backgroundColor: '#e9f2ff',\n borderRadius: '4px',\n padding: '2px 4px',\n fontSize: '0.82em',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Ubuntu, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n },\n regular: {\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Ubuntu, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n },\n bold: {\n fontWeight: 'bold',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Ubuntu, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n },\n});\n\nconst COLORS = [\n '#8884d8',\n '#82ca9d',\n '#ffc658',\n '#ff7300',\n '#413ea0',\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ff00ff',\n '#00ffff',\n];\n\nexport const EntityInfraWalletCard = () => {\n const classes = useStyles();\n const { entity } = useEntity();\n const infrawalletApi = useApi(infraWalletApiRef);\n\n const [costData, setCostData] = useState<Report[] | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [tabIndex, setTabIndex] = useState<number>(0);\n\n useEffect(() => {\n const fetchCostData = async () => {\n setLoading(true);\n setError(null);\n try {\n const annotations = entity.metadata.annotations || {};\n\n const annotationKeys = [\n 'infrawallet.io/project',\n 'infrawallet.io/account',\n 'infrawallet.io/service',\n 'infrawallet.io/category',\n 'infrawallet.io/provider',\n ];\n\n const filtersObj: Record<string, string[]> = {};\n\n annotationKeys.forEach(key => {\n if (annotations[key]) {\n const shortKey = key.replace('infrawallet.io/', '');\n const values = annotations[key]\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v.length > 0);\n filtersObj[shortKey] = values;\n }\n });\n\n if (annotations['infrawallet.io/extra-filters']) {\n const extraFilters = annotations['infrawallet.io/extra-filters'];\n // assuming extra-filters are in the format \"key1: value1, key2: value2\"\n extraFilters.split(',').forEach(pair => {\n const [key, value] = pair.split(':').map(s => s.trim());\n if (key && value) {\n const values = value\n .split('|')\n .map((v: string) => v.trim())\n .filter((v: string) => v.length > 0);\n filtersObj[key] = values;\n }\n });\n }\n\n // build filters string for API call (include all filters)\n const filtersArray = Object.entries(filtersObj).map(([key, values]) => {\n if (values.length === 1) {\n return `${key}:${values[0]}`;\n }\n const valuesString = values.join('|');\n return `${key}:(${valuesString})`;\n });\n const filters = `(${filtersArray.join(',')})`;\n\n const tags: Tag[] = [];\n const groups = '';\n const granularity = 'monthly';\n\n const endTime = new Date();\n const startTime = new Date();\n startTime.setMonth(endTime.getMonth() - 2);\n\n const costReportsResponse = await infrawalletApi.getCostReports(\n filters,\n tags,\n groups,\n granularity,\n startTime,\n endTime,\n );\n\n if (costReportsResponse.status !== 200) {\n throw new Error('Failed to fetch cost reports');\n }\n\n setCostData(costReportsResponse.data || null);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Unknown error occurred');\n } finally {\n setLoading(false);\n }\n };\n\n fetchCostData();\n }, [entity, infrawalletApi]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <Alert severity=\"error\">{error}</Alert>;\n }\n\n if (!costData || costData.length === 0) {\n return <Alert severity=\"info\">No cost data available for this entity.</Alert>;\n }\n\n // prepare periods\n const periods = new Set<string>();\n costData.forEach(report => {\n Object.keys(report.reports).forEach(period => periods.add(period));\n });\n\n const sortedPeriods = Array.from(periods).sort();\n\n // calculate total cost for each period\n const totalCostsByPeriod = sortedPeriods.map(period => {\n const total = costData.reduce((sum, report) => {\n return sum + (report.reports[period] || 0);\n }, 0);\n return { period, total };\n });\n\n // calculate total cost for current and previous months\n const currentPeriod = sortedPeriods[sortedPeriods.length - 1];\n const previousPeriod = sortedPeriods.length > 1 ? sortedPeriods[sortedPeriods.length - 2] : null;\n\n const totalCost = totalCostsByPeriod.find(item => item.period === currentPeriod)?.total || 0;\n const previousTotalCost = previousPeriod\n ? totalCostsByPeriod.find(item => item.period === previousPeriod)?.total || 0\n : 0;\n\n // calculate percentage change\n const percentageChange = previousTotalCost !== 0 ? ((totalCost - previousTotalCost) / previousTotalCost) * 100 : 0;\n const percentageChangeFormatted = Math.abs(percentageChange).toFixed(2);\n let mark = '';\n if (percentageChange < 0) {\n mark = '▼';\n } else if (percentageChange > 0) {\n mark = '▲';\n }\n\n // 1. extract unique project IDs\n const projects = Array.from(\n new Set(\n costData\n .map(report => {\n const project = report.project as string | undefined;\n return typeof project === 'string' ? project : undefined;\n })\n .filter((project): project is string => !!project),\n ),\n );\n\n if (projects.length === 0) {\n return <Alert severity=\"warning\">No project data available to display in the chart.</Alert>;\n }\n\n // 2. build chart data with per-project costs\n const chartData = sortedPeriods.map(period => {\n const dataPoint: Record<string, any> = { period };\n projects.forEach(project => {\n const projectReports = costData.filter(report => report.project === project);\n const total = projectReports.reduce((sum, report) => {\n return sum + (report.reports[period] || 0);\n }, 0);\n dataPoint[project] = total;\n });\n return dataPoint;\n });\n\n // 3. calculate per-service costs for current period\n const perServiceCosts = costData.reduce((acc, report) => {\n const service = report.service as string | undefined;\n const cost = report.reports[currentPeriod] || 0;\n if (typeof service === 'string') {\n if (!acc[service]) {\n acc[service] = 0;\n }\n acc[service] += cost;\n }\n return acc;\n }, {} as Record<string, number>);\n\n // 4. calculate per-service costs for previous period\n const prevPerServiceCosts = previousPeriod\n ? costData.reduce((acc, report) => {\n const service = report.service as string | undefined;\n const cost = report.reports[previousPeriod] || 0;\n if (typeof service === 'string') {\n if (!acc[service]) {\n acc[service] = 0;\n }\n acc[service] += cost;\n }\n return acc;\n }, {} as Record<string, number>)\n : {};\n\n // 5. prepare data for per-service table\n const serviceRows = Object.entries(perServiceCosts).map(([service, cost]) => {\n const prevCost = prevPerServiceCosts[service] || 0;\n const change = prevCost !== 0 ? ((cost - prevCost) / prevCost) * 100 : 0;\n return {\n service,\n cost,\n change,\n };\n });\n\n // helper function to determine className based on change\n const getChangeClass = (change: number): string => {\n if (change > 0) {\n return classes.increase;\n }\n if (change === 0) {\n return classes.noChange;\n }\n return classes.decrease;\n };\n\n // helper function to determine mark based on change\n const getChangeMark = (change: number): string => {\n if (change < 0) {\n return '▼';\n }\n if (change > 0) {\n return '▲';\n }\n return '';\n };\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setTabIndex(newValue);\n };\n\n return (\n <InfoCard title=\"InfraWallet\">\n <Tabs value={tabIndex} onChange={handleTabChange} aria-label=\"Cost Tabs\">\n <Tab label=\"Total Cost\" />\n <Tab label=\"Service Breakdown\" />\n </Tabs>\n\n {/* total cost tab */}\n {tabIndex === 0 && (\n <Box p={2}>\n <Box display=\"flex\" alignItems=\"center\">\n {previousTotalCost > 0 && (\n <Box className={getChangeClass(percentageChange)} mr={1}>\n {mark} {percentageChangeFormatted}%\n </Box>\n )}\n <Typography variant=\"h6\" className={classes.bold}>\n Current Month: ${totalCost.toFixed(2)}\n </Typography>\n </Box>\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"period\" />\n <YAxis />\n <Tooltip />\n <Legend />\n {projects.map((project, index) => (\n <Line\n key={project}\n type=\"monotone\"\n dataKey={project}\n stroke={COLORS[index % COLORS.length]}\n activeDot={{ r: 8 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </Box>\n )}\n\n {/* per-service cost tab */}\n {tabIndex === 1 && (\n <Box p={2}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell className={classes.bold}>Service</TableCell>\n <TableCell align=\"right\" className={classes.bold}>\n Monthly Cost\n </TableCell>\n <TableCell align=\"right\" className={classes.bold}>\n Monthly Change\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {serviceRows.map(row => {\n const serviceChangeClass = getChangeClass(row.change);\n const serviceMark = getChangeMark(row.change);\n const changeFormatted = Math.abs(row.change).toFixed(2);\n return (\n <TableRow key={row.service}>\n <TableCell component=\"th\" scope=\"row\">\n {row.service}\n </TableCell>\n <TableCell align=\"right\">${row.cost.toFixed(2)}</TableCell>\n <TableCell align=\"right\">\n <Box className={serviceChangeClass} display=\"inline\">\n {serviceMark} {changeFormatted}%\n </Box>\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </Box>\n )}\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityInfraWalletCard.esm.js","sources":["../../../src/components/EntityInfraWalletCard/EntityInfraWalletCard.tsx"],"sourcesContent":["import { InfoCard, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Alert from '@mui/material/Alert';\nimport Box from '@mui/material/Box';\nimport Tab from '@mui/material/Tab';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport Tabs from '@mui/material/Tabs';\nimport Typography from '@mui/material/Typography';\nimport React, { useEffect, useState } from 'react';\nimport { CartesianGrid, Legend, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis } from 'recharts';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { Report, Tag } from '../../api/types';\n\nconst COLORS = [\n '#8884d8',\n '#82ca9d',\n '#ffc658',\n '#ff7300',\n '#413ea0',\n '#ff0000',\n '#00ff00',\n '#0000ff',\n '#ff00ff',\n '#00ffff',\n];\n\nexport const EntityInfraWalletCard = () => {\n const { entity } = useEntity();\n const infrawalletApi = useApi(infraWalletApiRef);\n\n const [costData, setCostData] = useState<Report[] | null>(null);\n const [loading, setLoading] = useState<boolean>(true);\n const [error, setError] = useState<string | null>(null);\n const [tabIndex, setTabIndex] = useState<number>(0);\n\n useEffect(() => {\n const fetchCostData = async () => {\n setLoading(true);\n setError(null);\n try {\n const annotations = entity.metadata.annotations || {};\n\n const annotationKeys = [\n 'infrawallet.io/project',\n 'infrawallet.io/account',\n 'infrawallet.io/service',\n 'infrawallet.io/category',\n 'infrawallet.io/provider',\n ];\n\n const filtersObj: Record<string, string[]> = {};\n\n annotationKeys.forEach(key => {\n if (annotations[key]) {\n const shortKey = key.replace('infrawallet.io/', '');\n const values = annotations[key]\n .split(',')\n .map((v: string) => v.trim())\n .filter((v: string) => v.length > 0);\n filtersObj[shortKey] = values;\n }\n });\n\n if (annotations['infrawallet.io/extra-filters']) {\n const extraFilters = annotations['infrawallet.io/extra-filters'];\n // assuming extra-filters are in the format \"key1: value1, key2: value2\"\n extraFilters.split(',').forEach(pair => {\n const [key, value] = pair.split(':').map(s => s.trim());\n if (key && value) {\n const values = value\n .split('|')\n .map((v: string) => v.trim())\n .filter((v: string) => v.length > 0);\n filtersObj[key] = values;\n }\n });\n }\n\n // build filters string for API call (include all filters)\n const filtersArray = Object.entries(filtersObj).map(([key, values]) => {\n if (values.length === 1) {\n return `${key}:${values[0]}`;\n }\n const valuesString = values.join('|');\n return `${key}:(${valuesString})`;\n });\n const filters = `(${filtersArray.join(',')})`;\n\n const tags: Tag[] = [];\n const groups = '';\n const granularity = 'monthly';\n\n const endTime = new Date();\n const startTime = new Date();\n startTime.setMonth(endTime.getMonth() - 2);\n\n const costReportsResponse = await infrawalletApi.getCostReports(\n filters,\n tags,\n groups,\n granularity,\n startTime,\n endTime,\n );\n\n if (costReportsResponse.status !== 200) {\n throw new Error('Failed to fetch cost reports');\n }\n\n setCostData(costReportsResponse.data || null);\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Unknown error occurred');\n } finally {\n setLoading(false);\n }\n };\n\n fetchCostData();\n }, [entity, infrawalletApi]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <Alert severity=\"error\">{error}</Alert>;\n }\n\n if (!costData || costData.length === 0) {\n return <Alert severity=\"info\">No cost data available for this entity.</Alert>;\n }\n\n // prepare periods\n const periods = new Set<string>();\n costData.forEach(report => {\n Object.keys(report.reports).forEach(period => periods.add(period));\n });\n\n const sortedPeriods = Array.from(periods).sort();\n\n // calculate total cost for each period\n const totalCostsByPeriod = sortedPeriods.map(period => {\n const total = costData.reduce((sum, report) => {\n return sum + (report.reports[period] || 0);\n }, 0);\n return { period, total };\n });\n\n // calculate total cost for current and previous months\n const currentPeriod = sortedPeriods[sortedPeriods.length - 1];\n const previousPeriod = sortedPeriods.length > 1 ? sortedPeriods[sortedPeriods.length - 2] : null;\n\n const totalCost = totalCostsByPeriod.find(item => item.period === currentPeriod)?.total || 0;\n const previousTotalCost = previousPeriod\n ? totalCostsByPeriod.find(item => item.period === previousPeriod)?.total || 0\n : 0;\n\n // calculate percentage change\n const percentageChange = previousTotalCost !== 0 ? ((totalCost - previousTotalCost) / previousTotalCost) * 100 : 0;\n const percentageChangeFormatted = Math.abs(percentageChange).toFixed(2);\n\n let color = '#0052cc';\n let backgroundColor = '#e9f2ff';\n let mark = '';\n if (percentageChange < 0) {\n color = '#216e4e';\n backgroundColor = '#dcfff1';\n mark = '▼';\n } else if (percentageChange > 0) {\n color = '#ae2e24';\n backgroundColor = '#ffeceb';\n mark = '▲';\n }\n\n // 1. extract unique project IDs\n const projects = Array.from(\n new Set(\n costData\n .map(report => {\n const project = report.project as string | undefined;\n return typeof project === 'string' ? project : undefined;\n })\n .filter((project): project is string => !!project),\n ),\n );\n\n if (projects.length === 0) {\n return <Alert severity=\"warning\">No project data available to display in the chart.</Alert>;\n }\n\n // 2. build chart data with per-project costs\n const chartData = sortedPeriods.map(period => {\n const dataPoint: Record<string, any> = { period };\n projects.forEach(project => {\n const projectReports = costData.filter(report => report.project === project);\n const total = projectReports.reduce((sum, report) => {\n return sum + (report.reports[period] || 0);\n }, 0);\n dataPoint[project] = total;\n });\n return dataPoint;\n });\n\n // 3. calculate per-service costs for current period\n const perServiceCosts = costData.reduce(\n (acc, report) => {\n const service = report.service as string | undefined;\n const cost = report.reports[currentPeriod] || 0;\n if (typeof service === 'string') {\n if (!acc[service]) {\n acc[service] = 0;\n }\n acc[service] += cost;\n }\n return acc;\n },\n {} as Record<string, number>,\n );\n\n // 4. calculate per-service costs for previous period\n const prevPerServiceCosts = previousPeriod\n ? costData.reduce(\n (acc, report) => {\n const service = report.service as string | undefined;\n const cost = report.reports[previousPeriod] || 0;\n if (typeof service === 'string') {\n if (!acc[service]) {\n acc[service] = 0;\n }\n acc[service] += cost;\n }\n return acc;\n },\n {} as Record<string, number>,\n )\n : {};\n\n // 5. prepare data for per-service table\n const serviceRows = Object.entries(perServiceCosts).map(([service, cost]) => {\n const prevCost = prevPerServiceCosts[service] || 0;\n const change = prevCost !== 0 ? ((cost - prevCost) / prevCost) * 100 : 0;\n return {\n service,\n cost,\n change,\n };\n });\n\n const handleTabChange = (_event: React.ChangeEvent<{}>, newValue: number) => {\n setTabIndex(newValue);\n };\n\n return (\n <InfoCard title=\"InfraWallet\">\n <Tabs value={tabIndex} onChange={handleTabChange} aria-label=\"Cost Tabs\">\n <Tab label=\"Total Cost\" />\n <Tab label=\"Service Breakdown\" />\n </Tabs>\n\n {/* total cost tab */}\n {tabIndex === 0 && (\n <Box p={2}>\n <Box display=\"flex\" alignItems=\"center\">\n {previousTotalCost > 0 && (\n <Box\n sx={{\n fontSize: '0.82em',\n paddingInline: '2px',\n borderRadius: '4px',\n color: color,\n backgroundColor: backgroundColor,\n }}\n mr={1}\n >\n {mark} {percentageChangeFormatted}%\n </Box>\n )}\n <Typography variant=\"h6\" sx={{ fontWeight: 'bold' }}>\n Current Month: ${totalCost.toFixed(2)}\n </Typography>\n </Box>\n <ResponsiveContainer width=\"100%\" height={300}>\n <LineChart data={chartData}>\n <CartesianGrid strokeDasharray=\"3 3\" />\n <XAxis dataKey=\"period\" />\n <YAxis />\n <Tooltip />\n <Legend />\n {projects.map((project, index) => (\n <Line\n key={project}\n type=\"monotone\"\n dataKey={project}\n stroke={COLORS[index % COLORS.length]}\n activeDot={{ r: 8 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </Box>\n )}\n\n {/* per-service cost tab */}\n {tabIndex === 1 && (\n <Box p={2}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell sx={{ fontWeight: 'bold' }}>Service</TableCell>\n <TableCell align=\"right\" sx={{ fontWeight: 'bold' }}>\n Monthly Cost\n </TableCell>\n <TableCell align=\"right\" sx={{ fontWeight: 'bold' }}>\n Monthly Change\n </TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {serviceRows.map(row => {\n let serviceColor = '#0052cc';\n let serviceBackgroundColor = '#e9f2ff';\n let serviceMark = '';\n if (row.change < 0) {\n serviceColor = '#216e4e';\n serviceBackgroundColor = '#dcfff1';\n serviceMark = '▼';\n } else if (row.change > 0) {\n serviceColor = '#ae2e24';\n serviceBackgroundColor = '#ffeceb';\n serviceMark = '▲';\n }\n\n const changeFormatted = Math.abs(row.change).toFixed(2);\n return (\n <TableRow key={row.service}>\n <TableCell component=\"th\" scope=\"row\">\n {row.service}\n </TableCell>\n <TableCell align=\"right\">${row.cost.toFixed(2)}</TableCell>\n <TableCell align=\"right\">\n <Box\n sx={{\n fontSize: '0.82em',\n paddingInline: '2px',\n borderRadius: '4px',\n color: serviceColor,\n backgroundColor: serviceBackgroundColor,\n }}\n display=\"inline\"\n >\n {serviceMark} {changeFormatted}%\n </Box>\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n </Box>\n )}\n </InfoCard>\n );\n};\n"],"names":["React"],"mappings":"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"}
@@ -1,25 +1,25 @@
1
- import Collapse from '@material-ui/core/Collapse';
2
- import IconButton from '@material-ui/core/IconButton';
3
- import Paper from '@material-ui/core/Paper';
4
- import Table from '@material-ui/core/Table';
5
- import TableBody from '@material-ui/core/TableBody';
6
- import TableCell from '@material-ui/core/TableCell';
7
- import TableContainer from '@material-ui/core/TableContainer';
8
- import TableHead from '@material-ui/core/TableHead';
9
- import TableRow from '@material-ui/core/TableRow';
10
1
  import CloseIcon from '@mui/icons-material/Close';
11
2
  import Alert from '@mui/material/Alert';
12
3
  import AlertTitle from '@mui/material/AlertTitle';
13
- import React from 'react';
4
+ import Collapse from '@mui/material/Collapse';
5
+ import IconButton from '@mui/material/IconButton';
6
+ import Paper from '@mui/material/Paper';
7
+ import Table from '@mui/material/Table';
8
+ import TableBody from '@mui/material/TableBody';
9
+ import TableCell from '@mui/material/TableCell';
10
+ import TableContainer from '@mui/material/TableContainer';
11
+ import TableHead from '@mui/material/TableHead';
12
+ import TableRow from '@mui/material/TableRow';
13
+ import React__default from 'react';
14
14
 
15
15
  const ErrorsAlertComponent = ({ errors }) => {
16
- const [open, setOpen] = React.useState(true);
17
- return /* @__PURE__ */ React.createElement(Collapse, { in: open }, /* @__PURE__ */ React.createElement(
16
+ const [open, setOpen] = React__default.useState(true);
17
+ return /* @__PURE__ */ React__default.createElement(Collapse, { in: open }, /* @__PURE__ */ React__default.createElement(
18
18
  Alert,
19
19
  {
20
20
  severity: "warning",
21
21
  style: { maxHeight: "300px", overflow: "auto" },
22
- action: /* @__PURE__ */ React.createElement(
22
+ action: /* @__PURE__ */ React__default.createElement(
23
23
  IconButton,
24
24
  {
25
25
  "aria-label": "close",
@@ -29,11 +29,11 @@ const ErrorsAlertComponent = ({ errors }) => {
29
29
  setOpen(false);
30
30
  }
31
31
  },
32
- /* @__PURE__ */ React.createElement(CloseIcon, { fontSize: "inherit" })
32
+ /* @__PURE__ */ React__default.createElement(CloseIcon, { fontSize: "inherit" })
33
33
  )
34
34
  },
35
- /* @__PURE__ */ React.createElement(AlertTitle, null, "InfraWallet failed to fetch data from some accounts. Here is the list of errors."),
36
- /* @__PURE__ */ React.createElement(TableContainer, { component: Paper }, /* @__PURE__ */ React.createElement(Table, { "aria-label": "errors table" }, /* @__PURE__ */ React.createElement(TableHead, null, /* @__PURE__ */ React.createElement(TableRow, null, /* @__PURE__ */ React.createElement(TableCell, { style: { minWidth: "150px" } }, "Account/Integration"), /* @__PURE__ */ React.createElement(TableCell, null, "Error Message"))), /* @__PURE__ */ React.createElement(TableBody, null, errors.map((row) => /* @__PURE__ */ React.createElement(TableRow, { key: row.name }, /* @__PURE__ */ React.createElement(TableCell, null, row.name), /* @__PURE__ */ React.createElement(TableCell, null, row.error))))))
35
+ /* @__PURE__ */ React__default.createElement(AlertTitle, null, "InfraWallet failed to fetch data from some accounts. Here is the list of errors."),
36
+ /* @__PURE__ */ React__default.createElement(TableContainer, { component: Paper }, /* @__PURE__ */ React__default.createElement(Table, { "aria-label": "errors table" }, /* @__PURE__ */ React__default.createElement(TableHead, null, /* @__PURE__ */ React__default.createElement(TableRow, null, /* @__PURE__ */ React__default.createElement(TableCell, { style: { minWidth: "150px" } }, "Account/Integration"), /* @__PURE__ */ React__default.createElement(TableCell, null, "Error Message"))), /* @__PURE__ */ React__default.createElement(TableBody, null, errors.map((row) => /* @__PURE__ */ React__default.createElement(TableRow, { key: row.name }, /* @__PURE__ */ React__default.createElement(TableCell, null, row.name), /* @__PURE__ */ React__default.createElement(TableCell, null, row.error))))))
37
37
  ));
38
38
  };
39
39
 
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorsAlertComponent.esm.js","sources":["../../../src/components/ErrorsAlertComponent/ErrorsAlertComponent.tsx"],"sourcesContent":["import Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport React, { FC } from 'react';\nimport { CloudProviderError } from '../../api/types';\n\nexport const ErrorsAlertComponent: FC<{ errors: CloudProviderError[] }> = ({ errors }) => {\n const [open, setOpen] = React.useState(true);\n\n return (\n <Collapse in={open}>\n <Alert\n severity=\"warning\"\n style={{ maxHeight: '300px', overflow: 'auto' }}\n action={\n <IconButton\n aria-label=\"close\"\n color=\"inherit\"\n size=\"small\"\n onClick={() => {\n setOpen(false);\n }}\n >\n <CloseIcon fontSize=\"inherit\" />\n </IconButton>\n }\n >\n <AlertTitle>InfraWallet failed to fetch data from some accounts. Here is the list of errors.</AlertTitle>\n <TableContainer component={Paper}>\n <Table aria-label=\"errors table\">\n <TableHead>\n <TableRow>\n <TableCell style={{ minWidth: '150px' }}>Account/Integration</TableCell>\n <TableCell>Error Message</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {errors.map(row => (\n <TableRow key={row.name}>\n <TableCell>{row.name}</TableCell>\n <TableCell>{row.error}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </Alert>\n </Collapse>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAeO,MAAM,oBAA6D,GAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AACxF,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;AAE3C,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,EAAA,EAAI,IACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,SAAA;AAAA,MACT,KAAO,EAAA,EAAE,SAAW,EAAA,OAAA,EAAS,UAAU,MAAO,EAAA;AAAA,MAC9C,MACE,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,OAAA;AAAA,UACX,KAAM,EAAA,SAAA;AAAA,UACN,IAAK,EAAA,OAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,WACf;AAAA,SAAA;AAAA,wBAEA,KAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,CAAA;AAAA,OAChC;AAAA,KAAA;AAAA,oBAGF,KAAA,CAAA,aAAA,CAAC,kBAAW,kFAAgF,CAAA;AAAA,oBAC5F,KAAA,CAAA,aAAA,CAAC,kBAAe,SAAW,EAAA,KAAA,EAAA,sCACxB,KAAM,EAAA,EAAA,YAAA,EAAW,cAChB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,SACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,gCACE,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,KAAO,EAAA,EAAE,QAAU,EAAA,OAAA,MAAW,qBAAmB,CAAA,kBAC3D,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,EAAU,eAAa,CAC1B,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,iBACE,MAAO,CAAA,GAAA,CAAI,yBACT,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,GAAK,EAAA,GAAA,CAAI,IACjB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAW,GAAI,CAAA,IAAK,CACrB,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAW,EAAA,IAAA,EAAA,GAAA,CAAI,KAAM,CACxB,CACD,CACH,CACF,CACF,CAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ErrorsAlertComponent.esm.js","sources":["../../../src/components/ErrorsAlertComponent/ErrorsAlertComponent.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport Alert from '@mui/material/Alert';\nimport AlertTitle from '@mui/material/AlertTitle';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport Paper from '@mui/material/Paper';\nimport Table from '@mui/material/Table';\nimport TableBody from '@mui/material/TableBody';\nimport TableCell from '@mui/material/TableCell';\nimport TableContainer from '@mui/material/TableContainer';\nimport TableHead from '@mui/material/TableHead';\nimport TableRow from '@mui/material/TableRow';\nimport React, { FC } from 'react';\nimport { CloudProviderError } from '../../api/types';\n\nexport const ErrorsAlertComponent: FC<{ errors: CloudProviderError[] }> = ({ errors }) => {\n const [open, setOpen] = React.useState(true);\n\n return (\n <Collapse in={open}>\n <Alert\n severity=\"warning\"\n style={{ maxHeight: '300px', overflow: 'auto' }}\n action={\n <IconButton\n aria-label=\"close\"\n color=\"inherit\"\n size=\"small\"\n onClick={() => {\n setOpen(false);\n }}\n >\n <CloseIcon fontSize=\"inherit\" />\n </IconButton>\n }\n >\n <AlertTitle>InfraWallet failed to fetch data from some accounts. Here is the list of errors.</AlertTitle>\n <TableContainer component={Paper}>\n <Table aria-label=\"errors table\">\n <TableHead>\n <TableRow>\n <TableCell style={{ minWidth: '150px' }}>Account/Integration</TableCell>\n <TableCell>Error Message</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {errors.map(row => (\n <TableRow key={row.name}>\n <TableCell>{row.name}</TableCell>\n <TableCell>{row.error}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </Alert>\n </Collapse>\n );\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;AAeO,MAAM,oBAA6D,GAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AACxF,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAAS,IAAI,CAAA,CAAA;AAE3C,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,EAAA,EAAI,IACZ,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,SAAA;AAAA,MACT,KAAO,EAAA,EAAE,SAAW,EAAA,OAAA,EAAS,UAAU,MAAO,EAAA;AAAA,MAC9C,MACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,OAAA;AAAA,UACX,KAAM,EAAA,SAAA;AAAA,UACN,IAAK,EAAA,OAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,WACf;AAAA,SAAA;AAAA,wBAEAA,cAAA,CAAA,aAAA,CAAC,SAAU,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,CAAA;AAAA,OAChC;AAAA,KAAA;AAAA,oBAGFA,cAAA,CAAA,aAAA,CAAC,kBAAW,kFAAgF,CAAA;AAAA,oBAC5FA,cAAA,CAAA,aAAA,CAAC,kBAAe,SAAW,EAAA,KAAA,EAAA,+CACxB,KAAM,EAAA,EAAA,YAAA,EAAW,cAChB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,SACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,gCACEA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,KAAO,EAAA,EAAE,QAAU,EAAA,OAAA,MAAW,qBAAmB,CAAA,kBAC3DA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,EAAU,eAAa,CAC1B,CACF,CACA,kBAAAA,cAAA,CAAA,aAAA,CAAC,iBACE,MAAO,CAAA,GAAA,CAAI,yBACTA,cAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,GAAK,EAAA,GAAA,CAAI,IACjB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,iBAAW,GAAI,CAAA,IAAK,CACrB,kBAAAA,cAAA,CAAA,aAAA,CAAC,SAAW,EAAA,IAAA,EAAA,GAAA,CAAI,KAAM,CACxB,CACD,CACH,CACF,CACF,CAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}