@pagerduty/backstage-plugin 0.12.1-next.55 → 0.12.1-next.57
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/esm/{index-79dadc7f.esm.js → index-2a806dc4.esm.js} +2 -2
- package/dist/esm/{index-79dadc7f.esm.js.map → index-2a806dc4.esm.js.map} +1 -1
- package/dist/esm/index-52835eae.esm.js +155 -0
- package/dist/esm/index-52835eae.esm.js.map +1 -0
- package/dist/esm/{index-774f4ee2.esm.js → index-734a65f6.esm.js} +3 -3
- package/dist/esm/{index-774f4ee2.esm.js.map → index-734a65f6.esm.js.map} +1 -1
- package/dist/index.esm.js +1 -1
- package/package.json +8 -1
- package/dist/esm/index-1f3c8365.esm.js +0 -174
- package/dist/esm/index-1f3c8365.esm.js.map +0 -1
package/dist/index.esm.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { E as EntityPagerDutyCard, c as EntityPagerDutySmallCard, H as HomePagePagerDutyCard, f as PagerDutyCard, e as PagerDutyClient, b as PagerDutyPage, T as TriggerButton, U as UnauthorizedError, i as isPagerDutyAvailable, d as isPagerDutySmallCardAvailable, i as isPluginApplicableToEntity, p as pagerDutyApiRef, a as pagerDutyPlugin, a as plugin } from './esm/index-
|
|
1
|
+
export { E as EntityPagerDutyCard, c as EntityPagerDutySmallCard, H as HomePagePagerDutyCard, f as PagerDutyCard, e as PagerDutyClient, b as PagerDutyPage, T as TriggerButton, U as UnauthorizedError, i as isPagerDutyAvailable, d as isPagerDutySmallCardAvailable, i as isPluginApplicableToEntity, p as pagerDutyApiRef, a as pagerDutyPlugin, a as plugin } from './esm/index-734a65f6.esm.js';
|
|
2
2
|
import '@backstage/core-plugin-api';
|
|
3
3
|
import '@backstage/errors';
|
|
4
4
|
import '@backstage/plugin-home-react';
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin",
|
|
3
3
|
"description": "A Backstage plugin that integrates towards PagerDuty",
|
|
4
|
-
"version": "0.12.1-next.
|
|
4
|
+
"version": "0.12.1-next.57",
|
|
5
5
|
"main": "dist/index.esm.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -41,12 +41,19 @@
|
|
|
41
41
|
"@backstage/plugin-catalog-react": "^1.9.1",
|
|
42
42
|
"@backstage/plugin-home-react": "^0.1.5",
|
|
43
43
|
"@backstage/theme": "^0.5.2",
|
|
44
|
+
"@emotion/react": "^11.11.4",
|
|
45
|
+
"@emotion/styled": "^11.11.5",
|
|
44
46
|
"@material-ui/core": "^4.12.2",
|
|
45
47
|
"@material-ui/icons": "^4.9.1",
|
|
46
48
|
"@material-ui/lab": "4.0.0-alpha.61",
|
|
49
|
+
"@mui/icons-material": "^5.15.19",
|
|
50
|
+
"@mui/material": "^5.15.19",
|
|
51
|
+
"@mui/x-date-pickers": "^7.6.1",
|
|
47
52
|
"@pagerduty/backstage-plugin-common": "^0.1.5-next.7",
|
|
53
|
+
"@tanstack/react-query": "^5.40.1",
|
|
48
54
|
"classnames": "^2.2.6",
|
|
49
55
|
"luxon": "^3.4.1",
|
|
56
|
+
"material-react-table": "^2.13.0",
|
|
50
57
|
"react-use": "^17.2.4",
|
|
51
58
|
"validate-color": "^2.2.4"
|
|
52
59
|
},
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { Typography, FormControl, Select, MenuItem, Button, Grid } from '@material-ui/core';
|
|
3
|
-
import { Table, Page, Header, Content } from '@backstage/core-components';
|
|
4
|
-
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
-
import { p as pagerDutyApiRef } from './index-774f4ee2.esm.js';
|
|
6
|
-
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
7
|
-
import '@backstage/errors';
|
|
8
|
-
import '@backstage/plugin-home-react';
|
|
9
|
-
import 'luxon';
|
|
10
|
-
import '@material-ui/icons/OpenInBrowser';
|
|
11
|
-
import '../assets/emptystate.svg';
|
|
12
|
-
import 'react-use/lib/useAsyncFn';
|
|
13
|
-
import '@material-ui/lab';
|
|
14
|
-
import '../assets/forbiddenstate.svg';
|
|
15
|
-
import '@material-ui/core/Avatar';
|
|
16
|
-
import '@material-ui/icons/Notifications';
|
|
17
|
-
import 'react-use/lib/useAsync';
|
|
18
|
-
import '@material-ui/icons/Link';
|
|
19
|
-
import '../assets/PD-Green.svg';
|
|
20
|
-
import '../assets/PD-White.svg';
|
|
21
|
-
import 'validate-color';
|
|
22
|
-
import '@material-ui/icons/Info';
|
|
23
|
-
import '@material-ui/icons/CheckCircle';
|
|
24
|
-
import '@material-ui/icons/RadioButtonUnchecked';
|
|
25
|
-
import '@material-ui/core/styles';
|
|
26
|
-
import 'react-use';
|
|
27
|
-
import '@material-ui/lab/Alert/Alert';
|
|
28
|
-
import '@backstage/catalog-model';
|
|
29
|
-
import '@material-ui/icons/AddAlert';
|
|
30
|
-
import '@material-ui/icons/ExpandMore';
|
|
31
|
-
|
|
32
|
-
function getColorFromStatus(status) {
|
|
33
|
-
switch (status) {
|
|
34
|
-
case "InSync":
|
|
35
|
-
return "green";
|
|
36
|
-
case "OutOfSync":
|
|
37
|
-
return "red";
|
|
38
|
-
case "NotMapped":
|
|
39
|
-
return "orange";
|
|
40
|
-
default:
|
|
41
|
-
return "gray";
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
function buildTableData(entities, mappings) {
|
|
45
|
-
const data = mappings.map((service) => {
|
|
46
|
-
return {
|
|
47
|
-
name: service.serviceName,
|
|
48
|
-
team: service.team,
|
|
49
|
-
escalationPolicy: service.escalationPolicy,
|
|
50
|
-
// status of mapping
|
|
51
|
-
mappingStatus: /* @__PURE__ */ React.createElement(
|
|
52
|
-
Typography,
|
|
53
|
-
{
|
|
54
|
-
variant: "body2",
|
|
55
|
-
style: {
|
|
56
|
-
color: getColorFromStatus(service.status)
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
service.status
|
|
60
|
-
),
|
|
61
|
-
mapping: (
|
|
62
|
-
// dropdown menu with static options. If service.mapping is defined select that option
|
|
63
|
-
/* @__PURE__ */ React.createElement(FormControl, { variant: "standard" }, /* @__PURE__ */ React.createElement(
|
|
64
|
-
Select,
|
|
65
|
-
{
|
|
66
|
-
displayEmpty: true,
|
|
67
|
-
value: service.entityRef
|
|
68
|
-
},
|
|
69
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "" }, /* @__PURE__ */ React.createElement("em", null, "None")),
|
|
70
|
-
entities.map((backstageService) => {
|
|
71
|
-
return /* @__PURE__ */ React.createElement(
|
|
72
|
-
MenuItem,
|
|
73
|
-
{
|
|
74
|
-
key: backstageService.id,
|
|
75
|
-
value: backstageService.id
|
|
76
|
-
},
|
|
77
|
-
backstageService.name
|
|
78
|
-
);
|
|
79
|
-
})
|
|
80
|
-
))
|
|
81
|
-
),
|
|
82
|
-
actions: /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", href: service.serviceUrl }, "Open in PagerDuty")
|
|
83
|
-
};
|
|
84
|
-
});
|
|
85
|
-
return data;
|
|
86
|
-
}
|
|
87
|
-
const ServiceMappingComponent = () => {
|
|
88
|
-
const [catalogEntities, setCatalogEntities] = useState([]);
|
|
89
|
-
const [, setServiceMappings] = useState([]);
|
|
90
|
-
const [tableData, setTableData] = useState([]);
|
|
91
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
92
|
-
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
93
|
-
const catalogApi = useApi(catalogApiRef);
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
async function fetchEntities() {
|
|
96
|
-
const { items } = await catalogApi.getEntities({
|
|
97
|
-
filter: { kind: "Component" }
|
|
98
|
-
});
|
|
99
|
-
const backstageServices = [];
|
|
100
|
-
items.forEach((entity) => {
|
|
101
|
-
var _a, _b, _c, _d, _e, _f;
|
|
102
|
-
backstageServices.push({
|
|
103
|
-
name: (_a = entity.metadata) == null ? void 0 : _a.name,
|
|
104
|
-
id: (_c = (_b = entity.metadata) == null ? void 0 : _b.uid) != null ? _c : "",
|
|
105
|
-
system: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.system) || "",
|
|
106
|
-
owner: JSON.stringify((_e = entity.spec) == null ? void 0 : _e.owner) || "",
|
|
107
|
-
lifecycle: JSON.stringify((_f = entity.spec) == null ? void 0 : _f.lifecycle) || ""
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
return backstageServices;
|
|
111
|
-
}
|
|
112
|
-
async function fetchServices() {
|
|
113
|
-
const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();
|
|
114
|
-
return foundServices;
|
|
115
|
-
}
|
|
116
|
-
if (catalogEntities.length === 0) {
|
|
117
|
-
Promise.all([fetchEntities(), fetchServices()]).then(
|
|
118
|
-
([entities, mappings]) => {
|
|
119
|
-
setCatalogEntities(entities);
|
|
120
|
-
setServiceMappings(mappings);
|
|
121
|
-
const data = buildTableData(
|
|
122
|
-
entities,
|
|
123
|
-
mappings
|
|
124
|
-
);
|
|
125
|
-
setTableData(data);
|
|
126
|
-
setIsLoading(false);
|
|
127
|
-
}
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
}, [catalogApi, catalogEntities, pagerDutyApi]);
|
|
131
|
-
const DenseTable = ({ items }) => {
|
|
132
|
-
const columns = [
|
|
133
|
-
{ title: "PagerDuty Service", field: "name" },
|
|
134
|
-
{ title: "Team", field: "team" },
|
|
135
|
-
{ title: "Escalation Policy", field: "escalationPolicy" },
|
|
136
|
-
{ title: "Mapping", field: "mapping" },
|
|
137
|
-
{ title: "Status", field: "mappingStatus" },
|
|
138
|
-
{ title: "Actions", field: "actions" }
|
|
139
|
-
];
|
|
140
|
-
return /* @__PURE__ */ React.createElement(
|
|
141
|
-
Table,
|
|
142
|
-
{
|
|
143
|
-
isLoading,
|
|
144
|
-
title: "PagerDuty Service Import",
|
|
145
|
-
subtitle: "Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.",
|
|
146
|
-
options: {
|
|
147
|
-
search: true,
|
|
148
|
-
paging: true,
|
|
149
|
-
pageSize: 10,
|
|
150
|
-
pageSizeOptions: [10, 25, 50],
|
|
151
|
-
sorting: true,
|
|
152
|
-
emptyRowsWhenPaging: false,
|
|
153
|
-
showFirstLastPageButtons: true,
|
|
154
|
-
columnResizable: true,
|
|
155
|
-
columnsButton: true,
|
|
156
|
-
rowStyle: {
|
|
157
|
-
height: "10px"
|
|
158
|
-
},
|
|
159
|
-
padding: "dense"
|
|
160
|
-
},
|
|
161
|
-
columns,
|
|
162
|
-
data: items
|
|
163
|
-
}
|
|
164
|
-
);
|
|
165
|
-
};
|
|
166
|
-
return /* @__PURE__ */ React.createElement(DenseTable, { items: tableData });
|
|
167
|
-
};
|
|
168
|
-
|
|
169
|
-
const PagerDutyPage = () => {
|
|
170
|
-
return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(Header, { title: "PagerDuty", subtitle: "Advanced configurations" }), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 3, direction: "column" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(ServiceMappingComponent, null)))));
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
export { PagerDutyPage };
|
|
174
|
-
//# sourceMappingURL=index-1f3c8365.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-1f3c8365.esm.js","sources":["../../src/components/PagerDutyPage/ServiceMappingComponent.tsx","../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { Table, TableColumn } from \"@backstage/core-components\";\nimport {\n Button,\n FormControl,\n MenuItem,\n Select,\n Typography,\n} from \"@material-ui/core\";\nimport { PagerDutyEntityMapping } from \"@pagerduty/backstage-plugin-common\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { pagerDutyApiRef } from \"../../api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport { Entity } from \"@backstage/catalog-model\";\n\ntype Service = {\n name: string; // \"Ads\"\n id: string; // \"QWe1j283n12j132\"\n system: string; // \"Production\"\n owner: string; // \"Mapped\"\n lifecycle: string; // \"Ads\"\n};\n\ntype TableItem = {\n name: string | undefined;\n team: string | undefined;\n escalationPolicy: string | undefined;\n mappingStatus: JSX.Element;\n mapping: JSX.Element;\n actions: JSX.Element;\n};\n\ntype DenseTableProps = {\n items: TableItem[];\n};\n\nfunction getColorFromStatus(status?: string) {\n switch (status) {\n case \"InSync\":\n return \"green\";\n case \"OutOfSync\":\n return \"red\";\n case \"NotMapped\":\n return \"orange\";\n default:\n return \"gray\";\n }\n}\n\nfunction buildTableData(\n entities: Service[],\n mappings: PagerDutyEntityMapping[]\n ): TableItem[] {\n const data: TableItem[] = mappings.map((service) => {\n return {\n name: service.serviceName,\n team: service.team,\n escalationPolicy: service.escalationPolicy,\n // status of mapping\n mappingStatus: (\n <Typography\n variant=\"body2\"\n style={{\n color: getColorFromStatus(service.status),\n }}\n >\n {service.status}\n </Typography>\n ),\n mapping: (\n // dropdown menu with static options. If service.mapping is defined select that option\n <FormControl variant=\"standard\">\n <Select\n displayEmpty\n // onChange={async (selection) => {\n // handleMappingChange(service, selection);\n // }}\n value={service.entityRef}\n >\n <MenuItem value=\"\">\n <em>None</em>\n </MenuItem>\n {entities.map((backstageService) => {\n return (\n <MenuItem\n key={backstageService.id}\n value={backstageService.id}\n >\n {backstageService.name}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n ),\n actions: (\n <Button variant=\"contained\" color=\"primary\" href={service.serviceUrl}>\n Open in PagerDuty\n </Button>\n ),\n };\n });\n\n return data;\n }\n\nexport const ServiceMappingComponent = () => {\n const [catalogEntities, setCatalogEntities] = useState<Service[]>([]);\n const [, setServiceMappings] = useState<PagerDutyEntityMapping[]>([]);\n const [tableData, setTableData] = useState<TableItem[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n useEffect(() => {\n async function fetchEntities(): Promise<Service[]> {\n const { items } = await catalogApi.getEntities({\n filter: { kind: \"Component\" },\n });\n\n const backstageServices: Service[] = [];\n items.forEach((entity: Entity) => {\n backstageServices.push({\n name: entity.metadata?.name,\n id: entity.metadata?.uid ?? \"\",\n system: JSON.stringify(entity.spec?.system) || \"\",\n owner: JSON.stringify(entity.spec?.owner) || \"\",\n lifecycle: JSON.stringify(entity.spec?.lifecycle) || \"\",\n });\n });\n\n return backstageServices;\n }\n\n async function fetchServices(): Promise<PagerDutyEntityMapping[]> {\n const { mappings: foundServices } = await pagerDutyApi.getEntityMappings();\n\n return foundServices;\n }\n\n if (catalogEntities.length === 0) {\n Promise.all([fetchEntities(), fetchServices()]).then(\n ([entities, mappings]) => {\n setCatalogEntities(entities);\n setServiceMappings(mappings);\n\n const data: TableItem[] = buildTableData(\n entities,\n mappings\n );\n\n setTableData(data);\n setIsLoading(false);\n }\n );\n }\n }, [catalogApi, catalogEntities, pagerDutyApi]);\n\n // async function handleMappingChange(\n // service: PagerDutyEntityMapping,\n // event: ChangeEvent<{\n // name?: string | undefined;\n // value: unknown;\n // }>\n // ) {\n // // event.preventDefault();\n // // const updatedData = [...tableData];\n\n // // // find the service in updatedData\n // // updatedData.findIndex((item) => item.name === service.serviceName);\n // // // updatedData[serviceIndex].mappingStatus = (\n // // // <Typography\n // // // variant=\"body2\"\n // // // style={{\n // // // color: getColorFromStatus(\"OutOfSync\"),\n // // // }}\n // // // >\n // // // \"OutOfSync\"\n // // // </Typography>\n // // // );\n\n // // // update the mapping status\n // // // service.status = \"OutOfSync\";\n\n // // // // update the mapping\n // // // service.entityRef = entityId;\n\n // // // store the mapping in the database\n // // await pagerDutyApi.storeServiceMapping(\n // // service.serviceId,\n // // event.target.value as string\n // // );\n // // setTableData(updatedData);\n // }\n\n // function buildTableData(\n // entities: Service[],\n // mappings: PagerDutyEntityMapping[]\n // ): TableItem[] {\n // const data: TableItem[] = mappings.map((service) => {\n // return {\n // name: service.serviceName,\n // team: service.team,\n // escalationPolicy: service.escalationPolicy,\n // // status of mapping\n // mappingStatus: (\n // <Typography\n // variant=\"body2\"\n // style={{\n // color: getColorFromStatus(service.status),\n // }}\n // >\n // {service.status}\n // </Typography>\n // ),\n // mapping: (\n // // dropdown menu with static options. If service.mapping is defined select that option\n // <FormControl variant=\"standard\">\n // <Select\n // displayEmpty\n // // onChange={async (selection) => {\n // // handleMappingChange(service, selection);\n // // }}\n // value={service.entityRef}\n // >\n // <MenuItem value=\"\">\n // <em>None</em>\n // </MenuItem>\n // {entities.map((backstageService) => {\n // return (\n // <MenuItem\n // key={backstageService.id}\n // value={backstageService.id}\n // >\n // {backstageService.name}\n // </MenuItem>\n // );\n // })}\n // </Select>\n // </FormControl>\n // ),\n // actions: (\n // <Button variant=\"contained\" color=\"primary\" href={service.serviceUrl}>\n // Open in PagerDuty\n // </Button>\n // ),\n // };\n // });\n\n // return data;\n // }\n\n // if(catalogEntities.length !== 0 && serviceMappings.length !== 0) {\n // const data: TableItem[] = buildTableData(catalogEntities, serviceMappings);\n // setTableData(data);\n // }\n\n const DenseTable = ({ items }: DenseTableProps) => {\n // const [data, _] = useState<TableItem[]>(items);\n\n // useEffect(() => {\n // setData(items);\n // }, [items]);\n\n const columns: TableColumn[] = [\n { title: \"PagerDuty Service\", field: \"name\" },\n { title: \"Team\", field: \"team\" },\n { title: \"Escalation Policy\", field: \"escalationPolicy\" },\n { title: \"Mapping\", field: \"mapping\" },\n { title: \"Status\", field: \"mappingStatus\" },\n { title: \"Actions\", field: \"actions\" },\n ];\n\n return (\n <Table\n isLoading={isLoading}\n title=\"PagerDuty Service Import\"\n subtitle=\"Use this page to import services from PagerDuty and map them to existing Backstage services. Only 1:1 mapping is allowed.\"\n options={{\n search: true,\n paging: true,\n pageSize: 10,\n pageSizeOptions: [10, 25, 50],\n sorting: true,\n emptyRowsWhenPaging: false,\n showFirstLastPageButtons: true,\n columnResizable: true,\n columnsButton: true,\n rowStyle: {\n height: \"10px\",\n },\n padding: \"dense\",\n }}\n columns={columns}\n data={items}\n />\n );\n };\n\n return <DenseTable items={tableData} />;\n};\n","import React from \"react\";\nimport { Grid } from \"@material-ui/core\";\nimport { Header, Page, Content } from \"@backstage/core-components\";\nimport { ServiceMappingComponent } from \"./ServiceMappingComponent\";\n\n/** @public */\nexport const PagerDutyPage = () => {\n return (\n <Page themeId=\"home\">\n <Header title=\"PagerDuty\" subtitle=\"Advanced configurations\" />\n <Content>\n {/* <Grid container spacing={3} direction=\"column\">\n <Grid item alignContent=\"flex-end\">\n <Button variant=\"contained\" color=\"primary\" onClick={() => {handleImport()}}>\n Import\n </Button>\n <Button variant=\"outlined\" color=\"primary\" onClick={() => {handleSave()}}>\n Save\n </Button>\n </Grid>\n </Grid> */}\n <Grid container spacing={3} direction=\"column\">\n <Grid item>\n <ServiceMappingComponent />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|