@pagerduty/backstage-plugin 0.18.0 → 0.19.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 (46) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/alpha/api.esm.js.map +1 -1
  3. package/dist/api/client.esm.js +91 -2
  4. package/dist/api/client.esm.js.map +1 -1
  5. package/dist/components/PagerDutyPage/AccountContext.esm.js +56 -0
  6. package/dist/components/PagerDutyPage/AccountContext.esm.js.map +1 -0
  7. package/dist/components/PagerDutyPage/AutomaticMappingsDialog.esm.js +197 -0
  8. package/dist/components/PagerDutyPage/AutomaticMappingsDialog.esm.js.map +1 -0
  9. package/dist/components/PagerDutyPage/MappingsDialog.esm.js +242 -0
  10. package/dist/components/PagerDutyPage/MappingsDialog.esm.js.map +1 -0
  11. package/dist/components/PagerDutyPage/MappingsTable/AutoMappingsButton.esm.js +74 -0
  12. package/dist/components/PagerDutyPage/MappingsTable/AutoMappingsButton.esm.js.map +1 -0
  13. package/dist/components/PagerDutyPage/MappingsTable/EmptyTableState.esm.js +26 -0
  14. package/dist/components/PagerDutyPage/MappingsTable/EmptyTableState.esm.js.map +1 -0
  15. package/dist/components/PagerDutyPage/MappingsTable/FilterRow.esm.js +67 -0
  16. package/dist/components/PagerDutyPage/MappingsTable/FilterRow.esm.js.map +1 -0
  17. package/dist/components/PagerDutyPage/MappingsTable/MappingToast.esm.js +69 -0
  18. package/dist/components/PagerDutyPage/MappingsTable/MappingToast.esm.js.map +1 -0
  19. package/dist/components/PagerDutyPage/MappingsTable/MappingsTable.esm.js +202 -0
  20. package/dist/components/PagerDutyPage/MappingsTable/MappingsTable.esm.js.map +1 -0
  21. package/dist/components/PagerDutyPage/MappingsTable/MappingsTableContent.esm.js +231 -0
  22. package/dist/components/PagerDutyPage/MappingsTable/MappingsTableContent.esm.js.map +1 -0
  23. package/dist/components/PagerDutyPage/MappingsTable/ServiceCell.esm.js +31 -0
  24. package/dist/components/PagerDutyPage/MappingsTable/ServiceCell.esm.js.map +1 -0
  25. package/dist/components/PagerDutyPage/MappingsTable/StatusCell.esm.js +112 -0
  26. package/dist/components/PagerDutyPage/MappingsTable/StatusCell.esm.js.map +1 -0
  27. package/dist/components/PagerDutyPage/MappingsTable/TableSkeleton.esm.js +50 -0
  28. package/dist/components/PagerDutyPage/MappingsTable/TableSkeleton.esm.js.map +1 -0
  29. package/dist/components/PagerDutyPage/MappingsTable/hooks/useConfirmMappings.esm.js +70 -0
  30. package/dist/components/PagerDutyPage/MappingsTable/hooks/useConfirmMappings.esm.js.map +1 -0
  31. package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js +67 -44
  32. package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js.map +1 -1
  33. package/dist/components/PagerDutyPage/index.esm.js +27 -12
  34. package/dist/components/PagerDutyPage/index.esm.js.map +1 -1
  35. package/dist/components/TriggerButton/index.esm.js +1 -1
  36. package/dist/components/TriggerButton/index.esm.js.map +1 -1
  37. package/dist/hooks/useDebounce.esm.js +13 -0
  38. package/dist/hooks/useDebounce.esm.js.map +1 -0
  39. package/dist/hooks/{index.esm.js → usePagerDutyEntity.esm.js} +1 -1
  40. package/dist/hooks/usePagerDutyEntity.esm.js.map +1 -0
  41. package/dist/index.d.ts +96 -4
  42. package/dist/package.json.esm.js +1 -1
  43. package/package.json +13 -13
  44. package/dist/components/PagerDutyPage/MappingTable.esm.js +0 -282
  45. package/dist/components/PagerDutyPage/MappingTable.esm.js.map +0 -1
  46. package/dist/hooks/index.esm.js.map +0 -1
@@ -0,0 +1,50 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Box, Flex, Skeleton } from '@backstage/ui';
3
+
4
+ function TableSkeleton() {
5
+ return /* @__PURE__ */ jsxs(Box, { "data-testid": "mappings-table-skeleton", style: { width: "100%" }, mt: "4", children: [
6
+ /* @__PURE__ */ jsxs(
7
+ Flex,
8
+ {
9
+ gap: "4",
10
+ style: {
11
+ padding: "1rem",
12
+ borderBottom: "1px solid var(--bui-border-neutral-default)",
13
+ backgroundColor: "var(--bui-bg-surface-0)"
14
+ },
15
+ children: [
16
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "15%" } }),
17
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "15%" } }),
18
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "20%" } }),
19
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "12%" } }),
20
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "12%" } }),
21
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "12%" } }),
22
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "20px", width: "10%" } })
23
+ ]
24
+ }
25
+ ),
26
+ [...Array(10)].map((_, index) => /* @__PURE__ */ jsxs(
27
+ Flex,
28
+ {
29
+ gap: "4",
30
+ style: {
31
+ padding: "1rem",
32
+ borderBottom: "1px solid var(--bui-border-neutral-subtle)"
33
+ },
34
+ children: [
35
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "15%" } }),
36
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "15%" } }),
37
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "20%" } }),
38
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "12%" } }),
39
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "12%" } }),
40
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "12%" } }),
41
+ /* @__PURE__ */ jsx(Skeleton, { style: { height: "16px", width: "10%" } })
42
+ ]
43
+ },
44
+ index
45
+ ))
46
+ ] });
47
+ }
48
+
49
+ export { TableSkeleton };
50
+ //# sourceMappingURL=TableSkeleton.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableSkeleton.esm.js","sources":["../../../../src/components/PagerDutyPage/MappingsTable/TableSkeleton.tsx"],"sourcesContent":["import { Box, Flex, Skeleton } from '@backstage/ui';\n\nexport function TableSkeleton() {\n return (\n <Box data-testid=\"mappings-table-skeleton\" style={{ width: '100%' }} mt=\"4\">\n <Flex\n gap=\"4\"\n style={{\n padding: '1rem',\n borderBottom: '1px solid var(--bui-border-neutral-default)',\n backgroundColor: 'var(--bui-bg-surface-0)',\n }}\n >\n <Skeleton style={{ height: '20px', width: '15%' }} />\n <Skeleton style={{ height: '20px', width: '15%' }} />\n <Skeleton style={{ height: '20px', width: '20%' }} />\n <Skeleton style={{ height: '20px', width: '12%' }} />\n <Skeleton style={{ height: '20px', width: '12%' }} />\n <Skeleton style={{ height: '20px', width: '12%' }} />\n <Skeleton style={{ height: '20px', width: '10%' }} />\n </Flex>\n\n {[...Array(10)].map((_, index) => (\n <Flex\n key={index}\n gap=\"4\"\n style={{\n padding: '1rem',\n borderBottom: '1px solid var(--bui-border-neutral-subtle)',\n }}\n >\n <Skeleton style={{ height: '16px', width: '15%' }} />\n <Skeleton style={{ height: '16px', width: '15%' }} />\n <Skeleton style={{ height: '16px', width: '20%' }} />\n <Skeleton style={{ height: '16px', width: '12%' }} />\n <Skeleton style={{ height: '16px', width: '12%' }} />\n <Skeleton style={{ height: '16px', width: '12%' }} />\n <Skeleton style={{ height: '16px', width: '10%' }} />\n </Flex>\n ))}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;AAEO,SAAS,aAAA,GAAgB;AAC9B,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,aAAA,EAAY,yBAAA,EAA0B,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAO,EAAG,EAAA,EAAG,GAAA,EACtE,QAAA,EAAA;AAAA,oBAAA,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,GAAA,EAAI,GAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,YAAA,EAAc,6CAAA;AAAA,UACd,eAAA,EAAiB;AAAA,SACnB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG;AAAA;AAAA;AAAA,KACrD;AAAA,IAEC,CAAC,GAAG,KAAA,CAAM,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,KAAA,qBACtB,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QAEC,GAAA,EAAI,GAAA;AAAA,QACJ,KAAA,EAAO;AAAA,UACL,OAAA,EAAS,MAAA;AAAA,UACT,YAAA,EAAc;AAAA,SAChB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG,CAAA;AAAA,0BACnD,GAAA,CAAC,YAAS,KAAA,EAAO,EAAE,QAAQ,MAAA,EAAQ,KAAA,EAAO,OAAM,EAAG;AAAA;AAAA,OAAA;AAAA,MAb9C;AAAA,KAeR;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
@@ -0,0 +1,70 @@
1
+ import { useState } from 'react';
2
+ import { useQueryClient } from '@tanstack/react-query';
3
+ import { useApi } from '@backstage/core-plugin-api';
4
+ import { pagerDutyApiRef } from '../../../../api/client.esm.js';
5
+ import { useAccountContext } from '../../AccountContext.esm.js';
6
+
7
+ function useConfirmMappings({
8
+ autoMatchResults,
9
+ mappingEntities,
10
+ onSuccess,
11
+ onError
12
+ }) {
13
+ const pagerDutyApi = useApi(pagerDutyApiRef);
14
+ const queryClient = useQueryClient();
15
+ const { selectedAccount } = useAccountContext();
16
+ const [isConfirming, setIsConfirming] = useState(false);
17
+ const confirmMappings = async () => {
18
+ try {
19
+ setIsConfirming(true);
20
+ const totalCount = Object.keys(autoMatchResults).length;
21
+ const mappingsToCreate = Object.entries(autoMatchResults).map(
22
+ ([entityName, matchData]) => {
23
+ const entity = mappingEntities?.find(
24
+ (e) => e.name === entityName
25
+ );
26
+ const entityRef = entity ? `${entity.type}:${entity.namespace}/${entity.name}`.toLowerCase() : `component:default/${entityName}`;
27
+ return {
28
+ serviceId: matchData.serviceId,
29
+ integrationKey: "",
30
+ entityRef,
31
+ account: selectedAccount || ""
32
+ };
33
+ }
34
+ );
35
+ const response = await pagerDutyApi.storeBulkServiceMappings(
36
+ mappingsToCreate
37
+ );
38
+ if (response.ok) {
39
+ const result = await response.json();
40
+ const successCount = result.successCount || 0;
41
+ const skippedCount = result.skippedCount || 0;
42
+ const errorCount = result.errorCount || 0;
43
+ const counts = {
44
+ created: successCount,
45
+ skipped: skippedCount,
46
+ errored: errorCount
47
+ };
48
+ onSuccess(successCount, totalCount, counts);
49
+ queryClient.invalidateQueries({
50
+ queryKey: ["pagerduty", "enhancedEntityMappings"]
51
+ });
52
+ } else {
53
+ const errorData = await response.json().catch(() => ({}));
54
+ onError(
55
+ errorData.error || "Failed to save mappings. Please try again."
56
+ );
57
+ }
58
+ } catch (error) {
59
+ onError(
60
+ `An error occurred while saving mappings: ${error instanceof Error ? error.message : "Unknown error"}`
61
+ );
62
+ } finally {
63
+ setIsConfirming(false);
64
+ }
65
+ };
66
+ return { confirmMappings, isConfirming };
67
+ }
68
+
69
+ export { useConfirmMappings };
70
+ //# sourceMappingURL=useConfirmMappings.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useConfirmMappings.esm.js","sources":["../../../../../src/components/PagerDutyPage/MappingsTable/hooks/useConfirmMappings.ts"],"sourcesContent":["import { useState } from 'react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { pagerDutyApiRef } from '../../../../api';\nimport { AutoMatchResults } from '../MappingsTable';\nimport { MappingCounts } from '../MappingToast';\nimport { FormattedBackstageEntity } from '@pagerduty/backstage-plugin-common';\nimport { useAccountContext } from '../../AccountContext';\n\ninterface UseConfirmMappingsParams {\n autoMatchResults: AutoMatchResults;\n mappingEntities?: FormattedBackstageEntity[];\n onSuccess: (\n successCount: number,\n totalCount: number,\n counts: MappingCounts,\n ) => void;\n onError: (errorMessage: string) => void;\n}\n\nexport function useConfirmMappings({\n autoMatchResults,\n mappingEntities,\n onSuccess,\n onError,\n}: UseConfirmMappingsParams) {\n const pagerDutyApi = useApi(pagerDutyApiRef);\n const queryClient = useQueryClient();\n const { selectedAccount } = useAccountContext();\n const [isConfirming, setIsConfirming] = useState(false);\n\n const confirmMappings = async () => {\n try {\n setIsConfirming(true);\n const totalCount = Object.keys(autoMatchResults).length;\n const mappingsToCreate = Object.entries(autoMatchResults).map(\n ([entityName, matchData]) => {\n const entity = mappingEntities?.find(\n (e: FormattedBackstageEntity) => e.name === entityName,\n );\n\n const entityRef = entity\n ? `${entity.type}:${entity.namespace}/${entity.name}`.toLowerCase()\n : `component:default/${entityName}`;\n\n return {\n serviceId: matchData.serviceId,\n integrationKey: '',\n entityRef: entityRef,\n account: selectedAccount || '',\n };\n },\n );\n\n const response = await pagerDutyApi.storeBulkServiceMappings(\n mappingsToCreate,\n );\n\n if (response.ok) {\n const result = await response.json();\n const successCount = result.successCount || 0;\n const skippedCount = result.skippedCount || 0;\n const errorCount = result.errorCount || 0;\n\n const counts: MappingCounts = {\n created: successCount,\n skipped: skippedCount,\n errored: errorCount,\n };\n onSuccess(successCount, totalCount, counts);\n queryClient.invalidateQueries({\n queryKey: ['pagerduty', 'enhancedEntityMappings'],\n });\n } else {\n const errorData = await response.json().catch(() => ({}));\n onError(\n errorData.error || 'Failed to save mappings. Please try again.',\n );\n }\n } catch (error) {\n onError(\n `An error occurred while saving mappings: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`,\n );\n } finally {\n setIsConfirming(false);\n }\n };\n\n return { confirmMappings, isConfirming };\n}\n"],"names":[],"mappings":";;;;;;AAoBO,SAAS,kBAAA,CAAmB;AAAA,EACjC,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,YAAA,GAAe,OAAO,eAAe,CAAA;AAC3C,EAAA,MAAM,cAAc,cAAA,EAAe;AACnC,EAAA,MAAM,EAAE,eAAA,EAAgB,GAAI,iBAAA,EAAkB;AAC9C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AAEtD,EAAA,MAAM,kBAAkB,YAAY;AAClC,IAAA,IAAI;AACF,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,gBAAgB,CAAA,CAAE,MAAA;AACjD,MAAA,MAAM,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,gBAAgB,CAAA,CAAE,GAAA;AAAA,QACxD,CAAC,CAAC,UAAA,EAAY,SAAS,CAAA,KAAM;AAC3B,UAAA,MAAM,SAAS,eAAA,EAAiB,IAAA;AAAA,YAC9B,CAAC,CAAA,KAAgC,CAAA,CAAE,IAAA,KAAS;AAAA,WAC9C;AAEA,UAAA,MAAM,SAAA,GAAY,MAAA,GACd,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA,CAAG,WAAA,EAAY,GAChE,qBAAqB,UAAU,CAAA,CAAA;AAEnC,UAAA,OAAO;AAAA,YACL,WAAW,SAAA,CAAU,SAAA;AAAA,YACrB,cAAA,EAAgB,EAAA;AAAA,YAChB,SAAA;AAAA,YACA,SAAS,eAAA,IAAmB;AAAA,WAC9B;AAAA,QACF;AAAA,OACF;AAEA,MAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,wBAAA;AAAA,QAClC;AAAA,OACF;AAEA,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,IAAA,EAAK;AACnC,QAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,CAAA;AAC5C,QAAA,MAAM,YAAA,GAAe,OAAO,YAAA,IAAgB,CAAA;AAC5C,QAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,CAAA;AAExC,QAAA,MAAM,MAAA,GAAwB;AAAA,UAC5B,OAAA,EAAS,YAAA;AAAA,UACT,OAAA,EAAS,YAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AACA,QAAA,SAAA,CAAU,YAAA,EAAc,YAAY,MAAM,CAAA;AAC1C,QAAA,WAAA,CAAY,iBAAA,CAAkB;AAAA,UAC5B,QAAA,EAAU,CAAC,WAAA,EAAa,wBAAwB;AAAA,SACjD,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,QAAA,OAAA;AAAA,UACE,UAAU,KAAA,IAAS;AAAA,SACrB;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA;AAAA,QACE,CAAA,yCAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,OACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,iBAAiB,YAAA,EAAa;AACzC;;;;"}
@@ -1,49 +1,72 @@
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';
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
3
+ import MappingsTable from './MappingsTable/MappingsTable.esm.js';
4
+ import { Card, CardBody, Flex, Text, Select } from '@backstage/ui';
5
+ import { AccountProvider, useAccountContext } from './AccountContext.esm.js';
6
+ import { makeStyles } from '@material-ui/core';
7
7
 
8
+ const useStyles = makeStyles((theme) => ({
9
+ accountCard: {
10
+ marginBottom: "16px",
11
+ width: "fit-content",
12
+ borderRadius: "8px"
13
+ },
14
+ accountCardBody: {
15
+ padding: "16px 20px !important"
16
+ },
17
+ accountLabel: {
18
+ fontSize: "15px",
19
+ fontWeight: 600,
20
+ color: theme.palette.text.primary,
21
+ marginBottom: "8px"
22
+ },
23
+ requiredIndicator: {
24
+ display: "inline-block",
25
+ color: "#dc3545",
26
+ fontWeight: 700,
27
+ marginLeft: "2px"
28
+ },
29
+ accountSelect: {
30
+ minWidth: "200px"
31
+ },
32
+ mainCard: {
33
+ borderRadius: "8px"
34
+ },
35
+ helpText: {
36
+ fontSize: "13px",
37
+ color: theme.palette.text.secondary,
38
+ fontStyle: "italic",
39
+ marginTop: "6px"
40
+ }
41
+ }));
42
+ const ServiceMappingContent = () => {
43
+ const { selectedAccount, setSelectedAccount, accounts } = useAccountContext();
44
+ const classes = useStyles();
45
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
46
+ accounts.length > 0 && /* @__PURE__ */ jsx(Card, { className: classes.accountCard, children: /* @__PURE__ */ jsx(CardBody, { className: classes.accountCardBody, children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "2", children: [
47
+ /* @__PURE__ */ jsxs(Text, { className: classes.accountLabel, children: [
48
+ "Please Select an Account:",
49
+ /* @__PURE__ */ jsx("div", { className: classes.requiredIndicator, children: "*" })
50
+ ] }),
51
+ /* @__PURE__ */ jsx(
52
+ Select,
53
+ {
54
+ selectionMode: "single",
55
+ size: "small",
56
+ value: selectedAccount,
57
+ onChange: (value) => setSelectedAccount(value?.toString() || ""),
58
+ placeholder: "Select account",
59
+ options: accounts,
60
+ className: classes.accountSelect
61
+ }
62
+ )
63
+ ] }) }) }),
64
+ /* @__PURE__ */ jsx(Card, { className: classes.mainCard, children: /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsx(MappingsTable, {}, selectedAccount) }) })
65
+ ] });
66
+ };
8
67
  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 });
68
+ const queryClient = new QueryClient();
69
+ return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(AccountProvider, { children: /* @__PURE__ */ jsx(ServiceMappingContent, {}) }) });
47
70
  };
48
71
 
49
72
  export { ServiceMappingComponent };
@@ -1 +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;;;;"}
1
+ {"version":3,"file":"ServiceMappingComponent.esm.js","sources":["../../../src/components/PagerDutyPage/ServiceMappingComponent.tsx"],"sourcesContent":["import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport MappingsTable from './MappingsTable/MappingsTable';\nimport { Card, CardBody, Select, Flex, Text } from '@backstage/ui';\nimport { AccountProvider, useAccountContext } from './AccountContext';\nimport { makeStyles } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n accountCard: {\n marginBottom: '16px',\n width: 'fit-content',\n borderRadius: '8px',\n },\n accountCardBody: {\n padding: '16px 20px !important',\n },\n accountLabel: {\n fontSize: '15px',\n fontWeight: 600,\n color: theme.palette.text.primary,\n marginBottom: '8px',\n },\n requiredIndicator: {\n display: 'inline-block',\n color: '#dc3545',\n fontWeight: 700,\n marginLeft: '2px',\n },\n accountSelect: {\n minWidth: '200px',\n },\n mainCard: {\n borderRadius: '8px',\n },\n helpText: {\n fontSize: '13px',\n color: theme.palette.text.secondary,\n fontStyle: 'italic',\n marginTop: '6px',\n },\n}));\n\nconst ServiceMappingContent = () => {\n const { selectedAccount, setSelectedAccount, accounts } = useAccountContext();\n const classes = useStyles();\n\n return (\n <>\n {accounts.length > 0 && (\n <Card className={classes.accountCard}>\n <CardBody className={classes.accountCardBody}>\n <Flex direction=\"column\" gap=\"2\">\n <Text className={classes.accountLabel}>\n Please Select an Account:\n <div className={classes.requiredIndicator}>*</div>\n </Text>\n <Select\n selectionMode=\"single\"\n size=\"small\"\n value={selectedAccount}\n onChange={value => setSelectedAccount(value?.toString() || '')}\n placeholder=\"Select account\"\n options={accounts}\n className={classes.accountSelect}\n />\n </Flex>\n </CardBody>\n </Card>\n )}\n <Card className={classes.mainCard}>\n <CardBody>\n <MappingsTable key={selectedAccount} />\n </CardBody>\n </Card>\n </>\n );\n};\n\nexport const ServiceMappingComponent = () => {\n const queryClient = new QueryClient();\n\n return (\n <QueryClientProvider client={queryClient}>\n <AccountProvider>\n <ServiceMappingContent />\n </AccountProvider>\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useState, useEffect } from 'react';
3
- import { makeStyles, Typography, createStyles } from '@material-ui/core';
4
- import { Grid, Card, RadioGroup, Radio } from '@backstage/ui';
3
+ import { makeStyles, CardContent, Typography, createStyles } from '@material-ui/core';
4
+ import { Card, Flex, Text, RadioGroup, Radio } from '@backstage/ui';
5
5
  import { Page, Header, Content, TabbedLayout } from '@backstage/core-components';
6
6
  import { ServiceMappingComponent } from './ServiceMappingComponent.esm.js';
7
7
  import { useApi } from '@backstage/core-plugin-api';
@@ -10,7 +10,7 @@ import { NotFoundError } from '@backstage/errors';
10
10
 
11
11
  const SERVICE_DEPENDENCY_SYNC_STRATEGY = "settings::service-dependency-sync-strategy";
12
12
  const useStyles = makeStyles(
13
- () => createStyles({
13
+ (theme) => createStyles({
14
14
  cardStyles: {
15
15
  padding: "15px",
16
16
  marginTop: "16px"
@@ -20,11 +20,26 @@ const useStyles = makeStyles(
20
20
  },
21
21
  linkStyles: {
22
22
  color: "cadetblue"
23
+ },
24
+ descriptionCard: {
25
+ marginBottom: "24px",
26
+ borderRadius: "8px"
27
+ },
28
+ descriptionText: {
29
+ fontSize: "16px",
30
+ color: theme.palette.text.primary,
31
+ lineHeight: 1.5,
32
+ marginBottom: "4px"
33
+ },
34
+ warningText: {
35
+ fontSize: "16px",
36
+ color: theme.palette.text.primary,
37
+ lineHeight: 1.5
23
38
  }
24
39
  })
25
40
  );
26
41
  const PagerDutyPage = () => {
27
- const { cardStyles, textContainerStyles, linkStyles } = useStyles();
42
+ const { cardStyles, textContainerStyles, linkStyles, descriptionCard, descriptionText, warningText } = useStyles();
28
43
  const pagerDutyApi = useApi(pagerDutyApiRef);
29
44
  const [
30
45
  selectedServiceDependencyStrategy,
@@ -56,15 +71,15 @@ const PagerDutyPage = () => {
56
71
  return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
57
72
  /* @__PURE__ */ jsx(Header, { title: "PagerDuty", subtitle: "Advanced configurations" }),
58
73
  /* @__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."
74
+ /* @__PURE__ */ jsx(TabbedLayout.Route, { path: "/service-mapping", title: "Service Mapping", children: /* @__PURE__ */ jsxs(Fragment, { children: [
75
+ /* @__PURE__ */ jsx(Card, { className: descriptionCard, children: /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", children: [
76
+ /* @__PURE__ */ jsx(Text, { className: descriptionText, children: "Easily map your existing PagerDuty services to entities in Backstage without the need to add anotations to all your projects." }),
77
+ /* @__PURE__ */ jsxs(Text, { className: warningText, children: [
78
+ /* @__PURE__ */ jsx("strong", { children: "Warning:" }),
79
+ " Only 1:1 mapping is allowed at this time."
65
80
  ] })
66
- ] }),
67
- /* @__PURE__ */ jsx(Grid.Item, { children: /* @__PURE__ */ jsx(ServiceMappingComponent, {}) })
81
+ ] }) }) }),
82
+ /* @__PURE__ */ jsx(ServiceMappingComponent, {})
68
83
  ] }) }),
69
84
  /* @__PURE__ */ jsx(TabbedLayout.Route, { path: "/settings", title: "Configuration", children: /* @__PURE__ */ jsxs(Fragment, { children: [
70
85
  /* @__PURE__ */ jsx(Typography, { variant: "h4", children: "Plugin configuration" }),
@@ -1 +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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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../../../src/components/PagerDutyPage/index.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n CardContent,\n createStyles,\n makeStyles,\n Typography,\n} from '@material-ui/core';\nimport { Card, RadioGroup, Radio, Flex, Text } 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>(theme =>\n createStyles({\n cardStyles: {\n padding: '15px',\n marginTop: '16px',\n },\n textContainerStyles: {\n marginTop: '16px',\n },\n linkStyles: {\n color: 'cadetblue',\n },\n descriptionCard: {\n marginBottom: '24px',\n borderRadius: '8px',\n },\n descriptionText: {\n fontSize: '16px',\n color: theme.palette.text.primary,\n lineHeight: 1.5,\n marginBottom: '4px',\n },\n warningText: {\n fontSize: '16px',\n color: theme.palette.text.primary,\n lineHeight: 1.5,\n },\n }),\n);\n\n/** @public */\nexport const PagerDutyPage = () => {\n const { cardStyles, textContainerStyles, linkStyles, descriptionCard, descriptionText, warningText } = 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 <>\n <Card className={descriptionCard}>\n <CardContent>\n <Flex direction=\"column\">\n <Text className={descriptionText}>\n Easily map your existing PagerDuty services to entities in\n Backstage without the need to add anotations to all your\n projects.\n </Text>\n <Text className={warningText}>\n <strong>Warning:</strong> Only 1:1 mapping is allowed at this time.\n </Text>\n </Flex>\n </CardContent>\n </Card>\n\n <ServiceMappingComponent />\n </>\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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"}
@@ -1,7 +1,7 @@
1
1
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
2
2
  import { useState, useCallback } from 'react';
3
3
  import { makeStyles, Button } from '@material-ui/core';
4
- import { usePagerdutyEntity } from '../../hooks/index.esm.js';
4
+ import { usePagerdutyEntity } from '../../hooks/usePagerDutyEntity.esm.js';
5
5
  import { TriggerDialog } from '../TriggerDialog/TriggerDialog.esm.js';
6
6
 
7
7
  const useStyles = makeStyles((theme) => ({
@@ -1 +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;;;;"}
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/usePagerDutyEntity';\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;;;;"}
@@ -0,0 +1,13 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ function useDebounce(value, delay = 500) {
4
+ const [debounced, setDebounced] = useState(value);
5
+ useEffect(() => {
6
+ const handler = setTimeout(() => setDebounced(value), delay);
7
+ return () => clearTimeout(handler);
8
+ }, [value, delay]);
9
+ return debounced;
10
+ }
11
+
12
+ export { useDebounce as default };
13
+ //# sourceMappingURL=useDebounce.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebounce.esm.js","sources":["../../src/hooks/useDebounce.ts"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nexport default function useDebounce<T>(value: T, delay: number = 500) {\n const [debounced, setDebounced] = useState(value);\n useEffect(() => {\n const handler = setTimeout(() => setDebounced(value), delay);\n return () => clearTimeout(handler);\n }, [value, delay]);\n return debounced;\n}\n"],"names":[],"mappings":";;AAEA,SAAwB,WAAA,CAAe,KAAA,EAAU,KAAA,GAAgB,GAAA,EAAK;AACpE,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAA,CAAW,MAAM,YAAA,CAAa,KAAK,GAAG,KAAK,CAAA;AAC3D,IAAA,OAAO,MAAM,aAAa,OAAO,CAAA;AAAA,EACnC,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AACjB,EAAA,OAAO,SAAA;AACT;;;;"}
@@ -7,4 +7,4 @@ function usePagerdutyEntity() {
7
7
  }
8
8
 
9
9
  export { usePagerdutyEntity };
10
- //# sourceMappingURL=index.esm.js.map
10
+ //# sourceMappingURL=usePagerDutyEntity.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePagerDutyEntity.esm.js","sources":["../../src/hooks/usePagerDutyEntity.ts"],"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\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { PagerDutyEntity } from '../types';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\n\nexport function usePagerdutyEntity(): PagerDutyEntity {\n const { entity } = useEntity();\n\n return getPagerDutyEntity(entity);\n}\n"],"names":[],"mappings":";;;AAoBO,SAAS,kBAAA,GAAsC;AACpD,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAE7B,EAAA,OAAO,mBAAmB,MAAM,CAAA;AAClC;;;;"}