@electrolux-oss/plugin-infrawallet 0.1.8 → 0.1.9

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.
@@ -7,7 +7,7 @@ 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 CloseIcon from '@material-ui/icons/Close';
10
+ import CancelIcon from '@material-ui/icons/Close';
11
11
  import Alert from '@material-ui/lab/Alert';
12
12
  import React from 'react';
13
13
 
@@ -28,7 +28,7 @@ const ErrorsAlertComponent = ({ errors }) => {
28
28
  setOpen(false);
29
29
  }
30
30
  },
31
- /* @__PURE__ */ React.createElement(CloseIcon, { fontSize: "inherit" })
31
+ /* @__PURE__ */ React.createElement(CancelIcon, { fontSize: "inherit" })
32
32
  )
33
33
  },
34
34
  /* @__PURE__ */ React.createElement("p", null, "InfraWallet failed to fetch cloud costs from some of the configured accounts. Here are the list of errors."),
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorsAlertComponent.esm.js","sources":["../../../src/components/ErrorsAlertComponent/ErrorsAlertComponent.tsx"],"sourcesContent":["import Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Alert from '@material-ui/lab/Alert';\nimport 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 <p>\n InfraWallet failed to fetch cloud costs from some of the configured accounts. Here are the list of errors.\n </p>\n <TableContainer component={Paper}>\n <Table aria-label=\"errors table\">\n <TableHead>\n <TableRow>\n <TableCell style={{ minWidth: '150px' }}>Account Name</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":";;;;;;;;;;;;;AAcO,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,WAAE,4GAEH,CAAA;AAAA,oBACA,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,cAAY,CAAA,kBACpD,KAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,EAAU,eAAa,CAC1B,CACF,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,iBACE,MAAO,CAAA,GAAA,CAAI,yBACT,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EAAS,GAAK,EAAA,GAAA,CAAI,IACjB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,iBAAW,GAAI,CAAA,IAAK,CACrB,kBAAA,KAAA,CAAA,aAAA,CAAC,SAAW,EAAA,IAAA,EAAA,GAAA,CAAI,KAAM,CACxB,CACD,CACH,CACF,CACF,CAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ErrorsAlertComponent.esm.js","sources":["../../../src/components/ErrorsAlertComponent/ErrorsAlertComponent.tsx"],"sourcesContent":["import Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport CloseIcon from '@material-ui/icons/Close';\nimport Alert from '@material-ui/lab/Alert';\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 <p>\n InfraWallet failed to fetch cloud costs from some of the configured accounts. Here are the list of errors.\n </p>\n <TableContainer component={Paper}>\n <Table aria-label=\"errors table\">\n <TableHead>\n <TableRow>\n <TableCell style={{ minWidth: '150px' }}>Account Name</TableCell>\n <TableCell>Error Message</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {errors.map(row => (\n <TableRow key={row.name}>\n <TableCell>{row.name}</TableCell>\n <TableCell>{row.error}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </TableContainer>\n </Alert>\n </Collapse>\n );\n};\n"],"names":["CloseIcon"],"mappings":";;;;;;;;;;;;;AAcO,MAAM,oBAA6D,GAAA,CAAC,EAAE,MAAA,EAAa,KAAA;AACxF,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAA,KAAA,CAAM,SAAS,IAAI,CAAA,CAAA;AAE3C,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,EAAA,EAAI,IACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,QAAS,EAAA,SAAA;AAAA,MACT,KAAO,EAAA,EAAE,SAAW,EAAA,OAAA,EAAS,UAAU,MAAO,EAAA;AAAA,MAC9C,MACE,kBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,OAAA;AAAA,UACX,KAAM,EAAA,SAAA;AAAA,UACN,IAAK,EAAA,OAAA;AAAA,UACL,SAAS,MAAM;AACb,YAAA,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,WACf;AAAA,SAAA;AAAA,wBAEA,KAAA,CAAA,aAAA,CAACA,UAAU,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,CAAA;AAAA,OAChC;AAAA,KAAA;AAAA,oBAGF,KAAA,CAAA,aAAA,CAAC,WAAE,4GAEH,CAAA;AAAA,oBACA,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,cAAY,CAAA,kBACpD,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,6 +1,6 @@
1
1
  import { useApi, configApiRef, alertApiRef } from '@backstage/core-plugin-api';
2
2
  import AddIcon from '@material-ui/icons/Add';
3
- import CloseIcon from '@material-ui/icons/Close';
3
+ import CancelIcon from '@material-ui/icons/Close';
4
4
  import DeleteIcon from '@material-ui/icons/DeleteOutlined';
5
5
  import EditIcon from '@material-ui/icons/Edit';
6
6
  import SaveIcon from '@material-ui/icons/Save';
@@ -175,7 +175,7 @@ const MetricConfigurationComponent = ({ wallet }) => {
175
175
  /* @__PURE__ */ React.createElement(
176
176
  GridActionsCellItem,
177
177
  {
178
- icon: /* @__PURE__ */ React.createElement(CloseIcon, null),
178
+ icon: /* @__PURE__ */ React.createElement(CancelIcon, null),
179
179
  label: "Cancel",
180
180
  className: "textPrimary",
181
181
  onClick: handleCancelClick(id),
@@ -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 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: '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","CancelIcon"],"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 '@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 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: '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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"}
@@ -45,8 +45,9 @@ const checkIfFiltersActivated = (filters) => {
45
45
  });
46
46
  return activated;
47
47
  };
48
- const ReportsComponent = () => {
48
+ const ReportsComponent = (props) => {
49
49
  var _a, _b;
50
+ const { title, subTitle } = props;
50
51
  const configApi = useApi(configApiRef);
51
52
  const params = useParams();
52
53
  const defaultGroupBy = (_a = configApi.getOptionalString("infraWallet.settings.defaultGroupBy")) != null ? _a : "none";
@@ -62,7 +63,7 @@ const ReportsComponent = () => {
62
63
  const [reportTags, setReportTags] = useState([]);
63
64
  const [granularity, setGranularity] = useState("monthly");
64
65
  const [aggregatedBy, setAggregatedBy] = useState(defaultGroupBy);
65
- const [groups, _setGroups] = useState("");
66
+ const [groups] = useState("");
66
67
  const [monthRangeState, setMonthRangeState] = React.useState({
67
68
  startMonth: startOfMonth(addMonths(/* @__PURE__ */ new Date(), defaultShowLastXMonths * -1 + 1)),
68
69
  endMonth: endOfMonth(/* @__PURE__ */ new Date())
@@ -109,7 +110,7 @@ const ReportsComponent = () => {
109
110
  fetchCostReportsCallback();
110
111
  fetchMetricsCallback();
111
112
  }, [fetchCostReportsCallback, fetchMetricsCallback]);
112
- return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Header, { title: "InfraWallet" }), /* @__PURE__ */ React.createElement(Content, null, submittingState ? /* @__PURE__ */ React.createElement(Progress, null) : null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, cloudProviderErrors.length > 0 && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(ErrorsAlertComponent, { errors: cloudProviderErrors })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
113
+ return /* @__PURE__ */ React.createElement(Page, { themeId: "tool" }, /* @__PURE__ */ React.createElement(Header, { title: title != null ? title : "InfraWallet", subtitle: subTitle != null ? subTitle : "" }), /* @__PURE__ */ React.createElement(Content, null, submittingState ? /* @__PURE__ */ React.createElement(Progress, null) : null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3 }, cloudProviderErrors.length > 0 && /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(ErrorsAlertComponent, { errors: cloudProviderErrors })), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
113
114
  TopbarComponent,
114
115
  {
115
116
  aggregatedBy,
@@ -1 +1 @@
1
- {"version":3,"file":"ReportsComponent.esm.js","sources":["../../../src/components/ReportsComponent/ReportsComponent.tsx"],"sourcesContent":["import { Content, Header, Page, Progress } from '@backstage/core-components';\nimport { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Chip, Grid } from '@material-ui/core';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { addMonths, endOfMonth, startOfMonth } from 'date-fns';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport {\n aggregateCostReports,\n filterCostReports,\n getAllReportTags,\n getPeriodStrings,\n mergeCostReports,\n} from '../../api/functions';\nimport { CloudProviderError, Filters, Metric, Report } from '../../api/types';\nimport { ColumnsChartComponent } from '../ColumnsChartComponent';\nimport { CostReportsTableComponent } from '../CostReportsTableComponent';\nimport { ErrorsAlertComponent } from '../ErrorsAlertComponent';\nimport { FiltersComponent } from '../FiltersComponent';\nimport { PieChartComponent } from '../PieChartComponent';\nimport { TopbarComponent } from '../TopbarComponent';\nimport { MonthRange } from '../types';\n\nconst getTotalCost = (report: Report): number => {\n let total = 0;\n Object.keys(report.reports).forEach((s: string) => {\n total += report.reports[s];\n });\n return total;\n};\n\nconst rearrangeData = (report: Report, periods: string[]): any[] => {\n const costs: any[] = [];\n periods.forEach((s: string) => {\n if (report.reports[s] !== undefined) {\n costs.push(report.reports[s]);\n } else {\n costs.push(null);\n }\n });\n return costs;\n};\n\nconst checkIfFiltersActivated = (filters: Filters): boolean => {\n let activated = false;\n Object.keys(filters).forEach((key: string) => {\n if (filters[key].length > 0) {\n activated = true;\n }\n });\n return activated;\n};\n\nexport const ReportsComponent = () => {\n const configApi = useApi(configApiRef);\n const params = useParams();\n\n const defaultGroupBy = configApi.getOptionalString('infraWallet.settings.defaultGroupBy') ?? 'none';\n const defaultShowLastXMonths = configApi.getOptionalNumber('infraWallet.settings.defaultShowLastXMonths') ?? 3;\n\n const MERGE_THRESHOLD = 8;\n const [submittingState, setSubmittingState] = useState<Boolean>(false);\n const [reports, setReports] = useState<Report[]>([]);\n const [metrics, setMetrics] = useState<Metric[]>([]);\n const [filters, setFilters] = useState<Filters>({});\n const [cloudProviderErrors, setCloudProviderErrors] = useState<CloudProviderError[]>([]);\n const [reportsAggregated, setReportsAggregated] = useState<Report[]>([]);\n const [reportsAggregatedAndMerged, setReportsAggregatedAndMerged] = useState<Report[]>([]);\n const [reportTags, setReportTags] = useState<string[]>([]);\n const [granularity, setGranularity] = useState<string>('monthly');\n const [aggregatedBy, setAggregatedBy] = useState<string>(defaultGroupBy);\n const [groups, _setGroups] = useState<string>('');\n const [monthRangeState, setMonthRangeState] = React.useState<MonthRange>({\n startMonth: startOfMonth(addMonths(new Date(), defaultShowLastXMonths * -1 + 1)),\n endMonth: endOfMonth(new Date()),\n });\n const [periods, setPeriods] = useState<string[]>([]);\n\n const alertApi = useApi(alertApiRef);\n const infraWalletApi = useApi(infraWalletApiRef);\n\n const fetchCostReportsCallback = useCallback(async () => {\n setSubmittingState(true);\n await infraWalletApi\n .getCostReports('', groups, granularity, monthRangeState.startMonth, monthRangeState.endMonth)\n .then(reportsResponse => {\n if (reportsResponse.data && reportsResponse.data.length > 0) {\n setReports(reportsResponse.data);\n setPeriods(getPeriodStrings(granularity, monthRangeState.startMonth, monthRangeState.endMonth));\n }\n if (reportsResponse.status === 207 && reportsResponse.errors) {\n setCloudProviderErrors(reportsResponse.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n setSubmittingState(false);\n }, [groups, monthRangeState, granularity, infraWalletApi, alertApi]);\n\n const fetchMetricsCallback = useCallback(async () => {\n await infraWalletApi\n .getMetrics(params.name ?? 'default', granularity, monthRangeState.startMonth, monthRangeState.endMonth)\n .then(metricsResponse => {\n if (metricsResponse.data && metricsResponse.data.length > 0) {\n setMetrics(metricsResponse.data);\n }\n if (metricsResponse.status === 207 && metricsResponse.errors) {\n setCloudProviderErrors(metricsResponse.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }, [params.name, monthRangeState, granularity, infraWalletApi, alertApi]);\n\n useEffect(() => {\n if (reports.length !== 0) {\n const filteredReports = filterCostReports(reports, filters);\n const arrgegatedReports = aggregateCostReports(filteredReports, aggregatedBy);\n const aggregatedAndMergedReports = mergeCostReports(arrgegatedReports, MERGE_THRESHOLD);\n const allTags = getAllReportTags(reports);\n setReportsAggregated(arrgegatedReports);\n setReportsAggregatedAndMerged(aggregatedAndMergedReports);\n setReportTags(allTags);\n }\n }, [filters, reports, aggregatedBy, granularity, monthRangeState]);\n\n useEffect(() => {\n fetchCostReportsCallback();\n fetchMetricsCallback();\n }, [fetchCostReportsCallback, fetchMetricsCallback]);\n\n return (\n <Page themeId=\"tool\">\n <Header title=\"InfraWallet\" />\n <Content>\n {submittingState ? <Progress /> : null}\n <Grid container spacing={3}>\n {cloudProviderErrors.length > 0 && (\n <Grid item xs={12}>\n <ErrorsAlertComponent errors={cloudProviderErrors} />\n </Grid>\n )}\n <Grid item xs={12}>\n <TopbarComponent\n aggregatedBy={aggregatedBy}\n aggregatedBySetter={setAggregatedBy}\n tags={reportTags}\n monthRange={monthRangeState}\n monthRangeSetter={setMonthRangeState}\n />\n </Grid>\n <Grid item xs={12}>\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />} aria-controls=\"filters-content\" id=\"filters-header\">\n <Typography>\n Filters {checkIfFiltersActivated(filters) && <Chip size=\"small\" label=\"active\" color=\"primary\" />}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <FiltersComponent reports={reports} filters={filters} filtersSetter={setFilters} />\n </AccordionDetails>\n </Accordion>\n </Grid>\n <Grid item xs={12} md={4} lg={3}>\n {reportsAggregatedAndMerged.length > 0 && (\n <PieChartComponent\n categories={reportsAggregatedAndMerged.map((item: any) => item.id)}\n series={reportsAggregatedAndMerged.map((item: any) => getTotalCost(item))}\n height={350}\n />\n )}\n </Grid>\n <Grid item xs={12} md={8} lg={9}>\n {reportsAggregatedAndMerged.length > 0 && (\n <ColumnsChartComponent\n granularitySetter={setGranularity}\n categories={periods}\n series={reportsAggregatedAndMerged.map((item: any) => ({\n name: item.id,\n type: 'column',\n data: rearrangeData(item, periods),\n }))}\n metrics={metrics.map((item: any) => ({\n name: item.id,\n type: 'line',\n data: rearrangeData(item, periods),\n }))}\n height={350}\n />\n )}\n </Grid>\n <Grid item xs={12}>\n {reportsAggregated.length > 0 && (\n <CostReportsTableComponent reports={reportsAggregated} aggregatedBy={aggregatedBy} periods={periods} />\n )}\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"ReportsComponent.esm.js","sources":["../../../src/components/ReportsComponent/ReportsComponent.tsx"],"sourcesContent":["import { Content, Header, Page, Progress } from '@backstage/core-components';\nimport { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { Chip, Grid } from '@material-ui/core';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { addMonths, endOfMonth, startOfMonth } from 'date-fns';\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { useParams } from 'react-router-dom';\nimport { infraWalletApiRef } from '../../api/InfraWalletApi';\nimport {\n aggregateCostReports,\n filterCostReports,\n getAllReportTags,\n getPeriodStrings,\n mergeCostReports,\n} from '../../api/functions';\nimport { CloudProviderError, Filters, Metric, Report } from '../../api/types';\nimport { ColumnsChartComponent } from '../ColumnsChartComponent';\nimport { CostReportsTableComponent } from '../CostReportsTableComponent';\nimport { ErrorsAlertComponent } from '../ErrorsAlertComponent';\nimport { FiltersComponent } from '../FiltersComponent';\nimport { PieChartComponent } from '../PieChartComponent';\nimport { TopbarComponent } from '../TopbarComponent';\nimport { MonthRange } from '../types';\n\nexport interface ReportsComponentProps {\n title?: string;\n subTitle?: string;\n}\n\nconst getTotalCost = (report: Report): number => {\n let total = 0;\n Object.keys(report.reports).forEach((s: string) => {\n total += report.reports[s];\n });\n return total;\n};\n\nconst rearrangeData = (report: Report, periods: string[]): any[] => {\n const costs: any[] = [];\n periods.forEach((s: string) => {\n if (report.reports[s] !== undefined) {\n costs.push(report.reports[s]);\n } else {\n costs.push(null);\n }\n });\n return costs;\n};\n\nconst checkIfFiltersActivated = (filters: Filters): boolean => {\n let activated = false;\n Object.keys(filters).forEach((key: string) => {\n if (filters[key].length > 0) {\n activated = true;\n }\n });\n return activated;\n};\n\nexport const ReportsComponent = (props: ReportsComponentProps) => {\n const { title, subTitle } = props;\n const configApi = useApi(configApiRef);\n const params = useParams();\n\n const defaultGroupBy = configApi.getOptionalString('infraWallet.settings.defaultGroupBy') ?? 'none';\n const defaultShowLastXMonths = configApi.getOptionalNumber('infraWallet.settings.defaultShowLastXMonths') ?? 3;\n\n const MERGE_THRESHOLD = 8;\n const [submittingState, setSubmittingState] = useState<boolean>(false);\n const [reports, setReports] = useState<Report[]>([]);\n const [metrics, setMetrics] = useState<Metric[]>([]);\n const [filters, setFilters] = useState<Filters>({});\n const [cloudProviderErrors, setCloudProviderErrors] = useState<CloudProviderError[]>([]);\n const [reportsAggregated, setReportsAggregated] = useState<Report[]>([]);\n const [reportsAggregatedAndMerged, setReportsAggregatedAndMerged] = useState<Report[]>([]);\n const [reportTags, setReportTags] = useState<string[]>([]);\n const [granularity, setGranularity] = useState<string>('monthly');\n const [aggregatedBy, setAggregatedBy] = useState<string>(defaultGroupBy);\n const [groups] = useState<string>('');\n const [monthRangeState, setMonthRangeState] = React.useState<MonthRange>({\n startMonth: startOfMonth(addMonths(new Date(), defaultShowLastXMonths * -1 + 1)),\n endMonth: endOfMonth(new Date()),\n });\n const [periods, setPeriods] = useState<string[]>([]);\n\n const alertApi = useApi(alertApiRef);\n const infraWalletApi = useApi(infraWalletApiRef);\n\n const fetchCostReportsCallback = useCallback(async () => {\n setSubmittingState(true);\n await infraWalletApi\n .getCostReports('', groups, granularity, monthRangeState.startMonth, monthRangeState.endMonth)\n .then(reportsResponse => {\n if (reportsResponse.data && reportsResponse.data.length > 0) {\n setReports(reportsResponse.data);\n setPeriods(getPeriodStrings(granularity, monthRangeState.startMonth, monthRangeState.endMonth));\n }\n if (reportsResponse.status === 207 && reportsResponse.errors) {\n setCloudProviderErrors(reportsResponse.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n setSubmittingState(false);\n }, [groups, monthRangeState, granularity, infraWalletApi, alertApi]);\n\n const fetchMetricsCallback = useCallback(async () => {\n await infraWalletApi\n .getMetrics(params.name ?? 'default', granularity, monthRangeState.startMonth, monthRangeState.endMonth)\n .then(metricsResponse => {\n if (metricsResponse.data && metricsResponse.data.length > 0) {\n setMetrics(metricsResponse.data);\n }\n if (metricsResponse.status === 207 && metricsResponse.errors) {\n setCloudProviderErrors(metricsResponse.errors);\n }\n })\n .catch(e => alertApi.post({ message: `${e.message}`, severity: 'error' }));\n }, [params.name, monthRangeState, granularity, infraWalletApi, alertApi]);\n\n useEffect(() => {\n if (reports.length !== 0) {\n const filteredReports = filterCostReports(reports, filters);\n const arrgegatedReports = aggregateCostReports(filteredReports, aggregatedBy);\n const aggregatedAndMergedReports = mergeCostReports(arrgegatedReports, MERGE_THRESHOLD);\n const allTags = getAllReportTags(reports);\n setReportsAggregated(arrgegatedReports);\n setReportsAggregatedAndMerged(aggregatedAndMergedReports);\n setReportTags(allTags);\n }\n }, [filters, reports, aggregatedBy, granularity, monthRangeState]);\n\n useEffect(() => {\n fetchCostReportsCallback();\n fetchMetricsCallback();\n }, [fetchCostReportsCallback, fetchMetricsCallback]);\n\n return (\n <Page themeId=\"tool\">\n <Header title={title ?? 'InfraWallet'} subtitle={subTitle ?? ''} />\n <Content>\n {submittingState ? <Progress /> : null}\n <Grid container spacing={3}>\n {cloudProviderErrors.length > 0 && (\n <Grid item xs={12}>\n <ErrorsAlertComponent errors={cloudProviderErrors} />\n </Grid>\n )}\n <Grid item xs={12}>\n <TopbarComponent\n aggregatedBy={aggregatedBy}\n aggregatedBySetter={setAggregatedBy}\n tags={reportTags}\n monthRange={monthRangeState}\n monthRangeSetter={setMonthRangeState}\n />\n </Grid>\n <Grid item xs={12}>\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />} aria-controls=\"filters-content\" id=\"filters-header\">\n <Typography>\n Filters {checkIfFiltersActivated(filters) && <Chip size=\"small\" label=\"active\" color=\"primary\" />}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <FiltersComponent reports={reports} filters={filters} filtersSetter={setFilters} />\n </AccordionDetails>\n </Accordion>\n </Grid>\n <Grid item xs={12} md={4} lg={3}>\n {reportsAggregatedAndMerged.length > 0 && (\n <PieChartComponent\n categories={reportsAggregatedAndMerged.map((item: any) => item.id)}\n series={reportsAggregatedAndMerged.map((item: any) => getTotalCost(item))}\n height={350}\n />\n )}\n </Grid>\n <Grid item xs={12} md={8} lg={9}>\n {reportsAggregatedAndMerged.length > 0 && (\n <ColumnsChartComponent\n granularitySetter={setGranularity}\n categories={periods}\n series={reportsAggregatedAndMerged.map((item: any) => ({\n name: item.id,\n type: 'column',\n data: rearrangeData(item, periods),\n }))}\n metrics={metrics.map((item: any) => ({\n name: item.id,\n type: 'line',\n data: rearrangeData(item, periods),\n }))}\n height={350}\n />\n )}\n </Grid>\n <Grid item xs={12}>\n {reportsAggregated.length > 0 && (\n <CostReportsTableComponent reports={reportsAggregated} aggregatedBy={aggregatedBy} periods={periods} />\n )}\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":["_a"],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { Routes, Route } from 'react-router-dom';
3
+ import { SettingsComponent } from './SettingsComponent/SettingsComponent.esm.js';
4
+ import { ReportsComponent } from './ReportsComponent/ReportsComponent.esm.js';
5
+
6
+ const Router = (props) => {
7
+ return /* @__PURE__ */ React.createElement(Routes, null, /* @__PURE__ */ React.createElement(Route, { path: "/", element: /* @__PURE__ */ React.createElement(ReportsComponent, { ...props }) }), /* @__PURE__ */ React.createElement(Route, { path: "/:name", element: /* @__PURE__ */ React.createElement(ReportsComponent, { ...props }) }), /* @__PURE__ */ React.createElement(Route, { path: "/:name/settings", element: /* @__PURE__ */ React.createElement(SettingsComponent, null) }));
8
+ };
9
+
10
+ export { Router };
11
+ //# sourceMappingURL=Router.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router.esm.js","sources":["../../src/components/Router.tsx"],"sourcesContent":["import React from 'react';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { SettingsComponent } from './SettingsComponent';\nimport { ReportsComponent, ReportsComponentProps } from './ReportsComponent';\n\nexport const Router = (props: ReportsComponentProps) => {\n return (\n <Routes>\n <Route path=\"/\" element={<ReportsComponent {...props} />} />\n <Route path=\"/:name\" element={<ReportsComponent {...props} />} />\n <Route path=\"/:name/settings\" element={<SettingsComponent />} />\n </Routes>\n );\n};\n"],"names":[],"mappings":";;;;;AAMa,MAAA,MAAA,GAAS,CAAC,KAAiC,KAAA;AACtD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,MAAK,GAAI,EAAA,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,CAAI,EAAA,CAAA,sCACzD,KAAM,EAAA,EAAA,IAAA,EAAK,QAAS,EAAA,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA,EAAkB,GAAG,KAAA,EAAO,GAAI,CAC/D,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,IAAA,EAAK,iBAAkB,EAAA,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,IAAkB,GAAI,CAChE,CAAA,CAAA;AAEJ;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,15 +1,21 @@
1
1
  /// <reference types="react" />
2
- import * as react from 'react';
3
- import react__default from 'react';
2
+ import * as React from 'react';
3
+ import React__default from 'react';
4
4
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
5
5
 
6
+ declare const InfraWalletIcon: () => React__default.JSX.Element;
7
+
8
+ interface ReportsComponentProps {
9
+ title?: string;
10
+ subTitle?: string;
11
+ }
12
+
6
13
  declare const infraWalletPlugin: _backstage_core_plugin_api.BackstagePlugin<{
7
- root: _backstage_core_plugin_api.RouteRef<{
14
+ root: _backstage_core_plugin_api.RouteRef<undefined>;
15
+ settings: _backstage_core_plugin_api.RouteRef<{
8
16
  name: string;
9
17
  }>;
10
18
  }, {}, {}>;
11
- declare const InfraWalletPage: () => react.JSX.Element;
12
-
13
- declare const InfraWalletIcon: () => react__default.JSX.Element;
19
+ declare const InfraWalletPage: (props: ReportsComponentProps) => React.JSX.Element;
14
20
 
15
- export { InfraWalletIcon, InfraWalletPage, infraWalletPlugin };
21
+ export { InfraWalletIcon, InfraWalletPage, type ReportsComponentProps, infraWalletPlugin };
package/dist/index.esm.js CHANGED
@@ -1,3 +1,3 @@
1
- export { InfraWalletPage, infraWalletPlugin } from './plugin.esm.js';
2
1
  export { InfraWalletIcon } from './components/InfraWalletIcon.esm.js';
2
+ export { InfraWalletPage, infraWalletPlugin } from './plugin.esm.js';
3
3
  //# sourceMappingURL=index.esm.js.map
@@ -1,12 +1,13 @@
1
1
  import { createPlugin, createApiFactory, identityApiRef, configApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
2
- import { rootRouteRef } from './routes.esm.js';
2
+ import { rootRouteRef, settingsRouteRef } from './routes.esm.js';
3
3
  import { infraWalletApiRef } from './api/InfraWalletApi.esm.js';
4
4
  import { InfraWalletApiClient } from './api/InfraWalletApiClient.esm.js';
5
5
 
6
6
  const infraWalletPlugin = createPlugin({
7
7
  id: "infrawallet",
8
8
  routes: {
9
- root: rootRouteRef
9
+ root: rootRouteRef,
10
+ settings: settingsRouteRef
10
11
  },
11
12
  apis: [
12
13
  createApiFactory({
@@ -19,7 +20,7 @@ const infraWalletPlugin = createPlugin({
19
20
  const InfraWalletPage = infraWalletPlugin.provide(
20
21
  createRoutableExtension({
21
22
  name: "InfraWalletPage",
22
- component: () => import('./routes.esm.js').then((m) => m.RootRoute),
23
+ component: () => import('./components/Router.esm.js').then((m) => m.Router),
23
24
  mountPoint: rootRouteRef
24
25
  })
25
26
  );
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n identityApiRef,\n configApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { infraWalletApiRef } from './api/InfraWalletApi';\nimport { InfraWalletApiClient } from './api/InfraWalletApiClient';\n\nexport const infraWalletPlugin = createPlugin({\n id: 'infrawallet',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: infraWalletApiRef,\n deps: { identityApi: identityApiRef, configApi: configApiRef },\n factory: ({ identityApi, configApi }) => new InfraWalletApiClient({ identityApi, configApi }),\n }),\n ],\n});\n\nexport const InfraWalletPage = infraWalletPlugin.provide(\n createRoutableExtension({\n name: 'InfraWalletPage',\n component: () => import('./routes').then(m => m.RootRoute),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAYO,MAAM,oBAAoB,YAAa,CAAA;AAAA,EAC5C,EAAI,EAAA,aAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,GACR;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,iBAAA;AAAA,MACL,IAAM,EAAA,EAAE,WAAa,EAAA,cAAA,EAAgB,WAAW,YAAa,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,WAAa,EAAA,SAAA,EAAgB,KAAA,IAAI,oBAAqB,CAAA,EAAE,WAAa,EAAA,SAAA,EAAW,CAAA;AAAA,KAC7F,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAEM,MAAM,kBAAkB,iBAAkB,CAAA,OAAA;AAAA,EAC/C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,iBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,iBAAU,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,SAAS,CAAA;AAAA,IACzD,UAAY,EAAA,YAAA;AAAA,GACb,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n identityApiRef,\n configApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, settingsRouteRef } from './routes';\nimport { infraWalletApiRef } from './api/InfraWalletApi';\nimport { InfraWalletApiClient } from './api/InfraWalletApiClient';\n\nexport const infraWalletPlugin = createPlugin({\n id: 'infrawallet',\n routes: {\n root: rootRouteRef,\n settings: settingsRouteRef,\n },\n apis: [\n createApiFactory({\n api: infraWalletApiRef,\n deps: { identityApi: identityApiRef, configApi: configApiRef },\n factory: ({ identityApi, configApi }) => new InfraWalletApiClient({ identityApi, configApi }),\n }),\n ],\n});\n\nexport const InfraWalletPage = infraWalletPlugin.provide(\n createRoutableExtension({\n name: 'InfraWalletPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;;AAYO,MAAM,oBAAoB,YAAa,CAAA;AAAA,EAC5C,EAAI,EAAA,aAAA;AAAA,EACJ,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,YAAA;AAAA,IACN,QAAU,EAAA,gBAAA;AAAA,GACZ;AAAA,EACA,IAAM,EAAA;AAAA,IACJ,gBAAiB,CAAA;AAAA,MACf,GAAK,EAAA,iBAAA;AAAA,MACL,IAAM,EAAA,EAAE,WAAa,EAAA,cAAA,EAAgB,WAAW,YAAa,EAAA;AAAA,MAC7D,OAAA,EAAS,CAAC,EAAE,WAAa,EAAA,SAAA,EAAgB,KAAA,IAAI,oBAAqB,CAAA,EAAE,WAAa,EAAA,SAAA,EAAW,CAAA;AAAA,KAC7F,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAEM,MAAM,kBAAkB,iBAAkB,CAAA,OAAA;AAAA,EAC/C,uBAAwB,CAAA;AAAA,IACtB,IAAM,EAAA,iBAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,4BAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,MAAM,CAAA;AAAA,IACjE,UAAY,EAAA,YAAA;AAAA,GACb,CAAA;AACH;;;;"}
@@ -1,14 +1,12 @@
1
1
  import { createRouteRef } from '@backstage/core-plugin-api';
2
- import React from 'react';
3
- import { Routes, Route } from 'react-router-dom';
4
- import { ReportsComponent } from './components/ReportsComponent/ReportsComponent.esm.js';
5
- import { SettingsComponent } from './components/SettingsComponent/SettingsComponent.esm.js';
6
2
 
7
3
  const rootRouteRef = createRouteRef({
8
- id: "infrawallet",
4
+ id: "infrawallet"
5
+ });
6
+ const settingsRouteRef = createRouteRef({
7
+ id: "infrawallet:settings",
9
8
  params: ["name"]
10
9
  });
11
- const RootRoute = () => /* @__PURE__ */ React.createElement(Routes, null, /* @__PURE__ */ React.createElement(Route, { path: "/", element: /* @__PURE__ */ React.createElement(ReportsComponent, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/:name", element: /* @__PURE__ */ React.createElement(ReportsComponent, null) }), /* @__PURE__ */ React.createElement(Route, { path: "/:name/settings", element: /* @__PURE__ */ React.createElement(SettingsComponent, null) }));
12
10
 
13
- export { RootRoute, rootRouteRef };
11
+ export { rootRouteRef, settingsRouteRef };
14
12
  //# sourceMappingURL=routes.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.tsx"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\nimport React from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport { ReportsComponent } from './components/ReportsComponent';\nimport { SettingsComponent } from './components/SettingsComponent';\n\nexport const rootRouteRef = createRouteRef({\n id: 'infrawallet',\n params: ['name'],\n});\n\nexport const RootRoute = () => (\n <Routes>\n <Route path=\"/\" element={<ReportsComponent />} />\n <Route path=\"/:name\" element={<ReportsComponent />} />\n <Route path=\"/:name/settings\" element={<SettingsComponent />} />\n </Routes>\n);\n"],"names":[],"mappings":";;;;;;AAMO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA,aAAA;AAAA,EACJ,MAAA,EAAQ,CAAC,MAAM,CAAA;AACjB,CAAC,EAAA;AAEM,MAAM,SAAY,GAAA,sBACtB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,IAAA,kBACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,IAAK,EAAA,GAAA,EAAI,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,IAAA,CAAA,EAAI,mBAC9C,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,IAAK,EAAA,QAAA,EAAS,OAAS,kBAAA,KAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,IAAA,CAAA,EAAI,CACpD,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,IAAA,EAAK,iBAAkB,EAAA,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,IAAkB,GAAI,CAChE;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["import { createRouteRef } from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'infrawallet',\n});\n\nexport const settingsRouteRef = createRouteRef({\n id: 'infrawallet:settings',\n params: ['name'],\n});\n"],"names":[],"mappings":";;AAEO,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA,aAAA;AACN,CAAC,EAAA;AAEM,MAAM,mBAAmB,cAAe,CAAA;AAAA,EAC7C,EAAI,EAAA,sBAAA;AAAA,EACJ,MAAA,EAAQ,CAAC,MAAM,CAAA;AACjB,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electrolux-oss/plugin-infrawallet",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin"
6
6
  },