@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.
- package/dist/api/InfraWalletApi.esm.js.map +1 -1
- package/dist/api/InfraWalletApiClient.esm.js +35 -13
- package/dist/api/InfraWalletApiClient.esm.js.map +1 -1
- package/dist/api/functions.esm.js +5 -4
- package/dist/api/functions.esm.js.map +1 -1
- package/dist/components/Budgets/Budgets.esm.js +184 -0
- package/dist/components/Budgets/Budgets.esm.js.map +1 -0
- package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js +32 -23
- package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js.map +1 -1
- package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js +41 -42
- package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js.map +1 -1
- package/dist/components/CustomCostsComponent/BulkInsertButton.esm.js +195 -0
- package/dist/components/CustomCostsComponent/BulkInsertButton.esm.js.map +1 -0
- package/dist/components/CustomCostsComponent/CustomCostsComponent.esm.js +369 -0
- package/dist/components/CustomCostsComponent/CustomCostsComponent.esm.js.map +1 -0
- package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js +95 -87
- package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js.map +1 -1
- package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js +16 -16
- package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js.map +1 -1
- package/dist/components/FiltersComponent/FiltersComponent.esm.js +72 -66
- package/dist/components/FiltersComponent/FiltersComponent.esm.js.map +1 -1
- package/dist/components/InfraWalletIcon.esm.js +10 -10
- package/dist/components/InfraWalletIcon.esm.js.map +1 -1
- package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js +15 -17
- package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js.map +1 -1
- package/dist/components/PieChartComponent/PieChartComponent.esm.js +5 -5
- package/dist/components/PieChartComponent/PieChartComponent.esm.js.map +1 -1
- package/dist/components/ProviderIcons/ProviderIcons.esm.js +62 -63
- package/dist/components/ProviderIcons/ProviderIcons.esm.js.map +1 -1
- package/dist/components/ReportsComponent/ReportsComponent.esm.js +37 -26
- package/dist/components/ReportsComponent/ReportsComponent.esm.js.map +1 -1
- package/dist/components/Router.esm.js +2 -3
- package/dist/components/Router.esm.js.map +1 -1
- package/dist/components/SettingsComponent/SettingsComponent.esm.js +4 -7
- package/dist/components/SettingsComponent/SettingsComponent.esm.js.map +1 -1
- package/dist/components/TopbarComponent/TopbarComponent.esm.js +16 -17
- package/dist/components/TopbarComponent/TopbarComponent.esm.js.map +1 -1
- package/dist/components/index.esm.js +22 -26
- package/dist/components/index.esm.js.map +1 -1
- 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
|
|
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__ */
|
|
103
|
+
return /* @__PURE__ */ React__default.createElement(Progress, null);
|
|
132
104
|
}
|
|
133
105
|
if (error) {
|
|
134
|
-
return /* @__PURE__ */
|
|
106
|
+
return /* @__PURE__ */ React__default.createElement(Alert, { severity: "error" }, error);
|
|
135
107
|
}
|
|
136
108
|
if (!costData || costData.length === 0) {
|
|
137
|
-
return /* @__PURE__ */
|
|
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 =
|
|
153
|
-
const previousTotalCost = previousPeriod ?
|
|
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__ */
|
|
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(
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (
|
|
189
|
-
acc[service]
|
|
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
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
const prevPerServiceCosts = previousPeriod ? costData.reduce(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
if (
|
|
200
|
-
acc[service]
|
|
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
|
|
203
|
-
}
|
|
204
|
-
|
|
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__ */
|
|
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__ */
|
|
246
|
-
|
|
247
|
-
|
|
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__ */
|
|
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
|
|
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] =
|
|
17
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
32
|
+
/* @__PURE__ */ React__default.createElement(CloseIcon, { fontSize: "inherit" })
|
|
33
33
|
)
|
|
34
34
|
},
|
|
35
|
-
/* @__PURE__ */
|
|
36
|
-
/* @__PURE__ */
|
|
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
|
|
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;;;;"}
|