@pagerduty/backstage-plugin 0.12.1-next.97 → 0.12.1-next.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/client.esm.js +151 -0
- package/dist/api/client.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js +17 -0
- package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js +17 -0
- package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEventListItem.esm.js +70 -0
- package/dist/components/ChangeEvents/ChangeEventListItem.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEvents.esm.js +45 -0
- package/dist/components/ChangeEvents/ChangeEvents.esm.js.map +1 -0
- package/dist/components/EntityPagerDutyCard/index.esm.js +29 -0
- package/dist/components/EntityPagerDutyCard/index.esm.js.map +1 -0
- package/dist/components/EntityPagerDutySmallCard/index.esm.js +29 -0
- package/dist/components/EntityPagerDutySmallCard/index.esm.js.map +1 -0
- package/dist/components/Errors/ForbiddenError.esm.js +24 -0
- package/dist/components/Errors/ForbiddenError.esm.js.map +1 -0
- package/dist/components/Errors/MissingTokenError.esm.js +24 -0
- package/dist/components/Errors/MissingTokenError.esm.js.map +1 -0
- package/dist/components/Errors/ServiceNotFoundError.esm.js +24 -0
- package/dist/components/Errors/ServiceNotFoundError.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationPolicy.esm.js +64 -0
- package/dist/components/Escalation/EscalationPolicy.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUser.esm.js +98 -0
- package/dist/components/Escalation/EscalationUser.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUsersEmptyState.esm.js +20 -0
- package/dist/components/Escalation/EscalationUsersEmptyState.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUsersForbiddenState.esm.js +20 -0
- package/dist/components/Escalation/EscalationUsersForbiddenState.esm.js.map +1 -0
- package/dist/components/HomePagePagerDutyCard/Content.esm.js +9 -0
- package/dist/components/HomePagePagerDutyCard/Content.esm.js.map +1 -0
- package/dist/components/HomePagePagerDutyCard/index.esm.js +2 -0
- package/dist/components/HomePagePagerDutyCard/index.esm.js.map +1 -0
- package/dist/components/Incident/IncidentEmptyState.esm.js +27 -0
- package/dist/components/Incident/IncidentEmptyState.esm.js.map +1 -0
- package/dist/components/Incident/IncidentForbiddenState.esm.js +17 -0
- package/dist/components/Incident/IncidentForbiddenState.esm.js.map +1 -0
- package/dist/components/Incident/IncidentListItem.esm.js +114 -0
- package/dist/components/Incident/IncidentListItem.esm.js.map +1 -0
- package/dist/components/Incident/Incidents.esm.js +41 -0
- package/dist/components/Incident/Incidents.esm.js.map +1 -0
- package/dist/components/PagerDutyCard/index.esm.js +193 -0
- package/dist/components/PagerDutyCard/index.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js +35 -0
- package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js +42 -0
- package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js +95 -0
- package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/StatusCard.esm.js +102 -0
- package/dist/components/PagerDutyCardCommon/StatusCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js +59 -0
- package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js.map +1 -0
- package/dist/components/PagerDutySmallCard/index.esm.js +209 -0
- package/dist/components/PagerDutySmallCard/index.esm.js.map +1 -0
- package/dist/components/TriggerButton/index.esm.js +48 -0
- package/dist/components/TriggerButton/index.esm.js.map +1 -0
- package/dist/components/TriggerDialog/TriggerDialog.esm.js +94 -0
- package/dist/components/TriggerDialog/TriggerDialog.esm.js.map +1 -0
- package/dist/components/constants.esm.js +5 -0
- package/dist/components/constants.esm.js.map +1 -0
- package/dist/components/pagerDutyEntity.esm.js +13 -0
- package/dist/components/pagerDutyEntity.esm.js.map +1 -0
- package/dist/deprecated.esm.js +10 -0
- package/dist/deprecated.esm.js.map +1 -0
- package/dist/hooks/index.esm.js +10 -0
- package/dist/hooks/index.esm.js.map +1 -0
- package/dist/index.d.ts +9 -24
- package/dist/index.esm.js +6 -30
- package/dist/index.esm.js.map +1 -1
- package/dist/plugin.esm.js +71 -0
- package/dist/plugin.esm.js.map +1 -0
- package/package.json +19 -24
- package/dist/esm/index-84a03966.esm.js +0 -1626
- package/dist/esm/index-84a03966.esm.js.map +0 -1
- package/dist/esm/index-be994860.esm.js +0 -37
- package/dist/esm/index-be994860.esm.js.map +0 -1
- package/dist/esm/index-df69ef10.esm.js +0 -292
- package/dist/esm/index-df69ef10.esm.js.map +0 -1
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { makeStyles, ListItem, ListItemIcon, ListItemText, Tooltip, IconButton, Typography } from '@material-ui/core';
|
|
3
|
+
import Avatar from '@material-ui/core/Avatar';
|
|
4
|
+
import NotificationsIcon from '@material-ui/icons/Notifications';
|
|
5
|
+
|
|
6
|
+
const useStyles = makeStyles((theme) => ({
|
|
7
|
+
listItemPrimary: {
|
|
8
|
+
fontWeight: "bold"
|
|
9
|
+
},
|
|
10
|
+
listItemSecondary: {
|
|
11
|
+
fontWeight: "normal",
|
|
12
|
+
textDecoration: "underline",
|
|
13
|
+
marginTop: "-5px"
|
|
14
|
+
},
|
|
15
|
+
buttonStyle: {
|
|
16
|
+
marginLeft: "-11px",
|
|
17
|
+
marginTop: "-10px",
|
|
18
|
+
fontSize: "15px",
|
|
19
|
+
color: theme.palette.text.primary,
|
|
20
|
+
"&:hover": {
|
|
21
|
+
backgroundColor: "transparent",
|
|
22
|
+
textDecoration: "underline"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
userTextButtonStyle: {
|
|
26
|
+
marginLeft: "-11px",
|
|
27
|
+
marginTop: "-10px",
|
|
28
|
+
marginBottom: "-10px",
|
|
29
|
+
fontSize: "15px",
|
|
30
|
+
color: theme.palette.text.primary,
|
|
31
|
+
"&:hover": {
|
|
32
|
+
backgroundColor: "transparent",
|
|
33
|
+
textDecoration: "underline"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
containerStyle: {
|
|
37
|
+
display: "flex",
|
|
38
|
+
alignItems: "center",
|
|
39
|
+
fontWeight: "bold"
|
|
40
|
+
},
|
|
41
|
+
iconStyle: {
|
|
42
|
+
fontSize: "25px",
|
|
43
|
+
marginLeft: "-4px",
|
|
44
|
+
color: theme.palette.text.primary
|
|
45
|
+
},
|
|
46
|
+
smallIconStyle: {
|
|
47
|
+
color: theme.palette.text.primary
|
|
48
|
+
},
|
|
49
|
+
avatarStyle: {
|
|
50
|
+
marginTop: "-20px"
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
function navigateToUrl(url) {
|
|
54
|
+
window.open(url, "_blank");
|
|
55
|
+
}
|
|
56
|
+
const EscalationUser = ({ user, policyUrl, policyName }) => {
|
|
57
|
+
const classes = useStyles();
|
|
58
|
+
return /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement(
|
|
59
|
+
Avatar,
|
|
60
|
+
{
|
|
61
|
+
alt: user.name,
|
|
62
|
+
src: user.avatar_url,
|
|
63
|
+
className: classes.avatarStyle
|
|
64
|
+
}
|
|
65
|
+
)), /* @__PURE__ */ React.createElement(
|
|
66
|
+
ListItemText,
|
|
67
|
+
{
|
|
68
|
+
primary: /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Tooltip, { title: "Open user in PagerDuty", placement: "top" }, /* @__PURE__ */ React.createElement(
|
|
69
|
+
IconButton,
|
|
70
|
+
{
|
|
71
|
+
"aria-label": "open-user-in-browser",
|
|
72
|
+
onClick: () => navigateToUrl(user.html_url),
|
|
73
|
+
className: classes.userTextButtonStyle
|
|
74
|
+
},
|
|
75
|
+
/* @__PURE__ */ React.createElement("span", { className: classes.containerStyle }, user.name)
|
|
76
|
+
)), /* @__PURE__ */ React.createElement(
|
|
77
|
+
Typography,
|
|
78
|
+
{
|
|
79
|
+
className: classes.listItemSecondary,
|
|
80
|
+
color: "textSecondary"
|
|
81
|
+
},
|
|
82
|
+
user.email
|
|
83
|
+
)),
|
|
84
|
+
secondary: /* @__PURE__ */ React.createElement(
|
|
85
|
+
IconButton,
|
|
86
|
+
{
|
|
87
|
+
"aria-label": "open-escalation-policy-in-browser",
|
|
88
|
+
onClick: () => navigateToUrl(policyUrl),
|
|
89
|
+
className: classes.buttonStyle
|
|
90
|
+
},
|
|
91
|
+
/* @__PURE__ */ React.createElement("span", { className: classes.containerStyle }, /* @__PURE__ */ React.createElement(NotificationsIcon, { className: classes.iconStyle }), policyName)
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
));
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
export { EscalationUser };
|
|
98
|
+
//# sourceMappingURL=EscalationUser.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscalationUser.esm.js","sources":["../../../src/components/Escalation/EscalationUser.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport {\n ListItem,\n ListItemIcon,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport { PagerDutyUser } from '@pagerduty/backstage-plugin-common';\nimport NotificationsIcon from \"@material-ui/icons/Notifications\";\nimport { BackstageTheme } from '@backstage/theme';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n listItemSecondary: {\n fontWeight: \"normal\",\n textDecoration: \"underline\",\n marginTop: \"-5px\",\n },\n buttonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n userTextButtonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n marginBottom: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n containerStyle: {\n display: \"flex\",\n alignItems: \"center\",\n fontWeight: \"bold\",\n },\n iconStyle: {\n fontSize: \"25px\",\n marginLeft: \"-4px\",\n color: theme.palette.text.primary,\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n },\n avatarStyle: {\n marginTop: \"-20px\",\n },\n}));\n\ntype Props = {\n user: PagerDutyUser;\n policyUrl: string;\n policyName: string;\n};\n\nfunction navigateToUrl(url: string) {\n // open url in new browser window\n window.open(url, \"_blank\");\n}\n\nexport const EscalationUser = ({ user, policyUrl, policyName }: Props) => {\n const classes = useStyles();\n\n return (\n <ListItem>\n <ListItemIcon>\n <Avatar\n alt={user.name}\n src={user.avatar_url}\n className={classes.avatarStyle}\n />\n </ListItemIcon>\n <ListItemText\n primary={\n <>\n <Tooltip title=\"Open user in PagerDuty\" placement=\"top\">\n <IconButton\n aria-label=\"open-user-in-browser\"\n onClick={() => navigateToUrl(user.html_url)}\n className={classes.userTextButtonStyle}\n >\n <span className={classes.containerStyle}>{user.name}</span>\n </IconButton>\n </Tooltip>\n\n <Typography\n className={classes.listItemSecondary}\n color=\"textSecondary\"\n >\n {user.email}\n </Typography>\n </>\n }\n secondary={\n <IconButton\n aria-label=\"open-escalation-policy-in-browser\"\n onClick={() => navigateToUrl(policyUrl)}\n className={classes.buttonStyle}\n >\n <span className={classes.containerStyle}>\n <NotificationsIcon className={classes.iconStyle} />\n {policyName}\n </span>\n </IconButton>\n }\n />\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { makeStyles, ListItem, ListItemIcon, ListItemText } from '@material-ui/core';
|
|
3
|
+
import { StatusWarning } from '@backstage/core-components';
|
|
4
|
+
|
|
5
|
+
const useStyles = makeStyles({
|
|
6
|
+
denseListIcon: {
|
|
7
|
+
marginRight: 0,
|
|
8
|
+
display: "flex",
|
|
9
|
+
flexDirection: "column",
|
|
10
|
+
alignItems: "center",
|
|
11
|
+
justifyContent: "center"
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const EscalationUsersEmptyState = () => {
|
|
15
|
+
const classes = useStyles();
|
|
16
|
+
return /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement("div", { className: classes.denseListIcon }, /* @__PURE__ */ React.createElement(StatusWarning, null))), /* @__PURE__ */ React.createElement(ListItemText, { primary: "No one is on-call. Update the escalation policy." }));
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { EscalationUsersEmptyState };
|
|
20
|
+
//# sourceMappingURL=EscalationUsersEmptyState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscalationUsersEmptyState.esm.js","sources":["../../../src/components/Escalation/EscalationUsersEmptyState.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport {\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n} from '@material-ui/core';\nimport { StatusWarning } from '@backstage/core-components';\n\nconst useStyles = makeStyles({\n denseListIcon: {\n marginRight: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nexport const EscalationUsersEmptyState = () => {\n const classes = useStyles();\n return (\n <ListItem>\n <ListItemIcon>\n <div className={classes.denseListIcon}>\n <StatusWarning />\n </div>\n </ListItemIcon>\n <ListItemText primary=\"No one is on-call. Update the escalation policy.\" />\n </ListItem>\n );\n};\n"],"names":[],"mappings":";;;;AAyBA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,aAAe,EAAA;AAAA,IACb,WAAa,EAAA,CAAA;AAAA,IACb,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,QAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,GAClB;AACF,CAAC,CAAA,CAAA;AAEM,MAAM,4BAA4B,MAAM;AAC7C,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,2CACG,QACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,oCACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,aAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA,IAAc,CACjB,CACF,CAAA,sCACC,YAAa,EAAA,EAAA,OAAA,EAAQ,oDAAmD,CAC3E,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { makeStyles, ListItem, ListItemIcon, ListItemText } from '@material-ui/core';
|
|
3
|
+
import { StatusError } from '@backstage/core-components';
|
|
4
|
+
|
|
5
|
+
const useStyles = makeStyles({
|
|
6
|
+
denseListIcon: {
|
|
7
|
+
marginRight: 0,
|
|
8
|
+
display: "flex",
|
|
9
|
+
flexDirection: "column",
|
|
10
|
+
alignItems: "center",
|
|
11
|
+
justifyContent: "center"
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const EscalationUsersForbiddenState = () => {
|
|
15
|
+
const classes = useStyles();
|
|
16
|
+
return /* @__PURE__ */ React.createElement(ListItem, null, /* @__PURE__ */ React.createElement(ListItemIcon, null, /* @__PURE__ */ React.createElement("div", { className: classes.denseListIcon }, /* @__PURE__ */ React.createElement(StatusError, null))), /* @__PURE__ */ React.createElement(ListItemText, { primary: "You don't permissions to list on-calls. Check your OAuth token permissions." }));
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export { EscalationUsersForbiddenState };
|
|
20
|
+
//# sourceMappingURL=EscalationUsersForbiddenState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscalationUsersForbiddenState.esm.js","sources":["../../../src/components/Escalation/EscalationUsersForbiddenState.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport {\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n} from '@material-ui/core';\nimport { StatusError } from '@backstage/core-components';\n\nconst useStyles = makeStyles({\n denseListIcon: {\n marginRight: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nexport const EscalationUsersForbiddenState = () => {\n const classes = useStyles();\n return (\n <ListItem>\n <ListItemIcon>\n <div className={classes.denseListIcon}>\n <StatusError />\n </div>\n </ListItemIcon>\n <ListItemText primary=\"You don't permissions to list on-calls. Check your OAuth token permissions.\" />\n </ListItem>\n );\n};\n"],"names":[],"mappings":";;;;AAyBA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,aAAe,EAAA;AAAA,IACb,WAAa,EAAA,CAAA;AAAA,IACb,OAAS,EAAA,MAAA;AAAA,IACT,aAAe,EAAA,QAAA;AAAA,IACf,UAAY,EAAA,QAAA;AAAA,IACZ,cAAgB,EAAA,QAAA;AAAA,GAClB;AACF,CAAC,CAAA,CAAA;AAEM,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,2CACG,QACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,oCACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,WAAW,OAAQ,CAAA,aAAA,EAAA,kBACrB,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA,IAAY,CACf,CACF,CAAA,sCACC,YAAa,EAAA,EAAA,OAAA,EAAQ,+EAA8E,CACtG,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PagerDutyCard } from '../PagerDutyCard/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const Content = (props) => {
|
|
5
|
+
return /* @__PURE__ */ React.createElement(PagerDutyCard, { ...props });
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { Content };
|
|
9
|
+
//# sourceMappingURL=Content.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Content.esm.js","sources":["../../../src/components/HomePagePagerDutyCard/Content.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\n\nimport { PagerDutyEntity } from '../../types';\nimport { PagerDutyCard } from '../PagerDutyCard';\n\n/** @public */\nexport type HomePagePagerDutyCardProps = PagerDutyEntity & {\n readOnly?: boolean;\n};\n\n/** @public */\nexport const Content = (props: HomePagePagerDutyCardProps) => {\n return <PagerDutyCard {...props} />;\n};\n"],"names":[],"mappings":";;;AA2Ba,MAAA,OAAA,GAAU,CAAC,KAAsC,KAAA;AAC5D,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAe,EAAA,EAAA,GAAG,KAAO,EAAA,CAAA,CAAA;AACnC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Grid, Typography } from '@material-ui/core';
|
|
3
|
+
import EmptyStateImage from '../../assets/emptystate.svg';
|
|
4
|
+
|
|
5
|
+
const IncidentsEmptyState = () => {
|
|
6
|
+
return /* @__PURE__ */ React.createElement(
|
|
7
|
+
Grid,
|
|
8
|
+
{
|
|
9
|
+
container: true,
|
|
10
|
+
justifyContent: "center",
|
|
11
|
+
direction: "column",
|
|
12
|
+
alignItems: "center"
|
|
13
|
+
},
|
|
14
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, "Nice! No incidents found!")),
|
|
15
|
+
/* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
16
|
+
"img",
|
|
17
|
+
{
|
|
18
|
+
src: EmptyStateImage,
|
|
19
|
+
alt: "EmptyState",
|
|
20
|
+
"data-testid": "emptyStateImg"
|
|
21
|
+
}
|
|
22
|
+
))
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { IncidentsEmptyState };
|
|
27
|
+
//# sourceMappingURL=IncidentEmptyState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentEmptyState.esm.js","sources":["../../../src/components/Incident/IncidentEmptyState.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport EmptyStateImage from \"../../assets/emptystate.svg\";\n\nexport const IncidentsEmptyState = () => {\n return (\n <Grid\n container\n justifyContent=\"center\"\n direction=\"column\"\n alignItems=\"center\"\n >\n <Grid item xs={12}>\n <Typography variant=\"h5\">Nice! No incidents found!</Typography>\n </Grid>\n <Grid item xs={12}>\n <img\n src={EmptyStateImage}\n alt=\"EmptyState\"\n data-testid=\"emptyStateImg\"\n />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;AAoBO,MAAM,sBAAsB,MAAM;AACvC,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAS,EAAA,IAAA;AAAA,MACT,cAAe,EAAA,QAAA;AAAA,MACf,SAAU,EAAA,QAAA;AAAA,MACV,UAAW,EAAA,QAAA;AAAA,KAAA;AAAA,oBAEX,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,IAAK,EAAA,EAAA,2BAAyB,CACpD,CAAA;AAAA,oBACC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,IAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAK,EAAA,eAAA;AAAA,QACL,GAAI,EAAA,YAAA;AAAA,QACJ,aAAY,EAAA,eAAA;AAAA,OAAA;AAAA,KAEhB,CAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Grid, Typography } from '@material-ui/core';
|
|
3
|
+
import ForbiddenStateImage from '../../assets/forbiddenstate.svg';
|
|
4
|
+
|
|
5
|
+
const IncidentForbiddenState = () => {
|
|
6
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "center", direction: "column", alignItems: "center" }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(Typography, { variant: "h5" }, "Feature not available with your account or token.")), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, /* @__PURE__ */ React.createElement(
|
|
7
|
+
"img",
|
|
8
|
+
{
|
|
9
|
+
src: ForbiddenStateImage,
|
|
10
|
+
alt: "ForbiddenState",
|
|
11
|
+
"data-testid": "forbiddenStateImg"
|
|
12
|
+
}
|
|
13
|
+
)));
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { IncidentForbiddenState };
|
|
17
|
+
//# sourceMappingURL=IncidentForbiddenState.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentForbiddenState.esm.js","sources":["../../../src/components/Incident/IncidentForbiddenState.tsx"],"sourcesContent":["/*\n * Copyright 2020 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\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport { Grid, Typography } from '@material-ui/core';\nimport ForbiddenStateImage from '../../assets/forbiddenstate.svg';\n\nexport const IncidentForbiddenState = () => {\n return (\n <Grid container justifyContent=\"center\" direction=\"column\" alignItems=\"center\">\n <Grid item xs={12}>\n <Typography variant=\"h5\">Feature not available with your account or token.</Typography>\n </Grid>\n <Grid item xs={12}>\n <img\n src={ForbiddenStateImage}\n alt=\"ForbiddenState\"\n data-testid=\"forbiddenStateImg\"\n />\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;AAqBO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,cAAe,EAAA,QAAA,EAAS,SAAU,EAAA,QAAA,EAAS,UAAW,EAAA,QAAA,EAAA,kBACnE,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,EAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,IAAA,EAAA,EAAK,mDAAiD,CAC5E,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,EACb,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAK,EAAA,mBAAA;AAAA,MACL,GAAI,EAAA,gBAAA;AAAA,MACJ,aAAY,EAAA,mBAAA;AAAA,KAAA;AAAA,GAEhB,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { makeStyles, ListItem, ListItemText, Chip, Typography, ListItemSecondaryAction, Tooltip, IconButton } from '@material-ui/core';
|
|
3
|
+
import { DateTime, Duration } from 'luxon';
|
|
4
|
+
import OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';
|
|
5
|
+
import { Link } from '@backstage/core-components';
|
|
6
|
+
|
|
7
|
+
const useStyles = makeStyles((theme) => ({
|
|
8
|
+
denseListIcon: {
|
|
9
|
+
marginRight: 0,
|
|
10
|
+
display: "flex",
|
|
11
|
+
flexDirection: "column",
|
|
12
|
+
alignItems: "center",
|
|
13
|
+
justifyContent: "center"
|
|
14
|
+
},
|
|
15
|
+
listItemPrimary: {
|
|
16
|
+
fontWeight: "bold"
|
|
17
|
+
},
|
|
18
|
+
warning: {
|
|
19
|
+
borderColor: theme.palette.warning.main,
|
|
20
|
+
color: "#fff",
|
|
21
|
+
backgroundColor: theme.palette.warning.main,
|
|
22
|
+
boxShadow: "0 4px 4px 0 rgba(0,0,0,0.2)",
|
|
23
|
+
textTransform: "uppercase",
|
|
24
|
+
"& *": {
|
|
25
|
+
color: "#fff"
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
error: {
|
|
29
|
+
borderColor: theme.palette.error.main,
|
|
30
|
+
color: "#fff",
|
|
31
|
+
backgroundColor: theme.palette.error.main,
|
|
32
|
+
boxShadow: "0 4px 4px 0 rgba(0,0,0,0.2)",
|
|
33
|
+
textTransform: "uppercase",
|
|
34
|
+
"& *": {
|
|
35
|
+
color: "#fff"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
lowUrgency: {
|
|
39
|
+
borderColor: theme.palette.warning.main,
|
|
40
|
+
color: theme.palette.warning.main,
|
|
41
|
+
backgroundColor: "#fff",
|
|
42
|
+
boxShadow: "0 4px 4px 0 rgba(0,0,0,0.2)",
|
|
43
|
+
textTransform: "uppercase",
|
|
44
|
+
"& *": {
|
|
45
|
+
color: theme.palette.warning.main
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
highUrgency: {
|
|
49
|
+
borderColor: theme.palette.error.main,
|
|
50
|
+
color: theme.palette.error.main,
|
|
51
|
+
backgroundColor: "#fff",
|
|
52
|
+
boxShadow: "0 4px 4px 0 rgba(0,0,0,0.2)",
|
|
53
|
+
textTransform: "uppercase",
|
|
54
|
+
"& *": {
|
|
55
|
+
color: theme.palette.error.main
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
textContainer: {
|
|
59
|
+
display: "flex",
|
|
60
|
+
alignItems: "baseline"
|
|
61
|
+
},
|
|
62
|
+
smallIconStyle: {
|
|
63
|
+
color: theme.palette.text.primary,
|
|
64
|
+
marginRight: "-20px"
|
|
65
|
+
}
|
|
66
|
+
}));
|
|
67
|
+
const IncidentListItem = ({ incident }) => {
|
|
68
|
+
var _a, _b, _c;
|
|
69
|
+
const classes = useStyles();
|
|
70
|
+
const duration = (/* @__PURE__ */ new Date()).getTime() - new Date(incident.created_at).getTime();
|
|
71
|
+
const createdAt = DateTime.local().minus(Duration.fromMillis(duration)).toRelative({ locale: "en" });
|
|
72
|
+
const user = (_a = incident.assignments[0]) == null ? void 0 : _a.assignee;
|
|
73
|
+
return /* @__PURE__ */ React.createElement(ListItem, { dense: true, key: incident.id }, /* @__PURE__ */ React.createElement(
|
|
74
|
+
ListItemText,
|
|
75
|
+
{
|
|
76
|
+
primary: /* @__PURE__ */ React.createElement("div", { className: classes.textContainer }, /* @__PURE__ */ React.createElement(
|
|
77
|
+
Chip,
|
|
78
|
+
{
|
|
79
|
+
"data-testid": `chip-${incident.status}`,
|
|
80
|
+
label: incident.status,
|
|
81
|
+
size: "small",
|
|
82
|
+
variant: "outlined",
|
|
83
|
+
className: incident.status === "triggered" ? classes.error : classes.warning
|
|
84
|
+
}
|
|
85
|
+
), /* @__PURE__ */ React.createElement(
|
|
86
|
+
Chip,
|
|
87
|
+
{
|
|
88
|
+
"data-testid": `chip-${incident.urgency}`,
|
|
89
|
+
label: `${incident.urgency} urgency`,
|
|
90
|
+
size: "small",
|
|
91
|
+
variant: "outlined",
|
|
92
|
+
className: incident.urgency === "high" ? classes.highUrgency : classes.lowUrgency
|
|
93
|
+
}
|
|
94
|
+
), incident.title),
|
|
95
|
+
primaryTypographyProps: {
|
|
96
|
+
variant: "body1",
|
|
97
|
+
className: classes.listItemPrimary
|
|
98
|
+
},
|
|
99
|
+
secondary: /* @__PURE__ */ React.createElement(Typography, { noWrap: true, variant: "body2", color: "textSecondary" }, "Created ", createdAt, " and assigned to", " ", /* @__PURE__ */ React.createElement(Link, { to: (_b = user == null ? void 0 : user.html_url) != null ? _b : "#" }, (_c = user == null ? void 0 : user.summary) != null ? _c : "nobody"))
|
|
100
|
+
}
|
|
101
|
+
), /* @__PURE__ */ React.createElement(ListItemSecondaryAction, null, /* @__PURE__ */ React.createElement(Tooltip, { title: "View in PagerDuty", placement: "top" }, /* @__PURE__ */ React.createElement(
|
|
102
|
+
IconButton,
|
|
103
|
+
{
|
|
104
|
+
href: incident.html_url,
|
|
105
|
+
target: "_blank",
|
|
106
|
+
rel: "noopener noreferrer",
|
|
107
|
+
className: classes.smallIconStyle
|
|
108
|
+
},
|
|
109
|
+
/* @__PURE__ */ React.createElement(OpenInBrowserIcon, null)
|
|
110
|
+
))));
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export { IncidentListItem };
|
|
114
|
+
//# sourceMappingURL=IncidentListItem.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncidentListItem.esm.js","sources":["../../../src/components/Incident/IncidentListItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React from 'react';\nimport {\n ListItem,\n ListItemSecondaryAction,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n Chip,\n} from '@material-ui/core';\nimport { DateTime, Duration } from 'luxon';\nimport { PagerDutyIncident } from '@pagerduty/backstage-plugin-common';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n denseListIcon: {\n marginRight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n warning: {\n borderColor: theme.palette.warning.main,\n color: \"#fff\",\n backgroundColor: theme.palette.warning.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n error: {\n borderColor: theme.palette.error.main,\n color: \"#fff\",\n backgroundColor: theme.palette.error.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n lowUrgency: {\n borderColor: theme.palette.warning.main,\n color: theme.palette.warning.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.warning.main,\n },\n },\n highUrgency: {\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.error.main,\n },\n },\n textContainer: {\n display: \"flex\",\n alignItems: \"baseline\",\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n}));\n\ntype Props = {\n incident: PagerDutyIncident;\n};\n\nexport const IncidentListItem = ({ incident }: Props) => {\n const classes = useStyles();\n const duration =\n new Date().getTime() - new Date(incident.created_at).getTime();\n const createdAt = DateTime.local()\n .minus(Duration.fromMillis(duration))\n .toRelative({ locale: 'en' });\n const user = incident.assignments[0]?.assignee;\n\n return (\n <ListItem dense key={incident.id}>\n <ListItemText\n primary={\n <div className={classes.textContainer}>\n <Chip\n data-testid={`chip-${incident.status}`}\n label={incident.status}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.status === \"triggered\"\n ? classes.error\n : classes.warning\n }\n />\n <Chip\n data-testid={`chip-${incident.urgency}`}\n label={`${incident.urgency} urgency`}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.urgency === \"high\"\n ? classes.highUrgency\n : classes.lowUrgency\n }\n />\n {incident.title}\n </div>\n }\n primaryTypographyProps={{\n variant: \"body1\",\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography noWrap variant=\"body2\" color=\"textSecondary\">\n Created {createdAt} and assigned to{\" \"}\n <Link to={user?.html_url ?? \"#\"}>{user?.summary ?? \"nobody\"}</Link>\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n <Tooltip title=\"View in PagerDuty\" placement=\"top\">\n <IconButton\n href={incident.html_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes.smallIconStyle}\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
|
+
import { List } from '@material-ui/core';
|
|
3
|
+
import { IncidentListItem } from './IncidentListItem.esm.js';
|
|
4
|
+
import { IncidentsEmptyState } from './IncidentEmptyState.esm.js';
|
|
5
|
+
import useAsyncFn from 'react-use/lib/useAsyncFn';
|
|
6
|
+
import { pagerDutyApiRef } from '../../api/client.esm.js';
|
|
7
|
+
import { Alert } from '@material-ui/lab';
|
|
8
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
9
|
+
import { Progress } from '@backstage/core-components';
|
|
10
|
+
import { IncidentForbiddenState } from './IncidentForbiddenState.esm.js';
|
|
11
|
+
|
|
12
|
+
const Incidents = ({ serviceId, refreshIncidents }) => {
|
|
13
|
+
const api = useApi(pagerDutyApiRef);
|
|
14
|
+
const [{ value: incidents, loading, error }, getIncidents] = useAsyncFn(
|
|
15
|
+
async () => {
|
|
16
|
+
const { incidents: foundIncidents } = await api.getIncidentsByServiceId(
|
|
17
|
+
serviceId
|
|
18
|
+
);
|
|
19
|
+
return foundIncidents;
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
getIncidents();
|
|
24
|
+
}, [refreshIncidents, getIncidents]);
|
|
25
|
+
if (error) {
|
|
26
|
+
if (error.message.includes("Forbidden")) {
|
|
27
|
+
return /* @__PURE__ */ React.createElement(IncidentForbiddenState, null);
|
|
28
|
+
}
|
|
29
|
+
return /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, "Error encountered while fetching information. ", error.message);
|
|
30
|
+
}
|
|
31
|
+
if (loading) {
|
|
32
|
+
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
33
|
+
}
|
|
34
|
+
if (!(incidents == null ? void 0 : incidents.length)) {
|
|
35
|
+
return /* @__PURE__ */ React.createElement(IncidentsEmptyState, null);
|
|
36
|
+
}
|
|
37
|
+
return /* @__PURE__ */ React.createElement(List, { dense: true }, incidents.map((incident, index) => /* @__PURE__ */ React.createElement(IncidentListItem, { key: incident.id + index, incident })));
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export { Incidents };
|
|
41
|
+
//# sourceMappingURL=Incidents.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Incidents.esm.js","sources":["../../../src/components/Incident/Incidents.tsx"],"sourcesContent":["/*\n * Copyright 2020 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// eslint-disable-next-line @backstage/no-undeclared-imports\nimport React, { useEffect } from 'react';\nimport { List } from '@material-ui/core';\nimport { IncidentListItem } from './IncidentListItem';\nimport { IncidentsEmptyState } from './IncidentEmptyState';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport { pagerDutyApiRef } from '../../api';\nimport { Alert } from '@material-ui/lab';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { Progress } from '@backstage/core-components';\nimport { IncidentForbiddenState } from './IncidentForbiddenState';\n\ntype Props = {\n serviceId: string;\n refreshIncidents: boolean;\n};\n\nexport const Incidents = ({ serviceId, refreshIncidents }: Props) => {\n const api = useApi(pagerDutyApiRef);\n\n const [{ value: incidents, loading, error }, getIncidents] = useAsyncFn(\n async () => {\n const { incidents: foundIncidents } = await api.getIncidentsByServiceId(\n serviceId,\n );\n return foundIncidents;\n },\n );\n\n useEffect(() => {\n getIncidents();\n }, [refreshIncidents, getIncidents]);\n\n if (error) {\n if (error.message.includes('Forbidden')) {\n return <IncidentForbiddenState />;\n }\n\n return (\n <Alert severity=\"error\">\n Error encountered while fetching information. {error.message}\n </Alert>\n );\n }\n\n if (loading) {\n return <Progress />;\n }\n\n if (!incidents?.length) {\n return <IncidentsEmptyState />;\n }\n\n return (\n <List dense>\n {incidents!.map((incident, index) => (\n <IncidentListItem key={incident.id + index} incident={incident} />\n ))}\n </List>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAiCO,MAAM,SAAY,GAAA,CAAC,EAAE,SAAA,EAAW,kBAA8B,KAAA;AACnE,EAAM,MAAA,GAAA,GAAM,OAAO,eAAe,CAAA,CAAA;AAElC,EAAM,MAAA,CAAC,EAAE,KAAO,EAAA,SAAA,EAAW,SAAS,KAAM,EAAA,EAAG,YAAY,CAAI,GAAA,UAAA;AAAA,IAC3D,YAAY;AACV,MAAA,MAAM,EAAE,SAAA,EAAW,cAAe,EAAA,GAAI,MAAM,GAAI,CAAA,uBAAA;AAAA,QAC9C,SAAA;AAAA,OACF,CAAA;AACA,MAAO,OAAA,cAAA,CAAA;AAAA,KACT;AAAA,GACF,CAAA;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAa,YAAA,EAAA,CAAA;AAAA,GACZ,EAAA,CAAC,gBAAkB,EAAA,YAAY,CAAC,CAAA,CAAA;AAEnC,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,WAAW,CAAG,EAAA;AACvC,MAAA,2CAAQ,sBAAuB,EAAA,IAAA,CAAA,CAAA;AAAA,KACjC;AAEA,IAAA,2CACG,KAAM,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,EAAA,gDAAA,EACyB,MAAM,OACvD,CAAA,CAAA;AAAA,GAEJ;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAAA,GACnB;AAEA,EAAI,IAAA,EAAC,uCAAW,MAAQ,CAAA,EAAA;AACtB,IAAA,2CAAQ,mBAAoB,EAAA,IAAA,CAAA,CAAA;AAAA,GAC9B;AAEA,EAAA,2CACG,IAAK,EAAA,EAAA,KAAA,EAAK,IACR,EAAA,EAAA,SAAA,CAAW,IAAI,CAAC,QAAA,EAAU,KACzB,qBAAA,KAAA,CAAA,aAAA,CAAC,oBAAiB,GAAK,EAAA,QAAA,CAAS,KAAK,KAAO,EAAA,QAAA,EAAoB,CACjE,CACH,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import React, { useState, useCallback } from 'react';
|
|
2
|
+
import { Card, CardHeader, Grid, Typography, Divider, CardContent } from '@material-ui/core';
|
|
3
|
+
import { Incidents } from '../Incident/Incidents.esm.js';
|
|
4
|
+
import { EscalationPolicy } from '../Escalation/EscalationPolicy.esm.js';
|
|
5
|
+
import useAsync from 'react-use/lib/useAsync';
|
|
6
|
+
import { pagerDutyApiRef, UnauthorizedError } from '../../api/client.esm.js';
|
|
7
|
+
import { MissingTokenError } from '../Errors/MissingTokenError.esm.js';
|
|
8
|
+
import { ServiceNotFoundError } from '../Errors/ServiceNotFoundError.esm.js';
|
|
9
|
+
import { ChangeEvents } from '../ChangeEvents/ChangeEvents.esm.js';
|
|
10
|
+
import PDGreenImage from '../../assets/PD-Green.svg';
|
|
11
|
+
import PDWhiteImage from '../../assets/PD-White.svg';
|
|
12
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
13
|
+
import { NotFoundError } from '@backstage/errors';
|
|
14
|
+
import { Progress, TabbedCard, CardTab, InfoCard } from '@backstage/core-components';
|
|
15
|
+
import { ForbiddenError } from '../Errors/ForbiddenError.esm.js';
|
|
16
|
+
import IncidentCounterCard from '../PagerDutyCardCommon/InsightsCard.esm.js';
|
|
17
|
+
import { OpenServiceButton } from '../PagerDutyCardCommon/OpenServiceButton.esm.js';
|
|
18
|
+
import ServiceStandardsCard from '../PagerDutyCardCommon/ServiceStandardsCard.esm.js';
|
|
19
|
+
import StatusCard from '../PagerDutyCardCommon/StatusCard.esm.js';
|
|
20
|
+
import { TriggerIncidentButton } from '../PagerDutyCardCommon/TriggerIncidentButton.esm.js';
|
|
21
|
+
import { makeStyles, createStyles, useTheme } from '@material-ui/core/styles';
|
|
22
|
+
|
|
23
|
+
const useStyles = makeStyles(
|
|
24
|
+
(theme) => createStyles({
|
|
25
|
+
overviewHeaderTextStyle: {
|
|
26
|
+
fontSize: "14px",
|
|
27
|
+
fontWeight: 500,
|
|
28
|
+
color: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)"
|
|
29
|
+
},
|
|
30
|
+
oncallHeaderTextStyle: {
|
|
31
|
+
fontSize: "14px",
|
|
32
|
+
fontWeight: 500,
|
|
33
|
+
marginTop: "10px",
|
|
34
|
+
color: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)"
|
|
35
|
+
},
|
|
36
|
+
headerStyle: {
|
|
37
|
+
marginBottom: "0px",
|
|
38
|
+
fontSize: "0px"
|
|
39
|
+
},
|
|
40
|
+
overviewHeaderContainerStyle: {
|
|
41
|
+
display: "flex",
|
|
42
|
+
margin: "15px",
|
|
43
|
+
marginBottom: "20px"
|
|
44
|
+
},
|
|
45
|
+
headerWithSubheaderContainerStyle: {
|
|
46
|
+
display: "flex",
|
|
47
|
+
alignItems: "center"
|
|
48
|
+
},
|
|
49
|
+
subheaderTextStyle: {
|
|
50
|
+
fontSize: "10px",
|
|
51
|
+
marginLeft: "5px"
|
|
52
|
+
},
|
|
53
|
+
overviewCardsContainerStyle: {
|
|
54
|
+
display: "flex",
|
|
55
|
+
margin: "15px",
|
|
56
|
+
marginTop: "-15px"
|
|
57
|
+
},
|
|
58
|
+
incidentMetricsContainerStyle: {
|
|
59
|
+
display: "flex",
|
|
60
|
+
height: "100%",
|
|
61
|
+
justifyContent: "center",
|
|
62
|
+
columnSpan: "all"
|
|
63
|
+
}
|
|
64
|
+
})
|
|
65
|
+
);
|
|
66
|
+
const BasicCard = ({ children }) => /* @__PURE__ */ React.createElement(InfoCard, { title: "PagerDuty" }, children);
|
|
67
|
+
const PagerDutyCard = (props) => {
|
|
68
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
69
|
+
const classes = useStyles();
|
|
70
|
+
const theme = useTheme();
|
|
71
|
+
const { readOnly, disableChangeEvents, disableOnCall } = props;
|
|
72
|
+
const api = useApi(pagerDutyApiRef);
|
|
73
|
+
const [refreshIncidents, setRefreshIncidents] = useState(false);
|
|
74
|
+
const [refreshChangeEvents, setRefreshChangeEvents] = useState(false);
|
|
75
|
+
const [refreshStatus, setRefreshStatus] = useState(false);
|
|
76
|
+
const handleRefresh = useCallback(() => {
|
|
77
|
+
setRefreshIncidents((x) => !x);
|
|
78
|
+
setRefreshChangeEvents((x) => !x);
|
|
79
|
+
setRefreshStatus((x) => !x);
|
|
80
|
+
}, []);
|
|
81
|
+
const {
|
|
82
|
+
value: service,
|
|
83
|
+
loading,
|
|
84
|
+
error
|
|
85
|
+
} = useAsync(async () => {
|
|
86
|
+
const { service: foundService } = await api.getServiceByPagerDutyEntity(
|
|
87
|
+
props
|
|
88
|
+
);
|
|
89
|
+
const serviceStandards = await api.getServiceStandardsByServiceId(
|
|
90
|
+
foundService.id
|
|
91
|
+
);
|
|
92
|
+
const serviceMetrics = await api.getServiceMetricsByServiceId(
|
|
93
|
+
foundService.id
|
|
94
|
+
);
|
|
95
|
+
const result = {
|
|
96
|
+
id: foundService.id,
|
|
97
|
+
name: foundService.name,
|
|
98
|
+
url: foundService.html_url,
|
|
99
|
+
policyId: foundService.escalation_policy.id,
|
|
100
|
+
policyLink: foundService.escalation_policy.html_url,
|
|
101
|
+
policyName: foundService.escalation_policy.name,
|
|
102
|
+
status: foundService.status,
|
|
103
|
+
standards: serviceStandards !== void 0 ? serviceStandards.standards : void 0,
|
|
104
|
+
metrics: serviceMetrics !== void 0 ? serviceMetrics.metrics : void 0
|
|
105
|
+
};
|
|
106
|
+
return result;
|
|
107
|
+
}, [props]);
|
|
108
|
+
if (error) {
|
|
109
|
+
let errorNode;
|
|
110
|
+
switch (error.constructor) {
|
|
111
|
+
case UnauthorizedError:
|
|
112
|
+
errorNode = /* @__PURE__ */ React.createElement(MissingTokenError, null);
|
|
113
|
+
break;
|
|
114
|
+
case NotFoundError:
|
|
115
|
+
errorNode = /* @__PURE__ */ React.createElement(ServiceNotFoundError, null);
|
|
116
|
+
break;
|
|
117
|
+
default:
|
|
118
|
+
errorNode = /* @__PURE__ */ React.createElement(ForbiddenError, null);
|
|
119
|
+
}
|
|
120
|
+
return /* @__PURE__ */ React.createElement(BasicCard, null, errorNode);
|
|
121
|
+
}
|
|
122
|
+
if (loading) {
|
|
123
|
+
return /* @__PURE__ */ React.createElement(BasicCard, null, /* @__PURE__ */ React.createElement(Progress, null));
|
|
124
|
+
}
|
|
125
|
+
return /* @__PURE__ */ React.createElement(Card, { "data-testid": "pagerduty-card" }, /* @__PURE__ */ React.createElement(
|
|
126
|
+
CardHeader,
|
|
127
|
+
{
|
|
128
|
+
className: classes.headerStyle,
|
|
129
|
+
title: theme.palette.type === "dark" ? /* @__PURE__ */ React.createElement("img", { src: PDWhiteImage, alt: "PagerDuty", height: "35" }) : /* @__PURE__ */ React.createElement("img", { src: PDGreenImage, alt: "PagerDuty", height: "35" }),
|
|
130
|
+
action: !readOnly && props.integrationKey ? /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(
|
|
131
|
+
TriggerIncidentButton,
|
|
132
|
+
{
|
|
133
|
+
"data-testid": "trigger-incident-button",
|
|
134
|
+
integrationKey: props.integrationKey,
|
|
135
|
+
entityName: props.name,
|
|
136
|
+
handleRefresh
|
|
137
|
+
}
|
|
138
|
+
), /* @__PURE__ */ React.createElement(OpenServiceButton, { serviceUrl: service.url })) : /* @__PURE__ */ React.createElement(OpenServiceButton, { serviceUrl: service.url })
|
|
139
|
+
}
|
|
140
|
+
), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, className: classes.overviewHeaderContainerStyle }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 3 }, /* @__PURE__ */ React.createElement(Typography, { className: classes.overviewHeaderTextStyle }, "STATUS")), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 6 }, /* @__PURE__ */ React.createElement("span", { className: classes.headerWithSubheaderContainerStyle }, /* @__PURE__ */ React.createElement(Typography, { className: classes.overviewHeaderTextStyle }, "INSIGHTS"), /* @__PURE__ */ React.createElement(Typography, { className: classes.subheaderTextStyle }, "(last 30 days)"))), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 3 }, /* @__PURE__ */ React.createElement(Typography, { className: classes.overviewHeaderTextStyle }, "STANDARDS"))), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 12, className: classes.overviewCardsContainerStyle }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 3 }, /* @__PURE__ */ React.createElement(StatusCard, { serviceId: service.id, refreshStatus })), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 6, className: classes.incidentMetricsContainerStyle }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 4 }, /* @__PURE__ */ React.createElement(
|
|
141
|
+
IncidentCounterCard,
|
|
142
|
+
{
|
|
143
|
+
count: (service == null ? void 0 : service.metrics) !== void 0 && service.metrics.length > 0 ? service == null ? void 0 : service.metrics[0].total_interruptions : void 0,
|
|
144
|
+
label: "interruptions",
|
|
145
|
+
color: theme.palette.textSubtle
|
|
146
|
+
}
|
|
147
|
+
)), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 4 }, /* @__PURE__ */ React.createElement(
|
|
148
|
+
IncidentCounterCard,
|
|
149
|
+
{
|
|
150
|
+
count: (service == null ? void 0 : service.metrics) !== void 0 && service.metrics.length > 0 ? service == null ? void 0 : service.metrics[0].total_high_urgency_incidents : void 0,
|
|
151
|
+
label: "high urgency",
|
|
152
|
+
color: theme.palette.warning.main
|
|
153
|
+
}
|
|
154
|
+
)), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 4 }, /* @__PURE__ */ React.createElement(
|
|
155
|
+
IncidentCounterCard,
|
|
156
|
+
{
|
|
157
|
+
count: (service == null ? void 0 : service.metrics) !== void 0 && ((_a = service == null ? void 0 : service.metrics) == null ? void 0 : _a.length) > 0 ? service == null ? void 0 : service.metrics[0].total_incident_count : void 0,
|
|
158
|
+
label: "incidents",
|
|
159
|
+
color: theme.palette.error.main
|
|
160
|
+
}
|
|
161
|
+
))), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 3 }, /* @__PURE__ */ React.createElement(
|
|
162
|
+
ServiceStandardsCard,
|
|
163
|
+
{
|
|
164
|
+
total: ((_b = service == null ? void 0 : service.standards) == null ? void 0 : _b.score) !== void 0 ? (_d = (_c = service == null ? void 0 : service.standards) == null ? void 0 : _c.score) == null ? void 0 : _d.total : void 0,
|
|
165
|
+
completed: ((_e = service == null ? void 0 : service.standards) == null ? void 0 : _e.score) !== void 0 ? (_g = (_f = service == null ? void 0 : service.standards) == null ? void 0 : _f.score) == null ? void 0 : _g.passing : void 0,
|
|
166
|
+
standards: (service == null ? void 0 : service.standards) !== void 0 ? (_h = service == null ? void 0 : service.standards) == null ? void 0 : _h.standards : void 0
|
|
167
|
+
}
|
|
168
|
+
))), /* @__PURE__ */ React.createElement(Divider, null), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(TabbedCard, null, /* @__PURE__ */ React.createElement(CardTab, { label: "Incidents" }, /* @__PURE__ */ React.createElement(
|
|
169
|
+
Incidents,
|
|
170
|
+
{
|
|
171
|
+
serviceId: service.id,
|
|
172
|
+
refreshIncidents
|
|
173
|
+
}
|
|
174
|
+
)), disableChangeEvents !== true ? /* @__PURE__ */ React.createElement(CardTab, { label: "Change Events" }, /* @__PURE__ */ React.createElement(
|
|
175
|
+
ChangeEvents,
|
|
176
|
+
{
|
|
177
|
+
"data-testid": "change-events",
|
|
178
|
+
serviceId: service.id,
|
|
179
|
+
refreshEvents: refreshChangeEvents
|
|
180
|
+
}
|
|
181
|
+
)) : /* @__PURE__ */ React.createElement(React.Fragment, null)), disableOnCall !== true ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Typography, { className: classes.oncallHeaderTextStyle }, "ON CALL"), /* @__PURE__ */ React.createElement(
|
|
182
|
+
EscalationPolicy,
|
|
183
|
+
{
|
|
184
|
+
"data-testid": "oncall-card",
|
|
185
|
+
policyId: service.policyId,
|
|
186
|
+
policyUrl: service.policyLink,
|
|
187
|
+
policyName: service.policyName
|
|
188
|
+
}
|
|
189
|
+
)) : /* @__PURE__ */ React.createElement(React.Fragment, null)));
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
export { PagerDutyCard };
|
|
193
|
+
//# sourceMappingURL=index.esm.js.map
|