@pagerduty/backstage-plugin 0.12.1-next.5 → 0.12.1-next.50
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-1d34c106.esm.js → index-31a3ac2f.esm.js} +2 -2
- package/dist/esm/{index-1d34c106.esm.js.map → index-31a3ac2f.esm.js.map} +1 -1
- package/dist/esm/{index-891e987b.esm.js → index-442f32fb.esm.js} +23 -5
- package/dist/esm/index-442f32fb.esm.js.map +1 -0
- package/dist/esm/index-5a598487.esm.js +112 -0
- package/dist/esm/index-5a598487.esm.js.map +1 -0
- package/dist/index.d.ts +10 -4
- package/dist/index.esm.js +1 -1
- package/package.json +2 -3
- package/dist/esm/index-891e987b.esm.js.map +0 -1
- package/dist/esm/index-ded958da.esm.js +0 -162
- package/dist/esm/index-ded958da.esm.js.map +0 -1
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { Typography, FormControl, InputLabel, 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-891e987b.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 getMappingStatus(serviceName) {
|
|
33
|
-
if (serviceName === "Ads") {
|
|
34
|
-
return "In Sync" /* InSync */;
|
|
35
|
-
}
|
|
36
|
-
return "Out Of Sync" /* OutOfSync */;
|
|
37
|
-
}
|
|
38
|
-
function getColorFromStatus(status) {
|
|
39
|
-
switch (status) {
|
|
40
|
-
case "In Sync" /* InSync */:
|
|
41
|
-
return "green";
|
|
42
|
-
case "Out Of Sync" /* OutOfSync */:
|
|
43
|
-
return "red";
|
|
44
|
-
default:
|
|
45
|
-
return "orange";
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const DenseTable = ({ BackstageServices, PagerDutyServices }) => {
|
|
49
|
-
const columns = [
|
|
50
|
-
{ title: "PagerDuty Service", field: "name" },
|
|
51
|
-
{ title: "Team", field: "team" },
|
|
52
|
-
{ title: "Escalation Policy", field: "escalationPolicy" },
|
|
53
|
-
{ title: "Mapping", field: "mapping" },
|
|
54
|
-
{ title: "Status", field: "mappingStatus", width: "10%" },
|
|
55
|
-
{ title: "Actions", field: "actions" }
|
|
56
|
-
];
|
|
57
|
-
const data = PagerDutyServices.map((service) => {
|
|
58
|
-
var _a, _b;
|
|
59
|
-
const status = getMappingStatus(service.name);
|
|
60
|
-
return {
|
|
61
|
-
name: service.name,
|
|
62
|
-
team: (_b = (_a = service.teams) == null ? void 0 : _a.at(0)) == null ? void 0 : _b.summary,
|
|
63
|
-
escalationPolicy: service.escalation_policy.name,
|
|
64
|
-
mappingStatus: (
|
|
65
|
-
// status of mapping
|
|
66
|
-
/* @__PURE__ */ React.createElement(
|
|
67
|
-
Typography,
|
|
68
|
-
{
|
|
69
|
-
variant: "body2",
|
|
70
|
-
style: {
|
|
71
|
-
color: getColorFromStatus(status)
|
|
72
|
-
}
|
|
73
|
-
},
|
|
74
|
-
status
|
|
75
|
-
)
|
|
76
|
-
),
|
|
77
|
-
mapping: (
|
|
78
|
-
// dropdown menu with static options. If service.mapping is defined select that option
|
|
79
|
-
/* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(InputLabel, { id: "demo-simple-select-helper-label" }, "Service"), /* @__PURE__ */ React.createElement(
|
|
80
|
-
Select,
|
|
81
|
-
{
|
|
82
|
-
labelId: "demo-simple-select-helper-label",
|
|
83
|
-
id: "demo-simple-select-helper"
|
|
84
|
-
},
|
|
85
|
-
/* @__PURE__ */ React.createElement(MenuItem, { value: "" }, /* @__PURE__ */ React.createElement("em", null, "None")),
|
|
86
|
-
BackstageServices.map((backstageService) => {
|
|
87
|
-
return /* @__PURE__ */ React.createElement(
|
|
88
|
-
MenuItem,
|
|
89
|
-
{
|
|
90
|
-
key: backstageService.name,
|
|
91
|
-
value: backstageService.name
|
|
92
|
-
},
|
|
93
|
-
backstageService.name
|
|
94
|
-
);
|
|
95
|
-
})
|
|
96
|
-
))
|
|
97
|
-
),
|
|
98
|
-
actions: /* @__PURE__ */ React.createElement(Button, { variant: "contained", color: "primary", href: service.html_url }, "Open in PagerDuty")
|
|
99
|
-
};
|
|
100
|
-
});
|
|
101
|
-
return /* @__PURE__ */ React.createElement(
|
|
102
|
-
Table,
|
|
103
|
-
{
|
|
104
|
-
title: "PagerDuty Service Import",
|
|
105
|
-
subtitle: "Use this page to import services from PagerDuty and map them to existing Backstage services ",
|
|
106
|
-
options: {
|
|
107
|
-
search: true,
|
|
108
|
-
paging: true,
|
|
109
|
-
pageSize: 10,
|
|
110
|
-
pageSizeOptions: [10, 25, 50],
|
|
111
|
-
sorting: true,
|
|
112
|
-
emptyRowsWhenPaging: false,
|
|
113
|
-
showFirstLastPageButtons: true,
|
|
114
|
-
columnResizable: true,
|
|
115
|
-
columnsButton: true,
|
|
116
|
-
rowStyle: {
|
|
117
|
-
height: "10px"
|
|
118
|
-
},
|
|
119
|
-
padding: "dense"
|
|
120
|
-
},
|
|
121
|
-
columns,
|
|
122
|
-
data
|
|
123
|
-
}
|
|
124
|
-
);
|
|
125
|
-
};
|
|
126
|
-
const ServiceMappingComponent = () => {
|
|
127
|
-
const backstageServices = [];
|
|
128
|
-
const [catalogEntities, setCatalogEntities] = useState([]);
|
|
129
|
-
const [pagerDutyServices, setPagerDutyServices] = useState([]);
|
|
130
|
-
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
131
|
-
const catalogApi = useApi(catalogApiRef);
|
|
132
|
-
useEffect(() => {
|
|
133
|
-
async function fetchServices() {
|
|
134
|
-
const { services: foundServices } = await pagerDutyApi.getAllServices();
|
|
135
|
-
setPagerDutyServices(foundServices);
|
|
136
|
-
}
|
|
137
|
-
async function fetchEntities() {
|
|
138
|
-
const response = await catalogApi.getEntities();
|
|
139
|
-
setCatalogEntities(response.items);
|
|
140
|
-
}
|
|
141
|
-
fetchServices();
|
|
142
|
-
fetchEntities();
|
|
143
|
-
}, [catalogApi, pagerDutyApi]);
|
|
144
|
-
catalogEntities.forEach((entity) => {
|
|
145
|
-
var _a, _b, _c, _d, _e, _f;
|
|
146
|
-
backstageServices.push({
|
|
147
|
-
name: (_a = entity.metadata) == null ? void 0 : _a.name,
|
|
148
|
-
id: (_c = (_b = entity.metadata) == null ? void 0 : _b.uid) != null ? _c : "",
|
|
149
|
-
system: JSON.stringify((_d = entity.spec) == null ? void 0 : _d.system) || "",
|
|
150
|
-
owner: JSON.stringify((_e = entity.spec) == null ? void 0 : _e.owner) || "",
|
|
151
|
-
lifecycle: JSON.stringify((_f = entity.spec) == null ? void 0 : _f.lifecycle) || ""
|
|
152
|
-
});
|
|
153
|
-
});
|
|
154
|
-
return /* @__PURE__ */ React.createElement(DenseTable, { BackstageServices: backstageServices || [], PagerDutyServices: pagerDutyServices != null ? pagerDutyServices : [] });
|
|
155
|
-
};
|
|
156
|
-
|
|
157
|
-
const PagerDutyPage = () => {
|
|
158
|
-
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)))));
|
|
159
|
-
};
|
|
160
|
-
|
|
161
|
-
export { PagerDutyPage };
|
|
162
|
-
//# sourceMappingURL=index-ded958da.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-ded958da.esm.js","sources":["../../src/components/PagerDutyPage/ServiceMappingComponent.tsx","../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport {\n Table,\n TableColumn,\n} from \"@backstage/core-components\";\nimport { Button, FormControl, InputLabel, MenuItem, Select, Typography } from \"@material-ui/core\";\nimport { PagerDutyService } from \"@pagerduty/backstage-plugin-common\";\nimport { Entity } from \"@backstage/catalog-model\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { pagerDutyApiRef } from \"../../api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport { GetEntitiesResponse } from \"@backstage/catalog-client\";\n\nenum MappingStatus { \n InSync = \"In Sync\", \n OutOfSync = \"Out Of Sync\", \n NotMapped = \"Not Mapped\"};\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\n\ntype DenseTableProps = {\n BackstageServices: Service[];\n PagerDutyServices: PagerDutyService[];\n};\n\nfunction getMappingStatus(serviceName: string) : MappingStatus {\n \n if(serviceName === \"Ads\") {\n return MappingStatus.InSync;\n } \n \n return MappingStatus.OutOfSync;\n}\n\nfunction getColorFromStatus(status: MappingStatus) {\n switch (status) {\n case MappingStatus.InSync:\n return \"green\";\n case MappingStatus.OutOfSync:\n return \"red\";\n default:\n return \"orange\";\n }\n}\n\nexport const DenseTable = ({ BackstageServices, PagerDutyServices }: DenseTableProps) => {\n// const classes = useStyles();\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\", width: \"10%\" },\n { title: \"Actions\", field: \"actions\" },\n ];\n\n const data = PagerDutyServices.map((service) => {\n\n const status = getMappingStatus(service.name);\n\n return {\n name: service.name,\n team: service.teams?.at(0)?.summary,\n escalationPolicy: service.escalation_policy.name,\n mappingStatus:\n ( // status of mapping\n <Typography\n variant=\"body2\"\n style={{\n color: getColorFromStatus(status),\n }}\n >\n {status}\n </Typography>\n ),\n mapping: (\n // dropdown menu with static options. If service.mapping is defined select that option\n <FormControl>\n <InputLabel id=\"demo-simple-select-helper-label\">Service</InputLabel>\n <Select\n labelId=\"demo-simple-select-helper-label\"\n id=\"demo-simple-select-helper\"\n // onChange={handleChange}\n >\n <MenuItem value=\"\">\n <em>None</em>\n </MenuItem>\n {BackstageServices.map((backstageService) => {\n return (\n <MenuItem\n key={backstageService.name}\n value={backstageService.name}\n >\n {backstageService.name}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n // <select title=\"Mapping\" value={service.mapping}>\n // <option aria-label=\"None\" value=\"\" />\n // <option value=\"Ads\">Ads</option>\n // <option value=\"Cache\">Cache</option>\n // <option value=\"Catalog\">Catalog</option>\n // <option value=\"Checkout\">Checkout</option>\n // </select>\n ),\n actions: (\n <Button variant=\"contained\" color=\"primary\" href={service.html_url}>\n Open in PagerDuty\n </Button>\n ),\n };\n });\n\n return (\n <Table\n title=\"PagerDuty Service Import\"\n subtitle=\"Use this page to import services from PagerDuty and map them to existing Backstage services \"\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={data}\n />\n );\n};\n\nexport const ServiceMappingComponent = () => {\n const backstageServices: Service[] = [];\n const [catalogEntities, setCatalogEntities] = useState<Entity[]>([]);\n const [pagerDutyServices, setPagerDutyServices] = useState<PagerDutyService[]>([]);\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n useEffect(() => {\n async function fetchServices() {\n const { services: foundServices } = await pagerDutyApi.getAllServices();\n\n setPagerDutyServices(foundServices);\n }\n\n async function fetchEntities() { \n const response : GetEntitiesResponse = await catalogApi.getEntities();\n\n setCatalogEntities(response.items);\n }\n\n fetchServices();\n fetchEntities();\n }, [catalogApi, pagerDutyApi]);\n\n // const {\n // value: pagerDutyServices,\n // loading,\n // error,\n // } = useAsync(async () => {\n // const { services: foundServices } = await pagerDutyApi.getAllServices();\n\n // const response : GetEntitiesResponse = await catalogApi.getEntities();\n\n // setCatalogEntities(response.items);\n\n // return foundServices;\n // }, []);\n\n // if (error) {\n // return <p>Error: {error.message}</p>;\n // }\n\n // if(loading) {\n // return <p>Loading...</p>;\n // }\n\n catalogEntities.forEach((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 <DenseTable BackstageServices={backstageServices || []} PagerDutyServices={pagerDutyServices ?? []} />;\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 // const [toggleImport, setToggleImport] = useState(false);\n // const [toggleSave, setToggleSave] = useState(false);\n\n // const handleImport = () => {\n // setToggleImport(!toggleImport);\n // };\n\n // const handleSave = () => {\n // setToggleSave(!toggleSave);\n // }\n\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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"}
|