@backstage/plugin-catalog-unprocessed-entities 0.2.15 → 0.2.16-next.1

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/CHANGELOG.md CHANGED
@@ -1,5 +1,31 @@
1
1
  # @backstage/plugin-catalog-unprocessed-entities
2
2
 
3
+ ## 0.2.16-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies
8
+ - @backstage/core-components@0.17.1-next.0
9
+ - @backstage/frontend-plugin-api@0.10.1-next.0
10
+ - @backstage/core-compat-api@0.4.1-next.1
11
+ - @backstage/catalog-model@1.7.3
12
+ - @backstage/core-plugin-api@1.10.5
13
+ - @backstage/errors@1.2.7
14
+
15
+ ## 0.2.16-next.0
16
+
17
+ ### Patch Changes
18
+
19
+ - ba88bfa: Added confirmation popup for delete entities in Catalog Unprocessed Entities plugin
20
+ - 2479827: Fixed the `convertTimeToLocalTimezone` function in the FailedEntities component to correctly parse ISO 8601 date strings and set the timezone to the current local timezone.
21
+ - Updated dependencies
22
+ - @backstage/core-compat-api@0.4.1-next.0
23
+ - @backstage/catalog-model@1.7.3
24
+ - @backstage/core-components@0.17.0
25
+ - @backstage/core-plugin-api@1.10.5
26
+ - @backstage/errors@1.2.7
27
+ - @backstage/frontend-plugin-api@0.10.0
28
+
3
29
  ## 0.2.15
4
30
 
5
31
  ### Patch Changes
@@ -0,0 +1,34 @@
1
+ import Button from '@material-ui/core/Button';
2
+ import Dialog from '@material-ui/core/Dialog';
3
+ import DialogActions from '@material-ui/core/DialogActions';
4
+ import DialogTitle from '@material-ui/core/DialogTitle';
5
+ import React, { useState } from 'react';
6
+ import { assertError } from '@backstage/errors';
7
+
8
+ function DeleteEntityConfirmationDialog(props) {
9
+ const { open, onClose, onConfirm } = props;
10
+ const [busy, setBusy] = useState(false);
11
+ const onDelete = async () => {
12
+ setBusy(true);
13
+ try {
14
+ onConfirm();
15
+ } catch (err) {
16
+ assertError(err);
17
+ } finally {
18
+ setBusy(false);
19
+ }
20
+ };
21
+ return /* @__PURE__ */ React.createElement(Dialog, { open, onClose }, /* @__PURE__ */ React.createElement(DialogTitle, { id: "responsive-dialog-title" }, "Are you sure you want to delete this entity?"), /* @__PURE__ */ React.createElement(DialogActions, null, /* @__PURE__ */ React.createElement(
22
+ Button,
23
+ {
24
+ variant: "contained",
25
+ color: "secondary",
26
+ disabled: busy,
27
+ onClick: onDelete
28
+ },
29
+ "Delete"
30
+ ), /* @__PURE__ */ React.createElement(Button, { onClick: onClose, color: "primary" }, "Cancel")));
31
+ }
32
+
33
+ export { DeleteEntityConfirmationDialog };
34
+ //# sourceMappingURL=DeleteEntityConfirmationDialog.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeleteEntityConfirmationDialog.esm.js","sources":["../../src/components/DeleteEntityConfirmationDialog.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport React, { useState } from 'react';\nimport { assertError } from '@backstage/errors';\n\ninterface DeleteEntityConfirmationProps {\n open: boolean;\n onClose: () => any;\n onConfirm: () => any;\n}\n\nexport function DeleteEntityConfirmationDialog(\n props: DeleteEntityConfirmationProps,\n) {\n const { open, onClose, onConfirm } = props;\n const [busy, setBusy] = useState(false);\n const onDelete = async () => {\n setBusy(true);\n try {\n onConfirm();\n } catch (err) {\n assertError(err);\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Dialog open={open} onClose={onClose}>\n <DialogTitle id=\"responsive-dialog-title\">\n Are you sure you want to delete this entity?\n </DialogTitle>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n disabled={busy}\n onClick={onDelete}\n >\n Delete\n </Button>\n <Button onClick={onClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n"],"names":[],"mappings":";;;;;;;AA6BO,SAAS,+BACd,KACA,EAAA;AACA,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,SAAA,EAAc,GAAA,KAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,WAAW,YAAY;AAC3B,IAAA,OAAA,CAAQ,IAAI,CAAA;AACZ,IAAI,IAAA;AACF,MAAU,SAAA,EAAA;AAAA,aACH,GAAK,EAAA;AACZ,MAAA,WAAA,CAAY,GAAG,CAAA;AAAA,KACf,SAAA;AACA,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA;AACf,GACF;AAEA,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,MAAO,EAAA,EAAA,IAAA,EAAY,OAClB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,EAAA,EAAG,yBAA0B,EAAA,EAAA,8CAE1C,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,aACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,WAAA;AAAA,MACR,KAAM,EAAA,WAAA;AAAA,MACN,QAAU,EAAA,IAAA;AAAA,MACV,OAAS,EAAA;AAAA,KAAA;AAAA,IACV;AAAA,GAED,sCACC,MAAO,EAAA,EAAA,OAAA,EAAS,SAAS,KAAM,EAAA,SAAA,EAAA,EAAU,QAE1C,CACF,CACF,CAAA;AAEJ;;;;"}
@@ -10,6 +10,7 @@ import { EntityDialog } from './EntityDialog.esm.js';
10
10
  import { catalogUnprocessedEntitiesApiRef } from '../api/index.esm.js';
11
11
  import useAsync from 'react-use/esm/useAsync';
12
12
  import DeleteIcon from '@material-ui/icons/Delete';
13
+ import { DeleteEntityConfirmationDialog } from './DeleteEntityConfirmationDialog.esm.js';
13
14
 
14
15
  const useStyles = makeStyles((theme) => ({
15
16
  errorBox: {
@@ -41,16 +42,12 @@ const RenderErrorContext = ({
41
42
  }
42
43
  return null;
43
44
  };
44
- const convertTimeToLocalTimezone = (strDateTime) => {
45
- const dateTime = DateTime.fromFormat(
46
- strDateTime.toLocaleString(),
47
- "yyyy-MM-dd hh:mm:ss",
48
- {
49
- zone: "UTC"
50
- }
51
- );
52
- const dateTimeLocalTz = dateTime.setZone(DateTime.local().zoneName);
53
- return dateTimeLocalTz.toFormat("yyyy-MM-dd hh:mm:ss ZZZZ");
45
+ const convertTimeToLocalTimezone = (dateTime) => {
46
+ const isoDateTime = typeof dateTime === "string" ? dateTime : dateTime.toISOString();
47
+ const strDateTime = DateTime.fromISO(isoDateTime, {
48
+ zone: DateTime.local().zoneName
49
+ });
50
+ return strDateTime.toFormat("yyyy-MM-dd hh:mm:ss ZZZZ");
54
51
  };
55
52
  const FailedEntities = () => {
56
53
  const classes = useStyles();
@@ -63,28 +60,41 @@ const FailedEntities = () => {
63
60
  const [, setSelectedSearchTerm] = useState("");
64
61
  const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef);
65
62
  const alertApi = useApi(alertApiRef);
63
+ const [selectedEntityId, setSelectedEntityId] = useState(
64
+ void 0
65
+ );
66
+ const [selectedEntityRef, setSelectedEntityRef] = useState(void 0);
67
+ const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);
66
68
  if (loading) {
67
69
  return /* @__PURE__ */ React.createElement(Progress, null);
68
70
  }
69
71
  if (error) {
70
72
  return /* @__PURE__ */ React.createElement(ErrorPanel, { error });
71
73
  }
72
- const handleDelete = async ({
74
+ const handleDelete = ({
73
75
  entityId,
74
76
  entityRef
75
77
  }) => {
78
+ setSelectedEntityId(entityId);
79
+ setSelectedEntityRef(entityRef);
80
+ setConfirmationDialogOpen(true);
81
+ };
82
+ const cleanUpAfterRemoval = async () => {
76
83
  try {
77
- await unprocessedEntityApi.delete(entityId);
78
- alertApi.post({
79
- message: `Entity ${entityRef} has been deleted`,
80
- severity: "success"
81
- });
84
+ if (selectedEntityId) {
85
+ await unprocessedEntityApi.delete(selectedEntityId);
86
+ alertApi.post({
87
+ message: `Entity ${selectedEntityRef} has been deleted`,
88
+ severity: "success"
89
+ });
90
+ }
82
91
  } catch (e) {
83
92
  alertApi.post({
84
- message: `Ran into an issue when deleting ${entityRef}. Please try again later.`,
93
+ message: `Ran into an issue when deleting ${selectedEntityRef}. Please try again later.`,
85
94
  severity: "error"
86
95
  });
87
96
  }
97
+ setConfirmationDialogOpen(false);
88
98
  };
89
99
  const columns = [
90
100
  {
@@ -141,7 +151,7 @@ const FailedEntities = () => {
141
151
  IconButton,
142
152
  {
143
153
  "aria-label": "delete",
144
- onClick: async () => await handleDelete({
154
+ onClick: () => handleDelete({
145
155
  entityId: entity_id,
146
156
  entityRef: entity_ref
147
157
  })
@@ -151,7 +161,7 @@ const FailedEntities = () => {
151
161
  }
152
162
  }
153
163
  ];
154
- return /* @__PURE__ */ React.createElement(
164
+ return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
155
165
  Table,
156
166
  {
157
167
  options: { pageSize: 20, search: true },
@@ -172,8 +182,15 @@ const FailedEntities = () => {
172
182
  }));
173
183
  }
174
184
  }
175
- );
185
+ ), /* @__PURE__ */ React.createElement(
186
+ DeleteEntityConfirmationDialog,
187
+ {
188
+ open: confirmationDialogOpen,
189
+ onClose: () => setConfirmationDialogOpen(false),
190
+ onConfirm: cleanUpAfterRemoval
191
+ }
192
+ ));
176
193
  };
177
194
 
178
- export { FailedEntities };
195
+ export { FailedEntities, convertTimeToLocalTimezone };
179
196
  //# sourceMappingURL=FailedEntities.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FailedEntities.esm.js","sources":["../../src/components/FailedEntities.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\nimport { DateTime } from 'luxon';\nimport {\n ErrorPanel,\n MarkdownContent,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\n\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport { Theme, makeStyles } from '@material-ui/core/styles';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { UnprocessedEntity } from '../types';\nimport { EntityDialog } from './EntityDialog';\nimport { catalogUnprocessedEntitiesApiRef } from '../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport DeleteIcon from '@material-ui/icons/Delete';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n errorBox: {\n color: theme.palette.status.error,\n backgroundColor: theme.palette.errorBackground,\n padding: '1em',\n margin: '1em',\n border: `1px solid ${theme.palette.status.error}`,\n },\n errorTitle: {\n width: '100%',\n fontWeight: 'bold',\n },\n successMessage: {\n background: theme.palette.infoBackground,\n color: theme.palette.infoText,\n padding: theme.spacing(2),\n },\n}));\n\nconst RenderErrorContext = ({\n error,\n rowData,\n}: {\n error: { message: string };\n rowData: UnprocessedEntity;\n}) => {\n if (error.message.includes('tags.')) {\n return (\n <>\n <Typography>Tags</Typography>\n <ul>\n {rowData.unprocessed_entity.metadata.tags?.map(t => (\n <li>{t}</li>\n ))}\n </ul>\n </>\n );\n }\n\n if (error.message.includes('metadata.name')) {\n return (\n <>\n <Typography>Name</Typography>\n <Typography variant=\"caption\">\n {rowData.unprocessed_entity.metadata.name}\n </Typography>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Converts input datetime which lacks timezone info into user's local time so that they can\n * easily understand the times.\n */\nconst convertTimeToLocalTimezone = (strDateTime: string | Date) => {\n const dateTime = DateTime.fromFormat(\n strDateTime.toLocaleString(),\n 'yyyy-MM-dd hh:mm:ss',\n {\n zone: 'UTC',\n },\n );\n\n const dateTimeLocalTz = dateTime.setZone(DateTime.local().zoneName);\n\n return dateTimeLocalTz.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ');\n};\n\nexport const FailedEntities = () => {\n const classes = useStyles();\n const unprocessedApi = useApi(catalogUnprocessedEntitiesApiRef);\n const {\n loading,\n error,\n value: data,\n } = useAsync(async () => await unprocessedApi.failed());\n const [, setSelectedSearchTerm] = useState<string>('');\n const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef);\n const alertApi = useApi(alertApiRef);\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const handleDelete = async ({\n entityId,\n entityRef,\n }: {\n entityId: string;\n entityRef: string;\n }) => {\n try {\n await unprocessedEntityApi.delete(entityId);\n alertApi.post({\n message: `Entity ${entityRef} has been deleted`,\n severity: 'success',\n });\n } catch (e) {\n alertApi.post({\n message: `Ran into an issue when deleting ${entityRef}. Please try again later.`,\n severity: 'error',\n });\n }\n };\n\n const columns: TableColumn[] = [\n {\n title: <Typography>entityRef</Typography>,\n sorting: true,\n field: 'entity_ref',\n customFilterAndSearch: (query, row: any) =>\n row.entity_ref\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US')),\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).entity_ref,\n },\n {\n title: <Typography>Location Path</Typography>,\n sorting: true,\n field: 'location_key',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).location_key,\n },\n {\n title: <Typography>Kind</Typography>,\n sorting: true,\n field: 'kind',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).unprocessed_entity.kind,\n },\n {\n title: <Typography>Owner</Typography>,\n sorting: true,\n field: 'unprocessed_entity.spec.owner',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).unprocessed_entity.spec?.owner ||\n 'unknown',\n },\n {\n title: <Typography>Last Discovery At</Typography>,\n sorting: true,\n field: 'last_discovery_at',\n render: (rowData: UnprocessedEntity | {}) =>\n convertTimeToLocalTimezone(\n (rowData as UnprocessedEntity).last_discovery_at,\n ) || 'unknown',\n },\n {\n title: <Typography>Next Refresh At</Typography>,\n sorting: true,\n field: 'next_update_at',\n render: (rowData: UnprocessedEntity | {}) =>\n convertTimeToLocalTimezone(\n (rowData as UnprocessedEntity).next_update_at,\n ) || 'unknown',\n },\n {\n title: <Typography>Raw Entity Definition</Typography>,\n sorting: false,\n render: (rowData: UnprocessedEntity | {}) => (\n <EntityDialog entity={rowData as UnprocessedEntity} />\n ),\n },\n {\n title: <Typography>Actions</Typography>,\n render: (rowData: UnprocessedEntity | {}) => {\n const { entity_id, entity_ref } = rowData as UnprocessedEntity;\n\n return (\n <IconButton\n aria-label=\"delete\"\n onClick={async () =>\n await handleDelete({\n entityId: entity_id,\n entityRef: entity_ref,\n })\n }\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <Table\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={data?.entities ?? []}\n emptyContent={\n <Typography className={classes.successMessage}>\n No failed entities found\n </Typography>\n }\n onSearchChange={(searchTerm: string) => setSelectedSearchTerm(searchTerm)}\n detailPanel={({ rowData }) => {\n const errors = (rowData as UnprocessedEntity).errors;\n return (\n <>\n {errors?.map((e, idx) => {\n return (\n <Box key={idx} className={classes.errorBox}>\n <Typography className={classes.errorTitle}>\n {e.name}\n </Typography>\n <MarkdownContent content={e.message} />\n <RenderErrorContext\n error={e}\n rowData={rowData as UnprocessedEntity}\n />\n </Box>\n );\n })}\n </>\n );\n }}\n />\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FailedEntities.esm.js","sources":["../../src/components/FailedEntities.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React, { useState } from 'react';\nimport { DateTime } from 'luxon';\nimport {\n ErrorPanel,\n MarkdownContent,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\n\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport { Theme, makeStyles } from '@material-ui/core/styles';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nimport { UnprocessedEntity } from '../types';\nimport { EntityDialog } from './EntityDialog';\nimport { catalogUnprocessedEntitiesApiRef } from '../api';\nimport useAsync from 'react-use/esm/useAsync';\nimport DeleteIcon from '@material-ui/icons/Delete';\nimport { DeleteEntityConfirmationDialog } from './DeleteEntityConfirmationDialog';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n errorBox: {\n color: theme.palette.status.error,\n backgroundColor: theme.palette.errorBackground,\n padding: '1em',\n margin: '1em',\n border: `1px solid ${theme.palette.status.error}`,\n },\n errorTitle: {\n width: '100%',\n fontWeight: 'bold',\n },\n successMessage: {\n background: theme.palette.infoBackground,\n color: theme.palette.infoText,\n padding: theme.spacing(2),\n },\n}));\n\nconst RenderErrorContext = ({\n error,\n rowData,\n}: {\n error: { message: string };\n rowData: UnprocessedEntity;\n}) => {\n if (error.message.includes('tags.')) {\n return (\n <>\n <Typography>Tags</Typography>\n <ul>\n {rowData.unprocessed_entity.metadata.tags?.map(t => (\n <li>{t}</li>\n ))}\n </ul>\n </>\n );\n }\n\n if (error.message.includes('metadata.name')) {\n return (\n <>\n <Typography>Name</Typography>\n <Typography variant=\"caption\">\n {rowData.unprocessed_entity.metadata.name}\n </Typography>\n </>\n );\n }\n\n return null;\n};\n\n/**\n * Converts input datetime which lacks timezone info into user's local time so that they can\n * easily understand the times.\n */\nexport const convertTimeToLocalTimezone = (dateTime: string | Date) => {\n const isoDateTime =\n typeof dateTime === 'string' ? dateTime : dateTime.toISOString();\n\n const strDateTime = DateTime.fromISO(isoDateTime, {\n zone: DateTime.local().zoneName,\n });\n\n return strDateTime.toFormat('yyyy-MM-dd hh:mm:ss ZZZZ');\n};\n\nexport const FailedEntities = () => {\n const classes = useStyles();\n const unprocessedApi = useApi(catalogUnprocessedEntitiesApiRef);\n const {\n loading,\n error,\n value: data,\n } = useAsync(async () => await unprocessedApi.failed());\n const [, setSelectedSearchTerm] = useState<string>('');\n const unprocessedEntityApi = useApi(catalogUnprocessedEntitiesApiRef);\n const alertApi = useApi(alertApiRef);\n const [selectedEntityId, setSelectedEntityId] = useState<string | undefined>(\n undefined,\n );\n const [selectedEntityRef, setSelectedEntityRef] = useState<\n string | undefined\n >(undefined);\n const [confirmationDialogOpen, setConfirmationDialogOpen] = useState(false);\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return <ErrorPanel error={error} />;\n }\n\n const handleDelete = ({\n entityId,\n entityRef,\n }: {\n entityId: string;\n entityRef: string;\n }) => {\n setSelectedEntityId(entityId);\n setSelectedEntityRef(entityRef);\n setConfirmationDialogOpen(true);\n };\n\n const cleanUpAfterRemoval = async () => {\n try {\n if (selectedEntityId) {\n await unprocessedEntityApi.delete(selectedEntityId);\n alertApi.post({\n message: `Entity ${selectedEntityRef} has been deleted`,\n severity: 'success',\n });\n }\n } catch (e) {\n alertApi.post({\n message: `Ran into an issue when deleting ${selectedEntityRef}. Please try again later.`,\n severity: 'error',\n });\n }\n setConfirmationDialogOpen(false);\n };\n\n const columns: TableColumn[] = [\n {\n title: <Typography>entityRef</Typography>,\n sorting: true,\n field: 'entity_ref',\n customFilterAndSearch: (query, row: any) =>\n row.entity_ref\n .toLocaleUpperCase('en-US')\n .includes(query.toLocaleUpperCase('en-US')),\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).entity_ref,\n },\n {\n title: <Typography>Location Path</Typography>,\n sorting: true,\n field: 'location_key',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).location_key,\n },\n {\n title: <Typography>Kind</Typography>,\n sorting: true,\n field: 'kind',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).unprocessed_entity.kind,\n },\n {\n title: <Typography>Owner</Typography>,\n sorting: true,\n field: 'unprocessed_entity.spec.owner',\n render: (rowData: UnprocessedEntity | {}) =>\n (rowData as UnprocessedEntity).unprocessed_entity.spec?.owner ||\n 'unknown',\n },\n {\n title: <Typography>Last Discovery At</Typography>,\n sorting: true,\n field: 'last_discovery_at',\n render: (rowData: UnprocessedEntity | {}) =>\n convertTimeToLocalTimezone(\n (rowData as UnprocessedEntity).last_discovery_at,\n ) || 'unknown',\n },\n {\n title: <Typography>Next Refresh At</Typography>,\n sorting: true,\n field: 'next_update_at',\n render: (rowData: UnprocessedEntity | {}) =>\n convertTimeToLocalTimezone(\n (rowData as UnprocessedEntity).next_update_at,\n ) || 'unknown',\n },\n {\n title: <Typography>Raw Entity Definition</Typography>,\n sorting: false,\n render: (rowData: UnprocessedEntity | {}) => (\n <EntityDialog entity={rowData as UnprocessedEntity} />\n ),\n },\n {\n title: <Typography>Actions</Typography>,\n render: (rowData: UnprocessedEntity | {}) => {\n const { entity_id, entity_ref } = rowData as UnprocessedEntity;\n\n return (\n <IconButton\n aria-label=\"delete\"\n onClick={() =>\n handleDelete({\n entityId: entity_id,\n entityRef: entity_ref,\n })\n }\n >\n <DeleteIcon fontSize=\"small\" data-testid=\"delete-icon\" />\n </IconButton>\n );\n },\n },\n ];\n\n return (\n <>\n <Table\n options={{ pageSize: 20, search: true }}\n columns={columns}\n data={data?.entities ?? []}\n emptyContent={\n <Typography className={classes.successMessage}>\n No failed entities found\n </Typography>\n }\n onSearchChange={(searchTerm: string) =>\n setSelectedSearchTerm(searchTerm)\n }\n detailPanel={({ rowData }) => {\n const errors = (rowData as UnprocessedEntity).errors;\n return (\n <>\n {errors?.map((e, idx) => {\n return (\n <Box key={idx} className={classes.errorBox}>\n <Typography className={classes.errorTitle}>\n {e.name}\n </Typography>\n <MarkdownContent content={e.message} />\n <RenderErrorContext\n error={e}\n rowData={rowData as UnprocessedEntity}\n />\n </Box>\n );\n })}\n </>\n );\n }}\n />\n <DeleteEntityConfirmationDialog\n open={confirmationDialogOpen}\n onClose={() => setConfirmationDialogOpen(false)}\n onConfirm={cleanUpAfterRemoval}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog-unprocessed-entities",
3
- "version": "0.2.15",
3
+ "version": "0.2.16-next.1",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "catalog-unprocessed-entities",
@@ -62,12 +62,12 @@
62
62
  "test": "backstage-cli package test"
63
63
  },
64
64
  "dependencies": {
65
- "@backstage/catalog-model": "^1.7.3",
66
- "@backstage/core-compat-api": "^0.4.0",
67
- "@backstage/core-components": "^0.17.0",
68
- "@backstage/core-plugin-api": "^1.10.5",
69
- "@backstage/errors": "^1.2.7",
70
- "@backstage/frontend-plugin-api": "^0.10.0",
65
+ "@backstage/catalog-model": "1.7.3",
66
+ "@backstage/core-compat-api": "0.4.1-next.1",
67
+ "@backstage/core-components": "0.17.1-next.0",
68
+ "@backstage/core-plugin-api": "1.10.5",
69
+ "@backstage/errors": "1.2.7",
70
+ "@backstage/frontend-plugin-api": "0.10.1-next.0",
71
71
  "@material-ui/core": "^4.9.13",
72
72
  "@material-ui/icons": "^4.9.1",
73
73
  "@material-ui/lab": "^4.0.0-alpha.60",
@@ -75,8 +75,8 @@
75
75
  "react-use": "^17.2.4"
76
76
  },
77
77
  "devDependencies": {
78
- "@backstage/cli": "^0.31.0",
79
- "@backstage/dev-utils": "^1.1.8",
78
+ "@backstage/cli": "0.32.0-next.1",
79
+ "@backstage/dev-utils": "1.1.9-next.1",
80
80
  "@testing-library/jest-dom": "^6.0.0",
81
81
  "@testing-library/react": "^16.0.0",
82
82
  "@types/react": "^18.0.0",