@pagerduty/backstage-plugin 0.15.10-next.0 → 0.16.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.
- package/assets/PD-Green.svg +21 -0
- package/assets/PD-Icon.svg +13 -0
- package/assets/PD-White.svg +21 -0
- package/assets/emptystate.svg +6 -0
- package/assets/forbiddenstate.svg +25 -0
- package/dist/alpha/api.esm.js +22 -0
- package/dist/alpha/api.esm.js.map +1 -0
- package/dist/alpha/entity-cards.esm.js +69 -0
- package/dist/alpha/entity-cards.esm.js.map +1 -0
- package/dist/alpha/nav-items.esm.js +21 -0
- package/dist/alpha/nav-items.esm.js.map +1 -0
- package/dist/alpha/pages.esm.js +15 -0
- package/dist/alpha/pages.esm.js.map +1 -0
- package/dist/alpha/plugin.esm.js +26 -0
- package/dist/alpha/plugin.esm.js.map +1 -0
- package/dist/alpha.d.ts +139 -0
- package/dist/alpha.esm.js +2 -0
- package/dist/alpha.esm.js.map +1 -0
- package/dist/api/client.esm.js +225 -0
- package/dist/api/client.esm.js.map +1 -0
- package/dist/assets/PD-Green.svg +21 -0
- package/dist/assets/PD-Icon.svg +13 -0
- package/dist/assets/PD-White.svg +21 -0
- package/dist/assets/emptystate.svg +6 -0
- package/dist/assets/forbiddenstate.svg +25 -0
- package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js +29 -0
- package/dist/components/ChangeEvents/ChangeEventEmptyState.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js +29 -0
- package/dist/components/ChangeEvents/ChangeEventForbiddenState.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEventListItem.esm.js +85 -0
- package/dist/components/ChangeEvents/ChangeEventListItem.esm.js.map +1 -0
- package/dist/components/ChangeEvents/ChangeEvents.esm.js +60 -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 +53 -0
- package/dist/components/Escalation/EscalationPolicy.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUser.esm.js +97 -0
- package/dist/components/Escalation/EscalationUser.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUsersEmptyState.esm.js +23 -0
- package/dist/components/Escalation/EscalationUsersEmptyState.esm.js.map +1 -0
- package/dist/components/Escalation/EscalationUsersForbiddenState.esm.js +23 -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/Icons/index.esm.js +9 -0
- package/dist/components/Icons/index.esm.js.map +1 -0
- package/dist/components/Incident/IncidentEmptyState.esm.js +29 -0
- package/dist/components/Incident/IncidentEmptyState.esm.js.map +1 -0
- package/dist/components/Incident/IncidentForbiddenState.esm.js +29 -0
- package/dist/components/Incident/IncidentForbiddenState.esm.js.map +1 -0
- package/dist/components/Incident/IncidentListItem.esm.js +128 -0
- package/dist/components/Incident/IncidentListItem.esm.js.map +1 -0
- package/dist/components/Incident/Incidents.esm.js +54 -0
- package/dist/components/Incident/Incidents.esm.js.map +1 -0
- package/dist/components/PagerDutyCard/index.esm.js +231 -0
- package/dist/components/PagerDutyCard/index.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js +42 -0
- package/dist/components/PagerDutyCardCommon/InsightsCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js +43 -0
- package/dist/components/PagerDutyCardCommon/OpenServiceButton.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js +134 -0
- package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/StatusCard.esm.js +109 -0
- package/dist/components/PagerDutyCardCommon/StatusCard.esm.js.map +1 -0
- package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js +66 -0
- package/dist/components/PagerDutyCardCommon/TriggerIncidentButton.esm.js.map +1 -0
- package/dist/components/PagerDutyPage/MappingTable.esm.js +282 -0
- package/dist/components/PagerDutyPage/MappingTable.esm.js.map +1 -0
- package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js +50 -0
- package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js.map +1 -0
- package/dist/components/PagerDutyPage/index.esm.js +117 -0
- package/dist/components/PagerDutyPage/index.esm.js.map +1 -0
- package/dist/components/PagerDutySmallCard/index.esm.js +227 -0
- package/dist/components/PagerDutySmallCard/index.esm.js.map +1 -0
- package/dist/components/TriggerButton/index.esm.js +51 -0
- package/dist/components/TriggerButton/index.esm.js.map +1 -0
- package/dist/components/TriggerDialog/TriggerDialog.esm.js +120 -0
- package/dist/components/TriggerDialog/TriggerDialog.esm.js.map +1 -0
- package/dist/components/constants.esm.js +6 -0
- package/dist/components/constants.esm.js.map +1 -0
- package/dist/components/pagerDutyEntity.esm.js +14 -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 +182 -0
- package/dist/index.esm.js +8 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/package.json.esm.js +133 -0
- package/dist/package.json.esm.js.map +1 -0
- package/dist/plugin.esm.js +76 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +6 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +19 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MappingTable.esm.js","sources":["../../../src/components/PagerDutyPage/MappingTable.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { PagerDutyEntityMapping } from '@pagerduty/backstage-plugin-common';\nimport {\n MRT_ColumnDef,\n MRT_EditActionButtons,\n MRT_TableOptions,\n MaterialReactTable,\n useMaterialReactTable,\n} from 'material-react-table';\nimport {\n Box,\n DialogActions,\n DialogContent,\n DialogTitle,\n Typography,\n} from '@material-ui/core';\nimport { Flex, Tooltip, TooltipTrigger, ButtonIcon } from '@backstage/ui';\nimport {\n QueryClient,\n QueryClientProvider,\n useMutation,\n} from '@tanstack/react-query';\nimport { Edit, OpenInBrowser } from '@mui/icons-material';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { pagerDutyApiRef } from '../../api';\n\ntype BackstageEntity = {\n id: string;\n name: string;\n namespace: string;\n type: string;\n system: string;\n owner: string;\n lifecycle: string;\n annotations: Annotations;\n};\n\nexport type Annotations = {\n 'pagerduty.com/integration-key': string;\n 'pagerduty.com/service-id': string;\n};\n\nfunction getColorFromStatus(status?: string) {\n switch (status) {\n case 'InSync':\n return 'green';\n case 'OutOfSync':\n return 'red';\n case 'NotMapped':\n return 'orange';\n default:\n return 'gray';\n }\n}\n\nfunction makeReadable(status?: string) {\n switch (status) {\n case 'InSync':\n return 'In Sync';\n case 'OutOfSync':\n return 'Out of Sync';\n case 'NotMapped':\n return 'Not Mapped';\n default:\n return 'Refresh to Update';\n }\n}\n\ntype CatalogEntityOptions = {\n value: string;\n label: string;\n};\n\ntype MappingTableProps = {\n mappings: PagerDutyEntityMapping[];\n catalogEntities: BackstageEntity[];\n};\n\nexport const MappingTable = ({\n mappings,\n catalogEntities,\n}: MappingTableProps) => {\n const DenseTable = () => {\n const [validationErrors, setValidationErrors] = useState<\n Record<string, string | undefined>\n >({});\n const [entityOptions, setEntityOptions] = useState<CatalogEntityOptions[]>(\n [],\n );\n const pagerDutyApi = useApi(pagerDutyApiRef);\n\n useEffect(() => {\n getEntityOptions();\n }, []);\n\n const columns = useMemo<MRT_ColumnDef<PagerDutyEntityMapping>[]>(\n () => [\n {\n id: 'serviceId',\n accessorKey: 'serviceId',\n header: 'Service ID',\n visibleInShowHideMenu: false,\n enableEditing: false,\n Edit: () => null,\n Cell: ({ cell }) => (\n <Typography variant=\"body1\" style={{ fontWeight: 600 }}>\n {cell.getValue<string>()}\n </Typography>\n ),\n },\n {\n id: 'integrationKey',\n accessorKey: 'integrationKey',\n header: 'Integration Key',\n visibleInShowHideMenu: false,\n enableEditing: false,\n Edit: () => null,\n },\n {\n id: 'serviceName',\n accessorKey: 'serviceName',\n header: 'PagerDuty Service',\n enableEditing: false,\n },\n {\n id: 'account',\n accessorKey: 'account',\n header: 'Account',\n enableEditing: false,\n Edit: () => null,\n },\n {\n id: 'team',\n accessorKey: 'team',\n header: 'Team',\n enableEditing: false,\n },\n {\n id: 'escalationPolicy',\n accessorKey: 'escalationPolicy',\n header: 'Escalation Policy',\n enableEditing: false,\n },\n {\n id: 'entityRef',\n accessorKey: 'entityRef',\n header: 'Mapping',\n visibleInShowHideMenu: false,\n editVariant: 'select',\n editSelectOptions: entityOptions,\n muiEditTextFieldProps: {\n select: true,\n error: !!validationErrors?.state,\n helperText: validationErrors?.state,\n multiline: true,\n type: 'range',\n },\n },\n {\n id: 'entityName',\n accessorKey: 'entityName',\n header: 'Mapped Entity Name',\n enableEditing: false,\n Edit: () => null,\n },\n {\n id: 'status',\n accessorKey: 'status',\n header: 'Status',\n enableEditing: false,\n Edit: () => null,\n Cell: ({ cell }) => (\n <Box\n component=\"span\"\n bgcolor={getColorFromStatus(cell.getValue<string>())}\n borderRadius=\"0.25rem\"\n color=\"white\"\n p=\"0.25rem\"\n >\n {makeReadable(cell.getValue<string>())}\n </Box>\n ),\n },\n {\n id: 'serviceUrl',\n accessorKey: 'serviceUrl',\n header: 'Service URL',\n visibleInShowHideMenu: false,\n enableEditing: false,\n Edit: () => null,\n },\n ],\n [validationErrors, entityOptions],\n );\n\n // UPDATE hook (put mapping in api)\n function useUpdateMapping() {\n return useMutation({\n mutationFn: async (mapping: PagerDutyEntityMapping) => {\n return await pagerDutyApi.storeServiceMapping(\n mapping.serviceId,\n mapping.integrationKey ?? '',\n mapping.entityRef,\n mapping.account ?? '',\n );\n },\n });\n }\n\n // call UPDATE hook\n const { mutateAsync: updateMapping, isPending: isUpdatingMapping } =\n useUpdateMapping();\n\n // UPDATE action\n const handleSaveMapping: MRT_TableOptions<PagerDutyEntityMapping>['onEditingRowSave'] =\n async ({ values, table }) => {\n setValidationErrors({});\n\n values.entityName =\n catalogEntities.find(\n entity =>\n `${entity.type}:${entity.namespace}/${entity.name}`.toLowerCase() ===\n values.entityRef,\n )?.name ?? '';\n values.status = 'RefreshToUpdate';\n\n await updateMapping(values);\n\n // find corresponding mapping in mappings array\n // and update it with new values\n const existingMapping = mappings.find(\n item => item.serviceId === values.serviceId,\n );\n if (existingMapping) {\n existingMapping.entityRef = values.entityRef;\n existingMapping.entityName = values.entityName;\n }\n\n table.setEditingRow(null); // exit editing mode\n };\n\n const openInBrowser = (url: string) => {\n window.open(url, '_blank', 'noreferrer');\n };\n\n const dataTable = useMaterialReactTable({\n columns,\n data: mappings,\n editDisplayMode: 'modal',\n enableEditing: true,\n positionActionsColumn: 'last',\n enableStickyHeader: true,\n enableFilters: true,\n getRowId: row => row.serviceId,\n muiToolbarAlertBannerProps:\n mappings === undefined\n ? {\n color: 'error',\n children: 'Error loading data',\n }\n : undefined,\n muiTableContainerProps: {\n sx: {\n minHeight: '500px',\n },\n },\n onEditingRowCancel: () => setValidationErrors({}),\n onEditingRowSave: handleSaveMapping,\n renderEditRowDialogContent: ({ table, row, internalEditComponents }) => (\n <>\n <DialogTitle>Update Entity Mapping</DialogTitle>\n <DialogContent\n style={{ display: 'flex', flexDirection: 'column', gap: '1rem' }}\n >\n {internalEditComponents}\n </DialogContent>\n <DialogActions>\n <MRT_EditActionButtons variant=\"text\" table={table} row={row} />\n </DialogActions>\n </>\n ),\n renderRowActions: ({ row, table }) => (\n <Flex>\n <TooltipTrigger>\n <ButtonIcon\n aria-label=\"Edit\"\n variant=\"tertiary\"\n onClick={() => {\n getEntityOptions();\n table.setEditingRow(row);\n }}\n icon={<Edit />}\n />\n <Tooltip>Edit</Tooltip>\n </TooltipTrigger>\n <TooltipTrigger>\n <ButtonIcon\n aria-label=\"Open in PagerDuty\"\n variant=\"tertiary\"\n onClick={() => openInBrowser(row.getValue('serviceUrl'))}\n icon={<OpenInBrowser />}\n />\n <Tooltip> Open in PagerDuty</Tooltip>\n </TooltipTrigger>\n </Flex>\n ),\n state: {\n isLoading: mappings.length === 0 || catalogEntities.length === 0,\n isSaving: isUpdatingMapping,\n showAlertBanner:\n mappings === undefined || catalogEntities === undefined,\n showProgressBars: mappings.length === 0 || catalogEntities.length === 0,\n },\n initialState: {\n columnVisibility: {\n serviceId: false,\n entityRef: false,\n serviceUrl: false,\n integrationKey: false,\n },\n },\n });\n\n function getEntityOptions() {\n const options: CatalogEntityOptions[] = [];\n // initialize with empty object\n options.push({ value: '', label: 'None' });\n\n catalogEntities.forEach(entity => {\n // find service-id annotation in entity\n const foundServiceAnnotation =\n entity.annotations['pagerduty.com/service-id'];\n\n // find integration-key annotation in entity\n const foundIntegrationKeyAnnotation =\n entity.annotations['pagerduty.com/integration-key'];\n\n // find entity with service-id in mappings array if service-id is found in entity\n let foundServiceMapping: PagerDutyEntityMapping | undefined;\n if (foundServiceAnnotation || foundIntegrationKeyAnnotation) {\n foundServiceMapping = mappings.find(\n item =>\n item.serviceId === foundServiceAnnotation ||\n item.integrationKey === foundIntegrationKeyAnnotation,\n );\n }\n\n const entityRef =\n `${entity.type}:${entity.namespace}/${entity.name}`.toLowerCase();\n // find entity with entity.id in entityMappings array\n const foundEntityMapping = mappings.find(\n item => item.entityRef === entityRef,\n );\n\n if (\n (!foundEntityMapping &&\n (!foundServiceAnnotation || !foundIntegrationKeyAnnotation)) ||\n ((foundServiceAnnotation || foundIntegrationKeyAnnotation) &&\n foundServiceMapping &&\n !foundEntityMapping)\n ) {\n options.push({\n value: entityRef,\n label: entity.name,\n });\n }\n });\n\n setEntityOptions(options);\n }\n\n return <MaterialReactTable table={dataTable} />;\n };\n\n const queryClient = new QueryClient();\n\n return (\n <QueryClientProvider client={queryClient}>\n <DenseTable />\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;AA0CA,SAAS,mBAAmB,MAAA,EAAiB;AAC3C,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,QAAA;AACH,MAAA,OAAO,OAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAEA,SAAS,aAAa,MAAA,EAAiB;AACrC,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,QAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,WAAA;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AACE,MAAA,OAAO,mBAAA;AAAA;AAEb;AAYO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA,CAE9C,EAAE,CAAA;AACJ,IAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,MACxC;AAAC,KACH;AACA,IAAA,MAAM,YAAA,GAAe,OAAO,eAAe,CAAA;AAE3C,IAAA,SAAA,CAAU,MAAM;AACd,MAAA,gBAAA,EAAiB;AAAA,IACnB,CAAA,EAAG,EAAE,CAAA;AAEL,IAAA,MAAM,OAAA,GAAU,OAAA;AAAA,MACd,MAAM;AAAA,QACJ;AAAA,UACE,EAAA,EAAI,WAAA;AAAA,UACJ,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,YAAA;AAAA,UACR,qBAAA,EAAuB,KAAA;AAAA,UACvB,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM,IAAA;AAAA,UACZ,MAAM,CAAC,EAAE,IAAA,EAAK,yBACX,UAAA,EAAA,EAAW,OAAA,EAAQ,OAAA,EAAQ,KAAA,EAAO,EAAE,UAAA,EAAY,GAAA,EAAI,EAClD,QAAA,EAAA,IAAA,CAAK,UAAiB,EACzB;AAAA,SAEJ;AAAA,QACA;AAAA,UACE,EAAA,EAAI,gBAAA;AAAA,UACJ,WAAA,EAAa,gBAAA;AAAA,UACb,MAAA,EAAQ,iBAAA;AAAA,UACR,qBAAA,EAAuB,KAAA;AAAA,UACvB,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM;AAAA,SACd;AAAA,QACA;AAAA,UACE,EAAA,EAAI,aAAA;AAAA,UACJ,WAAA,EAAa,aAAA;AAAA,UACb,MAAA,EAAQ,mBAAA;AAAA,UACR,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,SAAA;AAAA,UACJ,WAAA,EAAa,SAAA;AAAA,UACb,MAAA,EAAQ,SAAA;AAAA,UACR,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM;AAAA,SACd;AAAA,QACA;AAAA,UACE,EAAA,EAAI,MAAA;AAAA,UACJ,WAAA,EAAa,MAAA;AAAA,UACb,MAAA,EAAQ,MAAA;AAAA,UACR,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,kBAAA;AAAA,UACJ,WAAA,EAAa,kBAAA;AAAA,UACb,MAAA,EAAQ,mBAAA;AAAA,UACR,aAAA,EAAe;AAAA,SACjB;AAAA,QACA;AAAA,UACE,EAAA,EAAI,WAAA;AAAA,UACJ,WAAA,EAAa,WAAA;AAAA,UACb,MAAA,EAAQ,SAAA;AAAA,UACR,qBAAA,EAAuB,KAAA;AAAA,UACvB,WAAA,EAAa,QAAA;AAAA,UACb,iBAAA,EAAmB,aAAA;AAAA,UACnB,qBAAA,EAAuB;AAAA,YACrB,MAAA,EAAQ,IAAA;AAAA,YACR,KAAA,EAAO,CAAC,CAAC,gBAAA,EAAkB,KAAA;AAAA,YAC3B,YAAY,gBAAA,EAAkB,KAAA;AAAA,YAC9B,SAAA,EAAW,IAAA;AAAA,YACX,IAAA,EAAM;AAAA;AACR,SACF;AAAA,QACA;AAAA,UACE,EAAA,EAAI,YAAA;AAAA,UACJ,WAAA,EAAa,YAAA;AAAA,UACb,MAAA,EAAQ,oBAAA;AAAA,UACR,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM;AAAA,SACd;AAAA,QACA;AAAA,UACE,EAAA,EAAI,QAAA;AAAA,UACJ,WAAA,EAAa,QAAA;AAAA,UACb,MAAA,EAAQ,QAAA;AAAA,UACR,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM,IAAA;AAAA,UACZ,IAAA,EAAM,CAAC,EAAE,IAAA,EAAK,qBACZ,GAAA;AAAA,YAAC,GAAA;AAAA,YAAA;AAAA,cACC,SAAA,EAAU,MAAA;AAAA,cACV,OAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,QAAA,EAAkB,CAAA;AAAA,cACnD,YAAA,EAAa,SAAA;AAAA,cACb,KAAA,EAAM,OAAA;AAAA,cACN,CAAA,EAAE,SAAA;AAAA,cAED,QAAA,EAAA,YAAA,CAAa,IAAA,CAAK,QAAA,EAAkB;AAAA;AAAA;AACvC,SAEJ;AAAA,QACA;AAAA,UACE,EAAA,EAAI,YAAA;AAAA,UACJ,WAAA,EAAa,YAAA;AAAA,UACb,MAAA,EAAQ,aAAA;AAAA,UACR,qBAAA,EAAuB,KAAA;AAAA,UACvB,aAAA,EAAe,KAAA;AAAA,UACf,MAAM,MAAM;AAAA;AACd,OACF;AAAA,MACA,CAAC,kBAAkB,aAAa;AAAA,KAClC;AAGA,IAAA,SAAS,gBAAA,GAAmB;AAC1B,MAAA,OAAO,WAAA,CAAY;AAAA,QACjB,UAAA,EAAY,OAAO,OAAA,KAAoC;AACrD,UAAA,OAAO,MAAM,YAAA,CAAa,mBAAA;AAAA,YACxB,OAAA,CAAQ,SAAA;AAAA,YACR,QAAQ,cAAA,IAAkB,EAAA;AAAA,YAC1B,OAAA,CAAQ,SAAA;AAAA,YACR,QAAQ,OAAA,IAAW;AAAA,WACrB;AAAA,QACF;AAAA,OACD,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,SAAA,EAAW,iBAAA,KAC7C,gBAAA,EAAiB;AAGnB,IAAA,MAAM,iBAAA,GACJ,OAAO,EAAE,MAAA,EAAQ,OAAM,KAAM;AAC3B,MAAA,mBAAA,CAAoB,EAAE,CAAA;AAEtB,MAAA,MAAA,CAAO,aACL,eAAA,CAAgB,IAAA;AAAA,QACd,CAAA,MAAA,KACE,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,WAAA,OACpD,MAAA,CAAO;AAAA,SACR,IAAA,IAAQ,EAAA;AACb,MAAA,MAAA,CAAO,MAAA,GAAS,iBAAA;AAEhB,MAAA,MAAM,cAAc,MAAM,CAAA;AAI1B,MAAA,MAAM,kBAAkB,QAAA,CAAS,IAAA;AAAA,QAC/B,CAAA,IAAA,KAAQ,IAAA,CAAK,SAAA,KAAc,MAAA,CAAO;AAAA,OACpC;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,eAAA,CAAgB,YAAY,MAAA,CAAO,SAAA;AACnC,QAAA,eAAA,CAAgB,aAAa,MAAA,CAAO,UAAA;AAAA,MACtC;AAEA,MAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AAAA,IAC1B,CAAA;AAEF,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAgB;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK,GAAA,EAAK,QAAA,EAAU,YAAY,CAAA;AAAA,IACzC,CAAA;AAEA,IAAA,MAAM,YAAY,qBAAA,CAAsB;AAAA,MACtC,OAAA;AAAA,MACA,IAAA,EAAM,QAAA;AAAA,MACN,eAAA,EAAiB,OAAA;AAAA,MACjB,aAAA,EAAe,IAAA;AAAA,MACf,qBAAA,EAAuB,MAAA;AAAA,MACvB,kBAAA,EAAoB,IAAA;AAAA,MACpB,aAAA,EAAe,IAAA;AAAA,MACf,QAAA,EAAU,SAAO,GAAA,CAAI,SAAA;AAAA,MACrB,0BAAA,EACE,aAAa,MAAA,GACT;AAAA,QACE,KAAA,EAAO,OAAA;AAAA,QACP,QAAA,EAAU;AAAA,OACZ,GACA,MAAA;AAAA,MACN,sBAAA,EAAwB;AAAA,QACtB,EAAA,EAAI;AAAA,UACF,SAAA,EAAW;AAAA;AACb,OACF;AAAA,MACA,kBAAA,EAAoB,MAAM,mBAAA,CAAoB,EAAE,CAAA;AAAA,MAChD,gBAAA,EAAkB,iBAAA;AAAA,MAClB,4BAA4B,CAAC,EAAE,OAAO,GAAA,EAAK,sBAAA,uBACzC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,eAAY,QAAA,EAAA,uBAAA,EAAqB,CAAA;AAAA,wBAClC,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,KAAK,MAAA,EAAO;AAAA,YAE9D,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,wBACA,GAAA,CAAC,iBACC,QAAA,kBAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,SAAQ,MAAA,EAAO,KAAA,EAAc,KAAU,CAAA,EAChE;AAAA,OAAA,EACF,CAAA;AAAA,MAEF,kBAAkB,CAAC,EAAE,KAAK,KAAA,EAAM,0BAC7B,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,MAAA;AAAA,cACX,OAAA,EAAQ,UAAA;AAAA,cACR,SAAS,MAAM;AACb,gBAAA,gBAAA,EAAiB;AACjB,gBAAA,KAAA,CAAM,cAAc,GAAG,CAAA;AAAA,cACzB,CAAA;AAAA,cACA,IAAA,sBAAO,IAAA,EAAA,EAAK;AAAA;AAAA,WACd;AAAA,0BACA,GAAA,CAAC,WAAQ,QAAA,EAAA,MAAA,EAAI;AAAA,SAAA,EACf,CAAA;AAAA,6BACC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,UAAA;AAAA,YAAA;AAAA,cACC,YAAA,EAAW,mBAAA;AAAA,cACX,OAAA,EAAQ,UAAA;AAAA,cACR,SAAS,MAAM,aAAA,CAAc,GAAA,CAAI,QAAA,CAAS,YAAY,CAAC,CAAA;AAAA,cACvD,IAAA,sBAAO,aAAA,EAAA,EAAc;AAAA;AAAA,WACvB;AAAA,0BACA,GAAA,CAAC,WAAQ,QAAA,EAAA,oBAAA,EAAkB;AAAA,SAAA,EAC7B;AAAA,OAAA,EACF,CAAA;AAAA,MAEF,KAAA,EAAO;AAAA,QACL,SAAA,EAAW,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,gBAAgB,MAAA,KAAW,CAAA;AAAA,QAC/D,QAAA,EAAU,iBAAA;AAAA,QACV,eAAA,EACE,QAAA,KAAa,MAAA,IAAa,eAAA,KAAoB,MAAA;AAAA,QAChD,gBAAA,EAAkB,QAAA,CAAS,MAAA,KAAW,CAAA,IAAK,gBAAgB,MAAA,KAAW;AAAA,OACxE;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,gBAAA,EAAkB;AAAA,UAChB,SAAA,EAAW,KAAA;AAAA,UACX,SAAA,EAAW,KAAA;AAAA,UACX,UAAA,EAAY,KAAA;AAAA,UACZ,cAAA,EAAgB;AAAA;AAClB;AACF,KACD,CAAA;AAED,IAAA,SAAS,gBAAA,GAAmB;AAC1B,MAAA,MAAM,UAAkC,EAAC;AAEzC,MAAA,OAAA,CAAQ,KAAK,EAAE,KAAA,EAAO,EAAA,EAAI,KAAA,EAAO,QAAQ,CAAA;AAEzC,MAAA,eAAA,CAAgB,QAAQ,CAAA,MAAA,KAAU;AAEhC,QAAA,MAAM,sBAAA,GACJ,MAAA,CAAO,WAAA,CAAY,0BAA0B,CAAA;AAG/C,QAAA,MAAM,6BAAA,GACJ,MAAA,CAAO,WAAA,CAAY,+BAA+B,CAAA;AAGpD,QAAA,IAAI,mBAAA;AACJ,QAAA,IAAI,0BAA0B,6BAAA,EAA+B;AAC3D,UAAA,mBAAA,GAAsB,QAAA,CAAS,IAAA;AAAA,YAC7B,CAAA,IAAA,KACE,IAAA,CAAK,SAAA,KAAc,sBAAA,IACnB,KAAK,cAAA,KAAmB;AAAA,WAC5B;AAAA,QACF;AAEA,QAAA,MAAM,SAAA,GACJ,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAA,CAAG,WAAA,EAAY;AAElE,QAAA,MAAM,qBAAqB,QAAA,CAAS,IAAA;AAAA,UAClC,CAAA,IAAA,KAAQ,KAAK,SAAA,KAAc;AAAA,SAC7B;AAEA,QAAA,IACG,CAAC,kBAAA,KACC,CAAC,sBAAA,IAA0B,CAAC,mCAC7B,sBAAA,IAA0B,6BAAA,KAC1B,mBAAA,IACA,CAAC,kBAAA,EACH;AACA,UAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,YACX,KAAA,EAAO,SAAA;AAAA,YACP,OAAO,MAAA,CAAO;AAAA,WACf,CAAA;AAAA,QACH;AAAA,MACF,CAAC,CAAA;AAED,MAAA,gBAAA,CAAiB,OAAO,CAAA;AAAA,IAC1B;AAEA,IAAA,uBAAO,GAAA,CAAC,kBAAA,EAAA,EAAmB,KAAA,EAAO,SAAA,EAAW,CAAA;AAAA,EAC/C,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY;AAEpC,EAAA,2BACG,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,cAAW,CAAA,EACd,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { pagerDutyApiRef } from '../../api/client.esm.js';
|
|
5
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
6
|
+
import { MappingTable } from './MappingTable.esm.js';
|
|
7
|
+
|
|
8
|
+
const ServiceMappingComponent = () => {
|
|
9
|
+
const [entityMappings, setEntityMappings] = useState([]);
|
|
10
|
+
const [catalogEntities, setCatalogEntities] = useState([]);
|
|
11
|
+
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
12
|
+
const catalogApi = useApi(catalogApiRef);
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
function fetchMappings() {
|
|
15
|
+
pagerDutyApi.getEntityMappings().then((result) => {
|
|
16
|
+
setEntityMappings(result.mappings);
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function fetchCatalogEntities() {
|
|
20
|
+
catalogApi.getEntities({
|
|
21
|
+
filter: { kind: "Component" }
|
|
22
|
+
}).then((result) => {
|
|
23
|
+
const entities = [];
|
|
24
|
+
result.items.forEach((entity) => {
|
|
25
|
+
const annotations = {
|
|
26
|
+
"pagerduty.com/integration-key": entity.metadata?.annotations?.["pagerduty.com/integration-key"] ?? "",
|
|
27
|
+
"pagerduty.com/service-id": entity.metadata?.annotations?.["pagerduty.com/service-id"] ?? ""
|
|
28
|
+
};
|
|
29
|
+
entities.push({
|
|
30
|
+
name: entity.metadata?.name,
|
|
31
|
+
id: entity.metadata?.uid ?? "",
|
|
32
|
+
namespace: entity.metadata?.namespace ?? "",
|
|
33
|
+
type: entity.kind ?? "",
|
|
34
|
+
system: entity.spec?.system ? JSON.stringify(entity.spec?.system) : "",
|
|
35
|
+
owner: entity.spec?.owner ? JSON.stringify(entity.spec?.owner) : "",
|
|
36
|
+
lifecycle: entity.spec?.lifecycle ? JSON.stringify(entity.spec?.lifecycle) : "",
|
|
37
|
+
annotations
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
setCatalogEntities(entities);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
fetchMappings();
|
|
44
|
+
fetchCatalogEntities();
|
|
45
|
+
}, [catalogApi, pagerDutyApi]);
|
|
46
|
+
return /* @__PURE__ */ jsx(MappingTable, { mappings: entityMappings, catalogEntities });
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export { ServiceMappingComponent };
|
|
50
|
+
//# sourceMappingURL=ServiceMappingComponent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServiceMappingComponent.esm.js","sources":["../../../src/components/PagerDutyPage/ServiceMappingComponent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { PagerDutyEntityMapping } from '@pagerduty/backstage-plugin-common';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { pagerDutyApiRef } from '../../api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport { MappingTable } from './MappingTable';\nimport { BackstageEntity, Annotations } from '../types';\n\nexport const ServiceMappingComponent = () => {\n const [entityMappings, setEntityMappings] = useState<\n PagerDutyEntityMapping[]\n >([]);\n const [catalogEntities, setCatalogEntities] = useState<BackstageEntity[]>([]);\n\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const catalogApi = useApi(catalogApiRef);\n\n // call fetchMappings() and fetchCatalogEntities() on useEffect hook\n useEffect(() => {\n function fetchMappings() {\n pagerDutyApi.getEntityMappings().then(result => {\n setEntityMappings(result.mappings);\n });\n }\n\n function fetchCatalogEntities() {\n catalogApi\n .getEntities({\n filter: { kind: 'Component' },\n })\n .then(result => {\n const entities: BackstageEntity[] = [];\n result.items.forEach(entity => {\n const annotations: Annotations = {\n 'pagerduty.com/integration-key':\n entity.metadata?.annotations?.[\n 'pagerduty.com/integration-key'\n ] ?? '',\n 'pagerduty.com/service-id':\n entity.metadata?.annotations?.['pagerduty.com/service-id'] ??\n '',\n };\n\n entities.push({\n name: entity.metadata?.name,\n id: entity.metadata?.uid ?? '',\n namespace: entity.metadata?.namespace ?? '',\n type: entity.kind ?? '',\n system: entity.spec?.system\n ? JSON.stringify(entity.spec?.system)\n : '',\n owner: entity.spec?.owner\n ? JSON.stringify(entity.spec?.owner)\n : '',\n lifecycle: entity.spec?.lifecycle\n ? JSON.stringify(entity.spec?.lifecycle)\n : '',\n annotations: annotations,\n });\n });\n\n setCatalogEntities(entities);\n });\n }\n\n fetchMappings();\n fetchCatalogEntities();\n }, [catalogApi, pagerDutyApi]);\n\n return (\n <MappingTable mappings={entityMappings} catalogEntities={catalogEntities} />\n );\n};\n"],"names":[],"mappings":";;;;;;;AAQO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA,CAE1C,EAAE,CAAA;AACJ,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,QAAA,CAA4B,EAAE,CAAA;AAE5E,EAAA,MAAM,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,OAAO,aAAa,CAAA;AAGvC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,SAAS,aAAA,GAAgB;AACvB,MAAA,YAAA,CAAa,iBAAA,EAAkB,CAAE,IAAA,CAAK,CAAA,MAAA,KAAU;AAC9C,QAAA,iBAAA,CAAkB,OAAO,QAAQ,CAAA;AAAA,MACnC,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,SAAS,oBAAA,GAAuB;AAC9B,MAAA,UAAA,CACG,WAAA,CAAY;AAAA,QACX,MAAA,EAAQ,EAAE,IAAA,EAAM,WAAA;AAAY,OAC7B,CAAA,CACA,IAAA,CAAK,CAAA,MAAA,KAAU;AACd,QAAA,MAAM,WAA8B,EAAC;AACrC,QAAA,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA,MAAA,KAAU;AAC7B,UAAA,MAAM,WAAA,GAA2B;AAAA,YAC/B,+BAAA,EACE,MAAA,CAAO,QAAA,EAAU,WAAA,GACf,+BACF,CAAA,IAAK,EAAA;AAAA,YACP,0BAAA,EACE,MAAA,CAAO,QAAA,EAAU,WAAA,GAAc,0BAA0B,CAAA,IACzD;AAAA,WACJ;AAEA,UAAA,QAAA,CAAS,IAAA,CAAK;AAAA,YACZ,IAAA,EAAM,OAAO,QAAA,EAAU,IAAA;AAAA,YACvB,EAAA,EAAI,MAAA,CAAO,QAAA,EAAU,GAAA,IAAO,EAAA;AAAA,YAC5B,SAAA,EAAW,MAAA,CAAO,QAAA,EAAU,SAAA,IAAa,EAAA;AAAA,YACzC,IAAA,EAAM,OAAO,IAAA,IAAQ,EAAA;AAAA,YACrB,MAAA,EAAQ,OAAO,IAAA,EAAM,MAAA,GACjB,KAAK,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,GAClC,EAAA;AAAA,YACJ,KAAA,EAAO,OAAO,IAAA,EAAM,KAAA,GAChB,KAAK,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,KAAK,CAAA,GACjC,EAAA;AAAA,YACJ,SAAA,EAAW,OAAO,IAAA,EAAM,SAAA,GACpB,KAAK,SAAA,CAAU,MAAA,CAAO,IAAA,EAAM,SAAS,CAAA,GACrC,EAAA;AAAA,YACJ;AAAA,WACD,CAAA;AAAA,QACH,CAAC,CAAA;AAED,QAAA,kBAAA,CAAmB,QAAQ,CAAA;AAAA,MAC7B,CAAC,CAAA;AAAA,IACL;AAEA,IAAA,aAAA,EAAc;AACd,IAAA,oBAAA,EAAqB;AAAA,EACvB,CAAA,EAAG,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA;AAE7B,EAAA,uBACE,GAAA,CAAC,YAAA,EAAA,EAAa,QAAA,EAAU,cAAA,EAAgB,eAAA,EAAkC,CAAA;AAE9E;;;;"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { makeStyles, Typography, createStyles } from '@material-ui/core';
|
|
4
|
+
import { Grid, Card, RadioGroup, Radio } from '@backstage/ui';
|
|
5
|
+
import { Page, Header, Content, TabbedLayout } from '@backstage/core-components';
|
|
6
|
+
import { ServiceMappingComponent } from './ServiceMappingComponent.esm.js';
|
|
7
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
8
|
+
import { pagerDutyApiRef } from '../../api/client.esm.js';
|
|
9
|
+
import { NotFoundError } from '@backstage/errors';
|
|
10
|
+
|
|
11
|
+
const SERVICE_DEPENDENCY_SYNC_STRATEGY = "settings::service-dependency-sync-strategy";
|
|
12
|
+
const useStyles = makeStyles(
|
|
13
|
+
() => createStyles({
|
|
14
|
+
cardStyles: {
|
|
15
|
+
padding: "15px",
|
|
16
|
+
marginTop: "16px"
|
|
17
|
+
},
|
|
18
|
+
textContainerStyles: {
|
|
19
|
+
marginTop: "16px"
|
|
20
|
+
},
|
|
21
|
+
linkStyles: {
|
|
22
|
+
color: "cadetblue"
|
|
23
|
+
}
|
|
24
|
+
})
|
|
25
|
+
);
|
|
26
|
+
const PagerDutyPage = () => {
|
|
27
|
+
const { cardStyles, textContainerStyles, linkStyles } = useStyles();
|
|
28
|
+
const pagerDutyApi = useApi(pagerDutyApiRef);
|
|
29
|
+
const [
|
|
30
|
+
selectedServiceDependencyStrategy,
|
|
31
|
+
setSelectedServiceDependencyStrategy
|
|
32
|
+
] = useState("disabled");
|
|
33
|
+
useEffect(() => {
|
|
34
|
+
function fetchSetting() {
|
|
35
|
+
pagerDutyApi.getSetting(SERVICE_DEPENDENCY_SYNC_STRATEGY).then((result) => {
|
|
36
|
+
if (result !== void 0) {
|
|
37
|
+
setSelectedServiceDependencyStrategy(result.value);
|
|
38
|
+
}
|
|
39
|
+
}).catch((error) => {
|
|
40
|
+
if (error instanceof NotFoundError) {
|
|
41
|
+
setSelectedServiceDependencyStrategy("disabled");
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
fetchSetting();
|
|
46
|
+
}, [pagerDutyApi]);
|
|
47
|
+
const handleChange = (value) => {
|
|
48
|
+
setSelectedServiceDependencyStrategy(value);
|
|
49
|
+
pagerDutyApi.storeSettings([
|
|
50
|
+
{
|
|
51
|
+
id: SERVICE_DEPENDENCY_SYNC_STRATEGY,
|
|
52
|
+
value
|
|
53
|
+
}
|
|
54
|
+
]);
|
|
55
|
+
};
|
|
56
|
+
return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
|
|
57
|
+
/* @__PURE__ */ jsx(Header, { title: "PagerDuty", subtitle: "Advanced configurations" }),
|
|
58
|
+
/* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsxs(TabbedLayout, { children: [
|
|
59
|
+
/* @__PURE__ */ jsx(TabbedLayout.Route, { path: "/service-mapping", title: "Service Mapping", children: /* @__PURE__ */ jsxs(Grid.Root, { gap: "3", columns: "1", children: [
|
|
60
|
+
/* @__PURE__ */ jsxs(Grid.Item, { children: [
|
|
61
|
+
/* @__PURE__ */ jsx(Typography, { children: "Easily map your existing PagerDuty services to entities in Backstage without the need to add anotations to all your projects." }),
|
|
62
|
+
/* @__PURE__ */ jsxs(Typography, { children: [
|
|
63
|
+
/* @__PURE__ */ jsx("b", { children: "Warning: " }),
|
|
64
|
+
"Only 1:1 mapping is allowed at this time."
|
|
65
|
+
] })
|
|
66
|
+
] }),
|
|
67
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(ServiceMappingComponent, {}) })
|
|
68
|
+
] }) }),
|
|
69
|
+
/* @__PURE__ */ jsx(TabbedLayout.Route, { path: "/settings", title: "Configuration", children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
70
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h4", children: "Plugin configuration" }),
|
|
71
|
+
/* @__PURE__ */ jsx(Typography, { children: "Configure your PagerDuty plugin configuration here" }),
|
|
72
|
+
/* @__PURE__ */ jsxs(
|
|
73
|
+
Card,
|
|
74
|
+
{
|
|
75
|
+
title: "Service dependency synchronization preferences",
|
|
76
|
+
className: cardStyles,
|
|
77
|
+
children: [
|
|
78
|
+
/* @__PURE__ */ jsx(Typography, { variant: "h6", children: "Service dependency synchronization strategy" }),
|
|
79
|
+
/* @__PURE__ */ jsxs(
|
|
80
|
+
RadioGroup,
|
|
81
|
+
{
|
|
82
|
+
label: "Select the main source of truth for your service dependencies",
|
|
83
|
+
value: selectedServiceDependencyStrategy,
|
|
84
|
+
onChange: (value) => handleChange(value),
|
|
85
|
+
children: [
|
|
86
|
+
/* @__PURE__ */ jsx(Radio, { value: "backstage" /* backstage */, children: "Backstage" }),
|
|
87
|
+
/* @__PURE__ */ jsx(Radio, { value: "pagerduty" /* pagerduty */, children: "PagerDuty" }),
|
|
88
|
+
/* @__PURE__ */ jsx(Radio, { value: "both" /* both */, children: "Both" }),
|
|
89
|
+
/* @__PURE__ */ jsx(Radio, { value: "disabled" /* disabled */, children: "Disabled" })
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
),
|
|
93
|
+
/* @__PURE__ */ jsx("div", { className: textContainerStyles, children: /* @__PURE__ */ jsxs(Typography, { children: [
|
|
94
|
+
/* @__PURE__ */ jsx("b", { children: "Warning: " }),
|
|
95
|
+
"Changing this setting will affect how your service dependencies are synchronized and may cause data loss. Check the",
|
|
96
|
+
" ",
|
|
97
|
+
/* @__PURE__ */ jsx(
|
|
98
|
+
"a",
|
|
99
|
+
{
|
|
100
|
+
className: linkStyles,
|
|
101
|
+
href: "https://pagerduty.github.io/backstage-plugin-docs/index.html",
|
|
102
|
+
children: "documentation"
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
" ",
|
|
106
|
+
"for more information."
|
|
107
|
+
] }) })
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
)
|
|
111
|
+
] }) })
|
|
112
|
+
] }) })
|
|
113
|
+
] });
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export { PagerDutyPage };
|
|
117
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { createStyles, makeStyles, Typography } from '@material-ui/core';\nimport { Card, Grid, RadioGroup, Radio } from '@backstage/ui';\nimport {\n Header,\n Page,\n Content,\n TabbedLayout,\n} from '@backstage/core-components';\nimport { ServiceMappingComponent } from './ServiceMappingComponent';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { pagerDutyApiRef } from '../../api';\nimport { NotFoundError } from '@backstage/errors';\nimport { BackstageTheme } from '@backstage/theme';\n\nenum StoreSettings {\n backstage = 'backstage',\n pagerduty = 'pagerduty',\n both = 'both',\n disabled = 'disabled',\n}\n\nconst SERVICE_DEPENDENCY_SYNC_STRATEGY =\n 'settings::service-dependency-sync-strategy';\n\nconst useStyles = makeStyles<BackstageTheme>(() =>\n createStyles({\n cardStyles: {\n padding: '15px',\n marginTop: '16px',\n },\n textContainerStyles: {\n marginTop: '16px',\n },\n linkStyles: {\n color: 'cadetblue',\n },\n }),\n);\n\n/** @public */\nexport const PagerDutyPage = () => {\n const { cardStyles, textContainerStyles, linkStyles } = useStyles();\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const [\n selectedServiceDependencyStrategy,\n setSelectedServiceDependencyStrategy,\n ] = useState('disabled');\n\n useEffect(() => {\n function fetchSetting() {\n pagerDutyApi\n .getSetting(SERVICE_DEPENDENCY_SYNC_STRATEGY)\n .then(result => {\n if (result !== undefined) {\n setSelectedServiceDependencyStrategy(result.value);\n }\n })\n .catch(error => {\n if (error instanceof NotFoundError) {\n // If the setting is not found, set the default value to \"disabled\"\n setSelectedServiceDependencyStrategy('disabled');\n }\n });\n }\n\n fetchSetting();\n }, [pagerDutyApi]);\n\n const handleChange = (value: StoreSettings) => {\n setSelectedServiceDependencyStrategy(value);\n pagerDutyApi.storeSettings([\n {\n id: SERVICE_DEPENDENCY_SYNC_STRATEGY,\n value,\n },\n ]);\n };\n\n return (\n <Page themeId=\"home\">\n <Header title=\"PagerDuty\" subtitle=\"Advanced configurations\" />\n <Content>\n <TabbedLayout>\n <TabbedLayout.Route path=\"/service-mapping\" title=\"Service Mapping\">\n <Grid.Root gap=\"3\" columns=\"1\">\n <Grid.Item>\n <Typography>\n Easily map your existing PagerDuty services to entities in\n Backstage without the need to add anotations to all your\n projects.\n </Typography>\n <Typography>\n <b>Warning: </b>Only 1:1 mapping is allowed at this time.\n </Typography>\n </Grid.Item>\n <Grid.Item>\n <ServiceMappingComponent />\n </Grid.Item>\n </Grid.Root>\n </TabbedLayout.Route>\n <TabbedLayout.Route path=\"/settings\" title=\"Configuration\">\n <>\n <Typography variant=\"h4\">Plugin configuration</Typography>\n <Typography>\n Configure your PagerDuty plugin configuration here\n </Typography>\n\n <Card\n title=\"Service dependency synchronization preferences\"\n className={cardStyles}\n >\n <Typography variant=\"h6\">\n Service dependency synchronization strategy\n </Typography>\n <RadioGroup\n label=\"Select the main source of truth for your service dependencies\"\n value={selectedServiceDependencyStrategy}\n onChange={value => handleChange(value as StoreSettings)}\n >\n <Radio value={StoreSettings.backstage}>Backstage</Radio>\n <Radio value={StoreSettings.pagerduty}>PagerDuty</Radio>\n <Radio value={StoreSettings.both}>Both</Radio>\n <Radio value={StoreSettings.disabled}>Disabled</Radio>\n </RadioGroup>\n\n <div className={textContainerStyles}>\n <Typography>\n <b>Warning: </b>Changing this setting will affect how your\n service dependencies are synchronized and may cause data\n loss. Check the{' '}\n <a\n className={linkStyles}\n href=\"https://pagerduty.github.io/backstage-plugin-docs/index.html\"\n >\n documentation\n </a>{' '}\n for more information.\n </Typography>\n </div>\n </Card>\n </>\n </TabbedLayout.Route>\n </TabbedLayout>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
import { CardHeader, Typography, Accordion, AccordionSummary, AccordionDetails } from '@material-ui/core';
|
|
4
|
+
import { Card, Flex, Grid } from '@backstage/ui';
|
|
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 PDGreenImage from '../../assets/PD-Green.svg';
|
|
10
|
+
import PDWhiteImage from '../../assets/PD-White.svg';
|
|
11
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
12
|
+
import { NotFoundError } from '@backstage/errors';
|
|
13
|
+
import { Progress, InfoCard } from '@backstage/core-components';
|
|
14
|
+
import { ForbiddenError } from '../Errors/ForbiddenError.esm.js';
|
|
15
|
+
import IncidentCounterCard from '../PagerDutyCardCommon/InsightsCard.esm.js';
|
|
16
|
+
import { OpenServiceButton } from '../PagerDutyCardCommon/OpenServiceButton.esm.js';
|
|
17
|
+
import ServiceStandardsCard from '../PagerDutyCardCommon/ServiceStandardsCard.esm.js';
|
|
18
|
+
import StatusCard from '../PagerDutyCardCommon/StatusCard.esm.js';
|
|
19
|
+
import { TriggerIncidentButton } from '../PagerDutyCardCommon/TriggerIncidentButton.esm.js';
|
|
20
|
+
import { makeStyles, useTheme, createStyles } from '@material-ui/core/styles';
|
|
21
|
+
import { EscalationPolicy } from '../Escalation/EscalationPolicy.esm.js';
|
|
22
|
+
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
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
|
+
subheaderTextStyle: {
|
|
32
|
+
fontSize: "10px",
|
|
33
|
+
paddingLeft: "5px",
|
|
34
|
+
paddingTop: "3px"
|
|
35
|
+
},
|
|
36
|
+
accordionStyle: {
|
|
37
|
+
background: "transparent"
|
|
38
|
+
},
|
|
39
|
+
gridRootStyle: {
|
|
40
|
+
width: "100%"
|
|
41
|
+
},
|
|
42
|
+
cardStyles: {
|
|
43
|
+
paddingLeft: "10px",
|
|
44
|
+
paddingRight: "10px"
|
|
45
|
+
}
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
const BasicCard = ({ children }) => /* @__PURE__ */ jsx(InfoCard, { title: "PagerDuty", children });
|
|
49
|
+
const PagerDutySmallCard = (props) => {
|
|
50
|
+
const classes = useStyles();
|
|
51
|
+
const theme = useTheme();
|
|
52
|
+
const { readOnly, disableInsights, disableOnCall } = props;
|
|
53
|
+
const api = useApi(pagerDutyApiRef);
|
|
54
|
+
const [refreshStatus, setRefreshStatus] = useState(false);
|
|
55
|
+
const handleRefresh = useCallback(() => {
|
|
56
|
+
setRefreshStatus((x) => !x);
|
|
57
|
+
}, []);
|
|
58
|
+
const {
|
|
59
|
+
value: service,
|
|
60
|
+
loading,
|
|
61
|
+
error
|
|
62
|
+
} = useAsync(async () => {
|
|
63
|
+
const { service: foundService } = await api.getServiceByPagerDutyEntity(
|
|
64
|
+
props
|
|
65
|
+
);
|
|
66
|
+
const serviceStandards = await api.getServiceStandardsByServiceId(
|
|
67
|
+
foundService.id,
|
|
68
|
+
props.account
|
|
69
|
+
);
|
|
70
|
+
const serviceMetrics = await api.getServiceMetricsByServiceId(
|
|
71
|
+
foundService.id,
|
|
72
|
+
props.account
|
|
73
|
+
);
|
|
74
|
+
const result = {
|
|
75
|
+
id: foundService.id,
|
|
76
|
+
name: foundService.name,
|
|
77
|
+
account: props.account,
|
|
78
|
+
url: foundService.html_url,
|
|
79
|
+
policyId: foundService.escalation_policy.id,
|
|
80
|
+
policyLink: foundService.escalation_policy.html_url,
|
|
81
|
+
policyName: foundService.escalation_policy.name,
|
|
82
|
+
status: foundService.status,
|
|
83
|
+
standards: serviceStandards !== void 0 ? serviceStandards.standards : void 0,
|
|
84
|
+
metrics: serviceMetrics !== void 0 ? serviceMetrics.metrics : void 0
|
|
85
|
+
};
|
|
86
|
+
return result;
|
|
87
|
+
}, [props]);
|
|
88
|
+
if (error) {
|
|
89
|
+
let errorNode;
|
|
90
|
+
switch (error.constructor) {
|
|
91
|
+
case UnauthorizedError:
|
|
92
|
+
errorNode = /* @__PURE__ */ jsx(MissingTokenError, {});
|
|
93
|
+
break;
|
|
94
|
+
case NotFoundError:
|
|
95
|
+
errorNode = /* @__PURE__ */ jsx(ServiceNotFoundError, {});
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
errorNode = /* @__PURE__ */ jsx(ForbiddenError, {});
|
|
99
|
+
}
|
|
100
|
+
return /* @__PURE__ */ jsx(BasicCard, { children: errorNode });
|
|
101
|
+
}
|
|
102
|
+
if (loading) {
|
|
103
|
+
return /* @__PURE__ */ jsx(BasicCard, { children: /* @__PURE__ */ jsx(Progress, {}) });
|
|
104
|
+
}
|
|
105
|
+
return /* @__PURE__ */ jsxs(Card, { "data-testid": "pagerduty-card", className: classes.cardStyles, children: [
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
CardHeader,
|
|
108
|
+
{
|
|
109
|
+
title: theme.palette.type === "dark" ? /* @__PURE__ */ jsx("img", { src: PDWhiteImage, alt: "PagerDuty", height: "25" }) : /* @__PURE__ */ jsx("img", { src: PDGreenImage, alt: "PagerDuty", height: "25" }),
|
|
110
|
+
action: !readOnly && props.integrationKey ? /* @__PURE__ */ jsxs(Flex, { children: [
|
|
111
|
+
/* @__PURE__ */ jsx(
|
|
112
|
+
TriggerIncidentButton,
|
|
113
|
+
{
|
|
114
|
+
compact: true,
|
|
115
|
+
"data-testid": "trigger-incident-button",
|
|
116
|
+
integrationKey: props.integrationKey,
|
|
117
|
+
entityName: props.name,
|
|
118
|
+
handleRefresh
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
/* @__PURE__ */ jsx(OpenServiceButton, { compact: true, serviceUrl: service.url })
|
|
122
|
+
] }) : /* @__PURE__ */ jsx(OpenServiceButton, { compact: true, serviceUrl: service.url })
|
|
123
|
+
}
|
|
124
|
+
),
|
|
125
|
+
/* @__PURE__ */ jsxs(Grid.Root, { columns: "2", gap: "1", pl: "1", pr: "1", children: [
|
|
126
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "STATUS" }) }),
|
|
127
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "STANDARDS" }) })
|
|
128
|
+
] }),
|
|
129
|
+
/* @__PURE__ */ jsxs(Grid.Root, { columns: "2", gap: "1", pl: "1", pr: "1", children: [
|
|
130
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(
|
|
131
|
+
StatusCard,
|
|
132
|
+
{
|
|
133
|
+
compact: true,
|
|
134
|
+
serviceId: service.id,
|
|
135
|
+
refreshStatus,
|
|
136
|
+
account: service.account
|
|
137
|
+
}
|
|
138
|
+
) }),
|
|
139
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(
|
|
140
|
+
ServiceStandardsCard,
|
|
141
|
+
{
|
|
142
|
+
compact: true,
|
|
143
|
+
total: service?.standards?.score !== void 0 ? service?.standards?.score?.total : void 0,
|
|
144
|
+
completed: service?.standards?.score !== void 0 ? service?.standards?.score?.passing : void 0,
|
|
145
|
+
standards: service?.standards !== void 0 ? service?.standards?.standards : void 0
|
|
146
|
+
}
|
|
147
|
+
) })
|
|
148
|
+
] }),
|
|
149
|
+
disableInsights !== true ? /* @__PURE__ */ jsxs(Accordion, { className: classes.accordionStyle, children: [
|
|
150
|
+
/* @__PURE__ */ jsxs(
|
|
151
|
+
AccordionSummary,
|
|
152
|
+
{
|
|
153
|
+
expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}),
|
|
154
|
+
"aria-controls": "panel1a-content",
|
|
155
|
+
id: "panel1a-header",
|
|
156
|
+
children: [
|
|
157
|
+
/* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "INSIGHTS" }),
|
|
158
|
+
/* @__PURE__ */ jsx(Typography, { className: classes.subheaderTextStyle, children: "(last 30 days)" })
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
),
|
|
162
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsxs(
|
|
163
|
+
Grid.Root,
|
|
164
|
+
{
|
|
165
|
+
columns: "3",
|
|
166
|
+
gap: "1",
|
|
167
|
+
pl: "1",
|
|
168
|
+
pr: "1",
|
|
169
|
+
className: classes.gridRootStyle,
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(
|
|
172
|
+
IncidentCounterCard,
|
|
173
|
+
{
|
|
174
|
+
compact: true,
|
|
175
|
+
count: service?.metrics !== void 0 && service.metrics.length > 0 ? service?.metrics[0].total_interruptions : void 0,
|
|
176
|
+
label: "interruptions",
|
|
177
|
+
color: theme.palette.textSubtle
|
|
178
|
+
}
|
|
179
|
+
) }),
|
|
180
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(
|
|
181
|
+
IncidentCounterCard,
|
|
182
|
+
{
|
|
183
|
+
compact: true,
|
|
184
|
+
count: service?.metrics !== void 0 && service.metrics.length > 0 ? service?.metrics[0].total_high_urgency_incidents : void 0,
|
|
185
|
+
label: "high urgency",
|
|
186
|
+
color: theme.palette.warning.main
|
|
187
|
+
}
|
|
188
|
+
) }),
|
|
189
|
+
/* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(
|
|
190
|
+
IncidentCounterCard,
|
|
191
|
+
{
|
|
192
|
+
compact: true,
|
|
193
|
+
count: service?.metrics !== void 0 && service?.metrics?.length > 0 ? service?.metrics[0].total_incident_count : void 0,
|
|
194
|
+
label: "incidents",
|
|
195
|
+
color: theme.palette.error.main
|
|
196
|
+
}
|
|
197
|
+
) })
|
|
198
|
+
]
|
|
199
|
+
}
|
|
200
|
+
) })
|
|
201
|
+
] }) : /* @__PURE__ */ jsx(Fragment, {}),
|
|
202
|
+
disableOnCall !== true ? /* @__PURE__ */ jsxs(Accordion, { className: classes.accordionStyle, children: [
|
|
203
|
+
/* @__PURE__ */ jsx(
|
|
204
|
+
AccordionSummary,
|
|
205
|
+
{
|
|
206
|
+
expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}),
|
|
207
|
+
"aria-controls": "panel1a-content",
|
|
208
|
+
id: "panel1a-header",
|
|
209
|
+
children: /* @__PURE__ */ jsx(Typography, { className: classes.overviewHeaderTextStyle, children: "ON CALL" })
|
|
210
|
+
}
|
|
211
|
+
),
|
|
212
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsx(
|
|
213
|
+
EscalationPolicy,
|
|
214
|
+
{
|
|
215
|
+
"data-testid": "oncall-card",
|
|
216
|
+
policyId: service.policyId,
|
|
217
|
+
policyUrl: service.policyLink,
|
|
218
|
+
policyName: service.policyName,
|
|
219
|
+
account: service.account
|
|
220
|
+
}
|
|
221
|
+
) })
|
|
222
|
+
] }) : /* @__PURE__ */ jsx(Fragment, {})
|
|
223
|
+
] });
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
export { PagerDutySmallCard };
|
|
227
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/components/PagerDutySmallCard/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 Accordion,\n AccordionDetails,\n AccordionSummary,\n CardHeader,\n Typography,\n} from '@material-ui/core';\nimport { Card, Flex, Grid } from '@backstage/ui';\nimport useAsync from 'react-use/lib/useAsync';\nimport { pagerDutyApiRef, UnauthorizedError } from '../../api';\nimport { MissingTokenError, ServiceNotFoundError } from '../Errors';\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 { Progress, InfoCard } 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';\nimport { EscalationPolicy } from '../Escalation';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\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 subheaderTextStyle: {\n fontSize: '10px',\n paddingLeft: '5px',\n paddingTop: '3px',\n },\n accordionStyle: {\n background: 'transparent',\n },\n gridRootStyle: {\n width: '100%',\n },\n cardStyles: {\n paddingLeft: '10px',\n paddingRight: '10px',\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 disableInsights?: boolean;\n disableOnCall?: boolean;\n};\n\n/** @public */\nexport const PagerDutySmallCard = (props: PagerDutyCardProps) => {\n const classes = useStyles();\n\n const theme = useTheme();\n const { readOnly, disableInsights, disableOnCall } = props;\n const api = useApi(pagerDutyApiRef);\n const [refreshStatus, setRefreshStatus] = useState<boolean>(false);\n\n const handleRefresh = useCallback(() => {\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 name: foundService.name,\n account: props.account,\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\" className={classes.cardStyles}>\n <CardHeader\n title={\n theme.palette.type === 'dark' ? (\n <img src={PDWhiteImage} alt=\"PagerDuty\" height=\"25\" />\n ) : (\n <img src={PDGreenImage} alt=\"PagerDuty\" height=\"25\" />\n )\n }\n action={\n !readOnly && props.integrationKey ? (\n <Flex>\n <TriggerIncidentButton\n compact\n data-testid=\"trigger-incident-button\"\n integrationKey={props.integrationKey}\n entityName={props.name}\n handleRefresh={handleRefresh}\n />\n <OpenServiceButton compact serviceUrl={service!.url} />\n </Flex>\n ) : (\n <OpenServiceButton compact serviceUrl={service!.url} />\n )\n }\n />\n\n <Grid.Root columns=\"2\" gap=\"1\" pl=\"1\" pr=\"1\">\n <Grid.Item>\n <Typography className={classes.overviewHeaderTextStyle}>\n STATUS\n </Typography>\n </Grid.Item>\n <Grid.Item>\n <Typography className={classes.overviewHeaderTextStyle}>\n STANDARDS\n </Typography>\n </Grid.Item>\n </Grid.Root>\n\n <Grid.Root columns=\"2\" gap=\"1\" pl=\"1\" pr=\"1\">\n <Grid.Item>\n <StatusCard\n compact\n serviceId={service!.id}\n refreshStatus={refreshStatus}\n account={service!.account}\n />\n </Grid.Item>\n <Grid.Item>\n <ServiceStandardsCard\n compact\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.Item>\n </Grid.Root>\n\n {disableInsights !== true ? (\n <Accordion className={classes.accordionStyle}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography className={classes.overviewHeaderTextStyle}>\n INSIGHTS\n </Typography>\n <Typography className={classes.subheaderTextStyle}>\n (last 30 days)\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Grid.Root\n columns=\"3\"\n gap=\"1\"\n pl=\"1\"\n pr=\"1\"\n className={classes.gridRootStyle}\n >\n <Grid.Item>\n <InsightsCard\n compact\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.Item>\n <Grid.Item>\n <InsightsCard\n compact\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.Item>\n <Grid.Item>\n <InsightsCard\n compact\n count={\n service?.metrics !== undefined &&\n 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.Item>\n </Grid.Root>\n </AccordionDetails>\n </Accordion>\n ) : (\n <></>\n )}\n\n {disableOnCall !== true ? (\n <Accordion className={classes.accordionStyle}>\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"panel1a-content\"\n id=\"panel1a-header\"\n >\n <Typography className={classes.overviewHeaderTextStyle}>\n ON CALL\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\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 </AccordionDetails>\n </Accordion>\n ) : (\n <></>\n )}\n </Card>\n );\n};\n"],"names":["InsightsCard"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useCallback } from 'react';
|
|
3
|
+
import { makeStyles, Button } from '@material-ui/core';
|
|
4
|
+
import { usePagerdutyEntity } from '../../hooks/index.esm.js';
|
|
5
|
+
import { TriggerDialog } from '../TriggerDialog/TriggerDialog.esm.js';
|
|
6
|
+
|
|
7
|
+
const useStyles = makeStyles((theme) => ({
|
|
8
|
+
buttonStyle: {
|
|
9
|
+
backgroundColor: theme.palette.error.main,
|
|
10
|
+
color: theme.palette.error.contrastText,
|
|
11
|
+
"&:hover": {
|
|
12
|
+
backgroundColor: theme.palette.error.dark
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}));
|
|
16
|
+
function TriggerButton(props) {
|
|
17
|
+
const { buttonStyle } = useStyles();
|
|
18
|
+
const { integrationKey, name } = usePagerdutyEntity();
|
|
19
|
+
const [dialogShown, setDialogShown] = useState(false);
|
|
20
|
+
const showDialog = useCallback(() => {
|
|
21
|
+
setDialogShown(true);
|
|
22
|
+
}, [setDialogShown]);
|
|
23
|
+
const hideDialog = useCallback(() => {
|
|
24
|
+
setDialogShown(false);
|
|
25
|
+
}, [setDialogShown]);
|
|
26
|
+
const disabled = !integrationKey;
|
|
27
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
28
|
+
/* @__PURE__ */ jsx(
|
|
29
|
+
Button,
|
|
30
|
+
{
|
|
31
|
+
onClick: showDialog,
|
|
32
|
+
variant: "contained",
|
|
33
|
+
className: disabled ? "" : buttonStyle,
|
|
34
|
+
disabled,
|
|
35
|
+
children: integrationKey ? props.children ?? "Create new incident" : "Missing integration key"
|
|
36
|
+
}
|
|
37
|
+
),
|
|
38
|
+
integrationKey && /* @__PURE__ */ jsx(
|
|
39
|
+
TriggerDialog,
|
|
40
|
+
{
|
|
41
|
+
showDialog: dialogShown,
|
|
42
|
+
handleDialog: hideDialog,
|
|
43
|
+
integrationKey,
|
|
44
|
+
serviceName: name
|
|
45
|
+
}
|
|
46
|
+
)
|
|
47
|
+
] });
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export { TriggerButton };
|
|
51
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../src/components/TriggerButton/index.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { useCallback, ReactNode, useState } from 'react';\nimport { makeStyles, Button } from '@material-ui/core';\nimport { BackstageTheme } from '@backstage/theme';\n\nimport { usePagerdutyEntity } from '../../hooks';\nimport { TriggerDialog } from '../TriggerDialog';\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n buttonStyle: {\n backgroundColor: theme.palette.error.main,\n color: theme.palette.error.contrastText,\n '&:hover': {\n backgroundColor: theme.palette.error.dark,\n },\n },\n}));\n\n/** @public */\nexport function TriggerButton(props: { children?: ReactNode }) {\n const { buttonStyle } = useStyles();\n const { integrationKey, name } = usePagerdutyEntity();\n const [dialogShown, setDialogShown] = useState<boolean>(false);\n\n const showDialog = useCallback(() => {\n setDialogShown(true);\n }, [setDialogShown]);\n const hideDialog = useCallback(() => {\n setDialogShown(false);\n }, [setDialogShown]);\n\n const disabled = !integrationKey;\n return (\n <>\n <Button\n onClick={showDialog}\n variant=\"contained\"\n className={disabled ? '' : buttonStyle}\n disabled={disabled}\n >\n {integrationKey\n ? props.children ?? 'Create new incident'\n : 'Missing integration key'}\n </Button>\n {integrationKey && (\n <TriggerDialog\n showDialog={dialogShown}\n handleDialog={hideDialog}\n integrationKey={integrationKey}\n serviceName={name}\n />\n )}\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;AAwBA,MAAM,SAAA,GAAY,WAA2B,CAAA,KAAA,MAAU;AAAA,EACrD,WAAA,EAAa;AAAA,IACX,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,IAAA;AAAA,IACrC,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,YAAA;AAAA,IAC3B,SAAA,EAAW;AAAA,MACT,eAAA,EAAiB,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM;AAAA;AACvC;AAEJ,CAAA,CAAE,CAAA;AAGK,SAAS,cAAc,KAAA,EAAiC;AAC7D,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,SAAA,EAAU;AAClC,EAAA,MAAM,EAAE,cAAA,EAAgB,IAAA,EAAK,GAAI,kBAAA,EAAmB;AACpD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAkB,KAAK,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,cAAA,CAAe,IAAI,CAAA;AAAA,EACrB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AACnB,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,cAAc,CAAC,CAAA;AAEnB,EAAA,MAAM,WAAW,CAAC,cAAA;AAClB,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,UAAA;AAAA,QACT,OAAA,EAAQ,WAAA;AAAA,QACR,SAAA,EAAW,WAAW,EAAA,GAAK,WAAA;AAAA,QAC3B,QAAA;AAAA,QAEC,QAAA,EAAA,cAAA,GACG,KAAA,CAAM,QAAA,IAAY,qBAAA,GAClB;AAAA;AAAA,KACN;AAAA,IACC,cAAA,oBACC,GAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,UAAA,EAAY,WAAA;AAAA,QACZ,YAAA,EAAc,UAAA;AAAA,QACd,cAAA;AAAA,QACA,WAAA,EAAa;AAAA;AAAA;AACf,GAAA,EAEJ,CAAA;AAEJ;;;;"}
|