@electrolux-oss/plugin-infrawallet 0.1.11 → 0.1.12

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 (36) hide show
  1. package/dist/api/InfraWalletApiClient.esm.js +4 -2
  2. package/dist/api/InfraWalletApiClient.esm.js.map +1 -1
  3. package/dist/api/functions.esm.js +15 -3
  4. package/dist/api/functions.esm.js.map +1 -1
  5. package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js +142 -173
  6. package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js.map +1 -1
  7. package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js +147 -91
  8. package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js.map +1 -1
  9. package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js +254 -0
  10. package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js.map +1 -0
  11. package/dist/components/EntityInfraWalletCard/index.esm.js +2 -0
  12. package/dist/components/EntityInfraWalletCard/index.esm.js.map +1 -0
  13. package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js +4 -4
  14. package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js.map +1 -1
  15. package/dist/components/FiltersComponent/FiltersComponent.esm.js +27 -27
  16. package/dist/components/FiltersComponent/FiltersComponent.esm.js.map +1 -1
  17. package/dist/components/InfraWalletAppData.esm.js +9 -0
  18. package/dist/components/InfraWalletAppData.esm.js.map +1 -0
  19. package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js +22 -10
  20. package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js.map +1 -1
  21. package/dist/components/PieChartComponent/PieChartComponent.esm.js +63 -59
  22. package/dist/components/PieChartComponent/PieChartComponent.esm.js.map +1 -1
  23. package/dist/components/ProviderIcons/ProviderIcons.esm.js +8 -8
  24. package/dist/components/ProviderIcons/ProviderIcons.esm.js.map +1 -1
  25. package/dist/components/ReportsComponent/ReportsComponent.esm.js +24 -20
  26. package/dist/components/ReportsComponent/ReportsComponent.esm.js.map +1 -1
  27. package/dist/components/SettingsComponent/SettingsComponent.esm.js +4 -4
  28. package/dist/components/SettingsComponent/SettingsComponent.esm.js.map +1 -1
  29. package/dist/components/index.esm.js +36 -0
  30. package/dist/components/index.esm.js.map +1 -0
  31. package/dist/index.d.ts +5 -1
  32. package/dist/index.esm.js +2 -1
  33. package/dist/index.esm.js.map +1 -1
  34. package/dist/plugin.esm.js +10 -2
  35. package/dist/plugin.esm.js.map +1 -1
  36. package/package.json +9 -11
@@ -0,0 +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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"}
@@ -0,0 +1,2 @@
1
+ export { EntityInfraWalletCard } from './EntityInfraWalletCard.esm.js';
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -7,9 +7,9 @@ import TableCell from '@material-ui/core/TableCell';
7
7
  import TableContainer from '@material-ui/core/TableContainer';
8
8
  import TableHead from '@material-ui/core/TableHead';
9
9
  import TableRow from '@material-ui/core/TableRow';
10
- import CancelIcon from '@material-ui/icons/Close';
11
- import Alert from '@material-ui/lab/Alert';
12
- import AlertTitle from '@material-ui/lab/AlertTitle';
10
+ import CloseIcon from '@mui/icons-material/Close';
11
+ import Alert from '@mui/material/Alert';
12
+ import AlertTitle from '@mui/material/AlertTitle';
13
13
  import React from 'react';
14
14
 
15
15
  const ErrorsAlertComponent = ({ errors }) => {
@@ -29,7 +29,7 @@ const ErrorsAlertComponent = ({ errors }) => {
29
29
  setOpen(false);
30
30
  }
31
31
  },
32
- /* @__PURE__ */ React.createElement(CancelIcon, { fontSize: "inherit" })
32
+ /* @__PURE__ */ React.createElement(CloseIcon, { fontSize: "inherit" })
33
33
  )
34
34
  },
35
35
  /* @__PURE__ */ React.createElement(AlertTitle, null, "InfraWallet failed to fetch data from some accounts. Here is the list of errors."),
@@ -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 '@material-ui/icons/Close';\nimport Alert from '@material-ui/lab/Alert';\nimport AlertTitle from '@material-ui/lab/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":["CloseIcon"],"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,CAACA,UAAU,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 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,15 +1,16 @@
1
- import { Tooltip, Grid, FormControl, Typography, Divider, CircularProgress, Chip } from '@material-ui/core';
1
+ import { useApi, alertApiRef } from '@backstage/core-plugin-api';
2
+ import { Tooltip, Grid, FormControl, Typography, Divider, CircularProgress } from '@material-ui/core';
2
3
  import Button from '@material-ui/core/Button';
3
4
  import Checkbox from '@material-ui/core/Checkbox';
4
5
  import TextField from '@material-ui/core/TextField';
5
6
  import { makeStyles, withStyles } from '@material-ui/core/styles';
6
- import CheckBoxIcon from '@material-ui/icons/CheckBox';
7
- import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
8
- import Autocomplete from '@material-ui/lab/Autocomplete';
7
+ import CheckBoxIcon from '@mui/icons-material/CheckBox';
8
+ import CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank';
9
+ import Autocomplete from '@mui/material/Autocomplete';
10
+ import Chip from '@mui/material/Chip';
9
11
  import React, { useState, useEffect } from 'react';
10
- import { getReportKeyAndValues, extractProvider, extractAccountInfo, tagExists } from '../../api/functions.esm.js';
11
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
12
12
  import { infraWalletApiRef } from '../../api/InfraWalletApi.esm.js';
13
+ import { getReportKeyAndValues, extractProvider, extractAccountInfo, tagExists } from '../../api/functions.esm.js';
13
14
  import { getProviderIcon } from '../ProviderIcons/ProviderIcons.esm.js';
14
15
 
15
16
  const useStyles = makeStyles((theme) => ({
@@ -43,14 +44,14 @@ const FiltersComponent = ({
43
44
  const [tagProviders, _setTagProviders] = useState(["AWS", "Azure"]);
44
45
  const [tagProvider, setTagProvider] = useState();
45
46
  const [openTagKey, setOpenTagKey] = useState(false);
46
- const [tagKeys, setTagKeys] = useState([]);
47
- const [selectedTagKey, setSelectedTagKey] = useState(null);
47
+ const [tagKeys, setTagKeys] = useState(void 0);
48
+ const [selectedTagKey, setSelectedTagKey] = useState(void 0);
48
49
  const [resetTagKeys, setResetTagKeys] = useState(false);
49
- const loadingTagKeys = openTagKey && tagKeys.length === 0;
50
+ const loadingTagKeys = openTagKey && tagKeys === void 0;
50
51
  const [openTagValue, setOpenTagValue] = useState(false);
51
- const [tagValues, setTagValues] = useState([]);
52
+ const [tagValues, setTagValues] = useState(void 0);
52
53
  const [resetTagValues, setResetTagValues] = useState(false);
53
- const loadingTagValues = openTagValue && tagValues.length === 0;
54
+ const loadingTagValues = openTagValue && tagValues === void 0;
54
55
  const [selectedTags, setSelectedTags] = useState([]);
55
56
  const infraWalletApi = useApi(infraWalletApiRef);
56
57
  const alertApi = useApi(alertApiRef);
@@ -61,8 +62,8 @@ const FiltersComponent = ({
61
62
  setTagProvider("");
62
63
  setOpenTagKey(false);
63
64
  setResetTagKeys((prev) => !prev);
64
- setTagKeys([]);
65
- setSelectedTagKey(null);
65
+ setTagKeys(void 0);
66
+ setSelectedTagKey(void 0);
66
67
  setOpenTagValue(false);
67
68
  setTagValues([]);
68
69
  if (provider) {
@@ -71,8 +72,8 @@ const FiltersComponent = ({
71
72
  }
72
73
  };
73
74
  const handleTagKeyChange = (tagKey) => {
74
- setSelectedTagKey(null);
75
- setTagValues([]);
75
+ setSelectedTagKey(void 0);
76
+ setTagValues(void 0);
76
77
  setResetTagValues((prev) => !prev);
77
78
  if (typeof tagKey === "string") {
78
79
  return;
@@ -105,7 +106,7 @@ const FiltersComponent = ({
105
106
  (async () => {
106
107
  if (tagProvider) {
107
108
  await infraWalletApi.getTagKeys(tagProvider, monthRange.startMonth, monthRange.endMonth).then((response) => {
108
- if (response.data && response.data.length > 0) {
109
+ if (response.data) {
109
110
  setTagKeys(response.data);
110
111
  }
111
112
  if (response.status === 207 && response.errors) {
@@ -122,7 +123,7 @@ const FiltersComponent = ({
122
123
  (async () => {
123
124
  if (selectedTagKey) {
124
125
  await infraWalletApi.getTagValues(selectedTagKey, monthRange.startMonth, monthRange.endMonth).then((response) => {
125
- if (response.data && response.data.length > 0) {
126
+ if (response.data) {
126
127
  setTagValues(response.data);
127
128
  }
128
129
  if (response.status === 207 && response.errors) {
@@ -141,7 +142,7 @@ const FiltersComponent = ({
141
142
  value: filters[key] || [],
142
143
  onChange: (_event, value, _reason) => handleFiltersChange(key, value),
143
144
  disableCloseOnSelect: true,
144
- renderOption: (option, { selected }) => {
145
+ renderOption: (props, option, { selected }) => {
145
146
  let provider = void 0;
146
147
  let providerIcon = void 0;
147
148
  let accountName = void 0;
@@ -158,7 +159,7 @@ const FiltersComponent = ({
158
159
  accountName = account.accountName;
159
160
  accountId = account.accountId;
160
161
  }
161
- return /* @__PURE__ */ React.createElement(React.Fragment, { key: `option-${option}` }, /* @__PURE__ */ React.createElement(Checkbox, { icon, checkedIcon, style: { marginRight: 8 }, checked: selected }), providerIcon && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, null, providerIcon), "\xA0\xA0"), key === "account" ? /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, accountName), /* @__PURE__ */ React.createElement(Typography, { variant: "caption", color: "textSecondary" }, accountId)) : /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.replace(`${provider}/`, "")));
162
+ return /* @__PURE__ */ React.createElement("li", { ...props, key: option }, /* @__PURE__ */ React.createElement(Checkbox, { icon, checkedIcon, style: { marginRight: 8 }, checked: selected }), providerIcon && /* @__PURE__ */ React.createElement(React.Fragment, null, providerIcon, "\xA0\xA0"), key === "account" ? /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, accountName), /* @__PURE__ */ React.createElement(Typography, { variant: "caption", color: "textSecondary" }, accountId)) : /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.replace(`${provider}/`, "")));
162
163
  },
163
164
  renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, { ...params, variant: "standard", label: key.charAt(0).toUpperCase() + key.slice(1) })
164
165
  }
@@ -169,20 +170,20 @@ const FiltersComponent = ({
169
170
  options: tagProviders,
170
171
  onChange: (_, provider) => handleTagProviderChange(provider),
171
172
  renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, { ...params, variant: "standard", label: "Tag provider" }),
172
- renderOption: (option) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option))
173
+ renderOption: (props, option) => /* @__PURE__ */ React.createElement("li", { ...props, key: option }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option))
173
174
  }
174
175
  )), /* @__PURE__ */ React.createElement(FormControl, { className: classes.formControl }, /* @__PURE__ */ React.createElement(
175
176
  Autocomplete,
176
177
  {
177
178
  id: "tag-keys",
178
179
  key: String(resetTagKeys),
179
- freeSolo: true,
180
180
  disabled: tagProvider ? false : true,
181
181
  open: openTagKey,
182
182
  onOpen: () => setOpenTagKey(true),
183
183
  onClose: () => setOpenTagKey(false),
184
- options: tagKeys,
184
+ options: tagKeys && tagKeys.length ? tagKeys : [{ key: "No value", provider: tagProvider }],
185
185
  getOptionLabel: (tag) => tag.key,
186
+ getOptionDisabled: (tag) => tag.key === "No value",
186
187
  loading: loadingTagKeys,
187
188
  onChange: (_, tagKey) => handleTagKeyChange(tagKey),
188
189
  renderInput: (params) => /* @__PURE__ */ React.createElement(
@@ -197,21 +198,20 @@ const FiltersComponent = ({
197
198
  }
198
199
  }
199
200
  ),
200
- renderOption: (option) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.key))
201
+ renderOption: (props, option) => /* @__PURE__ */ React.createElement("li", { ...props, key: option.key }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.key))
201
202
  }
202
203
  )), /* @__PURE__ */ React.createElement(FormControl, { className: classes.formControl }, /* @__PURE__ */ React.createElement(
203
204
  Autocomplete,
204
205
  {
205
206
  id: "tag-values",
206
207
  key: String(resetTagValues),
207
- freeSolo: true,
208
208
  disabled: selectedTagKey ? false : true,
209
209
  open: openTagValue,
210
210
  onOpen: () => setOpenTagValue(true),
211
211
  onClose: () => setOpenTagValue(false),
212
- options: tagValues,
212
+ options: tagValues && tagValues.length ? tagValues : [{ key: "No value", value: "No value", provider: tagProvider }],
213
213
  getOptionLabel: (tag) => (tag == null ? void 0 : tag.value) || "",
214
- getOptionDisabled: (tag) => tagExists(selectedTags, tag),
214
+ getOptionDisabled: (tag) => (tag == null ? void 0 : tag.value) === "No value" || tagExists(selectedTags, tag),
215
215
  loading: loadingTagValues,
216
216
  onChange: (_, tag) => handleTagValueSelection(tag),
217
217
  renderInput: (params) => /* @__PURE__ */ React.createElement(
@@ -226,7 +226,7 @@ const FiltersComponent = ({
226
226
  }
227
227
  }
228
228
  ),
229
- renderOption: (option) => /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.value))
229
+ renderOption: (props, option) => /* @__PURE__ */ React.createElement("li", { ...props, key: option.value }, /* @__PURE__ */ React.createElement(Typography, { variant: "body2" }, option.value))
230
230
  }
231
231
  )), /* @__PURE__ */ React.createElement(FormControl, { style: { marginTop: 10 } }, /* @__PURE__ */ React.createElement(
232
232
  HtmlTooltip,
@@ -1 +1 @@
1
- {"version":3,"file":"FiltersComponent.esm.js","sources":["../../../src/components/FiltersComponent/FiltersComponent.tsx"],"sourcesContent":["import { Chip, CircularProgress, Divider, FormControl, Grid, Tooltip, Typography } from '@material-ui/core';\nimport Button from '@material-ui/core/Button';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport TextField from '@material-ui/core/TextField';\nimport { Theme, makeStyles, withStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport React, { FC, useEffect, useState } from 'react';\nimport { extractAccountInfo, extractProvider, getReportKeyAndValues, tagExists } from '../../api/functions';\nimport { FiltersComponentProps } from '../types';\nimport { Tag } from '../../api/types';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { getProviderIcon } from '../ProviderIcons';\n\nconst useStyles = makeStyles(theme => ({\n formControl: {\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(3),\n width: 300,\n },\n}));\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\nconst HtmlTooltip = withStyles((theme: Theme) => ({\n tooltip: {\n backgroundColor: '#f5f5f9',\n color: 'rgba(0, 0, 0, 0.87)',\n maxWidth: 400,\n fontSize: theme.typography.pxToRem(14),\n border: '1px solid #dadde9',\n },\n}))(Tooltip);\n\nexport const FiltersComponent: FC<FiltersComponentProps> = ({\n reports,\n filters,\n monthRange,\n filtersSetter,\n selectedTagsSetter,\n providerErrorsSetter,\n}) => {\n const classes = useStyles();\n const keyValues: { [key: string]: string[] } = getReportKeyAndValues(reports);\n\n // tag providers\n const [tagProviders, _setTagProviders] = useState<string[]>(['AWS', 'Azure']);\n const [tagProvider, setTagProvider] = useState<string>();\n\n // tag keys\n const [openTagKey, setOpenTagKey] = useState(false);\n const [tagKeys, setTagKeys] = useState<Tag[]>([]);\n const [selectedTagKey, setSelectedTagKey] = useState<Tag | null>(null);\n const [resetTagKeys, setResetTagKeys] = useState(false);\n const loadingTagKeys = openTagKey && tagKeys.length === 0;\n\n // tag values\n const [openTagValue, setOpenTagValue] = useState(false);\n const [tagValues, setTagValues] = useState<Tag[]>([]);\n const [resetTagValues, setResetTagValues] = useState(false);\n const loadingTagValues = openTagValue && tagValues.length === 0;\n\n // user selected tags\n const [selectedTags, setSelectedTags] = useState<Tag[]>([]);\n\n const infraWalletApi = useApi(infraWalletApiRef);\n const alertApi = useApi(alertApiRef);\n\n const handleFiltersChange = (key: string, newValue: string[]): void => {\n filtersSetter({ ...filters, [key]: newValue });\n };\n\n const handleTagProviderChange = (provider: string | null) => {\n setTagProvider('');\n setOpenTagKey(false);\n setResetTagKeys(prev => !prev);\n setTagKeys([]);\n setSelectedTagKey(null);\n setOpenTagValue(false);\n setTagValues([]);\n\n if (provider) {\n setTagProvider(provider);\n setOpenTagKey(true);\n }\n };\n\n const handleTagKeyChange = (tagKey: Tag | string | null) => {\n setSelectedTagKey(null);\n setTagValues([]);\n setResetTagValues(prev => !prev);\n\n if (typeof tagKey === 'string') {\n return;\n }\n\n if (tagKey) {\n setSelectedTagKey(tagKey);\n setOpenTagValue(true);\n }\n };\n\n const handleTagValueSelection = (tag: Tag | string | null) => {\n if (typeof tag === 'string') {\n return;\n }\n\n if (tag && !tagExists(selectedTags, tag)) {\n setResetTagValues(prev => !prev);\n setSelectedTags([...selectedTags, tag]);\n }\n };\n\n const handleDeleteTag = (tagToDelete: Tag) => () => {\n setSelectedTags(\n selectedTags.filter(\n tag =>\n !(tag.provider === tagToDelete.provider && tag.key === tagToDelete.key && tag.value === tagToDelete.value),\n ),\n );\n };\n\n useEffect(() => {\n if (!loadingTagKeys) {\n return;\n }\n\n (async () => {\n if (tagProvider) {\n await infraWalletApi\n .getTagKeys(tagProvider, monthRange.startMonth, monthRange.endMonth)\n .then(response => {\n if (response.data && response.data.length > 0) {\n setTagKeys(response.data);\n }\n if (response.status === 207 && response.errors) {\n providerErrorsSetter(response.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n })();\n }, [loadingTagKeys, tagProvider, monthRange, infraWalletApi, alertApi, providerErrorsSetter]);\n\n useEffect(() => {\n if (!loadingTagValues) {\n return;\n }\n\n (async () => {\n if (selectedTagKey) {\n await infraWalletApi\n .getTagValues(selectedTagKey, monthRange.startMonth, monthRange.endMonth)\n .then(response => {\n if (response.data && response.data.length > 0) {\n setTagValues(response.data);\n }\n if (response.status === 207 && response.errors) {\n providerErrorsSetter(response.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n })();\n }, [loadingTagValues, selectedTagKey, monthRange, infraWalletApi, alertApi, providerErrorsSetter]);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n {Object.keys(keyValues).map(key => (\n <FormControl className={classes.formControl} key={`form-${key}`}>\n <Autocomplete\n multiple\n id={`checkboxes-${key}`}\n options={keyValues[key].sort()}\n value={filters[key] || []}\n onChange={(_event, value: string[], _reason) => handleFiltersChange(key, value)}\n disableCloseOnSelect\n renderOption={(option, { selected }) => {\n let provider = undefined;\n let providerIcon = undefined;\n let accountName = undefined;\n let accountId = undefined;\n if (key === 'provider') {\n provider = option;\n providerIcon = getProviderIcon(provider);\n } else if (['account', 'service'].includes(key)) {\n provider = extractProvider(option);\n providerIcon = getProviderIcon(provider);\n }\n\n if (key === 'account') {\n const account = extractAccountInfo(option.replace(`${provider}/`, ''));\n accountName = account.accountName;\n accountId = account.accountId;\n }\n\n return (\n <React.Fragment key={`option-${option}`}>\n <Checkbox icon={icon} checkedIcon={checkedIcon} style={{ marginRight: 8 }} checked={selected} />\n {providerIcon && (\n <>\n <Typography>{providerIcon}</Typography>\n &nbsp;&nbsp;\n </>\n )}\n {key === 'account' ? (\n <div>\n <Typography variant=\"body2\">{accountName}</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {accountId}\n </Typography>\n </div>\n ) : (\n <Typography variant=\"body2\">{option.replace(`${provider}/`, '')}</Typography>\n )}\n </React.Fragment>\n );\n }}\n renderInput={params => (\n <TextField {...params} variant=\"standard\" label={key.charAt(0).toUpperCase() + key.slice(1)} />\n )}\n />\n </FormControl>\n ))}\n <FormControl style={{ marginTop: 10 }}>\n <Button variant=\"contained\" color=\"primary\" onClick={() => filtersSetter({})}>\n Clear filters\n </Button>\n </FormControl>\n </Grid>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-providers\"\n options={tagProviders}\n onChange={(_, provider) => handleTagProviderChange(provider)}\n renderInput={params => <TextField {...params} variant=\"standard\" label=\"Tag provider\" />}\n renderOption={option => (\n <React.Fragment>\n <Typography variant=\"body2\">{option}</Typography>\n </React.Fragment>\n )}\n />\n </FormControl>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-keys\"\n key={String(resetTagKeys)}\n freeSolo\n disabled={tagProvider ? false : true}\n open={openTagKey}\n onOpen={() => setOpenTagKey(true)}\n onClose={() => setOpenTagKey(false)}\n options={tagKeys}\n getOptionLabel={tag => tag.key}\n loading={loadingTagKeys}\n onChange={(_, tagKey) => handleTagKeyChange(tagKey)}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"standard\"\n label=\"Tag keys\"\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <React.Fragment>\n {loadingTagKeys ? <CircularProgress color=\"inherit\" size={20} /> : null}\n {params.InputProps && params.InputProps.endAdornment}\n </React.Fragment>\n ),\n }}\n />\n )}\n renderOption={option => (\n <React.Fragment>\n <Typography variant=\"body2\">{option.key}</Typography>\n </React.Fragment>\n )}\n />\n </FormControl>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-values\"\n key={String(resetTagValues)}\n freeSolo\n disabled={selectedTagKey ? false : true}\n open={openTagValue}\n onOpen={() => setOpenTagValue(true)}\n onClose={() => setOpenTagValue(false)}\n options={tagValues}\n getOptionLabel={tag => tag?.value || ''}\n getOptionDisabled={tag => tagExists(selectedTags, tag)}\n loading={loadingTagValues}\n onChange={(_, tag) => handleTagValueSelection(tag)}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"standard\"\n label=\"Tag values\"\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <React.Fragment>\n {loadingTagValues ? <CircularProgress color=\"inherit\" size={20} /> : null}\n {params.InputProps && params.InputProps.endAdornment}\n </React.Fragment>\n ),\n }}\n />\n )}\n renderOption={option => (\n <React.Fragment>\n <Typography variant=\"body2\">{option.value}</Typography>\n </React.Fragment>\n )}\n />\n </FormControl>\n <FormControl style={{ marginTop: 10 }}>\n <HtmlTooltip\n title={\n <React.Fragment>\n You can apply <b>tags</b> to <em>one or more</em> providers. <b>Tags</b> will only filter the costs for\n the <b>selected providers</b>, while <em>others remain unchanged</em>.\n </React.Fragment>\n }\n >\n <Button variant=\"contained\" color=\"primary\" onClick={() => selectedTagsSetter(selectedTags)}>\n Apply\n </Button>\n </HtmlTooltip>\n </FormControl>\n </Grid>\n <Grid item xs={12}>\n {selectedTags.map(tag => (\n <Chip\n size=\"small\"\n key={`${tag.provider}/${tag.key}=${tag.value}`}\n label={`${tag.provider}/${tag.key}=${tag.value}`}\n onDelete={handleDeleteTag(tag)}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FiltersComponent.esm.js","sources":["../../../src/components/FiltersComponent/FiltersComponent.tsx"],"sourcesContent":["import { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport { CircularProgress, Divider, FormControl, Grid, Tooltip, Typography } from '@material-ui/core';\nimport Button from '@material-ui/core/Button';\nimport Checkbox from '@material-ui/core/Checkbox';\nimport TextField from '@material-ui/core/TextField';\nimport { Theme, makeStyles, withStyles } from '@material-ui/core/styles';\nimport CheckBoxIcon from '@mui/icons-material/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@mui/icons-material/CheckBoxOutlineBlank';\nimport Autocomplete from '@mui/material/Autocomplete';\nimport Chip from '@mui/material/Chip';\nimport React, { FC, useEffect, useState } from 'react';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { extractAccountInfo, extractProvider, getReportKeyAndValues, tagExists } from '../../api/functions';\nimport { Tag } from '../../api/types';\nimport { getProviderIcon } from '../ProviderIcons';\nimport { FiltersComponentProps } from '../types';\n\nconst useStyles = makeStyles(theme => ({\n formControl: {\n marginLeft: theme.spacing(1),\n marginRight: theme.spacing(3),\n width: 300,\n },\n}));\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\nconst HtmlTooltip = withStyles((theme: Theme) => ({\n tooltip: {\n backgroundColor: '#f5f5f9',\n color: 'rgba(0, 0, 0, 0.87)',\n maxWidth: 400,\n fontSize: theme.typography.pxToRem(14),\n border: '1px solid #dadde9',\n },\n}))(Tooltip);\n\nexport const FiltersComponent: FC<FiltersComponentProps> = ({\n reports,\n filters,\n monthRange,\n filtersSetter,\n selectedTagsSetter,\n providerErrorsSetter,\n}) => {\n const classes = useStyles();\n const keyValues: { [key: string]: string[] } = getReportKeyAndValues(reports);\n\n // tag providers\n const [tagProviders, _setTagProviders] = useState<string[]>(['AWS', 'Azure']);\n const [tagProvider, setTagProvider] = useState<string>();\n\n // tag keys\n const [openTagKey, setOpenTagKey] = useState(false);\n const [tagKeys, setTagKeys] = useState<Tag[] | undefined>(undefined);\n const [selectedTagKey, setSelectedTagKey] = useState<Tag | undefined>(undefined);\n const [resetTagKeys, setResetTagKeys] = useState(false);\n const loadingTagKeys = openTagKey && tagKeys === undefined;\n\n // tag values\n const [openTagValue, setOpenTagValue] = useState(false);\n const [tagValues, setTagValues] = useState<Tag[] | undefined>(undefined);\n const [resetTagValues, setResetTagValues] = useState(false);\n const loadingTagValues = openTagValue && tagValues === undefined;\n\n // user selected tags\n const [selectedTags, setSelectedTags] = useState<Tag[]>([]);\n\n const infraWalletApi = useApi(infraWalletApiRef);\n const alertApi = useApi(alertApiRef);\n\n const handleFiltersChange = (key: string, newValue: string[]): void => {\n filtersSetter({ ...filters, [key]: newValue });\n };\n\n const handleTagProviderChange = (provider: string | null) => {\n setTagProvider('');\n setOpenTagKey(false);\n setResetTagKeys(prev => !prev);\n setTagKeys(undefined);\n setSelectedTagKey(undefined);\n setOpenTagValue(false);\n setTagValues([]);\n\n if (provider) {\n setTagProvider(provider);\n setOpenTagKey(true);\n }\n };\n\n const handleTagKeyChange = (tagKey: Tag | string | null) => {\n setSelectedTagKey(undefined);\n setTagValues(undefined);\n setResetTagValues(prev => !prev);\n\n if (typeof tagKey === 'string') {\n return;\n }\n\n if (tagKey) {\n setSelectedTagKey(tagKey);\n setOpenTagValue(true);\n }\n };\n\n const handleTagValueSelection = (tag: Tag | string | null) => {\n if (typeof tag === 'string') {\n return;\n }\n\n if (tag && !tagExists(selectedTags, tag)) {\n setResetTagValues(prev => !prev);\n setSelectedTags([...selectedTags, tag]);\n }\n };\n\n const handleDeleteTag = (tagToDelete: Tag) => () => {\n setSelectedTags(\n selectedTags.filter(\n tag =>\n !(tag.provider === tagToDelete.provider && tag.key === tagToDelete.key && tag.value === tagToDelete.value),\n ),\n );\n };\n\n useEffect(() => {\n if (!loadingTagKeys) {\n return;\n }\n\n (async () => {\n if (tagProvider) {\n await infraWalletApi\n .getTagKeys(tagProvider, monthRange.startMonth, monthRange.endMonth)\n .then(response => {\n if (response.data) {\n setTagKeys(response.data);\n }\n if (response.status === 207 && response.errors) {\n providerErrorsSetter(response.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n })();\n }, [loadingTagKeys, tagProvider, monthRange, infraWalletApi, alertApi, providerErrorsSetter]);\n\n useEffect(() => {\n if (!loadingTagValues) {\n return;\n }\n\n (async () => {\n if (selectedTagKey) {\n await infraWalletApi\n .getTagValues(selectedTagKey, monthRange.startMonth, monthRange.endMonth)\n .then(response => {\n if (response.data) {\n setTagValues(response.data);\n }\n if (response.status === 207 && response.errors) {\n providerErrorsSetter(response.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n })();\n }, [loadingTagValues, selectedTagKey, monthRange, infraWalletApi, alertApi, providerErrorsSetter]);\n\n return (\n <Grid container>\n <Grid item xs={12}>\n {Object.keys(keyValues).map(key => (\n <FormControl className={classes.formControl} key={`form-${key}`}>\n <Autocomplete\n multiple\n id={`checkboxes-${key}`}\n options={keyValues[key].sort()}\n value={filters[key] || []}\n onChange={(_event, value: string[], _reason) => handleFiltersChange(key, value)}\n disableCloseOnSelect\n renderOption={(props, option, { selected }) => {\n let provider = undefined;\n let providerIcon = undefined;\n let accountName = undefined;\n let accountId = undefined;\n if (key === 'provider') {\n provider = option;\n providerIcon = getProviderIcon(provider);\n } else if (['account', 'service'].includes(key)) {\n provider = extractProvider(option);\n providerIcon = getProviderIcon(provider);\n }\n\n if (key === 'account') {\n const account = extractAccountInfo(option.replace(`${provider}/`, ''));\n accountName = account.accountName;\n accountId = account.accountId;\n }\n\n return (\n <li {...props} key={option}>\n <Checkbox icon={icon} checkedIcon={checkedIcon} style={{ marginRight: 8 }} checked={selected} />\n {providerIcon && <>{providerIcon}&nbsp;&nbsp;</>}\n {key === 'account' ? (\n <div>\n <Typography variant=\"body2\">{accountName}</Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {accountId}\n </Typography>\n </div>\n ) : (\n <Typography variant=\"body2\">{option.replace(`${provider}/`, '')}</Typography>\n )}\n </li>\n );\n }}\n renderInput={params => (\n <TextField {...params} variant=\"standard\" label={key.charAt(0).toUpperCase() + key.slice(1)} />\n )}\n />\n </FormControl>\n ))}\n <FormControl style={{ marginTop: 10 }}>\n <Button variant=\"contained\" color=\"primary\" onClick={() => filtersSetter({})}>\n Clear filters\n </Button>\n </FormControl>\n </Grid>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-providers\"\n options={tagProviders}\n onChange={(_, provider) => handleTagProviderChange(provider)}\n renderInput={params => <TextField {...params} variant=\"standard\" label=\"Tag provider\" />}\n renderOption={(props, option) => (\n <li {...props} key={option}>\n <Typography variant=\"body2\">{option}</Typography>\n </li>\n )}\n />\n </FormControl>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-keys\"\n key={String(resetTagKeys)}\n // freeSolo\n disabled={tagProvider ? false : true}\n open={openTagKey}\n onOpen={() => setOpenTagKey(true)}\n onClose={() => setOpenTagKey(false)}\n options={tagKeys && tagKeys.length ? tagKeys : [{ key: 'No value', provider: tagProvider as string }]}\n getOptionLabel={tag => tag.key}\n getOptionDisabled={tag => tag.key === 'No value'}\n loading={loadingTagKeys}\n onChange={(_, tagKey) => handleTagKeyChange(tagKey)}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"standard\"\n label=\"Tag keys\"\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <React.Fragment>\n {loadingTagKeys ? <CircularProgress color=\"inherit\" size={20} /> : null}\n {params.InputProps && params.InputProps.endAdornment}\n </React.Fragment>\n ),\n }}\n />\n )}\n renderOption={(props, option) => (\n <li {...props} key={option.key}>\n <Typography variant=\"body2\">{option.key}</Typography>\n </li>\n )}\n />\n </FormControl>\n <FormControl className={classes.formControl}>\n <Autocomplete\n id=\"tag-values\"\n key={String(resetTagValues)}\n // freeSolo\n disabled={selectedTagKey ? false : true}\n open={openTagValue}\n onOpen={() => setOpenTagValue(true)}\n onClose={() => setOpenTagValue(false)}\n options={\n tagValues && tagValues.length\n ? tagValues\n : [{ key: 'No value', value: 'No value', provider: tagProvider as string }]\n }\n getOptionLabel={tag => tag?.value || ''}\n getOptionDisabled={tag => tag?.value === 'No value' || tagExists(selectedTags, tag)}\n loading={loadingTagValues}\n onChange={(_, tag) => handleTagValueSelection(tag)}\n renderInput={params => (\n <TextField\n {...params}\n variant=\"standard\"\n label=\"Tag values\"\n InputProps={{\n ...params.InputProps,\n endAdornment: (\n <React.Fragment>\n {loadingTagValues ? <CircularProgress color=\"inherit\" size={20} /> : null}\n {params.InputProps && params.InputProps.endAdornment}\n </React.Fragment>\n ),\n }}\n />\n )}\n renderOption={(props, option) => (\n <li {...props} key={option.value}>\n <Typography variant=\"body2\">{option.value}</Typography>\n </li>\n )}\n />\n </FormControl>\n <FormControl style={{ marginTop: 10 }}>\n <HtmlTooltip\n title={\n <React.Fragment>\n You can apply <b>tags</b> to <em>one or more</em> providers. <b>Tags</b> will only filter the costs for\n the <b>selected providers</b>, while <em>others remain unchanged</em>.\n </React.Fragment>\n }\n >\n <Button variant=\"contained\" color=\"primary\" onClick={() => selectedTagsSetter(selectedTags)}>\n Apply\n </Button>\n </HtmlTooltip>\n </FormControl>\n </Grid>\n <Grid item xs={12}>\n {selectedTags.map(tag => (\n <Chip\n size=\"small\"\n key={`${tag.provider}/${tag.key}=${tag.value}`}\n label={`${tag.provider}/${tag.key}=${tag.value}`}\n onDelete={handleDeleteTag(tag)}\n />\n ))}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ const INFRAWALLET_ANNOTATION_PROJECT = "infrawallet.io/project";
2
+ const INFRAWALLET_ANNOTATION_ACCOUNT = "infrawallet.io/account";
3
+ const INFRAWALLET_ANNOTATION_SERVICE = "infrawallet.io/service";
4
+ const INFRAWALLET_ANNOTATION_CATEGORY = "infrawallet.io/category";
5
+ const INFRAWALLET_ANNOTATION_PROVIDER = "infrawallet.io/provider";
6
+ const INFRAWALLET_ANNOTATION_EXTRAS = "infrawallet.io/extra-filters";
7
+
8
+ export { INFRAWALLET_ANNOTATION_ACCOUNT, INFRAWALLET_ANNOTATION_CATEGORY, INFRAWALLET_ANNOTATION_EXTRAS, INFRAWALLET_ANNOTATION_PROJECT, INFRAWALLET_ANNOTATION_PROVIDER, INFRAWALLET_ANNOTATION_SERVICE };
9
+ //# sourceMappingURL=InfraWalletAppData.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InfraWalletAppData.esm.js","sources":["../../src/components/InfraWalletAppData.tsx"],"sourcesContent":["import { Entity } from '@backstage/catalog-model';\n\nexport const INFRAWALLET_ANNOTATION_PROJECT = 'infrawallet.io/project';\nexport const INFRAWALLET_ANNOTATION_ACCOUNT = 'infrawallet.io/account';\nexport const INFRAWALLET_ANNOTATION_SERVICE = 'infrawallet.io/service';\nexport const INFRAWALLET_ANNOTATION_CATEGORY = 'infrawallet.io/category';\nexport const INFRAWALLET_ANNOTATION_PROVIDER = 'infrawallet.io/provider';\nexport const INFRAWALLET_ANNOTATION_EXTRAS = 'infrawallet.io/extra-filters';\n\nexport const getInfraWalletProjectAnnotation = (entity: Entity) => {\n const project = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_PROJECT] ?? '';\n\n return project;\n};\n\nexport const getInfraWalletAccountAnnotation = (entity: Entity) => {\n const account = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_ACCOUNT] ?? '';\n\n return account;\n};\n\nexport const getInfraWalletServiceAnnotation = (entity: Entity) => {\n const service = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_SERVICE] ?? '';\n\n return service;\n};\n\nexport const getInfraWalletCategoryAnnotation = (entity: Entity) => {\n const category = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_CATEGORY] ?? '';\n\n return category;\n};\nexport const getInfraWalletProviderAnnotation = (entity: Entity) => {\n const provider = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_PROVIDER] ?? '';\n\n return provider;\n};\n\nexport const getInfraWalletExtrasAnnotation = (entity: Entity) => {\n const extras = entity.metadata.annotations?.[INFRAWALLET_ANNOTATION_EXTRAS] ?? '';\n\n return extras;\n};\n"],"names":[],"mappings":"AAEO,MAAM,8BAAiC,GAAA,yBAAA;AACvC,MAAM,8BAAiC,GAAA,yBAAA;AACvC,MAAM,8BAAiC,GAAA,yBAAA;AACvC,MAAM,+BAAkC,GAAA,0BAAA;AACxC,MAAM,+BAAkC,GAAA,0BAAA;AACxC,MAAM,6BAAgC,GAAA;;;;"}
@@ -1,15 +1,16 @@
1
1
  import { useApi, configApiRef, alertApiRef } from '@backstage/core-plugin-api';
2
- import AddIcon from '@material-ui/icons/Add';
3
- import CancelIcon from '@material-ui/icons/Close';
4
- import DeleteIcon from '@material-ui/icons/DeleteOutlined';
5
- import EditIcon from '@material-ui/icons/Edit';
6
- import SaveIcon from '@material-ui/icons/Save';
2
+ import AddIcon from '@mui/icons-material/Add';
3
+ import CancelIcon from '@mui/icons-material/Cancel';
4
+ import DeleteIcon from '@mui/icons-material/Delete';
5
+ import EditIcon from '@mui/icons-material/Edit';
6
+ import SaveIcon from '@mui/icons-material/Save';
7
7
  import Box from '@mui/material/Box';
8
8
  import Button from '@mui/material/Button';
9
9
  import React, { useState, useCallback, useEffect } from 'react';
10
10
  import { v4 } from 'uuid';
11
11
  import { infraWalletApiRef } from '../../api/InfraWalletApi.esm.js';
12
12
  import { DataGrid, GridToolbarContainer, GridRowEditStopReasons, GridRowModes, GridActionsCellItem } from '@mui/x-data-grid';
13
+ import { getProviderIcon } from '../ProviderIcons/ProviderIcons.esm.js';
13
14
 
14
15
  const MetricConfigurationComponent = ({ wallet }) => {
15
16
  var _a;
@@ -101,6 +102,7 @@ const MetricConfigurationComponent = ({ wallet }) => {
101
102
  width: 220,
102
103
  editable: !readOnly,
103
104
  type: "singleSelect",
105
+ display: "flex",
104
106
  valueOptions: () => {
105
107
  const options = [];
106
108
  const optionsSet = /* @__PURE__ */ new Set();
@@ -111,11 +113,15 @@ const MetricConfigurationComponent = ({ wallet }) => {
111
113
  }
112
114
  optionsSet.forEach((o) => options.push({ value: o, label: o }));
113
115
  return options;
116
+ },
117
+ renderCell: (params) => {
118
+ const provider = params.row.metric_provider;
119
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, getProviderIcon(provider), "\xA0\xA0", provider.charAt(0).toUpperCase() + provider.slice(1));
114
120
  }
115
121
  },
116
122
  {
117
123
  field: "config_name",
118
- headerName: "ConfigName",
124
+ headerName: "Integration",
119
125
  width: 180,
120
126
  editable: !readOnly,
121
127
  type: "singleSelect",
@@ -133,7 +139,7 @@ const MetricConfigurationComponent = ({ wallet }) => {
133
139
  },
134
140
  {
135
141
  field: "metric_name",
136
- headerName: "MetricName",
142
+ headerName: "Metric Name",
137
143
  width: 220,
138
144
  editable: !readOnly
139
145
  },
@@ -141,7 +147,8 @@ const MetricConfigurationComponent = ({ wallet }) => {
141
147
  field: "description",
142
148
  headerName: "Description",
143
149
  width: 220,
144
- editable: !readOnly
150
+ editable: !readOnly,
151
+ sortable: false
145
152
  },
146
153
  {
147
154
  field: "group",
@@ -153,7 +160,11 @@ const MetricConfigurationComponent = ({ wallet }) => {
153
160
  field: "query",
154
161
  headerName: "Query",
155
162
  flex: 1,
156
- editable: !readOnly
163
+ editable: !readOnly,
164
+ sortable: false,
165
+ renderCell: (params) => {
166
+ return /* @__PURE__ */ React.createElement("div", { style: { fontFamily: "monospace", fontSize: "0.9em" } }, params.row.query);
167
+ }
157
168
  }
158
169
  ];
159
170
  if (!readOnly) {
@@ -253,7 +264,8 @@ const MetricConfigurationComponent = ({ wallet }) => {
253
264
  processRowUpdate,
254
265
  slots: {
255
266
  toolbar: readOnly ? null : EditToolbar
256
- }
267
+ },
268
+ disableColumnMenu: true
257
269
  }
258
270
  )
259
271
  );
@@ -1 +1 @@
1
- {"version":3,"file":"MetricConfigurationComponent.esm.js","sources":["../../../src/components/MetricConfigurationComponent/MetricConfigurationComponent.tsx"],"sourcesContent":["import { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport AddIcon from '@material-ui/icons/Add';\nimport CancelIcon from '@material-ui/icons/Close';\nimport DeleteIcon from '@material-ui/icons/DeleteOutlined';\nimport EditIcon from '@material-ui/icons/Edit';\nimport SaveIcon from '@material-ui/icons/Save';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport React, { FC, useCallback, useEffect, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { MetricConfig, MetricSetting, Wallet } from '../../api/types';\n\nimport {\n DataGrid,\n GridActionsCellItem,\n GridColDef,\n GridEventListener,\n GridRowEditStopReasons,\n GridRowId,\n GridRowModel,\n GridRowModes,\n GridRowModesModel,\n GridRowsProp,\n GridSlots,\n GridToolbarContainer,\n ValueOptions,\n} from '@mui/x-data-grid';\n\nexport const MetricConfigurationComponent: FC<{ wallet?: Wallet }> = ({ wallet }) => {\n const configApi = useApi(configApiRef);\n const alertApi = useApi(alertApiRef);\n const infraWalletApi = useApi(infraWalletApiRef);\n const [rows, setRows] = useState<GridRowsProp>([]);\n const [metricConfigs, setMetricConfigs] = useState<MetricConfig[]>();\n const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({});\n\n const readOnly = configApi.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n function EditToolbar() {\n const handleClick = () => {\n const id = uuidv4();\n setRows(oldRows => [\n ...oldRows,\n {\n id,\n wallet_id: wallet ? wallet.id : '',\n metric_provider: '',\n config_name: '',\n metric_name: '',\n description: '',\n group: '',\n query: '',\n isNew: true,\n },\n ]);\n setRowModesModel(oldModel => ({\n ...oldModel,\n [id]: { mode: GridRowModes.Edit, fieldToFocus: 'name' },\n }));\n };\n\n return (\n <GridToolbarContainer>\n <Button color=\"primary\" startIcon={<AddIcon />} onClick={handleClick}>\n Add metric\n </Button>\n </GridToolbarContainer>\n );\n }\n\n const handleRowEditStop: GridEventListener<'rowEditStop'> = (params, event) => {\n if (params.reason === GridRowEditStopReasons.rowFocusOut) {\n event.defaultMuiPrevented = true;\n }\n };\n\n const handleEditClick = (id: GridRowId) => () => {\n setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } });\n };\n\n const handleSaveClick = (id: GridRowId) => () => {\n setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } });\n };\n\n const handleDeleteClick = (row: GridRowModel) => () => {\n if (wallet) {\n const { isNew, ...metricSetting } = row;\n infraWalletApi\n .deleteWalletMetricSetting(wallet.name, metricSetting as MetricSetting)\n .then(response => {\n if (response.status === 200) {\n setRows(rows.filter(r => r.id !== row.id));\n } else {\n alertApi.post({ message: 'Failed to update the metric setting', severity: 'error' });\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n };\n\n const handleCancelClick = (id: GridRowId) => () => {\n setRowModesModel({\n ...rowModesModel,\n [id]: { mode: GridRowModes.View, ignoreModifications: true },\n });\n\n const editedRow = rows.find(row => row.id === id);\n if (editedRow!.isNew) {\n setRows(rows.filter(row => row.id !== id));\n }\n };\n\n const processRowUpdate = (newRow: GridRowModel) => {\n const updatedRow = { ...newRow, isNew: false };\n if (wallet) {\n const { isNew, ...metricSetting } = updatedRow;\n\n infraWalletApi\n .updateWalletMetricSetting(wallet.name, metricSetting as MetricSetting)\n .then(response => {\n if (response.status === 200) {\n setRows(rows.map(row => (row.id === newRow.id ? updatedRow : row)));\n } else {\n alertApi.post({ message: 'Failed to update the metric setting', severity: 'error' });\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n\n return updatedRow;\n };\n\n const handleRowModesModelChange = (newRowModesModel: GridRowModesModel) => {\n setRowModesModel(newRowModesModel);\n };\n\n const columns: GridColDef[] = [\n {\n field: 'metric_provider',\n headerName: 'Provider',\n width: 220,\n editable: !readOnly,\n type: 'singleSelect',\n valueOptions: () => {\n const options: ValueOptions[] = [];\n const optionsSet = new Set<string>();\n\n if (metricConfigs) {\n metricConfigs.forEach(c => {\n optionsSet.add(c.metric_provider);\n });\n }\n optionsSet.forEach(o => options.push({ value: o, label: o }));\n return options;\n },\n },\n {\n field: 'config_name',\n headerName: 'ConfigName',\n width: 180,\n editable: !readOnly,\n type: 'singleSelect',\n valueOptions: params => {\n const options: ValueOptions[] = [];\n if (params.row.metric_provider !== '' && metricConfigs) {\n metricConfigs.forEach(c => {\n if (params.row.metric_provider === c.metric_provider) {\n options.push({ value: c.config_name, label: c.config_name });\n }\n });\n }\n return options;\n },\n },\n {\n field: 'metric_name',\n headerName: 'MetricName',\n width: 220,\n editable: !readOnly,\n },\n {\n field: 'description',\n headerName: 'Description',\n width: 220,\n editable: !readOnly,\n },\n {\n field: 'group',\n headerName: 'Group',\n width: 100,\n editable: !readOnly,\n },\n {\n field: 'query',\n headerName: 'Query',\n flex: 1,\n editable: !readOnly,\n },\n ];\n\n if (!readOnly) {\n columns.push({\n field: 'actions',\n type: 'actions',\n headerName: 'Actions',\n width: 100,\n cellClassName: 'actions',\n getActions: ({ id, row }) => {\n const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit;\n\n if (isInEditMode) {\n return [\n <GridActionsCellItem\n icon={<SaveIcon />}\n label=\"Save\"\n sx={{\n color: 'primary.main',\n }}\n onClick={handleSaveClick(id)}\n />,\n <GridActionsCellItem\n icon={<CancelIcon />}\n label=\"Cancel\"\n className=\"textPrimary\"\n onClick={handleCancelClick(id)}\n color=\"inherit\"\n />,\n ];\n }\n\n return [\n <GridActionsCellItem\n icon={<EditIcon />}\n label=\"Edit\"\n className=\"textPrimary\"\n onClick={handleEditClick(id)}\n color=\"inherit\"\n />,\n <GridActionsCellItem icon={<DeleteIcon />} label=\"Delete\" onClick={handleDeleteClick(row)} color=\"inherit\" />,\n ];\n },\n });\n }\n\n const getWalletMetricSettings = useCallback(async () => {\n if (wallet) {\n await infraWalletApi\n .getWalletMetricsSetting(wallet.name)\n .then(metricsResponse => {\n if (metricsResponse.data && metricsResponse.status === 200) {\n setRows(metricsResponse.data);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n }, [wallet, infraWalletApi, alertApi]);\n\n const getMetricConfig = useCallback(async () => {\n await infraWalletApi\n .getMetricConfigs()\n .then(response => {\n if (response.data && response.status === 200) {\n setMetricConfigs(response.data);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }, [alertApi, infraWalletApi]);\n\n useEffect(() => {\n getWalletMetricSettings();\n getMetricConfig();\n }, [getWalletMetricSettings, getMetricConfig]);\n\n return (\n <Box\n sx={{\n height: 500,\n width: '100%',\n '& .actions': {\n color: 'text.secondary',\n },\n '& .textPrimary': {\n color: 'text.primary',\n },\n }}\n >\n <DataGrid\n rows={rows}\n columns={columns}\n editMode=\"row\"\n rowModesModel={rowModesModel}\n onRowModesModelChange={handleRowModesModelChange}\n onRowEditStop={handleRowEditStop}\n processRowUpdate={processRowUpdate}\n slots={{\n toolbar: readOnly ? null : (EditToolbar as GridSlots['toolbar']),\n }}\n />\n </Box>\n );\n};\n"],"names":["uuidv4","_a"],"mappings":"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"}
1
+ {"version":3,"file":"MetricConfigurationComponent.esm.js","sources":["../../../src/components/MetricConfigurationComponent/MetricConfigurationComponent.tsx"],"sourcesContent":["import { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport AddIcon from '@mui/icons-material/Add';\nimport CancelIcon from '@mui/icons-material/Cancel';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport EditIcon from '@mui/icons-material/Edit';\nimport SaveIcon from '@mui/icons-material/Save';\nimport Box from '@mui/material/Box';\nimport Button from '@mui/material/Button';\nimport React, { FC, useCallback, useEffect, useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport { MetricConfig, MetricSetting, Wallet } from '../../api/types';\n\nimport {\n DataGrid,\n GridActionsCellItem,\n GridColDef,\n GridEventListener,\n GridRowEditStopReasons,\n GridRowId,\n GridRowModel,\n GridRowModes,\n GridRowModesModel,\n GridRowsProp,\n GridSlots,\n GridToolbarContainer,\n ValueOptions,\n} from '@mui/x-data-grid';\nimport { getProviderIcon } from '../ProviderIcons';\n\nexport const MetricConfigurationComponent: FC<{ wallet?: Wallet }> = ({ wallet }) => {\n const configApi = useApi(configApiRef);\n const alertApi = useApi(alertApiRef);\n const infraWalletApi = useApi(infraWalletApiRef);\n const [rows, setRows] = useState<GridRowsProp>([]);\n const [metricConfigs, setMetricConfigs] = useState<MetricConfig[]>();\n const [rowModesModel, setRowModesModel] = useState<GridRowModesModel>({});\n\n const readOnly = configApi.getOptionalBoolean('infraWallet.settings.readOnly') ?? false;\n\n function EditToolbar() {\n const handleClick = () => {\n const id = uuidv4();\n setRows(oldRows => [\n ...oldRows,\n {\n id,\n wallet_id: wallet ? wallet.id : '',\n metric_provider: '',\n config_name: '',\n metric_name: '',\n description: '',\n group: '',\n query: '',\n isNew: true,\n },\n ]);\n setRowModesModel(oldModel => ({\n ...oldModel,\n [id]: { mode: GridRowModes.Edit, fieldToFocus: 'name' },\n }));\n };\n\n return (\n <GridToolbarContainer>\n <Button color=\"primary\" startIcon={<AddIcon />} onClick={handleClick}>\n Add metric\n </Button>\n </GridToolbarContainer>\n );\n }\n\n const handleRowEditStop: GridEventListener<'rowEditStop'> = (params, event) => {\n if (params.reason === GridRowEditStopReasons.rowFocusOut) {\n event.defaultMuiPrevented = true;\n }\n };\n\n const handleEditClick = (id: GridRowId) => () => {\n setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } });\n };\n\n const handleSaveClick = (id: GridRowId) => () => {\n setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } });\n };\n\n const handleDeleteClick = (row: GridRowModel) => () => {\n if (wallet) {\n const { isNew, ...metricSetting } = row;\n infraWalletApi\n .deleteWalletMetricSetting(wallet.name, metricSetting as MetricSetting)\n .then(response => {\n if (response.status === 200) {\n setRows(rows.filter(r => r.id !== row.id));\n } else {\n alertApi.post({ message: 'Failed to update the metric setting', severity: 'error' });\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n };\n\n const handleCancelClick = (id: GridRowId) => () => {\n setRowModesModel({\n ...rowModesModel,\n [id]: { mode: GridRowModes.View, ignoreModifications: true },\n });\n\n const editedRow = rows.find(row => row.id === id);\n if (editedRow!.isNew) {\n setRows(rows.filter(row => row.id !== id));\n }\n };\n\n const processRowUpdate = (newRow: GridRowModel) => {\n const updatedRow = { ...newRow, isNew: false };\n if (wallet) {\n const { isNew, ...metricSetting } = updatedRow;\n\n infraWalletApi\n .updateWalletMetricSetting(wallet.name, metricSetting as MetricSetting)\n .then(response => {\n if (response.status === 200) {\n setRows(rows.map(row => (row.id === newRow.id ? updatedRow : row)));\n } else {\n alertApi.post({ message: 'Failed to update the metric setting', severity: 'error' });\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n\n return updatedRow;\n };\n\n const handleRowModesModelChange = (newRowModesModel: GridRowModesModel) => {\n setRowModesModel(newRowModesModel);\n };\n\n const columns: GridColDef[] = [\n {\n field: 'metric_provider',\n headerName: 'Provider',\n width: 220,\n editable: !readOnly,\n type: 'singleSelect',\n display: 'flex',\n valueOptions: () => {\n const options: ValueOptions[] = [];\n const optionsSet = new Set<string>();\n\n if (metricConfigs) {\n metricConfigs.forEach(c => {\n optionsSet.add(c.metric_provider);\n });\n }\n optionsSet.forEach(o => options.push({ value: o, label: o }));\n return options;\n },\n renderCell: params => {\n const provider = params.row.metric_provider;\n return (\n <>\n {getProviderIcon(provider)}&nbsp;&nbsp;{provider.charAt(0).toUpperCase() + provider.slice(1)}\n </>\n );\n },\n },\n {\n field: 'config_name',\n headerName: 'Integration',\n width: 180,\n editable: !readOnly,\n type: 'singleSelect',\n valueOptions: params => {\n const options: ValueOptions[] = [];\n if (params.row.metric_provider !== '' && metricConfigs) {\n metricConfigs.forEach(c => {\n if (params.row.metric_provider === c.metric_provider) {\n options.push({ value: c.config_name, label: c.config_name });\n }\n });\n }\n return options;\n },\n },\n {\n field: 'metric_name',\n headerName: 'Metric Name',\n width: 220,\n editable: !readOnly,\n },\n {\n field: 'description',\n headerName: 'Description',\n width: 220,\n editable: !readOnly,\n sortable: false,\n },\n {\n field: 'group',\n headerName: 'Group',\n width: 100,\n editable: !readOnly,\n },\n {\n field: 'query',\n headerName: 'Query',\n flex: 1,\n editable: !readOnly,\n sortable: false,\n renderCell: params => {\n return <div style={{ fontFamily: 'monospace', fontSize: '0.9em' }}>{params.row.query}</div>;\n },\n },\n ];\n\n if (!readOnly) {\n columns.push({\n field: 'actions',\n type: 'actions',\n headerName: 'Actions',\n width: 100,\n cellClassName: 'actions',\n getActions: ({ id, row }) => {\n const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit;\n\n if (isInEditMode) {\n return [\n <GridActionsCellItem\n icon={<SaveIcon />}\n label=\"Save\"\n sx={{\n color: 'primary.main',\n }}\n onClick={handleSaveClick(id)}\n />,\n <GridActionsCellItem\n icon={<CancelIcon />}\n label=\"Cancel\"\n className=\"textPrimary\"\n onClick={handleCancelClick(id)}\n color=\"inherit\"\n />,\n ];\n }\n\n return [\n <GridActionsCellItem\n icon={<EditIcon />}\n label=\"Edit\"\n className=\"textPrimary\"\n onClick={handleEditClick(id)}\n color=\"inherit\"\n />,\n <GridActionsCellItem icon={<DeleteIcon />} label=\"Delete\" onClick={handleDeleteClick(row)} color=\"inherit\" />,\n ];\n },\n });\n }\n\n const getWalletMetricSettings = useCallback(async () => {\n if (wallet) {\n await infraWalletApi\n .getWalletMetricsSetting(wallet.name)\n .then(metricsResponse => {\n if (metricsResponse.data && metricsResponse.status === 200) {\n setRows(metricsResponse.data);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }\n }, [wallet, infraWalletApi, alertApi]);\n\n const getMetricConfig = useCallback(async () => {\n await infraWalletApi\n .getMetricConfigs()\n .then(response => {\n if (response.data && response.status === 200) {\n setMetricConfigs(response.data);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }, [alertApi, infraWalletApi]);\n\n useEffect(() => {\n getWalletMetricSettings();\n getMetricConfig();\n }, [getWalletMetricSettings, getMetricConfig]);\n\n return (\n <Box\n sx={{\n height: 500,\n width: '100%',\n '& .actions': {\n color: 'text.secondary',\n },\n '& .textPrimary': {\n color: 'text.primary',\n },\n }}\n >\n <DataGrid\n rows={rows}\n columns={columns}\n editMode=\"row\"\n rowModesModel={rowModesModel}\n onRowModesModelChange={handleRowModesModelChange}\n onRowEditStop={handleRowEditStop}\n processRowUpdate={processRowUpdate}\n slots={{\n toolbar: readOnly ? null : (EditToolbar as GridSlots['toolbar']),\n }}\n disableColumnMenu\n />\n </Box>\n );\n};\n"],"names":["uuidv4","_a"],"mappings":"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"}