@pagerduty/backstage-plugin 0.15.9 → 0.15.10-next.0

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.
Files changed (91) hide show
  1. package/README.md +36 -0
  2. package/package.json +32 -19
  3. package/assets/PD-Green.svg +0 -21
  4. package/assets/PD-Icon.svg +0 -13
  5. package/assets/PD-White.svg +0 -21
  6. package/assets/emptystate.svg +0 -6
  7. package/assets/forbiddenstate.svg +0 -25
  8. package/dist/api/client.esm.js +0 -225
  9. package/dist/api/client.esm.js.map +0 -1
  10. package/dist/assets/PD-Green.svg +0 -21
  11. package/dist/assets/PD-Icon.svg +0 -13
  12. package/dist/assets/PD-White.svg +0 -21
  13. package/dist/assets/emptystate.svg +0 -6
  14. package/dist/assets/forbiddenstate.svg +0 -25
  15. package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js +0 -29
  16. package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js.map +0 -1
  17. package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js +0 -29
  18. package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js.map +0 -1
  19. package/dist/components/ChangeEvents/ChangeEventListItem.esm.js +0 -82
  20. package/dist/components/ChangeEvents/ChangeEventListItem.esm.js.map +0 -1
  21. package/dist/components/ChangeEvents/ChangeEvents.esm.js +0 -52
  22. package/dist/components/ChangeEvents/ChangeEvents.esm.js.map +0 -1
  23. package/dist/components/EntityPagerDutyCard/index.esm.js +0 -26
  24. package/dist/components/EntityPagerDutyCard/index.esm.js.map +0 -1
  25. package/dist/components/EntityPagerDutySmallCard/index.esm.js +0 -26
  26. package/dist/components/EntityPagerDutySmallCard/index.esm.js.map +0 -1
  27. package/dist/components/Errors/ForbiddenError.esm.js +0 -24
  28. package/dist/components/Errors/ForbiddenError.esm.js.map +0 -1
  29. package/dist/components/Errors/MissingTokenError.esm.js +0 -24
  30. package/dist/components/Errors/MissingTokenError.esm.js.map +0 -1
  31. package/dist/components/Errors/ServiceNotFoundError.esm.js +0 -24
  32. package/dist/components/Errors/ServiceNotFoundError.esm.js.map +0 -1
  33. package/dist/components/Escalation/EscalationPolicy.esm.js +0 -61
  34. package/dist/components/Escalation/EscalationPolicy.esm.js.map +0 -1
  35. package/dist/components/Escalation/EscalationUser.esm.js +0 -107
  36. package/dist/components/Escalation/EscalationUser.esm.js.map +0 -1
  37. package/dist/components/Escalation/EscalationUsersEmptyState.esm.js +0 -23
  38. package/dist/components/Escalation/EscalationUsersEmptyState.esm.js.map +0 -1
  39. package/dist/components/Escalation/EscalationUsersForbiddenState.esm.js +0 -23
  40. package/dist/components/Escalation/EscalationUsersForbiddenState.esm.js.map +0 -1
  41. package/dist/components/HomePagePagerDutyCard/Content.esm.js +0 -9
  42. package/dist/components/HomePagePagerDutyCard/Content.esm.js.map +0 -1
  43. package/dist/components/HomePagePagerDutyCard/index.esm.js +0 -2
  44. package/dist/components/HomePagePagerDutyCard/index.esm.js.map +0 -1
  45. package/dist/components/Icons/index.esm.js +0 -9
  46. package/dist/components/Icons/index.esm.js.map +0 -1
  47. package/dist/components/Incident/IncidentEmptyState.esm.js +0 -29
  48. package/dist/components/Incident/IncidentEmptyState.esm.js.map +0 -1
  49. package/dist/components/Incident/IncidentForbiddenState.esm.js +0 -29
  50. package/dist/components/Incident/IncidentForbiddenState.esm.js.map +0 -1
  51. package/dist/components/Incident/IncidentListItem.esm.js +0 -126
  52. package/dist/components/Incident/IncidentListItem.esm.js.map +0 -1
  53. package/dist/components/Incident/Incidents.esm.js +0 -46
  54. package/dist/components/Incident/Incidents.esm.js.map +0 -1
  55. package/dist/components/PagerDutyCard/index.esm.js +0 -239
  56. package/dist/components/PagerDutyCard/index.esm.js.map +0 -1
  57. package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js +0 -41
  58. package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js.map +0 -1
  59. package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js +0 -48
  60. package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js.map +0 -1
  61. package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js +0 -113
  62. package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js.map +0 -1
  63. package/dist/components/PagerDutyCardCommon/StatusCard.esm.js +0 -109
  64. package/dist/components/PagerDutyCardCommon/StatusCard.esm.js.map +0 -1
  65. package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js +0 -71
  66. package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js.map +0 -1
  67. package/dist/components/PagerDutyPage/MappingTable.esm.js +0 -271
  68. package/dist/components/PagerDutyPage/MappingTable.esm.js.map +0 -1
  69. package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js +0 -50
  70. package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js.map +0 -1
  71. package/dist/components/PagerDutyPage/index.esm.js +0 -152
  72. package/dist/components/PagerDutyPage/index.esm.js.map +0 -1
  73. package/dist/components/PagerDutySmallCard/index.esm.js +0 -247
  74. package/dist/components/PagerDutySmallCard/index.esm.js.map +0 -1
  75. package/dist/components/TriggerButton/index.esm.js +0 -51
  76. package/dist/components/TriggerButton/index.esm.js.map +0 -1
  77. package/dist/components/TriggerDialog/TriggerDialog.esm.js +0 -116
  78. package/dist/components/TriggerDialog/TriggerDialog.esm.js.map +0 -1
  79. package/dist/components/constants.esm.js +0 -6
  80. package/dist/components/constants.esm.js.map +0 -1
  81. package/dist/components/pagerDutyEntity.esm.js +0 -14
  82. package/dist/components/pagerDutyEntity.esm.js.map +0 -1
  83. package/dist/deprecated.esm.js +0 -10
  84. package/dist/deprecated.esm.js.map +0 -1
  85. package/dist/hooks/index.esm.js +0 -10
  86. package/dist/hooks/index.esm.js.map +0 -1
  87. package/dist/index.d.ts +0 -182
  88. package/dist/index.esm.js +0 -8
  89. package/dist/index.esm.js.map +0 -1
  90. package/dist/plugin.esm.js +0 -78
  91. package/dist/plugin.esm.js.map +0 -1
@@ -1,23 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
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__ */ jsxs(ListItem, { children: [
17
- /* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx("div", { className: classes.denseListIcon, children: /* @__PURE__ */ jsx(StatusError, {}) }) }),
18
- /* @__PURE__ */ jsx(ListItemText, { primary: "You don't permissions to list on-calls. Check your OAuth token permissions." })
19
- ] });
20
- };
21
-
22
- export { EscalationUsersForbiddenState };
23
- //# sourceMappingURL=EscalationUsersForbiddenState.esm.js.map
@@ -1 +0,0 @@
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 {\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":";;;;AAwBA,MAAM,YAAY,UAAA,CAAW;AAAA,EAC3B,aAAA,EAAe;AAAA,IACb,WAAA,EAAa,CAAA;AAAA,IACb,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,QAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB;AAAA;AAEpB,CAAC,CAAA;AAEM,MAAM,gCAAgC,MAAM;AACjD,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,4BACG,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,YAAA,EAAA,EACC,8BAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,aAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA,EACf,CAAA,EACF,CAAA;AAAA,oBACA,GAAA,CAAC,YAAA,EAAA,EAAa,OAAA,EAAQ,6EAAA,EAA8E;AAAA,GAAA,EACtG,CAAA;AAEJ;;;;"}
@@ -1,9 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { PagerDutyCard } from '../PagerDutyCard/index.esm.js';
3
-
4
- const Content = (props) => {
5
- return /* @__PURE__ */ jsx(PagerDutyCard, { ...props });
6
- };
7
-
8
- export { Content };
9
- //# sourceMappingURL=Content.esm.js.map
@@ -1 +0,0 @@
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 { 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":";;;AAyBO,MAAM,OAAA,GAAU,CAAC,KAAA,KAAsC;AAC5D,EAAA,uBAAO,GAAA,CAAC,aAAA,EAAA,EAAe,GAAG,KAAA,EAAO,CAAA;AACnC;;;;"}
@@ -1,2 +0,0 @@
1
- export { Content } from './Content.esm.js';
2
- //# sourceMappingURL=index.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -1,9 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import PDIcon from '../../assets/PD-Icon.svg';
3
-
4
- function PagerDutyIcon() {
5
- return /* @__PURE__ */ jsx("img", { src: PDIcon, alt: "PagerDuty", height: "20px" });
6
- }
7
-
8
- export { PagerDutyIcon };
9
- //# sourceMappingURL=index.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../src/components/Icons/index.tsx"],"sourcesContent":["import PDIcon from '../../assets/PD-Icon.svg';\n\n/** @public */\nexport function PagerDutyIcon() {\n return <img src={PDIcon} alt=\"PagerDuty\" height=\"20px\" />;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,aAAA,GAAgB;AAC9B,EAAA,2BAAQ,KAAA,EAAA,EAAI,GAAA,EAAK,QAAQ,GAAA,EAAI,WAAA,EAAY,QAAO,MAAA,EAAO,CAAA;AACzD;;;;"}
@@ -1,29 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Grid, Typography } from '@material-ui/core';
3
- import EmptyStateImage from '../../assets/emptystate.svg';
4
-
5
- const IncidentsEmptyState = () => {
6
- return /* @__PURE__ */ jsxs(
7
- Grid,
8
- {
9
- container: true,
10
- justifyContent: "center",
11
- direction: "column",
12
- alignItems: "center",
13
- children: [
14
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: "Nice! No incidents found!" }) }),
15
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
16
- "img",
17
- {
18
- src: EmptyStateImage,
19
- alt: "EmptyState",
20
- "data-testid": "emptyStateImg"
21
- }
22
- ) })
23
- ]
24
- }
25
- );
26
- };
27
-
28
- export { IncidentsEmptyState };
29
- //# sourceMappingURL=IncidentEmptyState.esm.js.map
@@ -1 +0,0 @@
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 { 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":";;;;AAmBO,MAAM,sBAAsB,MAAM;AACvC,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAW,QAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,2BAAA,EAAyB,CAAA,EACpD,CAAA;AAAA,wBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,eAAA;AAAA,YACL,GAAA,EAAI,YAAA;AAAA,YACJ,aAAA,EAAY;AAAA;AAAA,SACd,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,29 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Grid, Typography } from '@material-ui/core';
3
- import ForbiddenStateImage from '../../assets/forbiddenstate.svg';
4
-
5
- const IncidentForbiddenState = () => {
6
- return /* @__PURE__ */ jsxs(
7
- Grid,
8
- {
9
- container: true,
10
- justifyContent: "center",
11
- direction: "column",
12
- alignItems: "center",
13
- children: [
14
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(Typography, { variant: "h5", children: "Feature not available with your account or token." }) }),
15
- /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: /* @__PURE__ */ jsx(
16
- "img",
17
- {
18
- src: ForbiddenStateImage,
19
- alt: "ForbiddenState",
20
- "data-testid": "forbiddenStateImg"
21
- }
22
- ) })
23
- ]
24
- }
25
- );
26
- };
27
-
28
- export { IncidentForbiddenState };
29
- //# sourceMappingURL=IncidentForbiddenState.esm.js.map
@@ -1 +0,0 @@
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 { Grid, Typography } from '@material-ui/core';\nimport ForbiddenStateImage from '../../assets/forbiddenstate.svg';\n\nexport const IncidentForbiddenState = () => {\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\">\n Feature not available with your account or token.\n </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":";;;;AAoBO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,uBACE,IAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAS,IAAA;AAAA,MACT,cAAA,EAAe,QAAA;AAAA,MACf,SAAA,EAAU,QAAA;AAAA,MACV,UAAA,EAAW,QAAA;AAAA,MAEX,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,EAAA,EAAI,EAAA,EACb,8BAAC,UAAA,EAAA,EAAW,OAAA,EAAQ,IAAA,EAAK,QAAA,EAAA,mDAAA,EAEzB,CAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAC,IAAI,EAAA,EACb,QAAA,kBAAA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,mBAAA;AAAA,YACL,GAAA,EAAI,gBAAA;AAAA,YACJ,aAAA,EAAY;AAAA;AAAA,SACd,EACF;AAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
@@ -1,126 +0,0 @@
1
- import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { makeStyles, ListItem, ListItemText, Typography, Chip, 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
- const classes = useStyles();
69
- const duration = (/* @__PURE__ */ new Date()).getTime() - new Date(incident.created_at).getTime();
70
- const createdAt = DateTime.local().minus(Duration.fromMillis(duration)).toRelative({ locale: "en" });
71
- const user = incident.assignments[0]?.assignee;
72
- return /* @__PURE__ */ jsxs(ListItem, { dense: true, children: [
73
- /* @__PURE__ */ jsx(
74
- ListItemText,
75
- {
76
- primary: /* @__PURE__ */ jsxs("div", { className: classes.textContainer, children: [
77
- /* @__PURE__ */ jsx(
78
- Chip,
79
- {
80
- "data-testid": `chip-${incident.status}`,
81
- label: incident.status,
82
- size: "small",
83
- variant: "outlined",
84
- className: incident.status === "triggered" ? classes.error : classes.warning
85
- }
86
- ),
87
- /* @__PURE__ */ jsx(
88
- Chip,
89
- {
90
- "data-testid": `chip-${incident.urgency}`,
91
- label: `${incident.urgency} urgency`,
92
- size: "small",
93
- variant: "outlined",
94
- className: incident.urgency === "high" ? classes.highUrgency : classes.lowUrgency
95
- }
96
- ),
97
- incident.title
98
- ] }),
99
- primaryTypographyProps: {
100
- variant: "body1",
101
- className: classes.listItemPrimary
102
- },
103
- secondary: /* @__PURE__ */ jsxs(Typography, { noWrap: true, variant: "body2", color: "textSecondary", children: [
104
- "Created ",
105
- createdAt,
106
- " and assigned to",
107
- " ",
108
- /* @__PURE__ */ jsx(Link, { to: user?.html_url ?? "#", children: user?.summary ?? "nobody" })
109
- ] })
110
- }
111
- ),
112
- /* @__PURE__ */ jsx(ListItemSecondaryAction, { children: /* @__PURE__ */ jsx(Tooltip, { title: "View in PagerDuty", placement: "top", children: /* @__PURE__ */ jsx(
113
- IconButton,
114
- {
115
- href: incident.html_url,
116
- target: "_blank",
117
- rel: "noopener noreferrer",
118
- className: classes.smallIconStyle,
119
- children: /* @__PURE__ */ jsx(OpenInBrowserIcon, {})
120
- }
121
- ) }) })
122
- ] }, incident.id);
123
- };
124
-
125
- export { IncidentListItem };
126
- //# sourceMappingURL=IncidentListItem.esm.js.map
@@ -1 +0,0 @@
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 {\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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"}
@@ -1,46 +0,0 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { useEffect } from 'react';
3
- import { List } from '@material-ui/core';
4
- import { IncidentListItem } from './IncidentListItem.esm.js';
5
- import { IncidentsEmptyState } from './IncidentEmptyState.esm.js';
6
- import useAsyncFn from 'react-use/lib/useAsyncFn';
7
- import { pagerDutyApiRef } from '../../api/client.esm.js';
8
- import { Alert } from '@material-ui/lab';
9
- import { useApi } from '@backstage/core-plugin-api';
10
- import { Progress } from '@backstage/core-components';
11
- import { IncidentForbiddenState } from './IncidentForbiddenState.esm.js';
12
-
13
- const Incidents = ({ serviceId, account, refreshIncidents }) => {
14
- const api = useApi(pagerDutyApiRef);
15
- const [{ value: incidents, loading, error }, getIncidents] = useAsyncFn(
16
- async () => {
17
- const { incidents: foundIncidents } = await api.getIncidentsByServiceId(
18
- serviceId,
19
- account
20
- );
21
- return foundIncidents;
22
- }
23
- );
24
- useEffect(() => {
25
- getIncidents();
26
- }, [refreshIncidents, getIncidents]);
27
- if (error) {
28
- if (error.message.includes("Forbidden")) {
29
- return /* @__PURE__ */ jsx(IncidentForbiddenState, {});
30
- }
31
- return /* @__PURE__ */ jsxs(Alert, { severity: "error", children: [
32
- "Error encountered while fetching information. ",
33
- error.message
34
- ] });
35
- }
36
- if (loading) {
37
- return /* @__PURE__ */ jsx(Progress, {});
38
- }
39
- if (!incidents?.length) {
40
- return /* @__PURE__ */ jsx(IncidentsEmptyState, {});
41
- }
42
- return /* @__PURE__ */ jsx(List, { dense: true, children: incidents.map((incident, index) => /* @__PURE__ */ jsx(IncidentListItem, { incident }, incident.id + index)) });
43
- };
44
-
45
- export { Incidents };
46
- //# sourceMappingURL=Incidents.esm.js.map
@@ -1 +0,0 @@
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 { 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 account?: string;\n refreshIncidents: boolean;\n};\n\nexport const Incidents = ({ serviceId, account, 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 account,\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":";;;;;;;;;;;;AAkCO,MAAM,YAAY,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,kBAAiB,KAAa;AAC5E,EAAA,MAAM,GAAA,GAAM,OAAO,eAAe,CAAA;AAElC,EAAA,MAAM,CAAC,EAAE,KAAA,EAAO,SAAA,EAAW,SAAS,KAAA,EAAM,EAAG,YAAY,CAAA,GAAI,UAAA;AAAA,IAC3D,YAAY;AACV,MAAA,MAAM,EAAE,SAAA,EAAW,cAAA,EAAe,GAAI,MAAM,GAAA,CAAI,uBAAA;AAAA,QAC9C,SAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,OAAO,cAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,EAAa;AAAA,EACf,CAAA,EAAG,CAAC,gBAAA,EAAkB,YAAY,CAAC,CAAA;AAEnC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,WAAW,CAAA,EAAG;AACvC,MAAA,2BAAQ,sBAAA,EAAA,EAAuB,CAAA;AAAA,IACjC;AAEA,IAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,QAAA,EAAA;AAAA,MAAA,gDAAA;AAAA,MACyB,KAAA,CAAM;AAAA,KAAA,EACvD,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB;AAEA,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,2BAAQ,mBAAA,EAAA,EAAoB,CAAA;AAAA,EAC9B;AAEA,EAAA,2BACG,IAAA,EAAA,EAAK,KAAA,EAAK,IAAA,EACR,QAAA,EAAA,SAAA,CAAW,IAAI,CAAC,QAAA,EAAU,KAAA,qBACzB,GAAA,CAAC,oBAA2C,QAAA,EAAA,EAArB,QAAA,CAAS,EAAA,GAAK,KAA2B,CACjE,CAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1,239 +0,0 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { useState, useCallback } from 'react';
3
- import { Card, CardHeader, Grid, Typography, Divider, CardContent } from '@material-ui/core';
4
- import { Incidents } from '../Incident/Incidents.esm.js';
5
- import { EscalationPolicy } from '../Escalation/EscalationPolicy.esm.js';
6
- import useAsync from 'react-use/lib/useAsync';
7
- import { pagerDutyApiRef, UnauthorizedError } from '../../api/client.esm.js';
8
- import { MissingTokenError } from '../Errors/MissingTokenError.esm.js';
9
- import { ServiceNotFoundError } from '../Errors/ServiceNotFoundError.esm.js';
10
- import { ChangeEvents } from '../ChangeEvents/ChangeEvents.esm.js';
11
- import PDGreenImage from '../../assets/PD-Green.svg';
12
- import PDWhiteImage from '../../assets/PD-White.svg';
13
- import { useApi } from '@backstage/core-plugin-api';
14
- import { NotFoundError } from '@backstage/errors';
15
- import { Progress, TabbedCard, CardTab, InfoCard } from '@backstage/core-components';
16
- import { ForbiddenError } from '../Errors/ForbiddenError.esm.js';
17
- import IncidentCounterCard from '../PagerDutyCardCommon/InsightsCard.esm.js';
18
- import { OpenServiceButton } from '../PagerDutyCardCommon/OpenServiceButton.esm.js';
19
- import ServiceStandardsCard from '../PagerDutyCardCommon/ServiceStandardsCard.esm.js';
20
- import StatusCard from '../PagerDutyCardCommon/StatusCard.esm.js';
21
- import { TriggerIncidentButton } from '../PagerDutyCardCommon/TriggerIncidentButton.esm.js';
22
- import { makeStyles, useTheme, createStyles } from '@material-ui/core/styles';
23
-
24
- const useStyles = makeStyles(
25
- (theme) => createStyles({
26
- overviewHeaderTextStyle: {
27
- fontSize: "14px",
28
- fontWeight: 500,
29
- color: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)"
30
- },
31
- oncallHeaderTextStyle: {
32
- fontSize: "14px",
33
- fontWeight: 500,
34
- marginTop: "10px",
35
- color: theme.palette.type === "light" ? "rgba(0, 0, 0, 0.54)" : "rgba(255, 255, 255, 0.7)"
36
- },
37
- headerStyle: {
38
- marginBottom: "0px",
39
- fontSize: "0px"
40
- },
41
- overviewHeaderContainerStyle: {
42
- display: "flex",
43
- margin: "15px",
44
- marginBottom: "20px"
45
- },
46
- headerWithSubheaderContainerStyle: {
47
- display: "flex",
48
- alignItems: "center"
49
- },
50
- subheaderTextStyle: {
51
- fontSize: "10px",
52
- marginLeft: "5px"
53
- },
54
- overviewCardsContainerStyle: {
55
- display: "flex",
56
- margin: "15px",
57
- marginTop: "-15px"
58
- },
59
- incidentMetricsContainerStyle: {
60
- display: "flex",
61
- height: "100%",
62
- justifyContent: "center",
63
- columnSpan: "all"
64
- }
65
- })
66
- );
67
- const BasicCard = ({ children }) => /* @__PURE__ */ jsx(InfoCard, { title: "PagerDuty", children });
68
- const PagerDutyCard = (props) => {
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
- props.account
92
- );
93
- const serviceMetrics = await api.getServiceMetricsByServiceId(
94
- foundService.id,
95
- props.account
96
- );
97
- const result = {
98
- id: foundService.id,
99
- account: props.account,
100
- name: foundService.name,
101
- url: foundService.html_url,
102
- policyId: foundService.escalation_policy.id,
103
- policyLink: foundService.escalation_policy.html_url,
104
- policyName: foundService.escalation_policy.name,
105
- status: foundService.status,
106
- standards: serviceStandards !== void 0 ? serviceStandards.standards : void 0,
107
- metrics: serviceMetrics !== void 0 ? serviceMetrics.metrics : void 0
108
- };
109
- return result;
110
- }, [props]);
111
- if (error) {
112
- let errorNode;
113
- switch (error.constructor) {
114
- case UnauthorizedError:
115
- errorNode = /* @__PURE__ */ jsx(MissingTokenError, {});
116
- break;
117
- case NotFoundError:
118
- errorNode = /* @__PURE__ */ jsx(ServiceNotFoundError, {});
119
- break;
120
- default:
121
- errorNode = /* @__PURE__ */ jsx(ForbiddenError, {});
122
- }
123
- return /* @__PURE__ */ jsx(BasicCard, { children: errorNode });
124
- }
125
- if (loading) {
126
- return /* @__PURE__ */ jsx(BasicCard, { children: /* @__PURE__ */ jsx(Progress, {}) });
127
- }
128
- return /* @__PURE__ */ jsxs(Card, { "data-testid": "pagerduty-card", children: [
129
- /* @__PURE__ */ jsx(
130
- CardHeader,
131
- {
132
- className: classes.headerStyle,
133
- title: theme.palette.type === "dark" ? /* @__PURE__ */ jsx("img", { src: PDWhiteImage, alt: "PagerDuty", height: "35" }) : /* @__PURE__ */ jsx("img", { src: PDGreenImage, alt: "PagerDuty", height: "35" }),
134
- action: !readOnly && props.integrationKey ? /* @__PURE__ */ jsxs("div", { children: [
135
- /* @__PURE__ */ jsx(
136
- TriggerIncidentButton,
137
- {
138
- "data-testid": "trigger-incident-button",
139
- integrationKey: props.integrationKey,
140
- entityName: props.name,
141
- handleRefresh
142
- }
143
- ),
144
- /* @__PURE__ */ jsx(OpenServiceButton, { serviceUrl: service.url })
145
- ] }) : /* @__PURE__ */ jsx(OpenServiceButton, { serviceUrl: service.url })
146
- }
147
- ),
148
- /* @__PURE__ */ jsxs(Grid, { item: true, md: 12, className: classes.overviewHeaderContainerStyle, children: [
149
- /* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "STATUS" }) }),
150
- /* @__PURE__ */ jsx(Grid, { item: true, md: 6, children: /* @__PURE__ */ jsxs(Typography, { className: classes.headerWithSubheaderContainerStyle, children: [
151
- /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "INSIGHTS" }),
152
- /* @__PURE__ */ jsx(Typography, { className: classes.subheaderTextStyle, children: "(last 30 days)" })
153
- ] }) }),
154
- /* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "STANDARDS" }) })
155
- ] }),
156
- /* @__PURE__ */ jsxs(Grid, { item: true, md: 12, className: classes.overviewCardsContainerStyle, children: [
157
- /* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(
158
- StatusCard,
159
- {
160
- serviceId: service.id,
161
- account: service.account,
162
- refreshStatus
163
- }
164
- ) }),
165
- /* @__PURE__ */ jsxs(Grid, { item: true, md: 6, className: classes.incidentMetricsContainerStyle, children: [
166
- /* @__PURE__ */ jsx(Grid, { item: true, md: 4, children: /* @__PURE__ */ jsx(
167
- IncidentCounterCard,
168
- {
169
- count: service?.metrics !== void 0 && service.metrics.length > 0 ? service?.metrics[0].total_interruptions : void 0,
170
- label: "interruptions",
171
- color: theme.palette.textSubtle
172
- }
173
- ) }),
174
- /* @__PURE__ */ jsx(Grid, { item: true, md: 4, children: /* @__PURE__ */ jsx(
175
- IncidentCounterCard,
176
- {
177
- count: service?.metrics !== void 0 && service.metrics.length > 0 ? service?.metrics[0].total_high_urgency_incidents : void 0,
178
- label: "high urgency",
179
- color: theme.palette.warning.main
180
- }
181
- ) }),
182
- /* @__PURE__ */ jsx(Grid, { item: true, md: 4, children: /* @__PURE__ */ jsx(
183
- IncidentCounterCard,
184
- {
185
- count: service?.metrics !== void 0 && service?.metrics?.length > 0 ? service?.metrics[0].total_incident_count : void 0,
186
- label: "incidents",
187
- color: theme.palette.error.main
188
- }
189
- ) })
190
- ] }),
191
- /* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(
192
- ServiceStandardsCard,
193
- {
194
- total: service?.standards?.score !== void 0 ? service?.standards?.score?.total : void 0,
195
- completed: service?.standards?.score !== void 0 ? service?.standards?.score?.passing : void 0,
196
- standards: service?.standards !== void 0 ? service?.standards?.standards : void 0
197
- }
198
- ) })
199
- ] }),
200
- /* @__PURE__ */ jsx(Divider, {}),
201
- /* @__PURE__ */ jsxs(CardContent, { children: [
202
- /* @__PURE__ */ jsxs(TabbedCard, { children: [
203
- /* @__PURE__ */ jsx(CardTab, { label: "Incidents", children: /* @__PURE__ */ jsx(
204
- Incidents,
205
- {
206
- serviceId: service.id,
207
- refreshIncidents,
208
- account: service.account
209
- }
210
- ) }),
211
- disableChangeEvents !== true ? /* @__PURE__ */ jsx(CardTab, { label: "Change Events", children: /* @__PURE__ */ jsx(
212
- ChangeEvents,
213
- {
214
- "data-testid": "change-events",
215
- serviceId: service.id,
216
- refreshEvents: refreshChangeEvents,
217
- account: service.account
218
- }
219
- ) }) : /* @__PURE__ */ jsx(Fragment, {})
220
- ] }),
221
- disableOnCall !== true ? /* @__PURE__ */ jsxs(Fragment, { children: [
222
- /* @__PURE__ */ jsx(Typography, { className: classes.oncallHeaderTextStyle, children: "ON CALL" }),
223
- /* @__PURE__ */ jsx(
224
- EscalationPolicy,
225
- {
226
- "data-testid": "oncall-card",
227
- policyId: service.policyId,
228
- policyUrl: service.policyLink,
229
- policyName: service.policyName,
230
- account: service.account
231
- }
232
- )
233
- ] }) : /* @__PURE__ */ jsx(Fragment, {})
234
- ] })
235
- ] });
236
- };
237
-
238
- export { PagerDutyCard };
239
- //# sourceMappingURL=index.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../../../src/components/PagerDutyCard/index.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 { ReactNode, useCallback, useState } from 'react';\nimport {\n Card,\n CardHeader,\n Divider,\n CardContent,\n Grid,\n Typography,\n} from '@material-ui/core';\nimport { Incidents } from '../Incident';\nimport { EscalationPolicy } from '../Escalation';\nimport useAsync from 'react-use/lib/useAsync';\nimport { pagerDutyApiRef, UnauthorizedError } from '../../api';\nimport { MissingTokenError, ServiceNotFoundError } from '../Errors';\nimport { ChangeEvents } from '../ChangeEvents';\nimport PDGreenImage from '../../assets/PD-Green.svg';\nimport PDWhiteImage from '../../assets/PD-White.svg';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { NotFoundError } from '@backstage/errors';\nimport {\n Progress,\n TabbedCard,\n CardTab,\n InfoCard,\n} from '@backstage/core-components';\nimport { PagerDutyEntity } from '../../types';\nimport { ForbiddenError } from '../Errors/ForbiddenError';\nimport {\n InsightsCard,\n OpenServiceButton,\n ServiceStandardsCard,\n StatusCard,\n TriggerIncidentButton,\n} from '../PagerDutyCardCommon';\nimport { createStyles, makeStyles, useTheme } from '@material-ui/core/styles';\nimport { BackstageTheme } from '@backstage/theme';\nimport { PagerDutyCardServiceResponse } from '../../api/types';\n\nconst useStyles = makeStyles<BackstageTheme>(theme =>\n createStyles({\n overviewHeaderTextStyle: {\n fontSize: '14px',\n fontWeight: 500,\n color:\n theme.palette.type === 'light'\n ? 'rgba(0, 0, 0, 0.54)'\n : 'rgba(255, 255, 255, 0.7)',\n },\n oncallHeaderTextStyle: {\n fontSize: '14px',\n fontWeight: 500,\n marginTop: '10px',\n color:\n theme.palette.type === 'light'\n ? 'rgba(0, 0, 0, 0.54)'\n : 'rgba(255, 255, 255, 0.7)',\n },\n headerStyle: {\n marginBottom: '0px',\n fontSize: '0px',\n },\n overviewHeaderContainerStyle: {\n display: 'flex',\n margin: '15px',\n marginBottom: '20px',\n },\n headerWithSubheaderContainerStyle: {\n display: 'flex',\n alignItems: 'center',\n },\n subheaderTextStyle: {\n fontSize: '10px',\n marginLeft: '5px',\n },\n overviewCardsContainerStyle: {\n display: 'flex',\n margin: '15px',\n marginTop: '-15px',\n },\n incidentMetricsContainerStyle: {\n display: 'flex',\n height: '100%',\n justifyContent: 'center',\n columnSpan: 'all',\n },\n }),\n);\n\nconst BasicCard = ({ children }: { children: ReactNode }) => (\n <InfoCard title=\"PagerDuty\">{children}</InfoCard>\n);\n\n/** @public */\nexport type PagerDutyCardProps = PagerDutyEntity & {\n readOnly?: boolean;\n disableChangeEvents?: boolean;\n disableOnCall?: boolean;\n};\n\n/** @public */\nexport const PagerDutyCard = (props: PagerDutyCardProps) => {\n const classes = useStyles();\n\n const theme = useTheme();\n const { readOnly, disableChangeEvents, disableOnCall } = props;\n const api = useApi(pagerDutyApiRef);\n const [refreshIncidents, setRefreshIncidents] = useState<boolean>(false);\n const [refreshChangeEvents, setRefreshChangeEvents] =\n useState<boolean>(false);\n const [refreshStatus, setRefreshStatus] = useState<boolean>(false);\n\n const handleRefresh = useCallback(() => {\n setRefreshIncidents(x => !x);\n setRefreshChangeEvents(x => !x);\n setRefreshStatus(x => !x);\n }, []);\n\n const {\n value: service,\n loading,\n error,\n } = useAsync(async () => {\n const { service: foundService } = await api.getServiceByPagerDutyEntity(\n props,\n );\n\n const serviceStandards = await api.getServiceStandardsByServiceId(\n foundService.id,\n props.account,\n );\n\n const serviceMetrics = await api.getServiceMetricsByServiceId(\n foundService.id,\n props.account,\n );\n\n const result: PagerDutyCardServiceResponse = {\n id: foundService.id,\n account: props.account,\n name: foundService.name,\n url: foundService.html_url,\n policyId: foundService.escalation_policy.id,\n policyLink: foundService.escalation_policy.html_url as string,\n policyName: foundService.escalation_policy.name,\n status: foundService.status,\n standards:\n serviceStandards !== undefined ? serviceStandards.standards : undefined,\n metrics:\n serviceMetrics !== undefined ? serviceMetrics.metrics : undefined,\n };\n\n return result;\n }, [props]);\n\n if (error) {\n let errorNode: ReactNode;\n\n switch (error.constructor) {\n case UnauthorizedError:\n errorNode = <MissingTokenError />;\n break;\n case NotFoundError:\n errorNode = <ServiceNotFoundError />;\n break;\n default:\n errorNode = <ForbiddenError />;\n }\n\n return <BasicCard>{errorNode}</BasicCard>;\n }\n\n if (loading) {\n return (\n <BasicCard>\n <Progress />\n </BasicCard>\n );\n }\n\n return (\n <Card data-testid=\"pagerduty-card\">\n <CardHeader\n className={classes.headerStyle}\n title={\n theme.palette.type === 'dark' ? (\n <img src={PDWhiteImage} alt=\"PagerDuty\" height=\"35\" />\n ) : (\n <img src={PDGreenImage} alt=\"PagerDuty\" height=\"35\" />\n )\n }\n action={\n !readOnly && props.integrationKey ? (\n <div>\n <TriggerIncidentButton\n data-testid=\"trigger-incident-button\"\n integrationKey={props.integrationKey}\n entityName={props.name}\n handleRefresh={handleRefresh}\n />\n <OpenServiceButton serviceUrl={service!.url} />\n </div>\n ) : (\n <OpenServiceButton serviceUrl={service!.url} />\n )\n }\n />\n <Grid item md={12} className={classes.overviewHeaderContainerStyle}>\n <Grid item md={3}>\n <Typography className={classes.overviewHeaderTextStyle}>\n STATUS\n </Typography>\n </Grid>\n <Grid item md={6}>\n <Typography className={classes.headerWithSubheaderContainerStyle}>\n <Typography className={classes.overviewHeaderTextStyle}>\n INSIGHTS\n </Typography>\n <Typography className={classes.subheaderTextStyle}>\n (last 30 days)\n </Typography>\n </Typography>\n </Grid>\n <Grid item md={3}>\n <Typography className={classes.overviewHeaderTextStyle}>\n STANDARDS\n </Typography>\n </Grid>\n </Grid>\n <Grid item md={12} className={classes.overviewCardsContainerStyle}>\n <Grid item md={3}>\n <StatusCard\n serviceId={service!.id}\n account={service!.account}\n refreshStatus={refreshStatus}\n />\n </Grid>\n <Grid item md={6} className={classes.incidentMetricsContainerStyle}>\n <Grid item md={4}>\n <InsightsCard\n count={\n service?.metrics !== undefined && service.metrics.length > 0\n ? service?.metrics[0].total_interruptions\n : undefined\n }\n label=\"interruptions\"\n color={theme.palette.textSubtle}\n />\n </Grid>\n <Grid item md={4}>\n <InsightsCard\n count={\n service?.metrics !== undefined && service.metrics.length > 0\n ? service?.metrics[0].total_high_urgency_incidents\n : undefined\n }\n label=\"high urgency\"\n color={theme.palette.warning.main}\n />\n </Grid>\n <Grid item md={4}>\n <InsightsCard\n count={\n service?.metrics !== undefined && service?.metrics?.length > 0\n ? service?.metrics[0].total_incident_count\n : undefined\n }\n label=\"incidents\"\n color={theme.palette.error.main}\n />\n </Grid>\n </Grid>\n <Grid item md={3}>\n <ServiceStandardsCard\n total={\n service?.standards?.score !== undefined\n ? service?.standards?.score?.total\n : undefined\n }\n completed={\n service?.standards?.score !== undefined\n ? service?.standards?.score?.passing\n : undefined\n }\n standards={\n service?.standards !== undefined\n ? service?.standards?.standards\n : undefined\n }\n />\n </Grid>\n </Grid>\n\n <Divider />\n <CardContent>\n <TabbedCard>\n <CardTab label=\"Incidents\">\n <Incidents\n serviceId={service!.id}\n refreshIncidents={refreshIncidents}\n account={service!.account}\n />\n </CardTab>\n {disableChangeEvents !== true ? (\n <CardTab label=\"Change Events\">\n <ChangeEvents\n data-testid=\"change-events\"\n serviceId={service!.id}\n refreshEvents={refreshChangeEvents}\n account={service!.account}\n />\n </CardTab>\n ) : (\n <></>\n )}\n </TabbedCard>\n {disableOnCall !== true ? (\n <>\n <Typography className={classes.oncallHeaderTextStyle}>\n ON CALL\n </Typography>\n <EscalationPolicy\n data-testid=\"oncall-card\"\n policyId={service!.policyId}\n policyUrl={service!.policyLink}\n policyName={service!.policyName}\n account={service!.account}\n />\n </>\n ) : (\n <></>\n )}\n </CardContent>\n </Card>\n );\n};\n"],"names":["InsightsCard"],"mappings":"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"}