@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.
- package/dist/api/InfraWalletApiClient.esm.js +4 -2
- package/dist/api/InfraWalletApiClient.esm.js.map +1 -1
- package/dist/api/functions.esm.js +15 -3
- package/dist/api/functions.esm.js.map +1 -1
- package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js +142 -173
- package/dist/components/ColumnsChartComponent/ColumnsChartComponent.esm.js.map +1 -1
- package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js +147 -91
- package/dist/components/CostReportsTableComponent/CostReportsTableComponent.esm.js.map +1 -1
- package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js +254 -0
- package/dist/components/EntityInfraWalletCard/EntityInfraWalletCard.esm.js.map +1 -0
- package/dist/components/EntityInfraWalletCard/index.esm.js +2 -0
- package/dist/components/EntityInfraWalletCard/index.esm.js.map +1 -0
- package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js +4 -4
- package/dist/components/ErrorsAlertComponent/ErrorsAlertComponent.esm.js.map +1 -1
- package/dist/components/FiltersComponent/FiltersComponent.esm.js +27 -27
- package/dist/components/FiltersComponent/FiltersComponent.esm.js.map +1 -1
- package/dist/components/InfraWalletAppData.esm.js +9 -0
- package/dist/components/InfraWalletAppData.esm.js.map +1 -0
- package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js +22 -10
- package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js.map +1 -1
- package/dist/components/PieChartComponent/PieChartComponent.esm.js +63 -59
- package/dist/components/PieChartComponent/PieChartComponent.esm.js.map +1 -1
- package/dist/components/ProviderIcons/ProviderIcons.esm.js +8 -8
- package/dist/components/ProviderIcons/ProviderIcons.esm.js.map +1 -1
- package/dist/components/ReportsComponent/ReportsComponent.esm.js +24 -20
- package/dist/components/ReportsComponent/ReportsComponent.esm.js.map +1 -1
- package/dist/components/SettingsComponent/SettingsComponent.esm.js +4 -4
- package/dist/components/SettingsComponent/SettingsComponent.esm.js.map +1 -1
- package/dist/components/index.esm.js +36 -0
- package/dist/components/index.esm.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.esm.js +2 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +10 -2
- package/dist/plugin.esm.js.map +1 -1
- 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 @@
|
|
|
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
|
|
11
|
-
import Alert from '@material
|
|
12
|
-
import AlertTitle from '@material
|
|
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(
|
|
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 '@
|
|
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 {
|
|
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 '@
|
|
7
|
-
import CheckBoxOutlineBlankIcon from '@
|
|
8
|
-
import Autocomplete from '@material
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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 \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":";;;;;;;;;;;;;;AAgBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,WAAa,EAAA;AAAA,IACX,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC3B,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,KAAO,EAAA,GAAA;AAAA,GACT;AACF,CAAE,CAAA,CAAA,CAAA;AAEF,MAAM,IAAO,mBAAA,KAAA,CAAA,aAAA,CAAC,wBAAyB,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AACxD,MAAM,WAAc,mBAAA,KAAA,CAAA,aAAA,CAAC,YAAa,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AAEnD,MAAM,WAAA,GAAc,UAAW,CAAA,CAAC,KAAkB,MAAA;AAAA,EAChD,OAAS,EAAA;AAAA,IACP,eAAiB,EAAA,SAAA;AAAA,IACjB,KAAO,EAAA,qBAAA;AAAA,IACP,QAAU,EAAA,GAAA;AAAA,IACV,QAAU,EAAA,KAAA,CAAM,UAAW,CAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,IACrC,MAAQ,EAAA,mBAAA;AAAA,GACV;AACF,CAAA,CAAE,EAAE,OAAO,CAAA,CAAA;AAEJ,MAAM,mBAA8C,CAAC;AAAA,EAC1D,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AACF,CAAM,KAAA;AACJ,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAM,MAAA,SAAA,GAAyC,sBAAsB,OAAO,CAAA,CAAA;AAG5E,EAAM,MAAA,CAAC,cAAc,gBAAgB,CAAA,GAAI,SAAmB,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA,CAAA;AAC5E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAiB,EAAA,CAAA;AAGvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAgB,EAAE,CAAA,CAAA;AAChD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAqB,IAAI,CAAA,CAAA;AACrE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,UAAc,IAAA,OAAA,CAAQ,MAAW,KAAA,CAAA,CAAA;AAGxD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAA,QAAA,CAAgB,EAAE,CAAA,CAAA;AACpD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC1D,EAAM,MAAA,gBAAA,GAAmB,YAAgB,IAAA,SAAA,CAAU,MAAW,KAAA,CAAA,CAAA;AAG9D,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,CAAI,GAAA,QAAA,CAAgB,EAAE,CAAA,CAAA;AAE1D,EAAM,MAAA,cAAA,GAAiB,OAAO,iBAAiB,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AAEnC,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAA,EAAa,QAA6B,KAAA;AACrE,IAAA,aAAA,CAAc,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,UAAU,CAAA,CAAA;AAAA,GAC/C,CAAA;AAEA,EAAM,MAAA,uBAAA,GAA0B,CAAC,QAA4B,KAAA;AAC3D,IAAA,cAAA,CAAe,EAAE,CAAA,CAAA;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AACnB,IAAgB,eAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAC7B,IAAA,UAAA,CAAW,EAAE,CAAA,CAAA;AACb,IAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AACtB,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAA,YAAA,CAAa,EAAE,CAAA,CAAA;AAEf,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,cAAA,CAAe,QAAQ,CAAA,CAAA;AACvB,MAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,KACpB;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,MAAgC,KAAA;AAC1D,IAAA,iBAAA,CAAkB,IAAI,CAAA,CAAA;AACtB,IAAA,YAAA,CAAa,EAAE,CAAA,CAAA;AACf,IAAkB,iBAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAE/B,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,iBAAA,CAAkB,MAAM,CAAA,CAAA;AACxB,MAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAAA,KACtB;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,uBAAA,GAA0B,CAAC,GAA6B,KAAA;AAC5D,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,GAAO,IAAA,CAAC,SAAU,CAAA,YAAA,EAAc,GAAG,CAAG,EAAA;AACxC,MAAkB,iBAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAC/B,MAAA,eAAA,CAAgB,CAAC,GAAG,YAAc,EAAA,GAAG,CAAC,CAAA,CAAA;AAAA,KACxC;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,WAAA,KAAqB,MAAM;AAClD,IAAA,eAAA;AAAA,MACE,YAAa,CAAA,MAAA;AAAA,QACX,CACE,GAAA,KAAA,EAAE,GAAI,CAAA,QAAA,KAAa,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,GAAA,KAAQ,WAAY,CAAA,GAAA,IAAO,GAAI,CAAA,KAAA,KAAU,WAAY,CAAA,KAAA,CAAA;AAAA,OACxG;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,WAAa,EAAA;AACf,QAAM,MAAA,cAAA,CACH,WAAW,WAAa,EAAA,UAAA,CAAW,YAAY,UAAW,CAAA,QAAQ,CAClE,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA;AAChB,UAAA,IAAI,QAAS,CAAA,IAAA,IAAQ,QAAS,CAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AAC7C,YAAA,UAAA,CAAW,SAAS,IAAI,CAAA,CAAA;AAAA,WAC1B;AACA,UAAA,IAAI,QAAS,CAAA,MAAA,KAAW,GAAO,IAAA,QAAA,CAAS,MAAQ,EAAA;AAC9C,YAAA,oBAAA,CAAqB,SAAS,MAAM,CAAA,CAAA;AAAA,WACtC;AAAA,SACD,CAAA,CACA,KAAM,CAAA,CAAA,CAAA,KAAK,SAAS,IAAK,CAAA,EAAE,OAAS,EAAA,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,QAAU,EAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,OAC7E;AAAA,KACC,GAAA,CAAA;AAAA,GACL,EAAG,CAAC,cAAgB,EAAA,WAAA,EAAa,YAAY,cAAgB,EAAA,QAAA,EAAU,oBAAoB,CAAC,CAAA,CAAA;AAE5F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAM,MAAA,cAAA,CACH,aAAa,cAAgB,EAAA,UAAA,CAAW,YAAY,UAAW,CAAA,QAAQ,CACvE,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA;AAChB,UAAA,IAAI,QAAS,CAAA,IAAA,IAAQ,QAAS,CAAA,IAAA,CAAK,SAAS,CAAG,EAAA;AAC7C,YAAA,YAAA,CAAa,SAAS,IAAI,CAAA,CAAA;AAAA,WAC5B;AACA,UAAA,IAAI,QAAS,CAAA,MAAA,KAAW,GAAO,IAAA,QAAA,CAAS,MAAQ,EAAA;AAC9C,YAAA,oBAAA,CAAqB,SAAS,MAAM,CAAA,CAAA;AAAA,WACtC;AAAA,SACD,CAAA,CACA,KAAM,CAAA,CAAA,CAAA,KAAK,SAAS,IAAK,CAAA,EAAE,OAAS,EAAA,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,QAAU,EAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,OAC7E;AAAA,KACC,GAAA,CAAA;AAAA,GACL,EAAG,CAAC,gBAAkB,EAAA,cAAA,EAAgB,YAAY,cAAgB,EAAA,QAAA,EAAU,oBAAoB,CAAC,CAAA,CAAA;AAEjG,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,EACZ,MAAO,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,GAAA,CAAI,CAC1B,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAAa,EAAA,GAAA,EAAK,CAAQ,KAAA,EAAA,GAAG,CAC3D,CAAA,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,QAAQ,EAAA,IAAA;AAAA,MACR,EAAA,EAAI,cAAc,GAAG,CAAA,CAAA;AAAA,MACrB,OAAS,EAAA,SAAA,CAAU,GAAG,CAAA,CAAE,IAAK,EAAA;AAAA,MAC7B,KAAO,EAAA,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAC;AAAA,MACxB,UAAU,CAAC,MAAA,EAAQ,OAAiB,OAAY,KAAA,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,MAC9E,oBAAoB,EAAA,IAAA;AAAA,MACpB,YAAc,EAAA,CAAC,MAAQ,EAAA,EAAE,UAAe,KAAA;AACtC,QAAA,IAAI,QAAW,GAAA,KAAA,CAAA,CAAA;AACf,QAAA,IAAI,YAAe,GAAA,KAAA,CAAA,CAAA;AACnB,QAAA,IAAI,WAAc,GAAA,KAAA,CAAA,CAAA;AAClB,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA,CAAA;AAChB,QAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,UAAW,QAAA,GAAA,MAAA,CAAA;AACX,UAAA,YAAA,GAAe,gBAAgB,QAAQ,CAAA,CAAA;AAAA,mBAC9B,CAAC,SAAA,EAAW,SAAS,CAAE,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC/C,UAAA,QAAA,GAAW,gBAAgB,MAAM,CAAA,CAAA;AACjC,UAAA,YAAA,GAAe,gBAAgB,QAAQ,CAAA,CAAA;AAAA,SACzC;AAEA,QAAA,IAAI,QAAQ,SAAW,EAAA;AACrB,UAAM,MAAA,OAAA,GAAU,mBAAmB,MAAO,CAAA,OAAA,CAAQ,GAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,CAAC,CAAA,CAAA;AACrE,UAAA,WAAA,GAAc,OAAQ,CAAA,WAAA,CAAA;AACtB,UAAA,SAAA,GAAY,OAAQ,CAAA,SAAA,CAAA;AAAA,SACtB;AAEA,QACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,EAAe,GAAA,EAAK,CAAU,OAAA,EAAA,MAAM,CACnC,CAAA,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,IAAA,EAAY,WAA0B,EAAA,KAAA,EAAO,EAAE,WAAA,EAAa,CAAE,EAAA,EAAG,OAAS,EAAA,QAAA,EAAU,CAC7F,EAAA,YAAA,oBAEG,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAY,EAAA,IAAA,EAAA,YAAa,CAAa,EAAA,UAEzC,CAED,EAAA,GAAA,KAAQ,4BACN,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAS,WAAY,CAAA,kBACxC,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,SAAA,EAAU,KAAM,EAAA,eAAA,EAAA,EACjC,SACH,CACF,CAEA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,CAAE,CAEpE,CAAA,CAAA;AAAA,OAEJ;AAAA,MACA,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,aAAW,GAAG,MAAA,EAAQ,SAAQ,UAAW,EAAA,KAAA,EAAO,GAAI,CAAA,MAAA,CAAO,CAAC,CAAE,CAAA,WAAA,KAAgB,GAAI,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA,CAAA;AAAA,KAAA;AAAA,GAGnG,CACD,CACD,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAY,KAAO,EAAA,EAAE,WAAW,EAAG,EAAA,EAAA,sCACjC,MAAO,EAAA,EAAA,OAAA,EAAQ,aAAY,KAAM,EAAA,SAAA,EAAU,SAAS,MAAM,aAAA,CAAc,EAAE,CAAG,EAAA,EAAA,eAE9E,CACF,CACF,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EAAA,sCACZ,OAAQ,EAAA,IAAA,CACX,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,sBACZ,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,eAAA;AAAA,MACH,OAAS,EAAA,YAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,QAAA,KAAa,wBAAwB,QAAQ,CAAA;AAAA,MAC3D,WAAA,EAAa,4BAAW,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAW,GAAG,MAAQ,EAAA,OAAA,EAAQ,UAAW,EAAA,KAAA,EAAM,cAAe,EAAA,CAAA;AAAA,MACtF,YAAA,EAAc,CACZ,MAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,IACC,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,EAAA,MAAO,CACtC,CAAA;AAAA,KAAA;AAAA,GAGN,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,UAAA;AAAA,MACH,GAAA,EAAK,OAAO,YAAY,CAAA;AAAA,MACxB,QAAQ,EAAA,IAAA;AAAA,MACR,QAAA,EAAU,cAAc,KAAQ,GAAA,IAAA;AAAA,MAChC,IAAM,EAAA,UAAA;AAAA,MACN,MAAA,EAAQ,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,MAClC,OAAS,EAAA,OAAA;AAAA,MACT,cAAA,EAAgB,SAAO,GAAI,CAAA,GAAA;AAAA,MAC3B,OAAS,EAAA,cAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,MAAA,KAAW,mBAAmB,MAAM,CAAA;AAAA,MAClD,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,UAAA;AAAA,UACN,UAAY,EAAA;AAAA,YACV,GAAG,MAAO,CAAA,UAAA;AAAA,YACV,8BACG,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,UAAN,IACE,EAAA,cAAA,uCAAkB,gBAAiB,EAAA,EAAA,KAAA,EAAM,SAAU,EAAA,IAAA,EAAM,IAAI,CAAK,GAAA,IAAA,EAClE,OAAO,UAAc,IAAA,MAAA,CAAO,WAAW,YAC1C,CAAA;AAAA,WAEJ;AAAA,SAAA;AAAA,OACF;AAAA,MAEF,YAAc,EAAA,CAAA,MAAA,qBACX,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,QAAN,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAS,MAAO,CAAA,GAAI,CAC1C,CAAA;AAAA,KAAA;AAAA,GAGN,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,YAAA;AAAA,MACH,GAAA,EAAK,OAAO,cAAc,CAAA;AAAA,MAC1B,QAAQ,EAAA,IAAA;AAAA,MACR,QAAA,EAAU,iBAAiB,KAAQ,GAAA,IAAA;AAAA,MACnC,IAAM,EAAA,YAAA;AAAA,MACN,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,OAAS,EAAA,SAAA;AAAA,MACT,cAAA,EAAgB,CAAO,GAAA,KAAA,CAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAK,KAAS,KAAA,EAAA;AAAA,MACrC,iBAAmB,EAAA,CAAA,GAAA,KAAO,SAAU,CAAA,YAAA,EAAc,GAAG,CAAA;AAAA,MACrD,OAAS,EAAA,gBAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,GAAA,KAAQ,wBAAwB,GAAG,CAAA;AAAA,MACjD,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,YAAA;AAAA,UACN,UAAY,EAAA;AAAA,YACV,GAAG,MAAO,CAAA,UAAA;AAAA,YACV,8BACG,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,UAAN,IACE,EAAA,gBAAA,uCAAoB,gBAAiB,EAAA,EAAA,KAAA,EAAM,SAAU,EAAA,IAAA,EAAM,IAAI,CAAK,GAAA,IAAA,EACpE,OAAO,UAAc,IAAA,MAAA,CAAO,WAAW,YAC1C,CAAA;AAAA,WAEJ;AAAA,SAAA;AAAA,OACF;AAAA,MAEF,YAAc,EAAA,CAAA,MAAA,qBACX,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,QAAN,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAS,MAAO,CAAA,KAAM,CAC5C,CAAA;AAAA,KAAA;AAAA,GAGN,mBACC,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAO,EAAE,SAAA,EAAW,IAC/B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KACE,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,IAAe,EAAA,gBAAA,kBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,IAAA,EAAE,MAAI,CAAA,EAAI,MAAI,kBAAA,KAAA,CAAA,aAAA,CAAC,YAAG,aAAW,CAAA,EAAK,cAAY,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAE,EAAA,IAAA,EAAA,MAAI,CAAI,EAAA,sCAAA,kBACnE,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,IAAA,EAAE,oBAAkB,CAAA,EAAI,UAAQ,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,EAAA,yBAAuB,GAAK,GACvE,CAAA;AAAA,KAAA;AAAA,oBAGF,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,KAAA,EAAM,SAAU,EAAA,OAAA,EAAS,MAAM,kBAAA,CAAmB,YAAY,CAAA,EAAA,EAAG,OAE7F,CAAA;AAAA,GAEJ,CACF,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,EACZ,YAAa,CAAA,GAAA,CAAI,CAChB,GAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,OAAA;AAAA,MACL,GAAA,EAAK,GAAG,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,GAAG,CAAI,CAAA,EAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MAC5C,KAAA,EAAO,GAAG,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,GAAG,CAAI,CAAA,EAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MAC9C,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,KAAA;AAAA,GAEhC,CACH,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
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} </>}\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":";;;;;;;;;;;;;;;AAiBA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,WAAa,EAAA;AAAA,IACX,UAAA,EAAY,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC3B,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC5B,KAAO,EAAA,GAAA;AAAA,GACT;AACF,CAAE,CAAA,CAAA,CAAA;AAEF,MAAM,IAAO,mBAAA,KAAA,CAAA,aAAA,CAAC,wBAAyB,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AACxD,MAAM,WAAc,mBAAA,KAAA,CAAA,aAAA,CAAC,YAAa,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AAEnD,MAAM,WAAA,GAAc,UAAW,CAAA,CAAC,KAAkB,MAAA;AAAA,EAChD,OAAS,EAAA;AAAA,IACP,eAAiB,EAAA,SAAA;AAAA,IACjB,KAAO,EAAA,qBAAA;AAAA,IACP,QAAU,EAAA,GAAA;AAAA,IACV,QAAU,EAAA,KAAA,CAAM,UAAW,CAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,IACrC,MAAQ,EAAA,mBAAA;AAAA,GACV;AACF,CAAA,CAAE,EAAE,OAAO,CAAA,CAAA;AAEJ,MAAM,mBAA8C,CAAC;AAAA,EAC1D,OAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AACF,CAAM,KAAA;AACJ,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAM,MAAA,SAAA,GAAyC,sBAAsB,OAAO,CAAA,CAAA;AAG5E,EAAM,MAAA,CAAC,cAAc,gBAAgB,CAAA,GAAI,SAAmB,CAAC,KAAA,EAAO,OAAO,CAAC,CAAA,CAAA;AAC5E,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAiB,EAAA,CAAA;AAGvD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,SAA4B,KAAS,CAAA,CAAA,CAAA;AACnE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAA0B,KAAS,CAAA,CAAA,CAAA;AAC/E,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AACtD,EAAM,MAAA,cAAA,GAAiB,cAAc,OAAY,KAAA,KAAA,CAAA,CAAA;AAGjD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AACtD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA4B,KAAS,CAAA,CAAA,CAAA;AACvE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAC1D,EAAM,MAAA,gBAAA,GAAmB,gBAAgB,SAAc,KAAA,KAAA,CAAA,CAAA;AAGvD,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,CAAI,GAAA,QAAA,CAAgB,EAAE,CAAA,CAAA;AAE1D,EAAM,MAAA,cAAA,GAAiB,OAAO,iBAAiB,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AAEnC,EAAM,MAAA,mBAAA,GAAsB,CAAC,GAAA,EAAa,QAA6B,KAAA;AACrE,IAAA,aAAA,CAAc,EAAE,GAAG,OAAA,EAAS,CAAC,GAAG,GAAG,UAAU,CAAA,CAAA;AAAA,GAC/C,CAAA;AAEA,EAAM,MAAA,uBAAA,GAA0B,CAAC,QAA4B,KAAA;AAC3D,IAAA,cAAA,CAAe,EAAE,CAAA,CAAA;AACjB,IAAA,aAAA,CAAc,KAAK,CAAA,CAAA;AACnB,IAAgB,eAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAC7B,IAAA,UAAA,CAAW,KAAS,CAAA,CAAA,CAAA;AACpB,IAAA,iBAAA,CAAkB,KAAS,CAAA,CAAA,CAAA;AAC3B,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAA,YAAA,CAAa,EAAE,CAAA,CAAA;AAEf,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,cAAA,CAAe,QAAQ,CAAA,CAAA;AACvB,MAAA,aAAA,CAAc,IAAI,CAAA,CAAA;AAAA,KACpB;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,kBAAA,GAAqB,CAAC,MAAgC,KAAA;AAC1D,IAAA,iBAAA,CAAkB,KAAS,CAAA,CAAA,CAAA;AAC3B,IAAA,YAAA,CAAa,KAAS,CAAA,CAAA,CAAA;AACtB,IAAkB,iBAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAE/B,IAAI,IAAA,OAAO,WAAW,QAAU,EAAA;AAC9B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,iBAAA,CAAkB,MAAM,CAAA,CAAA;AACxB,MAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAAA,KACtB;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,uBAAA,GAA0B,CAAC,GAA6B,KAAA;AAC5D,IAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,GAAO,IAAA,CAAC,SAAU,CAAA,YAAA,EAAc,GAAG,CAAG,EAAA;AACxC,MAAkB,iBAAA,CAAA,CAAA,IAAA,KAAQ,CAAC,IAAI,CAAA,CAAA;AAC/B,MAAA,eAAA,CAAgB,CAAC,GAAG,YAAc,EAAA,GAAG,CAAC,CAAA,CAAA;AAAA,KACxC;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,eAAA,GAAkB,CAAC,WAAA,KAAqB,MAAM;AAClD,IAAA,eAAA;AAAA,MACE,YAAa,CAAA,MAAA;AAAA,QACX,CACE,GAAA,KAAA,EAAE,GAAI,CAAA,QAAA,KAAa,WAAY,CAAA,QAAA,IAAY,GAAI,CAAA,GAAA,KAAQ,WAAY,CAAA,GAAA,IAAO,GAAI,CAAA,KAAA,KAAU,WAAY,CAAA,KAAA,CAAA;AAAA,OACxG;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,WAAa,EAAA;AACf,QAAM,MAAA,cAAA,CACH,WAAW,WAAa,EAAA,UAAA,CAAW,YAAY,UAAW,CAAA,QAAQ,CAClE,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA;AAChB,UAAA,IAAI,SAAS,IAAM,EAAA;AACjB,YAAA,UAAA,CAAW,SAAS,IAAI,CAAA,CAAA;AAAA,WAC1B;AACA,UAAA,IAAI,QAAS,CAAA,MAAA,KAAW,GAAO,IAAA,QAAA,CAAS,MAAQ,EAAA;AAC9C,YAAA,oBAAA,CAAqB,SAAS,MAAM,CAAA,CAAA;AAAA,WACtC;AAAA,SACD,CAAA,CACA,KAAM,CAAA,CAAA,CAAA,KAAK,SAAS,IAAK,CAAA,EAAE,OAAS,EAAA,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,QAAU,EAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,OAC7E;AAAA,KACC,GAAA,CAAA;AAAA,GACL,EAAG,CAAC,cAAgB,EAAA,WAAA,EAAa,YAAY,cAAgB,EAAA,QAAA,EAAU,oBAAoB,CAAC,CAAA,CAAA;AAE5F,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,CAAC,YAAY;AACX,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAM,MAAA,cAAA,CACH,aAAa,cAAgB,EAAA,UAAA,CAAW,YAAY,UAAW,CAAA,QAAQ,CACvE,CAAA,IAAA,CAAK,CAAY,QAAA,KAAA;AAChB,UAAA,IAAI,SAAS,IAAM,EAAA;AACjB,YAAA,YAAA,CAAa,SAAS,IAAI,CAAA,CAAA;AAAA,WAC5B;AACA,UAAA,IAAI,QAAS,CAAA,MAAA,KAAW,GAAO,IAAA,QAAA,CAAS,MAAQ,EAAA;AAC9C,YAAA,oBAAA,CAAqB,SAAS,MAAM,CAAA,CAAA;AAAA,WACtC;AAAA,SACD,CAAA,CACA,KAAM,CAAA,CAAA,CAAA,KAAK,SAAS,IAAK,CAAA,EAAE,OAAS,EAAA,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,QAAU,EAAA,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,OAC7E;AAAA,KACC,GAAA,CAAA;AAAA,GACL,EAAG,CAAC,gBAAkB,EAAA,cAAA,EAAgB,YAAY,cAAgB,EAAA,QAAA,EAAU,oBAAoB,CAAC,CAAA,CAAA;AAEjG,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,EACZ,MAAO,CAAA,IAAA,CAAK,SAAS,CAAE,CAAA,GAAA,CAAI,CAC1B,GAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAAa,EAAA,GAAA,EAAK,CAAQ,KAAA,EAAA,GAAG,CAC3D,CAAA,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,QAAQ,EAAA,IAAA;AAAA,MACR,EAAA,EAAI,cAAc,GAAG,CAAA,CAAA;AAAA,MACrB,OAAS,EAAA,SAAA,CAAU,GAAG,CAAA,CAAE,IAAK,EAAA;AAAA,MAC7B,KAAO,EAAA,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAC;AAAA,MACxB,UAAU,CAAC,MAAA,EAAQ,OAAiB,OAAY,KAAA,mBAAA,CAAoB,KAAK,KAAK,CAAA;AAAA,MAC9E,oBAAoB,EAAA,IAAA;AAAA,MACpB,cAAc,CAAC,KAAA,EAAO,MAAQ,EAAA,EAAE,UAAe,KAAA;AAC7C,QAAA,IAAI,QAAW,GAAA,KAAA,CAAA,CAAA;AACf,QAAA,IAAI,YAAe,GAAA,KAAA,CAAA,CAAA;AACnB,QAAA,IAAI,WAAc,GAAA,KAAA,CAAA,CAAA;AAClB,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA,CAAA;AAChB,QAAA,IAAI,QAAQ,UAAY,EAAA;AACtB,UAAW,QAAA,GAAA,MAAA,CAAA;AACX,UAAA,YAAA,GAAe,gBAAgB,QAAQ,CAAA,CAAA;AAAA,mBAC9B,CAAC,SAAA,EAAW,SAAS,CAAE,CAAA,QAAA,CAAS,GAAG,CAAG,EAAA;AAC/C,UAAA,QAAA,GAAW,gBAAgB,MAAM,CAAA,CAAA;AACjC,UAAA,YAAA,GAAe,gBAAgB,QAAQ,CAAA,CAAA;AAAA,SACzC;AAEA,QAAA,IAAI,QAAQ,SAAW,EAAA;AACrB,UAAM,MAAA,OAAA,GAAU,mBAAmB,MAAO,CAAA,OAAA,CAAQ,GAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,CAAC,CAAA,CAAA;AACrE,UAAA,WAAA,GAAc,OAAQ,CAAA,WAAA,CAAA;AACtB,UAAA,SAAA,GAAY,OAAQ,CAAA,SAAA,CAAA;AAAA,SACtB;AAEA,QACE,uBAAA,KAAA,CAAA,aAAA,CAAC,IAAI,EAAA,EAAA,GAAG,KAAO,EAAA,GAAA,EAAK,0BACjB,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,IAAY,EAAA,WAAA,EAA0B,KAAO,EAAA,EAAE,aAAa,CAAE,EAAA,EAAG,OAAS,EAAA,QAAA,EAAU,CAC7F,EAAA,YAAA,8DAAmB,YAAa,EAAA,UAAY,CAC5C,EAAA,GAAA,KAAQ,SACP,mBAAA,KAAA,CAAA,aAAA,CAAC,6BACE,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAS,WAAY,CAAA,sCACxC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,KAAA,EAAM,eACjC,EAAA,EAAA,SACH,CACF,CAEA,mBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,OAAS,EAAA,EAAA,MAAA,CAAO,OAAQ,CAAA,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAK,EAAE,CAAE,CAEpE,CAAA,CAAA;AAAA,OAEJ;AAAA,MACA,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,aAAW,GAAG,MAAA,EAAQ,SAAQ,UAAW,EAAA,KAAA,EAAO,GAAI,CAAA,MAAA,CAAO,CAAC,CAAE,CAAA,WAAA,KAAgB,GAAI,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA,CAAA;AAAA,KAAA;AAAA,GAGnG,CACD,CACD,kBAAA,KAAA,CAAA,aAAA,CAAC,eAAY,KAAO,EAAA,EAAE,WAAW,EAAG,EAAA,EAAA,sCACjC,MAAO,EAAA,EAAA,OAAA,EAAQ,aAAY,KAAM,EAAA,SAAA,EAAU,SAAS,MAAM,aAAA,CAAc,EAAE,CAAG,EAAA,EAAA,eAE9E,CACF,CACF,CAAA,sCACC,IAAK,EAAA,EAAA,IAAA,EAAI,MAAC,EAAI,EAAA,EAAA,EAAA,sCACZ,OAAQ,EAAA,IAAA,CACX,mBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,sBACZ,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,eAAA;AAAA,MACH,OAAS,EAAA,YAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,QAAA,KAAa,wBAAwB,QAAQ,CAAA;AAAA,MAC3D,WAAA,EAAa,4BAAW,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAW,GAAG,MAAQ,EAAA,OAAA,EAAQ,UAAW,EAAA,KAAA,EAAM,cAAe,EAAA,CAAA;AAAA,MACtF,YAAc,EAAA,CAAC,KAAO,EAAA,MAAA,yCACnB,IAAI,EAAA,EAAA,GAAG,KAAO,EAAA,GAAA,EAAK,0BACjB,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,OAAA,EAAA,EAAS,MAAO,CACtC,CAAA;AAAA,KAAA;AAAA,GAGN,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,UAAA;AAAA,MACH,GAAA,EAAK,OAAO,YAAY,CAAA;AAAA,MAExB,QAAA,EAAU,cAAc,KAAQ,GAAA,IAAA;AAAA,MAChC,IAAM,EAAA,UAAA;AAAA,MACN,MAAA,EAAQ,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,MAChC,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,MAClC,OAAA,EAAS,OAAW,IAAA,OAAA,CAAQ,MAAS,GAAA,OAAA,GAAU,CAAC,EAAE,GAAK,EAAA,UAAA,EAAY,QAAU,EAAA,WAAA,EAAuB,CAAA;AAAA,MACpG,cAAA,EAAgB,SAAO,GAAI,CAAA,GAAA;AAAA,MAC3B,iBAAA,EAAmB,CAAO,GAAA,KAAA,GAAA,CAAI,GAAQ,KAAA,UAAA;AAAA,MACtC,OAAS,EAAA,cAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,MAAA,KAAW,mBAAmB,MAAM,CAAA;AAAA,MAClD,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,UAAA;AAAA,UACN,UAAY,EAAA;AAAA,YACV,GAAG,MAAO,CAAA,UAAA;AAAA,YACV,8BACG,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,UAAN,IACE,EAAA,cAAA,uCAAkB,gBAAiB,EAAA,EAAA,KAAA,EAAM,SAAU,EAAA,IAAA,EAAM,IAAI,CAAK,GAAA,IAAA,EAClE,OAAO,UAAc,IAAA,MAAA,CAAO,WAAW,YAC1C,CAAA;AAAA,WAEJ;AAAA,SAAA;AAAA,OACF;AAAA,MAEF,cAAc,CAAC,KAAA,EAAO,MACpB,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAI,GAAG,KAAA,EAAO,GAAK,EAAA,MAAA,CAAO,uBACxB,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,OAAS,EAAA,EAAA,MAAA,CAAO,GAAI,CAC1C,CAAA;AAAA,KAAA;AAAA,GAGN,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,SAAA,EAAW,QAAQ,WAC9B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,YAAA;AAAA,MACH,GAAA,EAAK,OAAO,cAAc,CAAA;AAAA,MAE1B,QAAA,EAAU,iBAAiB,KAAQ,GAAA,IAAA;AAAA,MACnC,IAAM,EAAA,YAAA;AAAA,MACN,MAAA,EAAQ,MAAM,eAAA,CAAgB,IAAI,CAAA;AAAA,MAClC,OAAA,EAAS,MAAM,eAAA,CAAgB,KAAK,CAAA;AAAA,MACpC,OACE,EAAA,SAAA,IAAa,SAAU,CAAA,MAAA,GACnB,SACA,GAAA,CAAC,EAAE,GAAA,EAAK,UAAY,EAAA,KAAA,EAAO,UAAY,EAAA,QAAA,EAAU,aAAuB,CAAA;AAAA,MAE9E,cAAA,EAAgB,CAAO,GAAA,KAAA,CAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAK,KAAS,KAAA,EAAA;AAAA,MACrC,mBAAmB,CAAO,GAAA,KAAA,CAAA,GAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,GAAA,CAAK,WAAU,UAAc,IAAA,SAAA,CAAU,cAAc,GAAG,CAAA;AAAA,MAClF,OAAS,EAAA,gBAAA;AAAA,MACT,QAAU,EAAA,CAAC,CAAG,EAAA,GAAA,KAAQ,wBAAwB,GAAG,CAAA;AAAA,MACjD,aAAa,CACX,MAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACJ,OAAQ,EAAA,UAAA;AAAA,UACR,KAAM,EAAA,YAAA;AAAA,UACN,UAAY,EAAA;AAAA,YACV,GAAG,MAAO,CAAA,UAAA;AAAA,YACV,8BACG,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,UAAN,IACE,EAAA,gBAAA,uCAAoB,gBAAiB,EAAA,EAAA,KAAA,EAAM,SAAU,EAAA,IAAA,EAAM,IAAI,CAAK,GAAA,IAAA,EACpE,OAAO,UAAc,IAAA,MAAA,CAAO,WAAW,YAC1C,CAAA;AAAA,WAEJ;AAAA,SAAA;AAAA,OACF;AAAA,MAEF,cAAc,CAAC,KAAA,EAAO,MACpB,qBAAA,KAAA,CAAA,aAAA,CAAC,QAAI,GAAG,KAAA,EAAO,GAAK,EAAA,MAAA,CAAO,yBACxB,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,SAAQ,OAAS,EAAA,EAAA,MAAA,CAAO,KAAM,CAC5C,CAAA;AAAA,KAAA;AAAA,GAGN,mBACC,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,OAAO,EAAE,SAAA,EAAW,IAC/B,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,KACE,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,QAAA,EAAN,IAAe,EAAA,gBAAA,kBACC,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,IAAA,EAAE,MAAI,CAAA,EAAI,MAAI,kBAAA,KAAA,CAAA,aAAA,CAAC,YAAG,aAAW,CAAA,EAAK,cAAY,kBAAA,KAAA,CAAA,aAAA,CAAC,GAAE,EAAA,IAAA,EAAA,MAAI,CAAI,EAAA,sCAAA,kBACnE,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,IAAA,EAAE,oBAAkB,CAAA,EAAI,UAAQ,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAG,EAAA,IAAA,EAAA,yBAAuB,GAAK,GACvE,CAAA;AAAA,KAAA;AAAA,oBAGF,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,OAAA,EAAQ,WAAY,EAAA,KAAA,EAAM,SAAU,EAAA,OAAA,EAAS,MAAM,kBAAA,CAAmB,YAAY,CAAA,EAAA,EAAG,OAE7F,CAAA;AAAA,GAEJ,CACF,CAAA,kBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,EACZ,YAAa,CAAA,GAAA,CAAI,CAChB,GAAA,qBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,IAAK,EAAA,OAAA;AAAA,MACL,GAAA,EAAK,GAAG,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,GAAG,CAAI,CAAA,EAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MAC5C,KAAA,EAAO,GAAG,GAAI,CAAA,QAAQ,IAAI,GAAI,CAAA,GAAG,CAAI,CAAA,EAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,MAC9C,QAAA,EAAU,gBAAgB,GAAG,CAAA;AAAA,KAAA;AAAA,GAEhC,CACH,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -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 '@
|
|
3
|
-
import CancelIcon from '@
|
|
4
|
-
import DeleteIcon from '@
|
|
5
|
-
import EditIcon from '@
|
|
6
|
-
import SaveIcon from '@
|
|
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: "
|
|
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: "
|
|
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
|
);
|
package/dist/components/MetricConfigurationComponent/MetricConfigurationComponent.esm.js.map
CHANGED
|
@@ -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)} {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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"}
|