@pagerduty/backstage-plugin 0.15.6 → 0.15.7
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/config.d.ts +1 -1
- package/dist/api/client.esm.js.map +1 -1
- package/dist/components/ChangeEvents/ChangeEventListItem.esm.js.map +1 -1
- package/dist/components/Escalation/EscalationUser.esm.js.map +1 -1
- package/dist/components/Incident/IncidentListItem.esm.js.map +1 -1
- package/dist/components/PagerDutyCardCommon/ServiceStandardsCard.esm.js.map +1 -1
- package/dist/components/PagerDutyPage/MappingTable.esm.js.map +1 -1
- package/dist/components/PagerDutyPage/ServiceMappingComponent.esm.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +3 -3
package/config.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.esm.js","sources":["../../src/api/client.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 {\n PagerDutyApi,\n PagerDutyTriggerAlarmRequest,\n PagerDutyClientApiDependencies,\n PagerDutyClientApiConfig,\n RequestOptions,\n} from './types';\nimport { PagerDutyChangeEventsResponse, \n PagerDutyOnCallUsersResponse, \n PagerDutyUser, \n PagerDutyServiceResponse,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyEntityMappingsResponse,\n PagerDutySetting\n} from 'common';\nimport { createApiRef, ConfigApi } from '@backstage/core-plugin-api';\nimport { NotFoundError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\nimport { PagerDutyEntity } from '../types';\n\n/** @public */\nexport class UnauthorizedError extends Error {}\n\n/** @public */\nexport class ForbiddenError extends Error { }\n\n/** @public */\nexport const pagerDutyApiRef = createApiRef<PagerDutyApi>({\n id: 'plugin.pagerduty.api',\n});\n\n/** @public */\nexport class PagerDutyClient implements PagerDutyApi {\n static fromConfig(\n configApi: ConfigApi,\n dependencies: PagerDutyClientApiDependencies,\n ) {\n const { discoveryApi, fetchApi } = dependencies;\n\n const eventsBaseUrl: string =\n configApi.getOptionalString('pagerDuty.eventsBaseUrl') ??\n 'https://events.pagerduty.com/v2';\n\n return new PagerDutyClient({\n eventsBaseUrl,\n discoveryApi,\n fetchApi,\n });\n }\n\n constructor(private readonly config: PagerDutyClientApiConfig) {}\n\n async getServiceByPagerDutyEntity(\n pagerDutyEntity: PagerDutyEntity,\n ): Promise<PagerDutyServiceResponse> {\n const { integrationKey, serviceId, account } = pagerDutyEntity;\n\n let response: PagerDutyServiceResponse;\n let url: string;\n\n if (integrationKey) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services?integration_key=${integrationKey}`;\n\n if(account) {\n url = `${url}&account=${account}`;\n }\n const serviceResponse = await this.findByUrl<PagerDutyServiceResponse>(url);\n\n if (serviceResponse.service === undefined) throw new NotFoundError();\n\n response = serviceResponse;\n } else if (serviceId) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n if (account) {\n url = `${url}?account=${account}`;\n }\n\n response = await this.findByUrl<PagerDutyServiceResponse>(url);\n } else {\n throw new NotFoundError();\n }\n\n return response;\n }\n\n async getSetting(id: string): Promise<PagerDutySetting> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/settings/${id}`;\n\n return await this.findByUrl<PagerDutySetting>(url);\n }\n\n async storeSettings(settings: PagerDutySetting[]): Promise<Response> {\n const body = JSON.stringify(settings);\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/settings`;\n\n return this.request(url, options);\n }\n\n async getEntityMappings(): Promise<PagerDutyEntityMappingsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return await this.findByUrl<PagerDutyEntityMappingsResponse>(url);\n }\n\n async storeServiceMapping(serviceId: string, integrationKey: string, backstageEntityRef: string, account: string): Promise<Response> {\n\n const body = JSON.stringify({\n entityRef: backstageEntityRef,\n serviceId: serviceId,\n integrationKey: integrationKey,\n account: account,\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return this.request(url, options);\n }\n\n async getServiceByEntity(entity: Entity): Promise<PagerDutyServiceResponse> {\n return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));\n }\n\n async getServiceById(serviceId: string, account?: string): Promise<PagerDutyServiceResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceResponse>(url);\n }\n\n async getIncidentsByServiceId(\n serviceId: string,\n account?: string,\n ): Promise<PagerDutyIncidentsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/incidents`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyIncidentsResponse>(url);\n }\n\n async getChangeEventsByServiceId(\n serviceId: string,\n account?: string,\n ): Promise<PagerDutyChangeEventsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/change-events`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyChangeEventsResponse>(url);\n }\n\n async getServiceStandardsByServiceId(\n serviceId: string,\n account?: string\n ): Promise<PagerDutyServiceStandardsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/standards`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceStandardsResponse>(url);\n }\n\n async getServiceMetricsByServiceId(\n serviceId: string,\n account?: string\n ): Promise<PagerDutyServiceMetricsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/metrics`;\n\n if (account){\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceMetricsResponse>(url);\n }\n\n async getOnCallByPolicyId(\n policyId: string,\n account?: string,\n ): Promise<PagerDutyUser[]> {\n const params = `escalation_policy_ids[]=${policyId}`;\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/oncall-users?${params}`;\n\n if (account) {\n url = url.concat(`&account=${account}`);\n }\n\n const response: PagerDutyOnCallUsersResponse = await this.findByUrl<PagerDutyOnCallUsersResponse>(url);\n return response.users;\n }\n\n triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise<Response> {\n const { integrationKey, source, description, userName } = request;\n\n const body = JSON.stringify({\n event_action: 'trigger',\n routing_key: integrationKey,\n client: 'Backstage',\n client_url: source,\n payload: {\n summary: description,\n source: source,\n severity: 'error',\n class: 'manual trigger',\n custom_details: {\n user: userName,\n },\n },\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = this.config.eventsBaseUrl ?? 'https://events.pagerduty.com/v2';\n\n return this.request(`${url}/enqueue`, options);\n }\n\n private async findByUrl<T>(url: string): Promise<T> {\n const options = {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const response = await this.request(url, options);\n return response.json();\n }\n\n private async request(\n url: string,\n options: RequestOptions,\n ): Promise<Response> {\n const response = await this.config.fetchApi.fetch(url, options);\n if (response.status === 401) {\n throw new UnauthorizedError(\"Unauthorized: You don't have access to this resource\");\n }\n\n if (response.status === 403) {\n throw new ForbiddenError(\"Forbidden: You are not allowed to perform this action\");\n }\n\n if (response.status === 404) {\n throw new NotFoundError(\"Not Found: Resource not found\");\n }\n\n if (!response.ok) {\n const payload = await response.json();\n const errors = payload.errors.map((error: string) => error).join(' ');\n const message = `Request failed with ${response.status}, ${errors}`;\n throw new Error(message);\n }\n return response;\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.esm.js","sources":["../../src/api/client.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 {\n PagerDutyApi,\n PagerDutyTriggerAlarmRequest,\n PagerDutyClientApiDependencies,\n PagerDutyClientApiConfig,\n RequestOptions,\n} from './types';\nimport { PagerDutyChangeEventsResponse, \n PagerDutyOnCallUsersResponse, \n PagerDutyUser, \n PagerDutyServiceResponse,\n PagerDutyIncidentsResponse,\n PagerDutyServiceStandardsResponse,\n PagerDutyServiceMetricsResponse,\n PagerDutyEntityMappingsResponse,\n PagerDutySetting\n} from '@pagerduty/backstage-plugin-common';\nimport { createApiRef, ConfigApi } from '@backstage/core-plugin-api';\nimport { NotFoundError } from '@backstage/errors';\nimport { Entity } from '@backstage/catalog-model';\nimport { getPagerDutyEntity } from '../components/pagerDutyEntity';\nimport { PagerDutyEntity } from '../types';\n\n/** @public */\nexport class UnauthorizedError extends Error {}\n\n/** @public */\nexport class ForbiddenError extends Error { }\n\n/** @public */\nexport const pagerDutyApiRef = createApiRef<PagerDutyApi>({\n id: 'plugin.pagerduty.api',\n});\n\n/** @public */\nexport class PagerDutyClient implements PagerDutyApi {\n static fromConfig(\n configApi: ConfigApi,\n dependencies: PagerDutyClientApiDependencies,\n ) {\n const { discoveryApi, fetchApi } = dependencies;\n\n const eventsBaseUrl: string =\n configApi.getOptionalString('pagerDuty.eventsBaseUrl') ??\n 'https://events.pagerduty.com/v2';\n\n return new PagerDutyClient({\n eventsBaseUrl,\n discoveryApi,\n fetchApi,\n });\n }\n\n constructor(private readonly config: PagerDutyClientApiConfig) {}\n\n async getServiceByPagerDutyEntity(\n pagerDutyEntity: PagerDutyEntity,\n ): Promise<PagerDutyServiceResponse> {\n const { integrationKey, serviceId, account } = pagerDutyEntity;\n\n let response: PagerDutyServiceResponse;\n let url: string;\n\n if (integrationKey) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services?integration_key=${integrationKey}`;\n\n if(account) {\n url = `${url}&account=${account}`;\n }\n const serviceResponse = await this.findByUrl<PagerDutyServiceResponse>(url);\n\n if (serviceResponse.service === undefined) throw new NotFoundError();\n\n response = serviceResponse;\n } else if (serviceId) {\n url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n if (account) {\n url = `${url}?account=${account}`;\n }\n\n response = await this.findByUrl<PagerDutyServiceResponse>(url);\n } else {\n throw new NotFoundError();\n }\n\n return response;\n }\n\n async getSetting(id: string): Promise<PagerDutySetting> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/settings/${id}`;\n\n return await this.findByUrl<PagerDutySetting>(url);\n }\n\n async storeSettings(settings: PagerDutySetting[]): Promise<Response> {\n const body = JSON.stringify(settings);\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/settings`;\n\n return this.request(url, options);\n }\n\n async getEntityMappings(): Promise<PagerDutyEntityMappingsResponse> {\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return await this.findByUrl<PagerDutyEntityMappingsResponse>(url);\n }\n\n async storeServiceMapping(serviceId: string, integrationKey: string, backstageEntityRef: string, account: string): Promise<Response> {\n\n const body = JSON.stringify({\n entityRef: backstageEntityRef,\n serviceId: serviceId,\n integrationKey: integrationKey,\n account: account,\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/mapping/entity`;\n\n return this.request(url, options);\n }\n\n async getServiceByEntity(entity: Entity): Promise<PagerDutyServiceResponse> {\n return await this.getServiceByPagerDutyEntity(getPagerDutyEntity(entity));\n }\n\n async getServiceById(serviceId: string, account?: string): Promise<PagerDutyServiceResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceResponse>(url);\n }\n\n async getIncidentsByServiceId(\n serviceId: string,\n account?: string,\n ): Promise<PagerDutyIncidentsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/incidents`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyIncidentsResponse>(url);\n }\n\n async getChangeEventsByServiceId(\n serviceId: string,\n account?: string,\n ): Promise<PagerDutyChangeEventsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/change-events`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyChangeEventsResponse>(url);\n }\n\n async getServiceStandardsByServiceId(\n serviceId: string,\n account?: string\n ): Promise<PagerDutyServiceStandardsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/standards`;\n\n if(account) {\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceStandardsResponse>(url);\n }\n\n async getServiceMetricsByServiceId(\n serviceId: string,\n account?: string\n ): Promise<PagerDutyServiceMetricsResponse> {\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/services/${serviceId}/metrics`;\n\n if (account){\n url = url.concat(`?account=${account}`);\n }\n\n return await this.findByUrl<PagerDutyServiceMetricsResponse>(url);\n }\n\n async getOnCallByPolicyId(\n policyId: string,\n account?: string,\n ): Promise<PagerDutyUser[]> {\n const params = `escalation_policy_ids[]=${policyId}`;\n let url = `${await this.config.discoveryApi.getBaseUrl(\n 'pagerduty',\n )}/oncall-users?${params}`;\n\n if (account) {\n url = url.concat(`&account=${account}`);\n }\n\n const response: PagerDutyOnCallUsersResponse = await this.findByUrl<PagerDutyOnCallUsersResponse>(url);\n return response.users;\n }\n\n triggerAlarm(request: PagerDutyTriggerAlarmRequest): Promise<Response> {\n const { integrationKey, source, description, userName } = request;\n\n const body = JSON.stringify({\n event_action: 'trigger',\n routing_key: integrationKey,\n client: 'Backstage',\n client_url: source,\n payload: {\n summary: description,\n source: source,\n severity: 'error',\n class: 'manual trigger',\n custom_details: {\n user: userName,\n },\n },\n });\n\n const options = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json; charset=UTF-8',\n Accept: 'application/json, text/plain, */*',\n },\n body,\n };\n\n const url = this.config.eventsBaseUrl ?? 'https://events.pagerduty.com/v2';\n\n return this.request(`${url}/enqueue`, options);\n }\n\n private async findByUrl<T>(url: string): Promise<T> {\n const options = {\n method: 'GET',\n headers: {\n Accept: 'application/vnd.pagerduty+json;version=2',\n 'Content-Type': 'application/json',\n },\n };\n const response = await this.request(url, options);\n return response.json();\n }\n\n private async request(\n url: string,\n options: RequestOptions,\n ): Promise<Response> {\n const response = await this.config.fetchApi.fetch(url, options);\n if (response.status === 401) {\n throw new UnauthorizedError(\"Unauthorized: You don't have access to this resource\");\n }\n\n if (response.status === 403) {\n throw new ForbiddenError(\"Forbidden: You are not allowed to perform this action\");\n }\n\n if (response.status === 404) {\n throw new NotFoundError(\"Not Found: Resource not found\");\n }\n\n if (!response.ok) {\n const payload = await response.json();\n const errors = payload.errors.map((error: string) => error).join(' ');\n const message = `Request failed with ${response.status}, ${errors}`;\n throw new Error(message);\n }\n return response;\n }\n}\n"],"names":[],"mappings":";;;;AAwCO,MAAM,0BAA0B,KAAA,CAAM;AAAC;AAGvC,MAAM,uBAAuB,KAAA,CAAM;AAAE;AAGrC,MAAM,kBAAkB,YAAA,CAA2B;AAAA,EACxD,EAAA,EAAI;AACN,CAAC;AAGM,MAAM,eAAA,CAAwC;AAAA,EAkBnD,YAA6B,MAAA,EAAkC;AAAlC,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAmC;AAAA,EAjBhE,OAAO,UAAA,CACL,SAAA,EACA,YAAA,EACA;AACA,IAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,YAAA;AAEnC,IAAA,MAAM,aAAA,GACJ,SAAA,CAAU,iBAAA,CAAkB,yBAAyB,CAAA,IACrD,iCAAA;AAEF,IAAA,OAAO,IAAI,eAAA,CAAgB;AAAA,MACzB,aAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAAA,EAIA,MAAM,4BACJ,eAAA,EACmC;AACnC,IAAA,MAAM,EAAE,cAAA,EAAgB,SAAA,EAAW,OAAA,EAAQ,GAAI,eAAA;AAE/C,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,UAAA;AAAA,QACtC;AAAA,OACD,6BAA6B,cAAc,CAAA,CAAA;AAE5C,MAAA,IAAG,OAAA,EAAS;AACV,QAAA,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AAAA,MACjC;AACA,MAAA,MAAM,eAAA,GAAkB,MAAM,IAAA,CAAK,SAAA,CAAoC,GAAG,CAAA;AAE1E,MAAA,IAAI,eAAA,CAAgB,OAAA,KAAY,MAAA,EAAW,MAAM,IAAI,aAAA,EAAc;AAEnE,MAAA,QAAA,GAAW,eAAA;AAAA,IACb,WAAW,SAAA,EAAW;AACpB,MAAA,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,MAAA,CAAO,YAAA,CAAa,UAAA;AAAA,QACtC;AAAA,OACD,aAAa,SAAS,CAAA,CAAA;AAEvB,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,SAAA,EAAY,OAAO,CAAA,CAAA;AAAA,MACjC;AAEA,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAoC,GAAG,CAAA;AAAA,IAC/D,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,aAAA,EAAc;AAAA,IAC1B;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,WAAW,EAAA,EAAuC;AACtD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC5C;AAAA,KACD,aAAa,EAAE,CAAA,CAAA;AAEhB,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAA4B,GAAG,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,cAAc,QAAA,EAAiD;AACnE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAEpC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,iCAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC5C;AAAA,KACD,CAAA,SAAA,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,iBAAA,GAA8D;AAClE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC5C;AAAA,KACD,CAAA,eAAA,CAAA;AAED,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAA2C,GAAG,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,mBAAA,CAAoB,SAAA,EAAmB,cAAA,EAAwB,oBAA4B,OAAA,EAAoC;AAEnI,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,SAAA,EAAW,kBAAA;AAAA,MACX,SAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,iCAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC5C;AAAA,KACD,CAAA,eAAA,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,OAAO,CAAA;AAAA,EAClC;AAAA,EAEA,MAAM,mBAAmB,MAAA,EAAmD;AAC1E,IAAA,OAAO,MAAM,IAAA,CAAK,2BAAA,CAA4B,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAAA,EAC1E;AAAA,EAEA,MAAM,cAAA,CAAe,SAAA,EAAmB,OAAA,EAAqD;AAC3F,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,aAAa,SAAS,CAAA,CAAA;AAEvB,IAAA,IAAG,OAAA,EAAS;AACV,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAoC,GAAG,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,uBAAA,CACJ,SAAA,EACA,OAAA,EACqC;AACrC,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,aAAa,SAAS,CAAA,UAAA,CAAA;AAEvB,IAAA,IAAG,OAAA,EAAS;AACV,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAsC,GAAG,CAAA;AAAA,EAC7D;AAAA,EAEA,MAAM,0BAAA,CACJ,SAAA,EACA,OAAA,EACwC;AACxC,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,aAAa,SAAS,CAAA,cAAA,CAAA;AAEvB,IAAA,IAAG,OAAA,EAAS;AACV,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAyC,GAAG,CAAA;AAAA,EAChE;AAAA,EAEA,MAAM,8BAAA,CACJ,SAAA,EACA,OAAA,EAC4C;AAC5C,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,aAAa,SAAS,CAAA,UAAA,CAAA;AAEvB,IAAA,IAAG,OAAA,EAAS;AACV,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAA6C,GAAG,CAAA;AAAA,EACpE;AAAA,EAEA,MAAM,4BAAA,CACJ,SAAA,EACA,OAAA,EAC0C;AAC1C,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,aAAa,SAAS,CAAA,QAAA,CAAA;AAEvB,IAAA,IAAI,OAAA,EAAQ;AACV,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAA2C,GAAG,CAAA;AAAA,EAClE;AAAA,EAEA,MAAM,mBAAA,CACJ,QAAA,EACA,OAAA,EAC0B;AAC1B,IAAA,MAAM,MAAA,GAAS,2BAA2B,QAAQ,CAAA,CAAA;AAClD,IAAA,IAAI,GAAA,GAAM,CAAA,EAAG,MAAM,IAAA,CAAK,OAAO,YAAA,CAAa,UAAA;AAAA,MAC1C;AAAA,KACD,iBAAiB,MAAM,CAAA,CAAA;AAExB,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,GAAA,GAAM,GAAA,CAAI,MAAA,CAAO,CAAA,SAAA,EAAY,OAAO,CAAA,CAAE,CAAA;AAAA,IACxC;AAEA,IAAA,MAAM,QAAA,GAAyC,MAAM,IAAA,CAAK,SAAA,CAAwC,GAAG,CAAA;AACrG,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAAA,EAEA,aAAa,OAAA,EAA0D;AACrE,IAAA,MAAM,EAAE,cAAA,EAAgB,MAAA,EAAQ,WAAA,EAAa,UAAS,GAAI,OAAA;AAE1D,IAAA,MAAM,IAAA,GAAO,KAAK,SAAA,CAAU;AAAA,MAC1B,YAAA,EAAc,SAAA;AAAA,MACd,WAAA,EAAa,cAAA;AAAA,MACb,MAAA,EAAQ,WAAA;AAAA,MACR,UAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,WAAA;AAAA,QACT,MAAA;AAAA,QACA,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,gBAAA;AAAA,QACP,cAAA,EAAgB;AAAA,UACd,IAAA,EAAM;AAAA;AACR;AACF,KACD,CAAA;AAED,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,iCAAA;AAAA,QAChB,MAAA,EAAQ;AAAA,OACV;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,MAAA,CAAO,aAAA,IAAiB,iCAAA;AAEzC,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,GAAG,YAAY,OAAO,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAc,UAAa,GAAA,EAAyB;AAClD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,KAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,0CAAA;AAAA,QACR,cAAA,EAAgB;AAAA;AAClB,KACF;AACA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAK,OAAO,CAAA;AAChD,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAc,OAAA,CACZ,GAAA,EACA,OAAA,EACmB;AACnB,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,QAAA,CAAS,KAAA,CAAM,KAAK,OAAO,CAAA;AAC9D,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,kBAAkB,sDAAsD,CAAA;AAAA,IACpF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,eAAe,uDAAuD,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,MAAA,MAAM,IAAI,cAAc,+BAA+B,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAK;AACpC,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAkB,KAAK,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACpE,MAAA,MAAM,OAAA,GAAU,CAAA,oBAAA,EAAuB,QAAA,CAAS,MAAM,KAAK,MAAM,CAAA,CAAA;AACjE,MAAA,MAAM,IAAI,MAAM,OAAO,CAAA;AAAA,IACzB;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChangeEventListItem.esm.js","sources":["../../../src/components/ChangeEvents/ChangeEventListItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { Link } from '@backstage/core-components';\nimport {\n ListItem,\n ListItemSecondaryAction,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n} from '@material-ui/core';\nimport { DateTime, Duration } from 'luxon';\nimport { PagerDutyChangeEvent } from 'common';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport LinkIcon from '@material-ui/icons/Link';\nimport { BackstageTheme } from '@backstage/theme';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n denseListIcon: {\n marginRight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n smallExternalLinkIconStyle: {\n color: theme.palette.text.primary,\n },\n smallExternalLinkWithoutMarginIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n}));\n\ntype Props = {\n changeEvent: PagerDutyChangeEvent;\n};\n\nexport const ChangeEventListItem = ({ changeEvent }: Props) => {\n const classes = useStyles();\n const duration =\n new Date().getTime() - new Date(changeEvent.timestamp).getTime();\n const changedAt = DateTime.local()\n .minus(Duration.fromMillis(duration))\n .toRelative({ locale: 'en' });\n \n let externalLinkElem: JSX.Element | undefined;\n if (changeEvent.links.length > 0) {\n const text: string = changeEvent.links[0].text;\n externalLinkElem = (\n <Tooltip title={text} placement=\"top\">\n <IconButton\n component={Link}\n to={changeEvent.links[0].href}\n className={\n changeEvent.html_url === undefined\n ? classes.smallExternalLinkWithoutMarginIconStyle\n : classes.smallExternalLinkIconStyle\n }\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n );\n }\n\n return (\n <ListItem dense key={changeEvent.id}>\n <ListItemText\n primary={<>{changeEvent.summary}</>}\n primaryTypographyProps={{\n variant: 'body1',\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography variant=\"body2\" color=\"textSecondary\">\n Triggered from {changeEvent.source} {changedAt}.\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n {externalLinkElem}\n {changeEvent.html_url === undefined ? null : (\n <Tooltip title=\"View in PagerDuty\" placement=\"top\">\n <IconButton\n component={Link}\n to={changeEvent.html_url}\n className={classes.smallIconStyle}\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n )}\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChangeEventListItem.esm.js","sources":["../../../src/components/ChangeEvents/ChangeEventListItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { Link } from '@backstage/core-components';\nimport {\n ListItem,\n ListItemSecondaryAction,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n} from '@material-ui/core';\nimport { DateTime, Duration } from 'luxon';\nimport { PagerDutyChangeEvent } from '@pagerduty/backstage-plugin-common';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport LinkIcon from '@material-ui/icons/Link';\nimport { BackstageTheme } from '@backstage/theme';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n denseListIcon: {\n marginRight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n smallExternalLinkIconStyle: {\n color: theme.palette.text.primary,\n },\n smallExternalLinkWithoutMarginIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n}));\n\ntype Props = {\n changeEvent: PagerDutyChangeEvent;\n};\n\nexport const ChangeEventListItem = ({ changeEvent }: Props) => {\n const classes = useStyles();\n const duration =\n new Date().getTime() - new Date(changeEvent.timestamp).getTime();\n const changedAt = DateTime.local()\n .minus(Duration.fromMillis(duration))\n .toRelative({ locale: 'en' });\n \n let externalLinkElem: JSX.Element | undefined;\n if (changeEvent.links.length > 0) {\n const text: string = changeEvent.links[0].text;\n externalLinkElem = (\n <Tooltip title={text} placement=\"top\">\n <IconButton\n component={Link}\n to={changeEvent.links[0].href}\n className={\n changeEvent.html_url === undefined\n ? classes.smallExternalLinkWithoutMarginIconStyle\n : classes.smallExternalLinkIconStyle\n }\n >\n <LinkIcon />\n </IconButton>\n </Tooltip>\n );\n }\n\n return (\n <ListItem dense key={changeEvent.id}>\n <ListItemText\n primary={<>{changeEvent.summary}</>}\n primaryTypographyProps={{\n variant: 'body1',\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography variant=\"body2\" color=\"textSecondary\">\n Triggered from {changeEvent.source} {changedAt}.\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n {externalLinkElem}\n {changeEvent.html_url === undefined ? null : (\n <Tooltip title=\"View in PagerDuty\" placement=\"top\">\n <IconButton\n component={Link}\n to={changeEvent.html_url}\n className={classes.smallIconStyle}\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n )}\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EscalationUser.esm.js","sources":["../../../src/components/Escalation/EscalationUser.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport {\n ListItem,\n ListItemIcon,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport { PagerDutyUser } from 'common';\nimport NotificationsIcon from \"@material-ui/icons/Notifications\";\nimport { BackstageTheme } from '@backstage/theme';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n listItemSecondary: {\n fontWeight: \"normal\",\n textDecoration: \"underline\",\n marginTop: \"-5px\",\n },\n buttonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n userTextButtonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n marginBottom: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n containerStyle: {\n display: \"flex\",\n alignItems: \"center\",\n fontWeight: \"bold\",\n },\n iconStyle: {\n fontSize: \"25px\",\n marginLeft: \"-4px\",\n color: theme.palette.text.primary,\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n },\n avatarStyle: {\n marginTop: \"-20px\",\n },\n}));\n\ntype Props = {\n user: PagerDutyUser;\n policyUrl: string;\n policyName: string;\n};\n\nfunction navigateToUrl(url: string) {\n // open url in new browser window\n window.open(url, \"_blank\");\n}\n\nexport const EscalationUser = ({ user, policyUrl, policyName }: Props) => {\n const classes = useStyles();\n\n return (\n <ListItem>\n <ListItemIcon>\n <Avatar\n alt={user.name}\n src={user.avatar_url}\n className={classes.avatarStyle}\n />\n </ListItemIcon>\n <ListItemText\n primary={\n <>\n <Tooltip title=\"Open user in PagerDuty\" placement=\"top\">\n <IconButton\n aria-label=\"open-user-in-browser\"\n onClick={() => navigateToUrl(user.html_url)}\n className={classes.userTextButtonStyle}\n >\n <span className={classes.containerStyle}>{user.name}</span>\n </IconButton>\n </Tooltip>\n\n <Typography\n className={classes.listItemSecondary}\n color=\"textSecondary\"\n >\n {user.email}\n </Typography>\n </>\n }\n secondary={\n <IconButton\n aria-label=\"open-escalation-policy-in-browser\"\n onClick={() => navigateToUrl(policyUrl)}\n className={classes.buttonStyle}\n >\n <span className={classes.containerStyle}>\n <NotificationsIcon className={classes.iconStyle} />\n {policyName}\n </span>\n </IconButton>\n }\n />\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EscalationUser.esm.js","sources":["../../../src/components/Escalation/EscalationUser.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport {\n ListItem,\n ListItemIcon,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n} from '@material-ui/core';\nimport Avatar from '@material-ui/core/Avatar';\nimport { PagerDutyUser } from '@pagerduty/backstage-plugin-common';\nimport NotificationsIcon from \"@material-ui/icons/Notifications\";\nimport { BackstageTheme } from '@backstage/theme';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n listItemSecondary: {\n fontWeight: \"normal\",\n textDecoration: \"underline\",\n marginTop: \"-5px\",\n },\n buttonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n userTextButtonStyle: {\n marginLeft: \"-11px\",\n marginTop: \"-10px\",\n marginBottom: \"-10px\",\n fontSize: \"15px\",\n color: theme.palette.text.primary,\n \"&:hover\": {\n backgroundColor: \"transparent\",\n textDecoration: \"underline\",\n },\n },\n containerStyle: {\n display: \"flex\",\n alignItems: \"center\",\n fontWeight: \"bold\",\n },\n iconStyle: {\n fontSize: \"25px\",\n marginLeft: \"-4px\",\n color: theme.palette.text.primary,\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n },\n avatarStyle: {\n marginTop: \"-20px\",\n },\n}));\n\ntype Props = {\n user: PagerDutyUser;\n policyUrl: string;\n policyName: string;\n};\n\nfunction navigateToUrl(url: string) {\n // open url in new browser window\n window.open(url, \"_blank\");\n}\n\nexport const EscalationUser = ({ user, policyUrl, policyName }: Props) => {\n const classes = useStyles();\n\n return (\n <ListItem>\n <ListItemIcon>\n <Avatar\n alt={user.name}\n src={user.avatar_url}\n className={classes.avatarStyle}\n />\n </ListItemIcon>\n <ListItemText\n primary={\n <>\n <Tooltip title=\"Open user in PagerDuty\" placement=\"top\">\n <IconButton\n aria-label=\"open-user-in-browser\"\n onClick={() => navigateToUrl(user.html_url)}\n className={classes.userTextButtonStyle}\n >\n <span className={classes.containerStyle}>{user.name}</span>\n </IconButton>\n </Tooltip>\n\n <Typography\n className={classes.listItemSecondary}\n color=\"textSecondary\"\n >\n {user.email}\n </Typography>\n </>\n }\n secondary={\n <IconButton\n aria-label=\"open-escalation-policy-in-browser\"\n onClick={() => navigateToUrl(policyUrl)}\n className={classes.buttonStyle}\n >\n <span className={classes.containerStyle}>\n <NotificationsIcon className={classes.iconStyle} />\n {policyName}\n </span>\n </IconButton>\n }\n />\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IncidentListItem.esm.js","sources":["../../../src/components/Incident/IncidentListItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport {\n ListItem,\n ListItemSecondaryAction,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n Chip,\n} from '@material-ui/core';\nimport { DateTime, Duration } from 'luxon';\nimport { PagerDutyIncident } from 'common';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n denseListIcon: {\n marginRight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n warning: {\n borderColor: theme.palette.warning.main,\n color: \"#fff\",\n backgroundColor: theme.palette.warning.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n error: {\n borderColor: theme.palette.error.main,\n color: \"#fff\",\n backgroundColor: theme.palette.error.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n lowUrgency: {\n borderColor: theme.palette.warning.main,\n color: theme.palette.warning.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.warning.main,\n },\n },\n highUrgency: {\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.error.main,\n },\n },\n textContainer: {\n display: \"flex\",\n alignItems: \"baseline\",\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n}));\n\ntype Props = {\n incident: PagerDutyIncident;\n};\n\nexport const IncidentListItem = ({ incident }: Props) => {\n const classes = useStyles();\n const duration =\n new Date().getTime() - new Date(incident.created_at).getTime();\n const createdAt = DateTime.local()\n .minus(Duration.fromMillis(duration))\n .toRelative({ locale: 'en' });\n const user = incident.assignments[0]?.assignee;\n\n return (\n <ListItem dense key={incident.id}>\n <ListItemText\n primary={\n <div className={classes.textContainer}>\n <Chip\n data-testid={`chip-${incident.status}`}\n label={incident.status}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.status === \"triggered\"\n ? classes.error\n : classes.warning\n }\n />\n <Chip\n data-testid={`chip-${incident.urgency}`}\n label={`${incident.urgency} urgency`}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.urgency === \"high\"\n ? classes.highUrgency\n : classes.lowUrgency\n }\n />\n {incident.title}\n </div>\n }\n primaryTypographyProps={{\n variant: \"body1\",\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography noWrap variant=\"body2\" color=\"textSecondary\">\n Created {createdAt} and assigned to{\" \"}\n <Link to={user?.html_url ?? \"#\"}>{user?.summary ?? \"nobody\"}</Link>\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n <Tooltip title=\"View in PagerDuty\" placement=\"top\">\n <IconButton\n href={incident.html_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes.smallIconStyle}\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IncidentListItem.esm.js","sources":["../../../src/components/Incident/IncidentListItem.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport {\n ListItem,\n ListItemSecondaryAction,\n Tooltip,\n ListItemText,\n makeStyles,\n IconButton,\n Typography,\n Chip,\n} from '@material-ui/core';\nimport { DateTime, Duration } from 'luxon';\nimport { PagerDutyIncident } from '@pagerduty/backstage-plugin-common';\nimport OpenInBrowserIcon from '@material-ui/icons/OpenInBrowser';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles<BackstageTheme>((theme) => ({\n denseListIcon: {\n marginRight: 0,\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n listItemPrimary: {\n fontWeight: \"bold\",\n },\n warning: {\n borderColor: theme.palette.warning.main,\n color: \"#fff\",\n backgroundColor: theme.palette.warning.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n error: {\n borderColor: theme.palette.error.main,\n color: \"#fff\",\n backgroundColor: theme.palette.error.main,\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: \"#fff\",\n },\n },\n lowUrgency: {\n borderColor: theme.palette.warning.main,\n color: theme.palette.warning.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.warning.main,\n },\n },\n highUrgency: {\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n backgroundColor: \"#fff\",\n boxShadow: \"0 4px 4px 0 rgba(0,0,0,0.2)\",\n textTransform: \"uppercase\",\n \"& *\": {\n color: theme.palette.error.main,\n },\n },\n textContainer: {\n display: \"flex\",\n alignItems: \"baseline\",\n },\n smallIconStyle: {\n color: theme.palette.text.primary,\n marginRight: \"-20px\",\n },\n}));\n\ntype Props = {\n incident: PagerDutyIncident;\n};\n\nexport const IncidentListItem = ({ incident }: Props) => {\n const classes = useStyles();\n const duration =\n new Date().getTime() - new Date(incident.created_at).getTime();\n const createdAt = DateTime.local()\n .minus(Duration.fromMillis(duration))\n .toRelative({ locale: 'en' });\n const user = incident.assignments[0]?.assignee;\n\n return (\n <ListItem dense key={incident.id}>\n <ListItemText\n primary={\n <div className={classes.textContainer}>\n <Chip\n data-testid={`chip-${incident.status}`}\n label={incident.status}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.status === \"triggered\"\n ? classes.error\n : classes.warning\n }\n />\n <Chip\n data-testid={`chip-${incident.urgency}`}\n label={`${incident.urgency} urgency`}\n size=\"small\"\n variant=\"outlined\"\n className={\n incident.urgency === \"high\"\n ? classes.highUrgency\n : classes.lowUrgency\n }\n />\n {incident.title}\n </div>\n }\n primaryTypographyProps={{\n variant: \"body1\",\n className: classes.listItemPrimary,\n }}\n secondary={\n <Typography noWrap variant=\"body2\" color=\"textSecondary\">\n Created {createdAt} and assigned to{\" \"}\n <Link to={user?.html_url ?? \"#\"}>{user?.summary ?? \"nobody\"}</Link>\n </Typography>\n }\n />\n <ListItemSecondaryAction>\n <Tooltip title=\"View in PagerDuty\" placement=\"top\">\n <IconButton\n href={incident.html_url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={classes.smallIconStyle}\n >\n <OpenInBrowserIcon />\n </IconButton>\n </Tooltip>\n </ListItemSecondaryAction>\n </ListItem>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceStandardsCard.esm.js","sources":["../../../src/components/PagerDutyCardCommon/ServiceStandardsCard.tsx"],"sourcesContent":["import { BackstageTheme } from \"@backstage/theme\";\nimport {\n Card,\n IconButton,\n LinearProgress,\n Theme,\n Tooltip,\n Typography,\n makeStyles,\n withStyles,\n} from \"@material-ui/core\";\nimport InfoIcon from \"@material-ui/icons/Info\";\nimport { PagerDutyServiceStandard } from \"common\";\nimport CheckCircle from \"@material-ui/icons/CheckCircle\";\nimport RadioButtonUncheckedIcon from \"@material-ui/icons/RadioButtonUnchecked\";\n\ntype Props = {\n total: number | undefined;\n completed: number | undefined;\n standards: PagerDutyServiceStandard[] | undefined;\n compact?: boolean;\n};\n\nfunction colorFromPercentage(theme: Theme, percentage: number) {\n if (percentage < 0.5) {\n return theme.palette.error.main;\n } else if (percentage < 0.8) {\n return theme.palette.warning.main;\n }\n return theme.palette.success.main;\n}\n\nfunction ServiceStandardsCard({ total, completed, standards, compact }: Props) {\n const useStyles = makeStyles<BackstageTheme>((theme) => ({\n cardStyle: {\n height: compact !== true ? \"120px\" : \"80px\",\n display: \"grid\",\n gridTemplateRows: \"1fr auto auto\",\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\n },\n containerStyle: {\n display: \"flex\",\n justifyContent: \"center\",\n marginTop: compact !== true ? \"-100px\" : \"-50px\",\n },\n largeTextStyle: {\n fontSize: compact !== true ? \"50px\" : \"40px\",\n color:\n completed !== undefined && total !== undefined\n ? colorFromPercentage(theme, completed / total)\n : colorFromPercentage(theme, 0),\n alignSelf: \"center\",\n justifyContent: \"center\",\n },\n smallTextStyle: {\n color: theme.palette.textSubtle,\n fontSize: compact !== true ? \"14px\" : \"12px\",\n fontWeight: \"bold\",\n alignSelf: \"center\",\n justifyContent: \"center\",\n marginLeft: \"-2px\",\n marginTop: compact !== true ? \"25px\" : \"20px\",\n },\n tooltipContainer: {},\n tooltipIcon: {\n marginRight: \"5px\",\n },\n standardItem: {\n display: \"flex\",\n alignItems: \"center\",\n },\n }));\n\n const BorderLinearProgress = withStyles((theme) => ({\n root: {\n height: 10,\n borderRadius: 5,\n margin: 5,\n },\n colorPrimary: {\n backgroundColor:\n theme.palette.grey[theme.palette.type === \"light\" ? 200 : 700],\n },\n bar: {\n borderRadius: 5,\n backgroundColor:\n completed !== undefined && total !== undefined\n ? colorFromPercentage(theme, completed / total)\n : colorFromPercentage(theme, 0),\n },\n }))(LinearProgress);\n\n const {\n cardStyle,\n containerStyle,\n largeTextStyle,\n smallTextStyle,\n tooltipContainer,\n tooltipIcon,\n standardItem,\n } = useStyles();\n\n if (standards === undefined || completed === undefined || total === undefined) {\n return (\n <Card className={cardStyle}>\n <div className={containerStyle}>\n <Typography className={smallTextStyle}>\n Unable to retrieve Scores\n </Typography>\n </div>\n </Card>\n );\n }\n \n return (\n <Card className={cardStyle}>\n {completed !== undefined && total !== undefined ? (\n <>\n <div className={tooltipContainer}>\n <IconButton>\n <Tooltip\n interactive\n title={\n <>\n {standards?.map((standard, key) => (\n <p key={key}>\n {standard.pass ? (\n <span className={standardItem}>\n <CheckCircle className={tooltipIcon} />{\" \"}\n {standard.name}\n </span>\n ) : (\n <span className={standardItem}>\n <RadioButtonUncheckedIcon className={tooltipIcon} />{\" \"}\n {standard.name}\n </span>\n )}\n </p>\n ))}\n </>\n }\n >\n <InfoIcon />\n </Tooltip>\n </IconButton>\n </div>\n <div className={containerStyle}>\n <Typography className={largeTextStyle}>{completed}</Typography>\n <Typography className={smallTextStyle}>/{total}</Typography>\n </div>\n <div>\n <BorderLinearProgress\n variant=\"determinate\"\n value={(completed! / total!) * 100}\n />\n </div>\n </>\n ) : (\n <div className={containerStyle}>\n <Typography className={smallTextStyle}>\n Unable to retrieve Scores\n </Typography>\n </div>\n )}\n </Card>\n );\n}\n\nexport default ServiceStandardsCard;\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ServiceStandardsCard.esm.js","sources":["../../../src/components/PagerDutyCardCommon/ServiceStandardsCard.tsx"],"sourcesContent":["import { BackstageTheme } from \"@backstage/theme\";\nimport {\n Card,\n IconButton,\n LinearProgress,\n Theme,\n Tooltip,\n Typography,\n makeStyles,\n withStyles,\n} from \"@material-ui/core\";\nimport InfoIcon from \"@material-ui/icons/Info\";\nimport { PagerDutyServiceStandard } from \"@pagerduty/backstage-plugin-common\";\nimport CheckCircle from \"@material-ui/icons/CheckCircle\";\nimport RadioButtonUncheckedIcon from \"@material-ui/icons/RadioButtonUnchecked\";\n\ntype Props = {\n total: number | undefined;\n completed: number | undefined;\n standards: PagerDutyServiceStandard[] | undefined;\n compact?: boolean;\n};\n\nfunction colorFromPercentage(theme: Theme, percentage: number) {\n if (percentage < 0.5) {\n return theme.palette.error.main;\n } else if (percentage < 0.8) {\n return theme.palette.warning.main;\n }\n return theme.palette.success.main;\n}\n\nfunction ServiceStandardsCard({ total, completed, standards, compact }: Props) {\n const useStyles = makeStyles<BackstageTheme>((theme) => ({\n cardStyle: {\n height: compact !== true ? \"120px\" : \"80px\",\n display: \"grid\",\n gridTemplateRows: \"1fr auto auto\",\n backgroundColor: \"rgba(0, 0, 0, 0.03)\",\n },\n containerStyle: {\n display: \"flex\",\n justifyContent: \"center\",\n marginTop: compact !== true ? \"-100px\" : \"-50px\",\n },\n largeTextStyle: {\n fontSize: compact !== true ? \"50px\" : \"40px\",\n color:\n completed !== undefined && total !== undefined\n ? colorFromPercentage(theme, completed / total)\n : colorFromPercentage(theme, 0),\n alignSelf: \"center\",\n justifyContent: \"center\",\n },\n smallTextStyle: {\n color: theme.palette.textSubtle,\n fontSize: compact !== true ? \"14px\" : \"12px\",\n fontWeight: \"bold\",\n alignSelf: \"center\",\n justifyContent: \"center\",\n marginLeft: \"-2px\",\n marginTop: compact !== true ? \"25px\" : \"20px\",\n },\n tooltipContainer: {},\n tooltipIcon: {\n marginRight: \"5px\",\n },\n standardItem: {\n display: \"flex\",\n alignItems: \"center\",\n },\n }));\n\n const BorderLinearProgress = withStyles((theme) => ({\n root: {\n height: 10,\n borderRadius: 5,\n margin: 5,\n },\n colorPrimary: {\n backgroundColor:\n theme.palette.grey[theme.palette.type === \"light\" ? 200 : 700],\n },\n bar: {\n borderRadius: 5,\n backgroundColor:\n completed !== undefined && total !== undefined\n ? colorFromPercentage(theme, completed / total)\n : colorFromPercentage(theme, 0),\n },\n }))(LinearProgress);\n\n const {\n cardStyle,\n containerStyle,\n largeTextStyle,\n smallTextStyle,\n tooltipContainer,\n tooltipIcon,\n standardItem,\n } = useStyles();\n\n if (standards === undefined || completed === undefined || total === undefined) {\n return (\n <Card className={cardStyle}>\n <div className={containerStyle}>\n <Typography className={smallTextStyle}>\n Unable to retrieve Scores\n </Typography>\n </div>\n </Card>\n );\n }\n \n return (\n <Card className={cardStyle}>\n {completed !== undefined && total !== undefined ? (\n <>\n <div className={tooltipContainer}>\n <IconButton>\n <Tooltip\n interactive\n title={\n <>\n {standards?.map((standard, key) => (\n <p key={key}>\n {standard.pass ? (\n <span className={standardItem}>\n <CheckCircle className={tooltipIcon} />{\" \"}\n {standard.name}\n </span>\n ) : (\n <span className={standardItem}>\n <RadioButtonUncheckedIcon className={tooltipIcon} />{\" \"}\n {standard.name}\n </span>\n )}\n </p>\n ))}\n </>\n }\n >\n <InfoIcon />\n </Tooltip>\n </IconButton>\n </div>\n <div className={containerStyle}>\n <Typography className={largeTextStyle}>{completed}</Typography>\n <Typography className={smallTextStyle}>/{total}</Typography>\n </div>\n <div>\n <BorderLinearProgress\n variant=\"determinate\"\n value={(completed! / total!) * 100}\n />\n </div>\n </>\n ) : (\n <div className={containerStyle}>\n <Typography className={smallTextStyle}>\n Unable to retrieve Scores\n </Typography>\n </div>\n )}\n </Card>\n );\n}\n\nexport default ServiceStandardsCard;\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MappingTable.esm.js","sources":["../../../src/components/PagerDutyPage/MappingTable.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { PagerDutyEntityMapping } from \"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 IconButton,\n Tooltip,\n Typography,\n} from \"@material-ui/core\";\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 <Box sx={{ display: \"flex\" }}>\n <Tooltip title=\"Edit\">\n <IconButton\n onClick={() => {\n getEntityOptions();\n table.setEditingRow(row);\n }}\n >\n <Edit />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Open in PagerDuty\">\n <IconButton\n onClick={() => openInBrowser(row.getValue(\"serviceUrl\"))}\n >\n <OpenInBrowser />\n </IconButton>\n </Tooltip>\n </Box>\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":"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"}
|
|
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 IconButton,\n Tooltip,\n Typography,\n} from \"@material-ui/core\";\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 <Box sx={{ display: \"flex\" }}>\n <Tooltip title=\"Edit\">\n <IconButton\n onClick={() => {\n getEntityOptions();\n table.setEditingRow(row);\n }}\n >\n <Edit />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Open in PagerDuty\">\n <IconButton\n onClick={() => openInBrowser(row.getValue(\"serviceUrl\"))}\n >\n <OpenInBrowser />\n </IconButton>\n </Tooltip>\n </Box>\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":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceMappingComponent.esm.js","sources":["../../../src/components/PagerDutyPage/ServiceMappingComponent.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { PagerDutyEntityMapping } from \"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,CAAC,MAAA,KAAW;AAChD,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,CAAC,MAAA,KAAW;AAChB,QAAA,MAAM,WAA8B,EAAC;AACrC,QAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC/B,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 { 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,CAAC,MAAA,KAAW;AAChD,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,CAAC,MAAA,KAAW;AAChB,QAAA,MAAM,WAA8B,EAAC;AACrC,QAAA,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,MAAA,KAAW;AAC/B,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;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
4
4
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
5
5
|
import { DiscoveryApi, FetchApi, ConfigApi } from '@backstage/core-plugin-api';
|
|
6
6
|
import { ReactNode } from 'react';
|
|
7
|
-
import { PagerDutySetting, PagerDutyEntityMappingsResponse, PagerDutyServiceResponse, PagerDutyIncidentsResponse, PagerDutyChangeEventsResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyUser } from 'common';
|
|
7
|
+
import { PagerDutySetting, PagerDutyEntityMappingsResponse, PagerDutyServiceResponse, PagerDutyIncidentsResponse, PagerDutyChangeEventsResponse, PagerDutyServiceStandardsResponse, PagerDutyServiceMetricsResponse, PagerDutyUser } from '@pagerduty/backstage-plugin-common';
|
|
8
8
|
|
|
9
9
|
/** @public */
|
|
10
10
|
declare const isPluginApplicableToEntity$1: (entity: Entity) => boolean;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagerduty/backstage-plugin",
|
|
3
3
|
"description": "A Backstage plugin that integrates towards PagerDuty",
|
|
4
|
-
"version": "0.15.
|
|
4
|
+
"version": "0.15.7",
|
|
5
5
|
"main": "dist/index.cjs.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "Apache-2.0",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"pluginId": "pagerduty",
|
|
16
16
|
"pluginPackages": [
|
|
17
17
|
"@pagerduty/backstage-plugin",
|
|
18
|
-
"common",
|
|
18
|
+
"@pagerduty/backstage-plugin-common",
|
|
19
19
|
"@pagerduty/backstage-plugin-backend"
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"@mui/icons-material": "^5.15.19",
|
|
57
57
|
"@mui/material": "^5.15.19",
|
|
58
58
|
"@mui/x-date-pickers": "^7.6.1",
|
|
59
|
+
"@pagerduty/backstage-plugin-common": "workspace:~",
|
|
59
60
|
"@tanstack/react-query": "^5.40.1",
|
|
60
61
|
"classnames": "^2.2.6",
|
|
61
|
-
"common": "workspace:^",
|
|
62
62
|
"luxon": "^3.4.1",
|
|
63
63
|
"material-react-table": "^2.13.0",
|
|
64
64
|
"react-use": "^17.2.4",
|