@backstage-community/plugin-ilert 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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @backstage-community/plugin-ilert
2
2
 
3
+ ## 0.19.0
4
+
5
+ ### Minor Changes
6
+
7
+ - cb0c039: Backstage version bump to v1.49.2
8
+
3
9
  ## 0.18.0
4
10
 
5
11
  ### Minor Changes
@@ -1,8 +1,8 @@
1
- import { createApiRef } from '@backstage/core-plugin-api';
1
+ import { createApiRef } from '@backstage/frontend-plugin-api';
2
2
  import { AuthenticationError, ResponseError } from '@backstage/errors';
3
3
  import { DateTime } from 'luxon';
4
4
 
5
- const ilertApiRef = createApiRef({
5
+ const ilertApiRef = createApiRef().with({
6
6
  id: "plugin.ilert.service"
7
7
  });
8
8
  const DEFAULT_PROXY_PATH = "/ilert";
@@ -1 +1 @@
1
- {"version":3,"file":"client.esm.js","sources":["../../src/api/client.ts"],"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\nimport {\n ConfigApi,\n createApiRef,\n DiscoveryApi,\n FetchApi,\n} from '@backstage/core-plugin-api';\nimport { AuthenticationError, ResponseError } from '@backstage/errors';\nimport { DateTime as dt } from 'luxon';\nimport {\n Alert,\n AlertAction,\n AlertResponder,\n AlertSource,\n EscalationPolicy,\n OnCall,\n Schedule,\n Service,\n StatusPage,\n User,\n} from '../types';\nimport {\n EventRequest,\n GetAlertsCountOpts,\n GetAlertsOpts,\n GetServicesOpts,\n GetStatusPagesOpts,\n ILertApi,\n} from './types';\n\n/** @public */\nexport const ilertApiRef = createApiRef<ILertApi>({\n id: 'plugin.ilert.service',\n});\n\nconst DEFAULT_PROXY_PATH = '/ilert';\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n};\n\n/** @public */\nexport class ILertClient implements ILertApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private readonly proxyPath: string;\n private readonly baseUrl: string;\n\n static fromConfig(\n configApi: ConfigApi,\n discoveryApi: DiscoveryApi,\n fetchApi: FetchApi,\n ) {\n const baseUrl: string =\n configApi.getOptionalString('ilert.baseUrl') ?? 'https://app.ilert.com';\n\n return new ILertClient({\n discoveryApi,\n fetchApi,\n baseUrl,\n proxyPath:\n configApi.getOptionalString('ilert.proxyPath') ?? DEFAULT_PROXY_PATH,\n });\n }\n\n constructor(opts: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n\n /**\n * URL used by users to access iLert web UI.\n * Example: https://my-org.ilert.com/\n */\n baseUrl: string;\n\n /**\n * Path to use for requests via the proxy, defaults to /ilert/api\n */\n proxyPath: string;\n }) {\n this.discoveryApi = opts.discoveryApi;\n this.fetchApi = opts.fetchApi;\n this.baseUrl = opts.baseUrl;\n this.proxyPath = opts.proxyPath;\n }\n\n private async fetch<T = any>(input: string, init?: RequestInit): Promise<T> {\n const apiUrl = await this.apiUrl();\n\n const response = await this.fetchApi.fetch(`${apiUrl}${input}`, init);\n if (response.status === 401) {\n throw new AuthenticationError(\n 'This request requires HTTP authentication.',\n );\n }\n if (!response.ok || response.status >= 400) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async fetchAlerts(opts?: GetAlertsOpts): Promise<Alert[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n if (opts?.alertSources !== undefined && Array.isArray(opts.alertSources)) {\n opts.alertSources.forEach((a: number) => {\n if (a) {\n query.append('alert-source', String(a));\n }\n });\n }\n\n if (opts?.states !== undefined && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(`/api/alerts?${query.toString()}`, init);\n return response;\n }\n\n async fetchAlertsCount(opts?: GetAlertsCountOpts): Promise<number> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts && opts.states && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(\n `/api/alerts/count?${query.toString()}`,\n init,\n );\n\n return response && response.count ? response.count : 0;\n }\n\n async fetchAlert(id: number): Promise<Alert> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(id)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertResponders(alert: Alert): Promise<AlertResponder[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/responders`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertActions(alert: Alert): Promise<AlertAction[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n\n return response;\n }\n\n async acceptAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'ACCEPT',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async resolveAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'RESOLVE',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async assignAlert(alert: Alert, responder: AlertResponder): Promise<Alert> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n };\n\n const query = new URLSearchParams();\n switch (responder.group) {\n case 'ESCALATION_POLICY':\n query.append('policy-id', String(responder.id));\n break;\n case 'ON_CALL_SCHEDULE':\n query.append('schedule-id', String(responder.id));\n break;\n default:\n query.append('user-id', String(responder.id));\n break;\n }\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/assign?${query.toString()}`,\n init,\n );\n\n return response;\n }\n\n async triggerAlertAction(alert: Alert, action: AlertAction): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n webhookId: action.webhookId,\n extensionId: action.extensionId,\n type: action.type,\n name: action.name,\n }),\n };\n\n await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n }\n\n async createAlert(eventRequest: EventRequest): Promise<boolean> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: eventRequest.integrationKey,\n summary: eventRequest.summary,\n details: eventRequest.details,\n eventType: 'ALERT',\n links: [\n {\n href: eventRequest.source,\n text: 'Backstage Url',\n },\n ],\n customDetails: {\n userName: eventRequest.userName,\n },\n }),\n };\n\n const response = await this.fetch('/api/events', init);\n return response;\n }\n\n async fetchAlertSources(): Promise<AlertSource[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/alert-sources', init);\n\n return response;\n }\n\n async fetchAlertSource(\n idOrIntegrationKey: number | string,\n ): Promise<AlertSource> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(idOrIntegrationKey)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertSourceOnCalls(alertSource: AlertSource): Promise<OnCall[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/on-calls?policies=${encodeURIComponent(\n alertSource.escalationPolicy.id,\n )}&expand=user&expand=escalationPolicy&timezone=${dt.local().zoneName}`,\n init,\n );\n\n return response;\n }\n\n async enableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: true }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async disableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: false }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async addImmediateMaintenance(\n alertSourceId: number,\n minutes: number,\n ): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n start: dt.utc().toISO(),\n end: dt.utc().plus({ minutes }).toISO(),\n description: `Immediate maintenance window for ${minutes} minutes. Backstage — iLert plugin.`,\n createdBy: 'Backstage',\n timezone: dt.local().zoneName,\n alertSources: [{ id: alertSourceId }],\n }),\n };\n\n const response = await this.fetch('/api/maintenance-windows', init);\n\n return response;\n }\n\n async fetchOnCallSchedules(): Promise<Schedule[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n '/api/schedules?include=currentShift&include=nextShift',\n init,\n );\n\n return response;\n }\n\n async fetchUsers(): Promise<User[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/users', init);\n\n return response;\n }\n\n async overrideShift(\n scheduleId: number,\n userId: number,\n start: string,\n end: string,\n ): Promise<Schedule> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ user: { id: userId }, start, end }),\n };\n\n const response = await this.fetch(\n `/api/schedules/${encodeURIComponent(scheduleId)}/overrides`,\n init,\n );\n\n return response;\n }\n\n async fetchServices(opts?: GetServicesOpts): Promise<Service[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'uptime');\n\n const response = await this.fetch(\n `/api/services?${query.toString()}`,\n init,\n );\n return response;\n }\n\n async fetchStatusPages(opts?: GetStatusPagesOpts): Promise<StatusPage[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'subscribed');\n\n const response = await this.fetch(\n `/api/status-pages?${query.toString()}`,\n init,\n );\n return response;\n }\n\n getAlertDetailsURL(alert: Alert): string {\n return `${this.baseUrl}/alert/view.jsf?id=${encodeURIComponent(alert.id)}`;\n }\n\n getAlertSourceDetailsURL(alertSource: AlertSource | null): string {\n if (!alertSource) {\n return '';\n }\n return `${this.baseUrl}/source/view.jsf?id=${encodeURIComponent(\n alertSource.id,\n )}`;\n }\n\n getEscalationPolicyDetailsURL(escalationPolicy: EscalationPolicy): string {\n return `${this.baseUrl}/policy/view.jsf?id=${encodeURIComponent(\n escalationPolicy.id,\n )}`;\n }\n\n getScheduleDetailsURL(schedule: Schedule): string {\n return `${this.baseUrl}/schedule/view.jsf?id=${encodeURIComponent(\n schedule.id,\n )}`;\n }\n\n getServiceDetailsURL(service: Service): string {\n return `${this.baseUrl}/service/view.jsf?id=${encodeURIComponent(\n service.id,\n )}`;\n }\n\n getStatusPageDetailsURL(statusPage: StatusPage): string {\n return `${this.baseUrl}/status-page/view.jsf?id=${encodeURIComponent(\n statusPage.id,\n )}`;\n }\n\n getStatusPageURL(statusPage: StatusPage): string {\n return statusPage.domain ? statusPage.domain : statusPage.subdomain;\n }\n\n getUserPhoneNumber(user: User | null) {\n return user?.mobile?.number || user?.landline?.number || '';\n }\n\n getUserInitials(user: User | null) {\n if (!user) {\n return '';\n }\n if (!user.firstName && !user.lastName) {\n return user.username;\n }\n return `${user.firstName} ${user.lastName}`;\n }\n\n private async apiUrl() {\n const proxyUrl = await this.discoveryApi.getBaseUrl('proxy');\n return proxyUrl + this.proxyPath;\n }\n}\n"],"names":["dt"],"mappings":"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"}
1
+ {"version":3,"file":"client.esm.js","sources":["../../src/api/client.ts"],"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\nimport { ConfigApi, DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';\nimport { createApiRef } from '@backstage/frontend-plugin-api';\nimport { AuthenticationError, ResponseError } from '@backstage/errors';\nimport { DateTime as dt } from 'luxon';\nimport {\n Alert,\n AlertAction,\n AlertResponder,\n AlertSource,\n EscalationPolicy,\n OnCall,\n Schedule,\n Service,\n StatusPage,\n User,\n} from '../types';\nimport {\n EventRequest,\n GetAlertsCountOpts,\n GetAlertsOpts,\n GetServicesOpts,\n GetStatusPagesOpts,\n ILertApi,\n} from './types';\n\n/** @public */\nexport const ilertApiRef = createApiRef<ILertApi>().with({\n id: 'plugin.ilert.service',\n});\n\nconst DEFAULT_PROXY_PATH = '/ilert';\nconst JSON_HEADERS = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n};\n\n/** @public */\nexport class ILertClient implements ILertApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private readonly proxyPath: string;\n private readonly baseUrl: string;\n\n static fromConfig(\n configApi: ConfigApi,\n discoveryApi: DiscoveryApi,\n fetchApi: FetchApi,\n ) {\n const baseUrl: string =\n configApi.getOptionalString('ilert.baseUrl') ?? 'https://app.ilert.com';\n\n return new ILertClient({\n discoveryApi,\n fetchApi,\n baseUrl,\n proxyPath:\n configApi.getOptionalString('ilert.proxyPath') ?? DEFAULT_PROXY_PATH,\n });\n }\n\n constructor(opts: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n\n /**\n * URL used by users to access iLert web UI.\n * Example: https://my-org.ilert.com/\n */\n baseUrl: string;\n\n /**\n * Path to use for requests via the proxy, defaults to /ilert/api\n */\n proxyPath: string;\n }) {\n this.discoveryApi = opts.discoveryApi;\n this.fetchApi = opts.fetchApi;\n this.baseUrl = opts.baseUrl;\n this.proxyPath = opts.proxyPath;\n }\n\n private async fetch<T = any>(input: string, init?: RequestInit): Promise<T> {\n const apiUrl = await this.apiUrl();\n\n const response = await this.fetchApi.fetch(`${apiUrl}${input}`, init);\n if (response.status === 401) {\n throw new AuthenticationError(\n 'This request requires HTTP authentication.',\n );\n }\n if (!response.ok || response.status >= 400) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async fetchAlerts(opts?: GetAlertsOpts): Promise<Alert[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n if (opts?.alertSources !== undefined && Array.isArray(opts.alertSources)) {\n opts.alertSources.forEach((a: number) => {\n if (a) {\n query.append('alert-source', String(a));\n }\n });\n }\n\n if (opts?.states !== undefined && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(`/api/alerts?${query.toString()}`, init);\n return response;\n }\n\n async fetchAlertsCount(opts?: GetAlertsCountOpts): Promise<number> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts && opts.states && Array.isArray(opts.states)) {\n opts.states.forEach(state => {\n query.append('state', state);\n });\n }\n const response = await this.fetch(\n `/api/alerts/count?${query.toString()}`,\n init,\n );\n\n return response && response.count ? response.count : 0;\n }\n\n async fetchAlert(id: number): Promise<Alert> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(id)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertResponders(alert: Alert): Promise<AlertResponder[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/responders`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertActions(alert: Alert): Promise<AlertAction[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n\n return response;\n }\n\n async acceptAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'ACCEPT',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async resolveAlert(alert: Alert, userName: string): Promise<Alert> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: alert.alertSource?.integrationKey || '',\n alertKey: alert.alertKey,\n summary: `from ${userName} via Backstage plugin`,\n eventType: 'RESOLVE',\n }),\n };\n\n await this.fetch('/api/events', init);\n return this.fetchAlert(alert.id);\n }\n\n async assignAlert(alert: Alert, responder: AlertResponder): Promise<Alert> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n };\n\n const query = new URLSearchParams();\n switch (responder.group) {\n case 'ESCALATION_POLICY':\n query.append('policy-id', String(responder.id));\n break;\n case 'ON_CALL_SCHEDULE':\n query.append('schedule-id', String(responder.id));\n break;\n default:\n query.append('user-id', String(responder.id));\n break;\n }\n\n const response = await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/assign?${query.toString()}`,\n init,\n );\n\n return response;\n }\n\n async triggerAlertAction(alert: Alert, action: AlertAction): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n webhookId: action.webhookId,\n extensionId: action.extensionId,\n type: action.type,\n name: action.name,\n }),\n };\n\n await this.fetch(\n `/api/alerts/${encodeURIComponent(alert.id)}/actions`,\n init,\n );\n }\n\n async createAlert(eventRequest: EventRequest): Promise<boolean> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n apiKey: eventRequest.integrationKey,\n summary: eventRequest.summary,\n details: eventRequest.details,\n eventType: 'ALERT',\n links: [\n {\n href: eventRequest.source,\n text: 'Backstage Url',\n },\n ],\n customDetails: {\n userName: eventRequest.userName,\n },\n }),\n };\n\n const response = await this.fetch('/api/events', init);\n return response;\n }\n\n async fetchAlertSources(): Promise<AlertSource[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/alert-sources', init);\n\n return response;\n }\n\n async fetchAlertSource(\n idOrIntegrationKey: number | string,\n ): Promise<AlertSource> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(idOrIntegrationKey)}`,\n init,\n );\n\n return response;\n }\n\n async fetchAlertSourceOnCalls(alertSource: AlertSource): Promise<OnCall[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n `/api/on-calls?policies=${encodeURIComponent(\n alertSource.escalationPolicy.id,\n )}&expand=user&expand=escalationPolicy&timezone=${dt.local().zoneName}`,\n init,\n );\n\n return response;\n }\n\n async enableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: true }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async disableAlertSource(alertSource: AlertSource): Promise<AlertSource> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ ...alertSource, active: false }),\n };\n\n const response = await this.fetch(\n `/api/alert-sources/${encodeURIComponent(alertSource.id)}`,\n init,\n );\n\n return response;\n }\n\n async addImmediateMaintenance(\n alertSourceId: number,\n minutes: number,\n ): Promise<void> {\n const init = {\n method: 'POST',\n headers: JSON_HEADERS,\n body: JSON.stringify({\n start: dt.utc().toISO(),\n end: dt.utc().plus({ minutes }).toISO(),\n description: `Immediate maintenance window for ${minutes} minutes. Backstage — iLert plugin.`,\n createdBy: 'Backstage',\n timezone: dt.local().zoneName,\n alertSources: [{ id: alertSourceId }],\n }),\n };\n\n const response = await this.fetch('/api/maintenance-windows', init);\n\n return response;\n }\n\n async fetchOnCallSchedules(): Promise<Schedule[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch(\n '/api/schedules?include=currentShift&include=nextShift',\n init,\n );\n\n return response;\n }\n\n async fetchUsers(): Promise<User[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n\n const response = await this.fetch('/api/users', init);\n\n return response;\n }\n\n async overrideShift(\n scheduleId: number,\n userId: number,\n start: string,\n end: string,\n ): Promise<Schedule> {\n const init = {\n method: 'PUT',\n headers: JSON_HEADERS,\n body: JSON.stringify({ user: { id: userId }, start, end }),\n };\n\n const response = await this.fetch(\n `/api/schedules/${encodeURIComponent(scheduleId)}/overrides`,\n init,\n );\n\n return response;\n }\n\n async fetchServices(opts?: GetServicesOpts): Promise<Service[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'uptime');\n\n const response = await this.fetch(\n `/api/services?${query.toString()}`,\n init,\n );\n return response;\n }\n\n async fetchStatusPages(opts?: GetStatusPagesOpts): Promise<StatusPage[]> {\n const init = {\n headers: JSON_HEADERS,\n };\n const query = new URLSearchParams();\n if (opts?.maxResults !== undefined) {\n query.append('max-results', String(opts.maxResults));\n }\n if (opts?.startIndex !== undefined) {\n query.append('start-index', String(opts.startIndex));\n }\n\n query.append('include', 'subscribed');\n\n const response = await this.fetch(\n `/api/status-pages?${query.toString()}`,\n init,\n );\n return response;\n }\n\n getAlertDetailsURL(alert: Alert): string {\n return `${this.baseUrl}/alert/view.jsf?id=${encodeURIComponent(alert.id)}`;\n }\n\n getAlertSourceDetailsURL(alertSource: AlertSource | null): string {\n if (!alertSource) {\n return '';\n }\n return `${this.baseUrl}/source/view.jsf?id=${encodeURIComponent(\n alertSource.id,\n )}`;\n }\n\n getEscalationPolicyDetailsURL(escalationPolicy: EscalationPolicy): string {\n return `${this.baseUrl}/policy/view.jsf?id=${encodeURIComponent(\n escalationPolicy.id,\n )}`;\n }\n\n getScheduleDetailsURL(schedule: Schedule): string {\n return `${this.baseUrl}/schedule/view.jsf?id=${encodeURIComponent(\n schedule.id,\n )}`;\n }\n\n getServiceDetailsURL(service: Service): string {\n return `${this.baseUrl}/service/view.jsf?id=${encodeURIComponent(\n service.id,\n )}`;\n }\n\n getStatusPageDetailsURL(statusPage: StatusPage): string {\n return `${this.baseUrl}/status-page/view.jsf?id=${encodeURIComponent(\n statusPage.id,\n )}`;\n }\n\n getStatusPageURL(statusPage: StatusPage): string {\n return statusPage.domain ? statusPage.domain : statusPage.subdomain;\n }\n\n getUserPhoneNumber(user: User | null) {\n return user?.mobile?.number || user?.landline?.number || '';\n }\n\n getUserInitials(user: User | null) {\n if (!user) {\n return '';\n }\n if (!user.firstName && !user.lastName) {\n return user.username;\n }\n return `${user.firstName} ${user.lastName}`;\n }\n\n private async apiUrl() {\n const proxyUrl = await this.discoveryApi.getBaseUrl('proxy');\n return proxyUrl + this.proxyPath;\n }\n}\n"],"names":["dt"],"mappings":"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"}
@@ -10,7 +10,8 @@ import { useAlertActions } from '../../hooks/useAlertActions.esm.js';
10
10
  import { AlertAssignModal } from './AlertAssignModal.esm.js';
11
11
  import { parseEntityRef, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
12
12
  import { Progress, Link } from '@backstage/core-components';
13
- import { useApi, alertApiRef, identityApiRef } from '@backstage/core-plugin-api';
13
+ import { useApi, identityApiRef } from '@backstage/core-plugin-api';
14
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
14
15
 
15
16
  const AlertActionsMenu = ({
16
17
  alert,
@@ -18,7 +19,7 @@ const AlertActionsMenu = ({
18
19
  setIsLoading
19
20
  }) => {
20
21
  const ilertApi = useApi(ilertApiRef);
21
- const alertApi = useApi(alertApiRef);
22
+ const alertApi = useApi(toastApiRef);
22
23
  const identityApi = useApi(identityApiRef);
23
24
  const [anchorEl, setAnchorEl] = useState(null);
24
25
  const callback = onAlertChanged || ((_) => {
@@ -46,12 +47,12 @@ const AlertActionsMenu = ({
46
47
  defaultNamespace: DEFAULT_NAMESPACE
47
48
  });
48
49
  const newAlert = await ilertApi.acceptAlert(alert, userName);
49
- alertApi.post({ message: "Alert accepted." });
50
+ alertApi.post({ title: "Alert accepted." });
50
51
  callback(newAlert);
51
52
  setProcessing(false);
52
53
  } catch (err) {
53
54
  setProcessing(false);
54
- alertApi.post({ message: err, severity: "error" });
55
+ alertApi.post({ title: err, status: "danger" });
55
56
  }
56
57
  };
57
58
  const handleResolve = async () => {
@@ -64,12 +65,12 @@ const AlertActionsMenu = ({
64
65
  defaultNamespace: DEFAULT_NAMESPACE
65
66
  });
66
67
  const newAlert = await ilertApi.resolveAlert(alert, userName);
67
- alertApi.post({ message: "Alert resolved." });
68
+ alertApi.post({ title: "Alert resolved." });
68
69
  callback(newAlert);
69
70
  setProcessing(false);
70
71
  } catch (err) {
71
72
  setProcessing(false);
72
- alertApi.post({ message: err, severity: "error" });
73
+ alertApi.post({ title: err, status: "danger" });
73
74
  }
74
75
  };
75
76
  const handleAssign = () => {
@@ -81,11 +82,11 @@ const AlertActionsMenu = ({
81
82
  handleCloseMenu();
82
83
  setProcessing(true);
83
84
  await ilertApi.triggerAlertAction(alert, action);
84
- alertApi.post({ message: "Alert action triggered." });
85
+ alertApi.post({ title: "Alert action triggered." });
85
86
  setProcessing(false);
86
87
  } catch (err) {
87
88
  setProcessing(false);
88
- alertApi.post({ message: err, severity: "error" });
89
+ alertApi.post({ title: err, status: "danger" });
89
90
  }
90
91
  };
91
92
  const actions = alertActions.map((a) => {
@@ -1 +1 @@
1
- {"version":3,"file":"AlertActionsMenu.esm.js","sources":["../../../src/components/Alert/AlertActionsMenu.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 */\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { ilertApiRef } from '../../api';\nimport { useAlertActions } from '../../hooks/useAlertActions';\nimport { Alert, AlertAction } from '../../types';\nimport { AlertAssignModal } from './AlertAssignModal';\n\nimport { DEFAULT_NAMESPACE, parseEntityRef } from '@backstage/catalog-model';\nimport { Link, Progress } from '@backstage/core-components';\nimport {\n alertApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\n\nexport const AlertActionsMenu = ({\n alert,\n onAlertChanged,\n setIsLoading,\n}: {\n alert: Alert;\n onAlertChanged?: (alert: Alert) => void;\n setIsLoading?: (isLoading: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const callback = onAlertChanged || ((_: Alert): void => {});\n const setProcessing = setIsLoading || ((_: boolean): void => {});\n const [isAssignAlertModalOpened, setIsAssignAlertModalOpened] =\n useState(false);\n\n const [{ alertActions, isLoading }] = useAlertActions(\n alert,\n Boolean(anchorEl),\n );\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleCloseMenu = () => {\n setAnchorEl(null);\n };\n\n const handleAccept = async (): Promise<void> => {\n try {\n handleCloseMenu();\n setProcessing(true);\n\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n const newAlert = await ilertApi.acceptAlert(alert, userName);\n alertApi.post({ message: 'Alert accepted.' });\n\n callback(newAlert);\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ message: err, severity: 'error' });\n }\n };\n\n const handleResolve = async (): Promise<void> => {\n try {\n handleCloseMenu();\n setProcessing(true);\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n const newAlert = await ilertApi.resolveAlert(alert, userName);\n alertApi.post({ message: 'Alert resolved.' });\n\n callback(newAlert);\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ message: err, severity: 'error' });\n }\n };\n\n const handleAssign = () => {\n handleCloseMenu();\n setIsAssignAlertModalOpened(true);\n };\n\n const handleTriggerAction = (action: AlertAction) => async () => {\n try {\n handleCloseMenu();\n setProcessing(true);\n await ilertApi.triggerAlertAction(alert, action);\n alertApi.post({ message: 'Alert action triggered.' });\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ message: err, severity: 'error' });\n }\n };\n\n const actions: ReactNode[] = alertActions.map(a => {\n const successTrigger = a.history\n ? a.history.find(h => h.success)\n : undefined;\n const triggeredBy =\n successTrigger && successTrigger.actor\n ? `${successTrigger.actor.firstName} ${successTrigger.actor.lastName}`\n : '';\n return (\n <MenuItem\n key={a.webhookId}\n onClick={handleTriggerAction(a)}\n disabled={!!successTrigger}\n >\n <Typography variant=\"inherit\" noWrap>\n {triggeredBy ? `${a.name} (by ${triggeredBy})` : a.name}\n </Typography>\n </MenuItem>\n );\n });\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleClick}\n size=\"small\"\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id={`alert-actions-menu-${alert.id}`}\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n PaperProps={{\n style: { maxHeight: 48 * 5.5 },\n }}\n >\n {alert.status === 'PENDING' ? (\n <MenuItem key=\"ack\" onClick={handleAccept}>\n <Typography variant=\"inherit\" noWrap>\n Accept\n </Typography>\n </MenuItem>\n ) : null}\n\n {alert.status !== 'RESOLVED' ? (\n <MenuItem key=\"close\" onClick={handleResolve}>\n <Typography variant=\"inherit\" noWrap>\n Resolve\n </Typography>\n </MenuItem>\n ) : null}\n\n {alert.status !== 'RESOLVED' ? (\n <MenuItem key=\"assign\" onClick={handleAssign}>\n <Typography variant=\"inherit\" noWrap>\n Assign\n </Typography>\n </MenuItem>\n ) : null}\n\n {isLoading ? (\n <MenuItem key=\"loading\">\n <Progress style={{ width: '100%' }} />\n </MenuItem>\n ) : (\n actions\n )}\n\n <MenuItem key=\"details\" onClick={handleCloseMenu}>\n <Typography variant=\"inherit\" noWrap>\n <Link to={ilertApi.getAlertDetailsURL(alert)}>View in iLert</Link>\n </Typography>\n </MenuItem>\n </Menu>\n <AlertAssignModal\n alert={alert}\n setIsModalOpened={setIsAssignAlertModalOpened}\n isModalOpened={isAssignAlertModalOpened}\n onAlertChanged={onAlertChanged}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AlertActionsMenu.esm.js","sources":["../../../src/components/Alert/AlertActionsMenu.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 */\nimport IconButton from '@material-ui/core/IconButton';\nimport Menu from '@material-ui/core/Menu';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport Typography from '@material-ui/core/Typography';\nimport MoreVertIcon from '@material-ui/icons/MoreVert';\nimport type { MouseEvent, ReactNode } from 'react';\nimport { useState } from 'react';\nimport { ilertApiRef } from '../../api';\nimport { useAlertActions } from '../../hooks/useAlertActions';\nimport { Alert, AlertAction } from '../../types';\nimport { AlertAssignModal } from './AlertAssignModal';\n\nimport { DEFAULT_NAMESPACE, parseEntityRef } from '@backstage/catalog-model';\nimport { Link, Progress } from '@backstage/core-components';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\n\nexport const AlertActionsMenu = ({\n alert,\n onAlertChanged,\n setIsLoading,\n}: {\n alert: Alert;\n onAlertChanged?: (alert: Alert) => void;\n setIsLoading?: (isLoading: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const identityApi = useApi(identityApiRef);\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\n const callback = onAlertChanged || ((_: Alert): void => {});\n const setProcessing = setIsLoading || ((_: boolean): void => {});\n const [isAssignAlertModalOpened, setIsAssignAlertModalOpened] =\n useState(false);\n\n const [{ alertActions, isLoading }] = useAlertActions(\n alert,\n Boolean(anchorEl),\n );\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleCloseMenu = () => {\n setAnchorEl(null);\n };\n\n const handleAccept = async (): Promise<void> => {\n try {\n handleCloseMenu();\n setProcessing(true);\n\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n const newAlert = await ilertApi.acceptAlert(alert, userName);\n alertApi.post({ title: 'Alert accepted.' });\n\n callback(newAlert);\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ title: err, status: 'danger' });\n }\n };\n\n const handleResolve = async (): Promise<void> => {\n try {\n handleCloseMenu();\n setProcessing(true);\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n const newAlert = await ilertApi.resolveAlert(alert, userName);\n alertApi.post({ title: 'Alert resolved.' });\n\n callback(newAlert);\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ title: err, status: 'danger' });\n }\n };\n\n const handleAssign = () => {\n handleCloseMenu();\n setIsAssignAlertModalOpened(true);\n };\n\n const handleTriggerAction = (action: AlertAction) => async () => {\n try {\n handleCloseMenu();\n setProcessing(true);\n await ilertApi.triggerAlertAction(alert, action);\n alertApi.post({ title: 'Alert action triggered.' });\n setProcessing(false);\n } catch (err) {\n setProcessing(false);\n alertApi.post({ title: err, status: 'danger' });\n }\n };\n\n const actions: ReactNode[] = alertActions.map(a => {\n const successTrigger = a.history\n ? a.history.find(h => h.success)\n : undefined;\n const triggeredBy =\n successTrigger && successTrigger.actor\n ? `${successTrigger.actor.firstName} ${successTrigger.actor.lastName}`\n : '';\n return (\n <MenuItem\n key={a.webhookId}\n onClick={handleTriggerAction(a)}\n disabled={!!successTrigger}\n >\n <Typography variant=\"inherit\" noWrap>\n {triggeredBy ? `${a.name} (by ${triggeredBy})` : a.name}\n </Typography>\n </MenuItem>\n );\n });\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={handleClick}\n size=\"small\"\n >\n <MoreVertIcon />\n </IconButton>\n <Menu\n id={`alert-actions-menu-${alert.id}`}\n anchorEl={anchorEl}\n keepMounted\n open={Boolean(anchorEl)}\n onClose={handleCloseMenu}\n PaperProps={{\n style: { maxHeight: 48 * 5.5 },\n }}\n >\n {alert.status === 'PENDING' ? (\n <MenuItem key=\"ack\" onClick={handleAccept}>\n <Typography variant=\"inherit\" noWrap>\n Accept\n </Typography>\n </MenuItem>\n ) : null}\n\n {alert.status !== 'RESOLVED' ? (\n <MenuItem key=\"close\" onClick={handleResolve}>\n <Typography variant=\"inherit\" noWrap>\n Resolve\n </Typography>\n </MenuItem>\n ) : null}\n\n {alert.status !== 'RESOLVED' ? (\n <MenuItem key=\"assign\" onClick={handleAssign}>\n <Typography variant=\"inherit\" noWrap>\n Assign\n </Typography>\n </MenuItem>\n ) : null}\n\n {isLoading ? (\n <MenuItem key=\"loading\">\n <Progress style={{ width: '100%' }} />\n </MenuItem>\n ) : (\n actions\n )}\n\n <MenuItem key=\"details\" onClick={handleCloseMenu}>\n <Typography variant=\"inherit\" noWrap>\n <Link to={ilertApi.getAlertDetailsURL(alert)}>View in iLert</Link>\n </Typography>\n </MenuItem>\n </Menu>\n <AlertAssignModal\n alert={alert}\n setIsModalOpened={setIsAssignAlertModalOpened}\n isModalOpened={isAssignAlertModalOpened}\n onAlertChanged={onAlertChanged}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
2
+ import { useApi } from '@backstage/core-plugin-api';
3
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
3
4
  import Typography from '@material-ui/core/Typography';
4
5
  import Button from '@material-ui/core/Button';
5
6
  import Dialog from '@material-ui/core/Dialog';
@@ -51,7 +52,7 @@ const AlertAssignModal = ({
51
52
  const callback = onAlertChanged || ((_) => {
52
53
  });
53
54
  const ilertApi = useApi(ilertApiRef);
54
- const alertApi = useApi(alertApiRef);
55
+ const alertApi = useApi(toastApiRef);
55
56
  const classes = useStyles();
56
57
  const handleClose = () => {
57
58
  setAlertRespondersList([]);
@@ -67,9 +68,9 @@ const AlertAssignModal = ({
67
68
  try {
68
69
  const newAlert = await ilertApi.assignAlert(alert, alertResponder);
69
70
  callback(newAlert);
70
- alertApi.post({ message: "Alert assigned." });
71
+ alertApi.post({ title: "Alert assigned." });
71
72
  } catch (err) {
72
- alertApi.post({ message: err, severity: "error" });
73
+ alertApi.post({ title: err, status: "danger" });
73
74
  }
74
75
  setIsLoading(false);
75
76
  setIsModalOpened(false);
@@ -1 +1 @@
1
- {"version":3,"file":"AlertAssignModal.esm.js","sources":["../../../src/components/Alert/AlertAssignModal.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 */\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\nimport MUIAlert from '@material-ui/lab/Alert';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { ilertApiRef } from '../../api';\nimport { useAssignAlert } from '../../hooks/useAssignAlert';\nimport { Alert } from '../../types';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n}));\n\nexport const AlertAssignModal = ({\n alert,\n isModalOpened,\n setIsModalOpened,\n onAlertChanged,\n}: {\n alert: Alert | null;\n isModalOpened: boolean;\n setIsModalOpened: (open: boolean) => void;\n onAlertChanged?: (alert: Alert) => void;\n}) => {\n const [\n { alertRespondersList, alertResponder, isLoading },\n { setIsLoading, setAlertResponder, setAlertRespondersList },\n ] = useAssignAlert(alert, isModalOpened);\n const callback = onAlertChanged || ((_: Alert): void => {});\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const classes = useStyles();\n\n const handleClose = () => {\n setAlertRespondersList([]);\n setIsModalOpened(false);\n };\n\n const handleAssign = () => {\n if (!alert || !alertResponder) {\n return;\n }\n setIsLoading(true);\n setAlertRespondersList([]);\n setTimeout(async () => {\n try {\n const newAlert = await ilertApi.assignAlert(alert, alertResponder);\n callback(newAlert);\n alertApi.post({ message: 'Alert assigned.' });\n } catch (err) {\n alertApi.post({ message: err, severity: 'error' });\n }\n setIsLoading(false);\n setIsModalOpened(false);\n }, 250);\n };\n\n const canAssign = !!alertResponder;\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"assign-alert-form-title\"\n >\n <DialogTitle id=\"assign-alert-form-title\">\n Select responder to assign\n </DialogTitle>\n <DialogContent>\n <MUIAlert severity=\"info\">\n <Typography variant=\"body1\" gutterBottom align=\"justify\">\n This action will assign the alert to the selected responder.\n </Typography>\n </MUIAlert>\n <Autocomplete\n disabled={isLoading}\n options={alertRespondersList}\n value={alertResponder}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setAlertResponder(newValue);\n }}\n autoHighlight\n groupBy={option => {\n switch (option.group) {\n case 'SUGGESTED':\n return 'Suggested responders';\n case 'USER':\n return 'Users';\n case 'ESCALATION_POLICY':\n return 'Escalation policies';\n case 'ON_CALL_SCHEDULE':\n return 'Schedules';\n default:\n return '';\n }\n }}\n getOptionLabel={a => a.name}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <Typography noWrap>{a.name}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Responder\"\n variant=\"outlined\"\n margin=\"normal\"\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!canAssign}\n onClick={handleAssign}\n color=\"primary\"\n variant=\"contained\"\n >\n Assign\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":["MUIAlert"],"mappings":"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"}
1
+ {"version":3,"file":"AlertAssignModal.esm.js","sources":["../../../src/components/Alert/AlertAssignModal.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 */\nimport { useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\nimport MUIAlert from '@material-ui/lab/Alert';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { ilertApiRef } from '../../api';\nimport { useAssignAlert } from '../../hooks/useAssignAlert';\nimport { Alert } from '../../types';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n}));\n\nexport const AlertAssignModal = ({\n alert,\n isModalOpened,\n setIsModalOpened,\n onAlertChanged,\n}: {\n alert: Alert | null;\n isModalOpened: boolean;\n setIsModalOpened: (open: boolean) => void;\n onAlertChanged?: (alert: Alert) => void;\n}) => {\n const [\n { alertRespondersList, alertResponder, isLoading },\n { setIsLoading, setAlertResponder, setAlertRespondersList },\n ] = useAssignAlert(alert, isModalOpened);\n const callback = onAlertChanged || ((_: Alert): void => {});\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const classes = useStyles();\n\n const handleClose = () => {\n setAlertRespondersList([]);\n setIsModalOpened(false);\n };\n\n const handleAssign = () => {\n if (!alert || !alertResponder) {\n return;\n }\n setIsLoading(true);\n setAlertRespondersList([]);\n setTimeout(async () => {\n try {\n const newAlert = await ilertApi.assignAlert(alert, alertResponder);\n callback(newAlert);\n alertApi.post({ title: 'Alert assigned.' });\n } catch (err) {\n alertApi.post({ title: err, status: 'danger' });\n }\n setIsLoading(false);\n setIsModalOpened(false);\n }, 250);\n };\n\n const canAssign = !!alertResponder;\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"assign-alert-form-title\"\n >\n <DialogTitle id=\"assign-alert-form-title\">\n Select responder to assign\n </DialogTitle>\n <DialogContent>\n <MUIAlert severity=\"info\">\n <Typography variant=\"body1\" gutterBottom align=\"justify\">\n This action will assign the alert to the selected responder.\n </Typography>\n </MUIAlert>\n <Autocomplete\n disabled={isLoading}\n options={alertRespondersList}\n value={alertResponder}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setAlertResponder(newValue);\n }}\n autoHighlight\n groupBy={option => {\n switch (option.group) {\n case 'SUGGESTED':\n return 'Suggested responders';\n case 'USER':\n return 'Users';\n case 'ESCALATION_POLICY':\n return 'Escalation policies';\n case 'ON_CALL_SCHEDULE':\n return 'Schedules';\n default:\n return '';\n }\n }}\n getOptionLabel={a => a.name}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <Typography noWrap>{a.name}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Responder\"\n variant=\"outlined\"\n margin=\"normal\"\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!canAssign}\n onClick={handleAssign}\n color=\"primary\"\n variant=\"contained\"\n >\n Assign\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":["MUIAlert"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { parseEntityRef, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
3
- import { useApi, alertApiRef, identityApiRef } from '@backstage/core-plugin-api';
3
+ import { useApi, identityApiRef } from '@backstage/core-plugin-api';
4
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
4
5
  import Typography from '@material-ui/core/Typography';
5
6
  import Button from '@material-ui/core/Button';
6
7
  import Dialog from '@material-ui/core/Dialog';
@@ -52,7 +53,7 @@ const AlertNewModal = ({
52
53
  { setAlertSource, setSummary, setDetails, setIsLoading }
53
54
  ] = useNewAlert(isModalOpened, initialAlertSource);
54
55
  const ilertApi = useApi(ilertApiRef);
55
- const alertApi = useApi(alertApiRef);
56
+ const alertApi = useApi(toastApiRef);
56
57
  const identityApi = useApi(identityApiRef);
57
58
  const source = window.location.toString();
58
59
  const classes = useStyles();
@@ -85,10 +86,10 @@ const AlertNewModal = ({
85
86
  userName,
86
87
  source
87
88
  });
88
- alertApi.post({ message: "Alert created." });
89
+ alertApi.post({ title: "Alert created." });
89
90
  refetchAlerts();
90
91
  } catch (err) {
91
- alertApi.post({ message: err, severity: "error" });
92
+ alertApi.post({ title: err, status: "danger" });
92
93
  }
93
94
  setIsModalOpened(false);
94
95
  }, 250);
@@ -1 +1 @@
1
- {"version":3,"file":"AlertNewModal.esm.js","sources":["../../../src/components/Alert/AlertNewModal.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 */\nimport { DEFAULT_NAMESPACE, parseEntityRef } from '@backstage/catalog-model';\nimport {\n alertApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport Alert from '@material-ui/lab/Alert';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { ilertApiRef } from '../../api';\nimport { useNewAlert } from '../../hooks/useNewAlert';\nimport { AlertSource } from '../../types';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n}));\n\nexport const AlertNewModal = ({\n isModalOpened,\n setIsModalOpened,\n refetchAlerts,\n initialAlertSource,\n entityName,\n}: {\n isModalOpened: boolean;\n setIsModalOpened: (open: boolean) => void;\n refetchAlerts: () => void;\n initialAlertSource?: AlertSource | null;\n entityName?: string;\n}) => {\n const [\n { alertSources, alertSource, summary, details, isLoading },\n { setAlertSource, setSummary, setDetails, setIsLoading },\n ] = useNewAlert(isModalOpened, initialAlertSource);\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const identityApi = useApi(identityApiRef);\n const source = window.location.toString();\n const classes = useStyles();\n const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n let integrationKey = '';\n if (initialAlertSource && initialAlertSource.integrationKey) {\n integrationKey = initialAlertSource.integrationKey;\n } else if (alertSource && alertSource.integrationKey) {\n integrationKey = alertSource.integrationKey;\n }\n const handleCreate = () => {\n if (!integrationKey) {\n return;\n }\n setIsLoading(true);\n setTimeout(async () => {\n try {\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n await ilertApi.createAlert({\n integrationKey,\n summary,\n details,\n userName,\n source,\n });\n alertApi.post({ message: 'Alert created.' });\n refetchAlerts();\n } catch (err) {\n alertApi.post({ message: err, severity: 'error' });\n }\n setIsModalOpened(false);\n }, 250);\n };\n\n const canCreate = !!integrationKey && !!summary;\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"create-alert-form-title\"\n >\n <DialogTitle id=\"create-alert-form-title\">\n {entityName ? (\n <div>\n This action will trigger an alert for{' '}\n <strong>\"{entityName}\"</strong>.\n </div>\n ) : (\n 'New alert'\n )}\n </DialogTitle>\n <DialogContent>\n <Alert severity=\"info\">\n <Typography variant=\"body1\" gutterBottom align=\"justify\">\n Please describe the problem you want to report. Be as descriptive as\n possible. Your signed in user and a reference to the current page\n will automatically be amended to the alarm so that the receiver can\n reach out to you if necessary.\n </Typography>\n </Alert>\n {!initialAlertSource ? (\n <Autocomplete\n disabled={isLoading}\n options={alertSources}\n value={alertSource}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setAlertSource(newValue);\n }}\n autoHighlight\n getOptionLabel={a => a.name}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <img\n src={prefersDarkMode ? a.lightIconUrl : a.iconUrl}\n alt={a.name}\n className={classes.sourceImage}\n />\n <Typography noWrap>{a.name}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Alert Source\"\n variant=\"outlined\"\n margin=\"normal\"\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n ) : null}\n <TextField\n disabled={isLoading}\n label=\"Summary\"\n fullWidth\n margin=\"normal\"\n variant=\"outlined\"\n classes={{\n root: classes.formControl,\n }}\n value={summary}\n onChange={event => {\n setSummary(event.target.value);\n }}\n />\n <TextField\n disabled={isLoading}\n label=\"Details\"\n fullWidth\n multiline\n rows={4}\n margin=\"normal\"\n variant=\"outlined\"\n classes={{\n root: classes.formControl,\n }}\n value={details}\n onChange={event => {\n setDetails(event.target.value);\n }}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!canCreate}\n onClick={handleCreate}\n color=\"secondary\"\n variant=\"contained\"\n >\n Create\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AlertNewModal.esm.js","sources":["../../../src/components/Alert/AlertNewModal.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 */\nimport { DEFAULT_NAMESPACE, parseEntityRef } from '@backstage/catalog-model';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\nimport Typography from '@material-ui/core/Typography';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TextField from '@material-ui/core/TextField';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport Alert from '@material-ui/lab/Alert';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { ilertApiRef } from '../../api';\nimport { useNewAlert } from '../../hooks/useNewAlert';\nimport { AlertSource } from '../../types';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n}));\n\nexport const AlertNewModal = ({\n isModalOpened,\n setIsModalOpened,\n refetchAlerts,\n initialAlertSource,\n entityName,\n}: {\n isModalOpened: boolean;\n setIsModalOpened: (open: boolean) => void;\n refetchAlerts: () => void;\n initialAlertSource?: AlertSource | null;\n entityName?: string;\n}) => {\n const [\n { alertSources, alertSource, summary, details, isLoading },\n { setAlertSource, setSummary, setDetails, setIsLoading },\n ] = useNewAlert(isModalOpened, initialAlertSource);\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const identityApi = useApi(identityApiRef);\n const source = window.location.toString();\n const classes = useStyles();\n const prefersDarkMode = useMediaQuery('(prefers-color-scheme: dark)');\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n let integrationKey = '';\n if (initialAlertSource && initialAlertSource.integrationKey) {\n integrationKey = initialAlertSource.integrationKey;\n } else if (alertSource && alertSource.integrationKey) {\n integrationKey = alertSource.integrationKey;\n }\n const handleCreate = () => {\n if (!integrationKey) {\n return;\n }\n setIsLoading(true);\n setTimeout(async () => {\n try {\n const { userEntityRef } = await identityApi.getBackstageIdentity();\n const { name: userName } = parseEntityRef(userEntityRef, {\n defaultKind: 'User',\n defaultNamespace: DEFAULT_NAMESPACE,\n });\n await ilertApi.createAlert({\n integrationKey,\n summary,\n details,\n userName,\n source,\n });\n alertApi.post({ title: 'Alert created.' });\n refetchAlerts();\n } catch (err) {\n alertApi.post({ title: err, status: 'danger' });\n }\n setIsModalOpened(false);\n }, 250);\n };\n\n const canCreate = !!integrationKey && !!summary;\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"create-alert-form-title\"\n >\n <DialogTitle id=\"create-alert-form-title\">\n {entityName ? (\n <div>\n This action will trigger an alert for{' '}\n <strong>\"{entityName}\"</strong>.\n </div>\n ) : (\n 'New alert'\n )}\n </DialogTitle>\n <DialogContent>\n <Alert severity=\"info\">\n <Typography variant=\"body1\" gutterBottom align=\"justify\">\n Please describe the problem you want to report. Be as descriptive as\n possible. Your signed in user and a reference to the current page\n will automatically be amended to the alarm so that the receiver can\n reach out to you if necessary.\n </Typography>\n </Alert>\n {!initialAlertSource ? (\n <Autocomplete\n disabled={isLoading}\n options={alertSources}\n value={alertSource}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setAlertSource(newValue);\n }}\n autoHighlight\n getOptionLabel={a => a.name}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <img\n src={prefersDarkMode ? a.lightIconUrl : a.iconUrl}\n alt={a.name}\n className={classes.sourceImage}\n />\n <Typography noWrap>{a.name}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Alert Source\"\n variant=\"outlined\"\n margin=\"normal\"\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n ) : null}\n <TextField\n disabled={isLoading}\n label=\"Summary\"\n fullWidth\n margin=\"normal\"\n variant=\"outlined\"\n classes={{\n root: classes.formControl,\n }}\n value={summary}\n onChange={event => {\n setSummary(event.target.value);\n }}\n />\n <TextField\n disabled={isLoading}\n label=\"Details\"\n fullWidth\n multiline\n rows={4}\n margin=\"normal\"\n variant=\"outlined\"\n classes={{\n root: classes.formControl,\n }}\n value={details}\n onChange={event => {\n setDetails(event.target.value);\n }}\n />\n </DialogContent>\n <DialogActions>\n <Button\n disabled={!canCreate}\n onClick={handleCreate}\n color=\"secondary\"\n variant=\"contained\"\n >\n Create\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,8 @@ import Alert from '@material-ui/lab/Alert';
14
14
  import { useState } from 'react';
15
15
  import { ilertApiRef } from '../../api/client.esm.js';
16
16
  import { HeaderIconLinkRow } from '@backstage/core-components';
17
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
17
+ import { useApi } from '@backstage/core-plugin-api';
18
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
18
19
 
19
20
  const ILertCardActionsHeader = ({
20
21
  alertSource,
@@ -23,7 +24,7 @@ const ILertCardActionsHeader = ({
23
24
  setIsMaintenanceModalOpened
24
25
  }) => {
25
26
  const ilertApi = useApi(ilertApiRef);
26
- const alertApi = useApi(alertApiRef);
27
+ const alertApi = useApi(toastApiRef);
27
28
  const [isLoading, setIsLoading] = useState(false);
28
29
  const [isDisableModalOpened, setIsDisableModalOpened] = useState(false);
29
30
  const handleCreateNewAlert = () => {
@@ -36,12 +37,12 @@ const ILertCardActionsHeader = ({
36
37
  }
37
38
  setIsLoading(true);
38
39
  const newAlertSource = await ilertApi.enableAlertSource(alertSource);
39
- alertApi.post({ message: "Alert source enabled." });
40
+ alertApi.post({ title: "Alert source enabled." });
40
41
  setIsLoading(false);
41
42
  setAlertSource(newAlertSource);
42
43
  } catch (err) {
43
44
  setIsLoading(false);
44
- alertApi.post({ message: err, severity: "error" });
45
+ alertApi.post({ title: err, status: "danger" });
45
46
  }
46
47
  };
47
48
  const handleDisableAlertSource = async () => {
@@ -52,12 +53,12 @@ const ILertCardActionsHeader = ({
52
53
  setIsDisableModalOpened(false);
53
54
  setIsLoading(true);
54
55
  const newAlertSource = await ilertApi.disableAlertSource(alertSource);
55
- alertApi.post({ message: "Alert source disabled." });
56
+ alertApi.post({ title: "Alert source disabled." });
56
57
  setIsLoading(false);
57
58
  setAlertSource(newAlertSource);
58
59
  } catch (err) {
59
60
  setIsLoading(false);
60
- alertApi.post({ message: err, severity: "error" });
61
+ alertApi.post({ title: err, status: "danger" });
61
62
  }
62
63
  };
63
64
  const handleDisableAlertSourceWarningOpen = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"ILertCardActionsHeader.esm.js","sources":["../../../src/components/ILertCard/ILertCardActionsHeader.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 */\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\nimport AlarmAddIcon from '@material-ui/icons/AlarmAdd';\nimport BuildIcon from '@material-ui/icons/Build';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport WebIcon from '@material-ui/icons/Web';\nimport Alert from '@material-ui/lab/Alert';\nimport { useState } from 'react';\nimport { ilertApiRef } from '../../api';\nimport { AlertSource } from '../../types';\n\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nexport const ILertCardActionsHeader = ({\n alertSource,\n setAlertSource,\n setIsNewAlertModalOpened,\n setIsMaintenanceModalOpened,\n}: {\n alertSource: AlertSource | null;\n setAlertSource: (alertSource: AlertSource) => void;\n setIsNewAlertModalOpened: (isOpen: boolean) => void;\n setIsMaintenanceModalOpened: (isOpen: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const [isLoading, setIsLoading] = useState(false);\n const [isDisableModalOpened, setIsDisableModalOpened] = useState(false);\n\n const handleCreateNewAlert = () => {\n setIsNewAlertModalOpened(true);\n };\n\n const handleEnableAlertSource = async () => {\n try {\n if (!alertSource) {\n return;\n }\n setIsLoading(true);\n const newAlertSource = await ilertApi.enableAlertSource(alertSource);\n alertApi.post({ message: 'Alert source enabled.' });\n setIsLoading(false);\n setAlertSource(newAlertSource);\n } catch (err) {\n setIsLoading(false);\n alertApi.post({ message: err, severity: 'error' });\n }\n };\n const handleDisableAlertSource = async () => {\n try {\n if (!alertSource) {\n return;\n }\n setIsDisableModalOpened(false);\n setIsLoading(true);\n const newAlertSource = await ilertApi.disableAlertSource(alertSource);\n alertApi.post({ message: 'Alert source disabled.' });\n setIsLoading(false);\n setAlertSource(newAlertSource);\n } catch (err) {\n setIsLoading(false);\n alertApi.post({ message: err, severity: 'error' });\n }\n };\n\n const handleDisableAlertSourceWarningOpen = () => {\n setIsDisableModalOpened(true);\n };\n\n const handleDisableAlertSourceWarningClose = () => {\n setIsDisableModalOpened(false);\n };\n\n const handleMaintenanceAlertSource = () => {\n setIsMaintenanceModalOpened(true);\n };\n\n const alertSourceLink: IconLinkVerticalProps = {\n label: 'Alert Source',\n href: ilertApi.getAlertSourceDetailsURL(alertSource),\n icon: <WebIcon />,\n };\n\n const createAlertLink: IconLinkVerticalProps = {\n label: 'Create Alert',\n onClick: handleCreateNewAlert,\n icon: <AlarmAddIcon />,\n color: 'secondary',\n disabled:\n !alertSource ||\n alertSource.status === 'DISABLED' ||\n alertSource.status === 'IN_MAINTENANCE',\n };\n\n const enableAlertSourceLink: IconLinkVerticalProps = {\n label: 'Enable',\n onClick: handleEnableAlertSource,\n icon: <PlayArrowIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const disableAlertSourceLink: IconLinkVerticalProps = {\n label: 'Disable',\n onClick: handleDisableAlertSourceWarningOpen,\n icon: <PauseIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const maintenanceAlertSourceLink: IconLinkVerticalProps = {\n label: 'Immediate maintenance',\n onClick: handleMaintenanceAlertSource,\n icon: <BuildIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const links: IconLinkVerticalProps[] = [\n alertSourceLink,\n createAlertLink,\n alertSource && alertSource.active\n ? disableAlertSourceLink\n : enableAlertSourceLink,\n ];\n\n if (alertSource && alertSource.status !== 'IN_MAINTENANCE') {\n links.push(maintenanceAlertSourceLink);\n }\n\n return (\n <>\n <HeaderIconLinkRow links={links} />\n <Dialog\n open={isDisableModalOpened}\n onClose={handleDisableAlertSourceWarningClose}\n aria-labelledby=\"alert-source-disable-form-title\"\n >\n <DialogTitle id=\"alert-source-disable-form-title\">\n Disable alert source\n </DialogTitle>\n <DialogContent>\n <Alert severity=\"info\">\n <Typography variant=\"body1\" align=\"justify\">\n Do you really want to disable this alert source? A disabled alert\n source cannot create new alerts.\n </Typography>\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={handleDisableAlertSource}\n color=\"secondary\"\n variant=\"contained\"\n >\n Disable\n </Button>\n <Button\n onClick={handleDisableAlertSourceWarningClose}\n color=\"primary\"\n >\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ILertCardActionsHeader.esm.js","sources":["../../../src/components/ILertCard/ILertCardActionsHeader.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 */\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Typography from '@material-ui/core/Typography';\nimport AlarmAddIcon from '@material-ui/icons/AlarmAdd';\nimport BuildIcon from '@material-ui/icons/Build';\nimport PauseIcon from '@material-ui/icons/Pause';\nimport PlayArrowIcon from '@material-ui/icons/PlayArrow';\nimport WebIcon from '@material-ui/icons/Web';\nimport Alert from '@material-ui/lab/Alert';\nimport { useState } from 'react';\nimport { ilertApiRef } from '../../api';\nimport { AlertSource } from '../../types';\n\nimport {\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\n\nexport const ILertCardActionsHeader = ({\n alertSource,\n setAlertSource,\n setIsNewAlertModalOpened,\n setIsMaintenanceModalOpened,\n}: {\n alertSource: AlertSource | null;\n setAlertSource: (alertSource: AlertSource) => void;\n setIsNewAlertModalOpened: (isOpen: boolean) => void;\n setIsMaintenanceModalOpened: (isOpen: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const [isLoading, setIsLoading] = useState(false);\n const [isDisableModalOpened, setIsDisableModalOpened] = useState(false);\n\n const handleCreateNewAlert = () => {\n setIsNewAlertModalOpened(true);\n };\n\n const handleEnableAlertSource = async () => {\n try {\n if (!alertSource) {\n return;\n }\n setIsLoading(true);\n const newAlertSource = await ilertApi.enableAlertSource(alertSource);\n alertApi.post({ title: 'Alert source enabled.' });\n setIsLoading(false);\n setAlertSource(newAlertSource);\n } catch (err) {\n setIsLoading(false);\n alertApi.post({ title: err, status: 'danger' });\n }\n };\n const handleDisableAlertSource = async () => {\n try {\n if (!alertSource) {\n return;\n }\n setIsDisableModalOpened(false);\n setIsLoading(true);\n const newAlertSource = await ilertApi.disableAlertSource(alertSource);\n alertApi.post({ title: 'Alert source disabled.' });\n setIsLoading(false);\n setAlertSource(newAlertSource);\n } catch (err) {\n setIsLoading(false);\n alertApi.post({ title: err, status: 'danger' });\n }\n };\n\n const handleDisableAlertSourceWarningOpen = () => {\n setIsDisableModalOpened(true);\n };\n\n const handleDisableAlertSourceWarningClose = () => {\n setIsDisableModalOpened(false);\n };\n\n const handleMaintenanceAlertSource = () => {\n setIsMaintenanceModalOpened(true);\n };\n\n const alertSourceLink: IconLinkVerticalProps = {\n label: 'Alert Source',\n href: ilertApi.getAlertSourceDetailsURL(alertSource),\n icon: <WebIcon />,\n };\n\n const createAlertLink: IconLinkVerticalProps = {\n label: 'Create Alert',\n onClick: handleCreateNewAlert,\n icon: <AlarmAddIcon />,\n color: 'secondary',\n disabled:\n !alertSource ||\n alertSource.status === 'DISABLED' ||\n alertSource.status === 'IN_MAINTENANCE',\n };\n\n const enableAlertSourceLink: IconLinkVerticalProps = {\n label: 'Enable',\n onClick: handleEnableAlertSource,\n icon: <PlayArrowIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const disableAlertSourceLink: IconLinkVerticalProps = {\n label: 'Disable',\n onClick: handleDisableAlertSourceWarningOpen,\n icon: <PauseIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const maintenanceAlertSourceLink: IconLinkVerticalProps = {\n label: 'Immediate maintenance',\n onClick: handleMaintenanceAlertSource,\n icon: <BuildIcon />,\n disabled: !alertSource || isLoading,\n };\n\n const links: IconLinkVerticalProps[] = [\n alertSourceLink,\n createAlertLink,\n alertSource && alertSource.active\n ? disableAlertSourceLink\n : enableAlertSourceLink,\n ];\n\n if (alertSource && alertSource.status !== 'IN_MAINTENANCE') {\n links.push(maintenanceAlertSourceLink);\n }\n\n return (\n <>\n <HeaderIconLinkRow links={links} />\n <Dialog\n open={isDisableModalOpened}\n onClose={handleDisableAlertSourceWarningClose}\n aria-labelledby=\"alert-source-disable-form-title\"\n >\n <DialogTitle id=\"alert-source-disable-form-title\">\n Disable alert source\n </DialogTitle>\n <DialogContent>\n <Alert severity=\"info\">\n <Typography variant=\"body1\" align=\"justify\">\n Do you really want to disable this alert source? A disabled alert\n source cannot create new alerts.\n </Typography>\n </Alert>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={handleDisableAlertSource}\n color=\"secondary\"\n variant=\"contained\"\n >\n Disable\n </Button>\n <Button\n onClick={handleDisableAlertSourceWarningClose}\n color=\"primary\"\n >\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -9,7 +9,8 @@ import DialogTitle from '@material-ui/core/DialogTitle';
9
9
  import MenuItem from '@material-ui/core/MenuItem';
10
10
  import TextField from '@material-ui/core/TextField';
11
11
  import { ilertApiRef } from '../../api/client.esm.js';
12
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
12
+ import { useApi } from '@backstage/core-plugin-api';
13
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
13
14
 
14
15
  const ILertCardMaintenanceModal = ({
15
16
  alertSource,
@@ -18,7 +19,7 @@ const ILertCardMaintenanceModal = ({
18
19
  setIsModalOpened
19
20
  }) => {
20
21
  const ilertApi = useApi(ilertApiRef);
21
- const alertApi = useApi(alertApiRef);
22
+ const alertApi = useApi(toastApiRef);
22
23
  const [minutes, setMinutes] = useState(5);
23
24
  const handleClose = () => {
24
25
  setIsModalOpened(false);
@@ -31,10 +32,10 @@ const ILertCardMaintenanceModal = ({
31
32
  setTimeout(async () => {
32
33
  try {
33
34
  await ilertApi.addImmediateMaintenance(alertSource.id, minutes);
34
- alertApi.post({ message: "Maintenance started." });
35
+ alertApi.post({ title: "Maintenance started." });
35
36
  refetchAlertSource();
36
37
  } catch (err) {
37
- alertApi.post({ message: err, severity: "error" });
38
+ alertApi.post({ title: err, status: "danger" });
38
39
  }
39
40
  }, 250);
40
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ILertCardMaintenanceModal.esm.js","sources":["../../../src/components/ILertCard/ILertCardMaintenanceModal.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 */\nimport { useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\nimport { ilertApiRef } from '../../api';\nimport { AlertSource } from '../../types';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nexport const ILertCardMaintenanceModal = ({\n alertSource,\n refetchAlertSource,\n isModalOpened,\n setIsModalOpened,\n}: {\n alertSource: AlertSource | null;\n refetchAlertSource: () => void;\n isModalOpened: boolean;\n setIsModalOpened: (isModalOpened: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const [minutes, setMinutes] = useState(5);\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n const handleImmediateMaintenance = () => {\n if (!alertSource) {\n return;\n }\n setIsModalOpened(false);\n setTimeout(async () => {\n try {\n await ilertApi.addImmediateMaintenance(alertSource.id, minutes);\n alertApi.post({ message: 'Maintenance started.' });\n refetchAlertSource();\n } catch (err) {\n alertApi.post({ message: err, severity: 'error' });\n }\n }, 250);\n };\n\n const handleMinutesChange = (event: any) => {\n setMinutes(event.target.value);\n };\n\n const minuteOptions = [\n {\n value: 5,\n label: '5 minutes',\n },\n {\n value: 10,\n label: '10 minutes',\n },\n {\n value: 15,\n label: '15 minutes',\n },\n {\n value: 30,\n label: '30 minutes',\n },\n {\n value: 60,\n label: '60 minutes',\n },\n ];\n\n if (!alertSource) {\n return null;\n }\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"maintenance-form-title\"\n >\n <DialogTitle id=\"maintenance-form-title\">\n New maintenance window\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Keep your alert sources quiet, when your systems are under\n maintenance.\n </DialogContentText>\n <TextField\n select\n label=\"Duration\"\n value={minutes}\n onChange={handleMinutesChange}\n variant=\"outlined\"\n fullWidth\n >\n {minuteOptions.map(option => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={handleImmediateMaintenance}\n color=\"primary\"\n variant=\"contained\"\n >\n Create\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ILertCardMaintenanceModal.esm.js","sources":["../../../src/components/ILertCard/ILertCardMaintenanceModal.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 */\nimport { useState } from 'react';\nimport Button from '@material-ui/core/Button';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogContentText from '@material-ui/core/DialogContentText';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport TextField from '@material-ui/core/TextField';\nimport { ilertApiRef } from '../../api';\nimport { AlertSource } from '../../types';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\n\nexport const ILertCardMaintenanceModal = ({\n alertSource,\n refetchAlertSource,\n isModalOpened,\n setIsModalOpened,\n}: {\n alertSource: AlertSource | null;\n refetchAlertSource: () => void;\n isModalOpened: boolean;\n setIsModalOpened: (isModalOpened: boolean) => void;\n}) => {\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const [minutes, setMinutes] = useState(5);\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n const handleImmediateMaintenance = () => {\n if (!alertSource) {\n return;\n }\n setIsModalOpened(false);\n setTimeout(async () => {\n try {\n await ilertApi.addImmediateMaintenance(alertSource.id, minutes);\n alertApi.post({ title: 'Maintenance started.' });\n refetchAlertSource();\n } catch (err) {\n alertApi.post({ title: err, status: 'danger' });\n }\n }, 250);\n };\n\n const handleMinutesChange = (event: any) => {\n setMinutes(event.target.value);\n };\n\n const minuteOptions = [\n {\n value: 5,\n label: '5 minutes',\n },\n {\n value: 10,\n label: '10 minutes',\n },\n {\n value: 15,\n label: '15 minutes',\n },\n {\n value: 30,\n label: '30 minutes',\n },\n {\n value: 60,\n label: '60 minutes',\n },\n ];\n\n if (!alertSource) {\n return null;\n }\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"maintenance-form-title\"\n >\n <DialogTitle id=\"maintenance-form-title\">\n New maintenance window\n </DialogTitle>\n <DialogContent>\n <DialogContentText>\n Keep your alert sources quiet, when your systems are under\n maintenance.\n </DialogContentText>\n <TextField\n select\n label=\"Duration\"\n value={minutes}\n onChange={handleMinutesChange}\n variant=\"outlined\"\n fullWidth\n >\n {minuteOptions.map(option => (\n <MenuItem key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={handleImmediateMaintenance}\n color=\"primary\"\n variant=\"contained\"\n >\n Create\n </Button>\n <Button onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -13,7 +13,8 @@ import { useShiftOverride } from '../../hooks/useShiftOverride.esm.js';
13
13
  import { DateTimePicker } from '@material-ui/pickers/DateTimePicker';
14
14
  import MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';
15
15
  import LuxonUtils from '@date-io/luxon';
16
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
16
+ import { useApi } from '@backstage/core-plugin-api';
17
+ import { toastApiRef } from '@backstage/frontend-plugin-api';
17
18
 
18
19
  const useStyles = makeStyles(() => ({
19
20
  container: {
@@ -55,7 +56,7 @@ const ShiftOverrideModal = ({
55
56
  { setUser, setStart, setEnd, setIsLoading }
56
57
  ] = useShiftOverride(shift, isModalOpened);
57
58
  const ilertApi = useApi(ilertApiRef);
58
- const alertApi = useApi(alertApiRef);
59
+ const alertApi = useApi(toastApiRef);
59
60
  const classes = useStyles();
60
61
  const handleClose = () => {
61
62
  setIsModalOpened(false);
@@ -74,11 +75,11 @@ const ShiftOverrideModal = ({
74
75
  end
75
76
  );
76
77
  if (success) {
77
- alertApi.post({ message: "Shift overridden." });
78
+ alertApi.post({ title: "Shift overridden." });
78
79
  refetchOnCallSchedules();
79
80
  }
80
81
  } catch (err) {
81
- alertApi.post({ message: err, severity: "error" });
82
+ alertApi.post({ title: err, status: "danger" });
82
83
  }
83
84
  setIsModalOpened(false);
84
85
  }, 250);
@@ -1 +1 @@
1
- {"version":3,"file":"ShiftOverrideModal.esm.js","sources":["../../../src/components/Shift/ShiftOverrideModal.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\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport Typography from '@material-ui/core/Typography';\nimport { ilertApiRef } from '../../api';\nimport { useShiftOverride } from '../../hooks/useShiftOverride';\nimport { Shift } from '../../types';\nimport { DateTimePicker } from '@material-ui/pickers/DateTimePicker';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport LuxonUtils from '@date-io/luxon';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n grow: {\n flexGrow: 1,\n },\n}));\n\nexport const ShiftOverrideModal = ({\n scheduleId,\n shift,\n refetchOnCallSchedules,\n isModalOpened,\n setIsModalOpened,\n}: {\n scheduleId: number;\n shift: Shift;\n refetchOnCallSchedules: () => void;\n isModalOpened: boolean;\n setIsModalOpened: (isModalOpened: boolean) => void;\n}) => {\n const [\n { isLoading, users, user, start, end },\n { setUser, setStart, setEnd, setIsLoading },\n ] = useShiftOverride(shift, isModalOpened);\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(alertApiRef);\n const classes = useStyles();\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n const handleOverride = () => {\n if (!shift || !shift.user) {\n return;\n }\n setIsLoading(true);\n setTimeout(async () => {\n try {\n const success = await ilertApi.overrideShift(\n scheduleId,\n user.id,\n start,\n end,\n );\n if (success) {\n alertApi.post({ message: 'Shift overridden.' });\n refetchOnCallSchedules();\n }\n } catch (err) {\n alertApi.post({ message: err, severity: 'error' });\n }\n setIsModalOpened(false);\n }, 250);\n };\n\n if (!shift) {\n return null;\n }\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"override-shift-form-title\"\n >\n <DialogTitle id=\"override-shift-form-title\">Shift override</DialogTitle>\n <DialogContent>\n <MuiPickersUtilsProvider utils={LuxonUtils}>\n <Autocomplete\n disabled={isLoading}\n options={users}\n value={user}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setUser(newValue);\n }}\n autoHighlight\n getOptionLabel={a => ilertApi.getUserInitials(a)}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <Typography noWrap>{ilertApi.getUserInitials(a)}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"User\"\n variant=\"outlined\"\n fullWidth\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n <DateTimePicker\n label=\"Start\"\n inputVariant=\"outlined\"\n fullWidth\n margin=\"normal\"\n ampm={false}\n value={start}\n className={classes.formControl}\n onChange={date => {\n setStart(date?.toISO() ?? '');\n }}\n />\n <DateTimePicker\n label=\"End\"\n inputVariant=\"outlined\"\n fullWidth\n margin=\"normal\"\n ampm={false}\n value={end}\n className={classes.formControl}\n onChange={date => {\n setEnd(date?.toISO() ?? '');\n }}\n />\n </MuiPickersUtilsProvider>\n </DialogContent>\n <DialogActions>\n <Button\n disabled={isLoading}\n onClick={handleOverride}\n color=\"primary\"\n variant=\"contained\"\n >\n Override\n </Button>\n <Button disabled={isLoading} onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ShiftOverrideModal.esm.js","sources":["../../../src/components/Shift/ShiftOverrideModal.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\nimport { makeStyles } from '@material-ui/core/styles';\nimport Button from '@material-ui/core/Button';\nimport TextField from '@material-ui/core/TextField';\nimport Dialog from '@material-ui/core/Dialog';\nimport DialogActions from '@material-ui/core/DialogActions';\nimport DialogContent from '@material-ui/core/DialogContent';\nimport DialogTitle from '@material-ui/core/DialogTitle';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport Typography from '@material-ui/core/Typography';\nimport { ilertApiRef } from '../../api';\nimport { useShiftOverride } from '../../hooks/useShiftOverride';\nimport { Shift } from '../../types';\nimport { DateTimePicker } from '@material-ui/pickers/DateTimePicker';\nimport MuiPickersUtilsProvider from '@material-ui/pickers/MuiPickersUtilsProvider';\nimport LuxonUtils from '@date-io/luxon';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { toastApiRef } from '@backstage/frontend-plugin-api';\n\nconst useStyles = makeStyles(() => ({\n container: {\n display: 'flex',\n flexWrap: 'wrap',\n },\n formControl: {\n minWidth: 120,\n width: '100%',\n },\n option: {\n fontSize: 15,\n '& > span': {\n marginRight: 10,\n fontSize: 18,\n },\n },\n optionWrapper: {\n display: 'flex',\n width: '100%',\n },\n sourceImage: {\n height: 22,\n paddingRight: 4,\n },\n grow: {\n flexGrow: 1,\n },\n}));\n\nexport const ShiftOverrideModal = ({\n scheduleId,\n shift,\n refetchOnCallSchedules,\n isModalOpened,\n setIsModalOpened,\n}: {\n scheduleId: number;\n shift: Shift;\n refetchOnCallSchedules: () => void;\n isModalOpened: boolean;\n setIsModalOpened: (isModalOpened: boolean) => void;\n}) => {\n const [\n { isLoading, users, user, start, end },\n { setUser, setStart, setEnd, setIsLoading },\n ] = useShiftOverride(shift, isModalOpened);\n const ilertApi = useApi(ilertApiRef);\n const alertApi = useApi(toastApiRef);\n const classes = useStyles();\n\n const handleClose = () => {\n setIsModalOpened(false);\n };\n\n const handleOverride = () => {\n if (!shift || !shift.user) {\n return;\n }\n setIsLoading(true);\n setTimeout(async () => {\n try {\n const success = await ilertApi.overrideShift(\n scheduleId,\n user.id,\n start,\n end,\n );\n if (success) {\n alertApi.post({ title: 'Shift overridden.' });\n refetchOnCallSchedules();\n }\n } catch (err) {\n alertApi.post({ title: err, status: 'danger' });\n }\n setIsModalOpened(false);\n }, 250);\n };\n\n if (!shift) {\n return null;\n }\n\n return (\n <Dialog\n open={isModalOpened}\n onClose={handleClose}\n aria-labelledby=\"override-shift-form-title\"\n >\n <DialogTitle id=\"override-shift-form-title\">Shift override</DialogTitle>\n <DialogContent>\n <MuiPickersUtilsProvider utils={LuxonUtils}>\n <Autocomplete\n disabled={isLoading}\n options={users}\n value={user}\n classes={{\n root: classes.formControl,\n option: classes.option,\n }}\n onChange={(_event: any, newValue: any) => {\n setUser(newValue);\n }}\n autoHighlight\n getOptionLabel={a => ilertApi.getUserInitials(a)}\n renderOption={a => (\n <div className={classes.optionWrapper}>\n <Typography noWrap>{ilertApi.getUserInitials(a)}</Typography>\n </div>\n )}\n renderInput={params => (\n <TextField\n {...params}\n label=\"User\"\n variant=\"outlined\"\n fullWidth\n inputProps={{\n ...params.inputProps,\n autoComplete: 'new-password', // disable autocomplete and autofill\n }}\n />\n )}\n />\n <DateTimePicker\n label=\"Start\"\n inputVariant=\"outlined\"\n fullWidth\n margin=\"normal\"\n ampm={false}\n value={start}\n className={classes.formControl}\n onChange={date => {\n setStart(date?.toISO() ?? '');\n }}\n />\n <DateTimePicker\n label=\"End\"\n inputVariant=\"outlined\"\n fullWidth\n margin=\"normal\"\n ampm={false}\n value={end}\n className={classes.formControl}\n onChange={date => {\n setEnd(date?.toISO() ?? '');\n }}\n />\n </MuiPickersUtilsProvider>\n </DialogContent>\n <DialogActions>\n <Button\n disabled={isLoading}\n onClick={handleOverride}\n color=\"primary\"\n variant=\"contained\"\n >\n Override\n </Button>\n <Button disabled={isLoading} onClick={handleClose} color=\"primary\">\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n );\n};\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -382,7 +382,9 @@ interface ILertApi {
382
382
  }
383
383
 
384
384
  /** @public */
385
- declare const ilertApiRef: _backstage_frontend_plugin_api.ApiRef<ILertApi>;
385
+ declare const ilertApiRef: _backstage_frontend_plugin_api.ApiRef<ILertApi, "plugin.ilert.service"> & {
386
+ readonly $$type: "@backstage/ApiRef";
387
+ };
386
388
  /** @public */
387
389
  declare class ILertClient implements ILertApi {
388
390
  private readonly discoveryApi;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-ilert",
3
- "version": "0.18.0",
3
+ "version": "0.19.0",
4
4
  "description": "A Backstage plugin that integrates towards iLert",
5
5
  "backstage": {
6
6
  "role": "frontend-plugin",
@@ -38,11 +38,12 @@
38
38
  "test": "backstage-cli package test"
39
39
  },
40
40
  "dependencies": {
41
- "@backstage/catalog-model": "^1.7.6",
42
- "@backstage/core-components": "^0.18.7",
43
- "@backstage/core-plugin-api": "^1.12.3",
41
+ "@backstage/catalog-model": "^1.7.7",
42
+ "@backstage/core-components": "^0.18.8",
43
+ "@backstage/core-plugin-api": "^1.12.4",
44
44
  "@backstage/errors": "^1.2.7",
45
- "@backstage/plugin-catalog-react": "^2.0.0",
45
+ "@backstage/frontend-plugin-api": "^0.15.1",
46
+ "@backstage/plugin-catalog-react": "^2.1.0",
46
47
  "@date-io/luxon": "1.x",
47
48
  "@material-ui/core": "^4.12.2",
48
49
  "@material-ui/icons": "^4.9.1",
@@ -54,8 +55,8 @@
54
55
  "react-use": "^17.2.4"
55
56
  },
56
57
  "devDependencies": {
57
- "@backstage/cli": "^0.35.4",
58
- "@backstage/dev-utils": "^1.1.20",
58
+ "@backstage/cli": "^0.36.0",
59
+ "@backstage/dev-utils": "^1.1.21",
59
60
  "@testing-library/jest-dom": "^6.0.0",
60
61
  "@types/humanize-duration": "^3.18.1",
61
62
  "@types/react-dom": "^18.2.19",