@backstage/plugin-devtools 0.1.34-next.0 → 0.1.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +17 -0
  3. package/config.d.ts +30 -0
  4. package/dist/api/DevToolsApi.esm.js.map +1 -1
  5. package/dist/api/DevToolsClient.esm.js +26 -0
  6. package/dist/api/DevToolsClient.esm.js.map +1 -1
  7. package/dist/components/Content/ConfigContent/ConfigContent.esm.js +1 -0
  8. package/dist/components/Content/ConfigContent/ConfigContent.esm.js.map +1 -1
  9. package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js +1 -0
  10. package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js.map +1 -1
  11. package/dist/components/Content/InfoContent/InfoContent.esm.js +1 -0
  12. package/dist/components/Content/InfoContent/InfoContent.esm.js.map +1 -1
  13. package/dist/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js +75 -0
  14. package/dist/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js.map +1 -0
  15. package/dist/components/Content/ScheduledTasksContent/ScheduledTasksContent.esm.js +243 -0
  16. package/dist/components/Content/ScheduledTasksContent/ScheduledTasksContent.esm.js.map +1 -0
  17. package/dist/components/DefaultDevToolsPage/DefaultDevToolsPage.esm.js +5 -1
  18. package/dist/components/DefaultDevToolsPage/DefaultDevToolsPage.esm.js.map +1 -1
  19. package/dist/hooks/useScheduledTasks.esm.js +30 -0
  20. package/dist/hooks/useScheduledTasks.esm.js.map +1 -0
  21. package/dist/hooks/useTriggerScheduledTask.esm.js +32 -0
  22. package/dist/hooks/useTriggerScheduledTask.esm.js.map +1 -0
  23. package/dist/index.d.ts +11 -1
  24. package/dist/index.esm.js +2 -0
  25. package/dist/index.esm.js.map +1 -1
  26. package/dist/package.json.esm.js +12 -6
  27. package/dist/package.json.esm.js.map +1 -1
  28. package/package.json +15 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # @backstage/plugin-devtools
2
2
 
3
+ ## 0.1.34
4
+
5
+ ### Patch Changes
6
+
7
+ - d02db50: Remove unnecessary use of `compatWrapper` and `convertLegacyRouteRef`(s) for the new frontend system.
8
+ - 291bf9d: Added scheduled tasks UI feature for the DevTools plugin
9
+ - Updated dependencies
10
+ - @backstage/frontend-plugin-api@0.13.2
11
+ - @backstage/core-components@0.18.4
12
+ - @backstage/core-plugin-api@1.12.1
13
+ - @backstage/plugin-devtools-common@0.1.20
14
+ - @backstage/core-compat-api@0.5.5
15
+ - @backstage/plugin-permission-react@0.4.39
16
+
3
17
  ## 0.1.34-next.0
4
18
 
5
19
  ### Patch Changes
package/README.md CHANGED
@@ -34,6 +34,12 @@ Lists the configuration being used by your current running Backstage instance.
34
34
 
35
35
  ![Example of Config tab](./docs/devtools-config-tab.png)
36
36
 
37
+ ### Scheduled Tasks
38
+
39
+ Scheduled tasks can be viewed and triggered under the `Scheduled Tasks` tab. [See below to configure](#scheduled-tasks-configuration).
40
+
41
+ ![Example of Scheduled Tasks tab](./docs/devtools-scheduled-tasks-tab.png)
42
+
37
43
  ## Optional Features
38
44
 
39
45
  The DevTools plugin can be setup with other tabs with additional helpful features.
@@ -456,3 +462,14 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
456
462
  apt-get update && \
457
463
  apt-get install -y ... iputils-ping
458
464
  ```
465
+
466
+ ### Scheduled Tasks Configuration
467
+
468
+ Scheduled tasks can be viewed and triggered under the `Scheduled Tasks` tab. You first must add the list of plugins for scheduled tasks to your config:
469
+
470
+ ```yaml
471
+ devTools:
472
+ scheduledTasks:
473
+ plugins:
474
+ - catalog
475
+ ```
package/config.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ /*
2
+ * Copyright 2025 The Backstage Authors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export interface Config {
17
+ devTools?: {
18
+ /**
19
+ * Scheduled tasks configuration
20
+ * @visibility frontend
21
+ */
22
+ scheduledTasks?: {
23
+ /**
24
+ * A list of plugin IDs to select from, e.g. ['catalog', 'scaffolder']
25
+ * @visibility frontend
26
+ */
27
+ plugins: string[];
28
+ };
29
+ };
30
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsApi.esm.js","sources":["../../src/api/DevToolsApi.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { createApiRef } from '@backstage/core-plugin-api';\nimport {\n ConfigInfo,\n DevToolsInfo,\n ExternalDependency,\n} from '@backstage/plugin-devtools-common';\n\nexport const devToolsApiRef = createApiRef<DevToolsApi>({\n id: 'plugin.devtools.service',\n});\n\nexport interface DevToolsApi {\n getConfig(): Promise<ConfigInfo | undefined>;\n getExternalDependencies(): Promise<ExternalDependency[] | undefined>;\n getInfo(): Promise<DevToolsInfo | undefined>;\n}\n"],"names":[],"mappings":";;AAuBO,MAAM,iBAAiB,YAAA,CAA0B;AAAA,EACtD,EAAA,EAAI;AACN,CAAC;;;;"}
1
+ {"version":3,"file":"DevToolsApi.esm.js","sources":["../../src/api/DevToolsApi.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { createApiRef } from '@backstage/core-plugin-api';\nimport {\n ConfigInfo,\n DevToolsInfo,\n ExternalDependency,\n} from '@backstage/plugin-devtools-common';\nimport {\n ScheduledTasks,\n TriggerScheduledTask,\n} from '@backstage/plugin-devtools-common/alpha';\n\nexport const devToolsApiRef = createApiRef<DevToolsApi>({\n id: 'plugin.devtools.service',\n});\n\nexport interface DevToolsApi {\n getConfig(): Promise<ConfigInfo | undefined>;\n getExternalDependencies(): Promise<ExternalDependency[] | undefined>;\n getInfo(): Promise<DevToolsInfo | undefined>;\n getScheduledTasksByPlugin(plugin: string): Promise<ScheduledTasks>;\n triggerScheduledTask(\n plugin: string,\n taskId: string,\n ): Promise<TriggerScheduledTask>;\n}\n"],"names":[],"mappings":";;AA2BO,MAAM,iBAAiB,YAAA,CAA0B;AAAA,EACtD,EAAA,EAAI;AACN,CAAC;;;;"}
@@ -12,6 +12,32 @@ class DevToolsClient {
12
12
  const configInfo = await this.get(urlSegment);
13
13
  return configInfo;
14
14
  }
15
+ async getScheduledTasksByPlugin(plugin) {
16
+ const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`;
17
+ const url = new URL(".backstage/scheduler/v1/tasks", baseUrl);
18
+ const response = await this.fetchApi.fetch(url.toString());
19
+ if (!response.ok) {
20
+ throw await ResponseError.fromResponse(response);
21
+ }
22
+ const scheduledTasks = await response.json();
23
+ return {
24
+ scheduledTasks: scheduledTasks.tasks
25
+ };
26
+ }
27
+ async triggerScheduledTask(plugin, taskId) {
28
+ const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`;
29
+ const url = new URL(
30
+ `.backstage/scheduler/v1/tasks/${taskId}/trigger`,
31
+ baseUrl
32
+ );
33
+ const response = await this.fetchApi.fetch(url.toString(), {
34
+ method: "POST"
35
+ });
36
+ if (!response.ok) {
37
+ throw await ResponseError.fromResponse(response);
38
+ }
39
+ return response.json();
40
+ }
15
41
  async getExternalDependencies() {
16
42
  const urlSegment = "external-dependencies";
17
43
  const externalDependencies = await this.get(urlSegment);
@@ -1 +1 @@
1
- {"version":3,"file":"DevToolsClient.esm.js","sources":["../../src/api/DevToolsClient.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';\nimport {\n ConfigInfo,\n DevToolsInfo,\n ExternalDependency,\n} from '@backstage/plugin-devtools-common';\nimport { ResponseError } from '@backstage/errors';\nimport { DevToolsApi } from './DevToolsApi';\n\nexport class DevToolsClient implements DevToolsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n public constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n public async getConfig(): Promise<ConfigInfo | undefined> {\n const urlSegment = 'config';\n\n const configInfo = await this.get<ConfigInfo | undefined>(urlSegment);\n return configInfo;\n }\n\n public async getExternalDependencies(): Promise<\n ExternalDependency[] | undefined\n > {\n const urlSegment = 'external-dependencies';\n\n const externalDependencies = await this.get<\n ExternalDependency[] | undefined\n >(urlSegment);\n return externalDependencies;\n }\n\n public async getInfo(): Promise<DevToolsInfo | undefined> {\n const urlSegment = 'info';\n\n const info = await this.get<DevToolsInfo | undefined>(urlSegment);\n return info;\n }\n\n private async get<T>(path: string): Promise<T> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('devtools')}/`;\n const url = new URL(path, baseUrl);\n\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n}\n"],"names":[],"mappings":";;AAyBO,MAAM,cAAA,CAAsC;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEV,YAAY,OAAA,EAGhB;AACD,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,MAAa,SAAA,GAA6C;AACxD,IAAA,MAAM,UAAA,GAAa,QAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAA4B,UAAU,CAAA;AACpE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAa,uBAAA,GAEX;AACA,IAAA,MAAM,UAAA,GAAa,uBAAA;AAEnB,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,GAAA,CAEtC,UAAU,CAAA;AACZ,IAAA,OAAO,oBAAA;AAAA,EACT;AAAA,EAEA,MAAa,OAAA,GAA6C;AACxD,IAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAA8B,UAAU,CAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,IAAO,IAAA,EAA0B;AAC7C,IAAA,MAAM,UAAU,CAAA,EAAG,MAAM,KAAK,YAAA,CAAa,UAAA,CAAW,UAAU,CAAC,CAAA,CAAA,CAAA;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAEjC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAEzD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,YAAA,CAAa,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF;;;;"}
1
+ {"version":3,"file":"DevToolsClient.esm.js","sources":["../../src/api/DevToolsClient.ts"],"sourcesContent":["/*\n * Copyright 2022 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 { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api';\nimport {\n ConfigInfo,\n DevToolsInfo,\n ExternalDependency,\n} from '@backstage/plugin-devtools-common';\nimport {\n ScheduledTasks,\n TriggerScheduledTask,\n} from '@backstage/plugin-devtools-common/alpha';\nimport { ResponseError } from '@backstage/errors';\nimport { DevToolsApi } from './DevToolsApi';\n\nexport class DevToolsClient implements DevToolsApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n\n public constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n public async getConfig(): Promise<ConfigInfo | undefined> {\n const urlSegment = 'config';\n\n const configInfo = await this.get<ConfigInfo | undefined>(urlSegment);\n return configInfo;\n }\n\n public async getScheduledTasksByPlugin(\n plugin: string,\n ): Promise<ScheduledTasks> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`;\n const url = new URL('.backstage/scheduler/v1/tasks', baseUrl);\n\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const scheduledTasks = await response.json();\n return {\n scheduledTasks: scheduledTasks.tasks,\n };\n }\n\n public async triggerScheduledTask(\n plugin: string,\n taskId: string,\n ): Promise<TriggerScheduledTask> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl(plugin)}/`;\n const url = new URL(\n `.backstage/scheduler/v1/tasks/${taskId}/trigger`,\n baseUrl,\n );\n\n const response = await this.fetchApi.fetch(url.toString(), {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<TriggerScheduledTask>;\n }\n\n public async getExternalDependencies(): Promise<\n ExternalDependency[] | undefined\n > {\n const urlSegment = 'external-dependencies';\n\n const externalDependencies = await this.get<\n ExternalDependency[] | undefined\n >(urlSegment);\n return externalDependencies;\n }\n\n public async getInfo(): Promise<DevToolsInfo | undefined> {\n const urlSegment = 'info';\n\n const info = await this.get<DevToolsInfo | undefined>(urlSegment);\n return info;\n }\n\n private async get<T>(path: string): Promise<T> {\n const baseUrl = `${await this.discoveryApi.getBaseUrl('devtools')}/`;\n const url = new URL(path, baseUrl);\n\n const response = await this.fetchApi.fetch(url.toString());\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json() as Promise<T>;\n }\n}\n"],"names":[],"mappings":";;AA6BO,MAAM,cAAA,CAAsC;AAAA,EAChC,YAAA;AAAA,EACA,QAAA;AAAA,EAEV,YAAY,OAAA,EAGhB;AACD,IAAA,IAAA,CAAK,eAAe,OAAA,CAAQ,YAAA;AAC5B,IAAA,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC1B;AAAA,EAEA,MAAa,SAAA,GAA6C;AACxD,IAAA,MAAM,UAAA,GAAa,QAAA;AAEnB,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,GAAA,CAA4B,UAAU,CAAA;AACpE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAa,0BACX,MAAA,EACyB;AACzB,IAAA,MAAM,UAAU,CAAA,EAAG,MAAM,KAAK,YAAA,CAAa,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA,CAAA;AAC7D,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,+BAAA,EAAiC,OAAO,CAAA;AAE5D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAEzD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,YAAA,CAAa,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC3C,IAAA,OAAO;AAAA,MACL,gBAAgB,cAAA,CAAe;AAAA,KACjC;AAAA,EACF;AAAA,EAEA,MAAa,oBAAA,CACX,MAAA,EACA,MAAA,EAC+B;AAC/B,IAAA,MAAM,UAAU,CAAA,EAAG,MAAM,KAAK,YAAA,CAAa,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA,CAAA;AAC7D,IAAA,MAAM,MAAM,IAAI,GAAA;AAAA,MACd,iCAAiC,MAAM,CAAA,QAAA,CAAA;AAAA,MACvC;AAAA,KACF;AAEA,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAA,CAAM,GAAA,CAAI,UAAS,EAAG;AAAA,MACzD,MAAA,EAAQ;AAAA,KACT,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,YAAA,CAAa,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA,EAEA,MAAa,uBAAA,GAEX;AACA,IAAA,MAAM,UAAA,GAAa,uBAAA;AAEnB,IAAA,MAAM,oBAAA,GAAuB,MAAM,IAAA,CAAK,GAAA,CAEtC,UAAU,CAAA;AACZ,IAAA,OAAO,oBAAA;AAAA,EACT;AAAA,EAEA,MAAa,OAAA,GAA6C;AACxD,IAAA,MAAM,UAAA,GAAa,MAAA;AAEnB,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,GAAA,CAA8B,UAAU,CAAA;AAChE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,IAAO,IAAA,EAA0B;AAC7C,IAAA,MAAM,UAAU,CAAA,EAAG,MAAM,KAAK,YAAA,CAAa,UAAA,CAAW,UAAU,CAAC,CAAA,CAAA,CAAA;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,IAAA,EAAM,OAAO,CAAA;AAEjC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,SAAS,KAAA,CAAM,GAAA,CAAI,UAAU,CAAA;AAEzD,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,MAAM,aAAA,CAAc,YAAA,CAAa,QAAQ,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AACF;;;;"}
@@ -11,6 +11,7 @@ import '../../../api/DevToolsApi.esm.js';
11
11
  import '@backstage/errors';
12
12
  import '@backstage/core-plugin-api';
13
13
  import 'react-use/esm/useAsync';
14
+ import 'react';
14
15
 
15
16
  const useStyles = makeStyles(
16
17
  (theme) => createStyles({
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigContent.esm.js","sources":["../../../../src/components/Content/ConfigContent/ConfigContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { Progress, WarningPanel } from '@backstage/core-components';\nimport Box from '@material-ui/core/Box';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport {\n createStyles,\n makeStyles,\n Theme,\n useTheme,\n} from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport ReactJson from 'react-json-view';\nimport { useConfig } from '../../../hooks';\nimport { ConfigError } from '@backstage/plugin-devtools-common';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n warningStyle: {\n paddingBottom: theme.spacing(2),\n },\n paperStyle: {\n padding: theme.spacing(2),\n },\n }),\n);\n\nexport const WarningContent = ({ error }: { error: ConfigError }) => {\n if (!error.messages) {\n return <Typography>{error.message}</Typography>;\n }\n\n const messages = error.messages as string[];\n\n return (\n <Box>\n {messages.map(message => (\n <Typography>{message}</Typography>\n ))}\n </Box>\n );\n};\n\n/** @public */\nexport const ConfigContent = () => {\n const classes = useStyles();\n const theme = useTheme();\n const { configInfo, loading, error } = useConfig();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!configInfo) {\n return <Alert severity=\"error\">Unable to load config data</Alert>;\n }\n\n return (\n <Box>\n {configInfo && configInfo.error && (\n <Box className={classes.warningStyle}>\n <WarningPanel title=\"Config validation failed\">\n <WarningContent error={configInfo.error} />\n </WarningPanel>\n </Box>\n )}\n <Paper className={classes.paperStyle}>\n <ReactJson\n src={configInfo.config as object}\n name=\"config\"\n enableClipboard={false}\n theme={theme.palette.type === 'dark' ? 'chalk' : 'rjv-default'}\n />\n </Paper>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA+BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAA,CAAa;AAAA,IACX,YAAA,EAAc;AAAA,MACZ,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAChC;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAC1B,GACD;AACH,CAAA;AAEO,MAAM,cAAA,GAAiB,CAAC,EAAE,KAAA,EAAM,KAA8B;AACnE,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,EAAA,uBACE,GAAA,CAAC,OACE,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,6BACZ,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,OAAA,EAAQ,CACtB,CAAA,EACH,CAAA;AAEJ;AAGO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,KAAA,KAAU,SAAA,EAAU;AAEjD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB,WAAW,KAAA,EAAO;AAChB,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAS,gBAAM,OAAA,EAAQ,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,QAAA,EAAA,4BAAA,EAA0B,CAAA;AAAA,EAC3D;AAEA,EAAA,4BACG,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,UAAA,IAAc,WAAW,KAAA,oBACxB,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,YAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAM,4BAClB,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAO,UAAA,CAAW,KAAA,EAAO,GAC3C,CAAA,EACF,CAAA;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,UAAA,EACxB,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAK,UAAA,CAAW,MAAA;AAAA,QAChB,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAiB,KAAA;AAAA,QACjB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,SAAS,OAAA,GAAU;AAAA;AAAA,KACnD,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ConfigContent.esm.js","sources":["../../../../src/components/Content/ConfigContent/ConfigContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { Progress, WarningPanel } from '@backstage/core-components';\nimport Box from '@material-ui/core/Box';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport {\n createStyles,\n makeStyles,\n Theme,\n useTheme,\n} from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport ReactJson from 'react-json-view';\nimport { useConfig } from '../../../hooks';\nimport { ConfigError } from '@backstage/plugin-devtools-common';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n warningStyle: {\n paddingBottom: theme.spacing(2),\n },\n paperStyle: {\n padding: theme.spacing(2),\n },\n }),\n);\n\nexport const WarningContent = ({ error }: { error: ConfigError }) => {\n if (!error.messages) {\n return <Typography>{error.message}</Typography>;\n }\n\n const messages = error.messages as string[];\n\n return (\n <Box>\n {messages.map(message => (\n <Typography>{message}</Typography>\n ))}\n </Box>\n );\n};\n\n/** @public */\nexport const ConfigContent = () => {\n const classes = useStyles();\n const theme = useTheme();\n const { configInfo, loading, error } = useConfig();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!configInfo) {\n return <Alert severity=\"error\">Unable to load config data</Alert>;\n }\n\n return (\n <Box>\n {configInfo && configInfo.error && (\n <Box className={classes.warningStyle}>\n <WarningPanel title=\"Config validation failed\">\n <WarningContent error={configInfo.error} />\n </WarningPanel>\n </Box>\n )}\n <Paper className={classes.paperStyle}>\n <ReactJson\n src={configInfo.config as object}\n name=\"config\"\n enableClipboard={false}\n theme={theme.palette.type === 'dark' ? 'chalk' : 'rjv-default'}\n />\n </Paper>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA+BA,MAAM,SAAA,GAAY,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAA,CAAa;AAAA,IACX,YAAA,EAAc;AAAA,MACZ,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,KAChC;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAC1B,GACD;AACH,CAAA;AAEO,MAAM,cAAA,GAAiB,CAAC,EAAE,KAAA,EAAM,KAA8B;AACnE,EAAA,IAAI,CAAC,MAAM,QAAA,EAAU;AACnB,IAAA,uBAAO,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,KAAA,CAAM,OAAA,EAAQ,CAAA;AAAA,EACpC;AAEA,EAAA,MAAM,WAAW,KAAA,CAAM,QAAA;AAEvB,EAAA,uBACE,GAAA,CAAC,OACE,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,6BACZ,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,OAAA,EAAQ,CACtB,CAAA,EACH,CAAA;AAEJ;AAGO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,QAAQ,QAAA,EAAS;AACvB,EAAA,MAAM,EAAE,UAAA,EAAY,OAAA,EAAS,KAAA,KAAU,SAAA,EAAU;AAEjD,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB,WAAW,KAAA,EAAO;AAChB,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAS,gBAAM,OAAA,EAAQ,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAQ,QAAA,EAAA,4BAAA,EAA0B,CAAA;AAAA,EAC3D;AAEA,EAAA,4BACG,GAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,UAAA,IAAc,WAAW,KAAA,oBACxB,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,QAAQ,YAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,KAAA,EAAM,4BAClB,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,OAAO,UAAA,CAAW,KAAA,EAAO,GAC3C,CAAA,EACF,CAAA;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,UAAA,EACxB,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,KAAK,UAAA,CAAW,MAAA;AAAA,QAChB,IAAA,EAAK,QAAA;AAAA,QACL,eAAA,EAAiB,KAAA;AAAA,QACjB,KAAA,EAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,SAAS,OAAA,GAAU;AAAA;AAAA,KACnD,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -11,6 +11,7 @@ import '@backstage/errors';
11
11
  import '@backstage/core-plugin-api';
12
12
  import 'react-use/esm/useAsync';
13
13
  import { useExternalDependencies } from '../../../hooks/useExternalDependencies.esm.js';
14
+ import 'react';
14
15
 
15
16
  const useStyles = makeStyles(
16
17
  (theme) => createStyles({
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalDependenciesContent.esm.js","sources":["../../../../src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 Progress,\n StatusError,\n StatusOK,\n StatusWarning,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { ExternalDependency } from '@backstage/plugin-devtools-common';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useExternalDependencies } from '../../../hooks';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n paperStyle: {\n padding: theme.spacing(2),\n },\n }),\n);\n\nexport const getExternalDependencyStatus = (\n result: Partial<ExternalDependency> | undefined,\n) => {\n switch (result?.status) {\n case 'Healthy':\n return (\n <Typography component=\"span\">\n <StatusOK /> {result.status}\n </Typography>\n );\n case 'Unhealthy':\n return (\n <Typography component=\"span\">\n <StatusError /> {`${result.status}`}\n </Typography>\n );\n case undefined:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\nconst columns: TableColumn[] = [\n {\n title: 'Name',\n width: 'auto',\n field: 'name',\n },\n {\n title: 'Target',\n width: 'auto',\n field: 'target',\n },\n {\n title: 'Type',\n width: 'auto',\n field: 'type',\n },\n {\n title: 'Status',\n width: 'auto',\n render: (row: Partial<ExternalDependency>) => (\n <Grid container direction=\"column\">\n <Grid item>\n <Typography variant=\"button\">\n {getExternalDependencyStatus(row)}\n </Typography>\n </Grid>\n <Grid item>{row.error && <Typography>{row.error}</Typography>}</Grid>\n </Grid>\n ),\n },\n];\n\n/** @public */\nexport const ExternalDependenciesContent = () => {\n const classes = useStyles();\n const { externalDependencies, loading, error } = useExternalDependencies();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!externalDependencies || externalDependencies.length === 0) {\n return (\n <Box>\n <Paper className={classes.paperStyle}>\n <Typography>No external dependencies found</Typography>\n </Paper>\n </Box>\n );\n }\n\n return (\n <Table\n title=\"Status\"\n options={{\n paging: true,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n loadingType: 'linear',\n showEmptyDataSourceMessage: !loading,\n }}\n columns={columns}\n data={externalDependencies || []}\n />\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ExternalDependenciesContent.esm.js","sources":["../../../../src/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 Progress,\n StatusError,\n StatusOK,\n StatusWarning,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { ExternalDependency } from '@backstage/plugin-devtools-common';\nimport Box from '@material-ui/core/Box';\nimport Grid from '@material-ui/core/Grid';\nimport Paper from '@material-ui/core/Paper';\nimport Typography from '@material-ui/core/Typography';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useExternalDependencies } from '../../../hooks';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n paperStyle: {\n padding: theme.spacing(2),\n },\n }),\n);\n\nexport const getExternalDependencyStatus = (\n result: Partial<ExternalDependency> | undefined,\n) => {\n switch (result?.status) {\n case 'Healthy':\n return (\n <Typography component=\"span\">\n <StatusOK /> {result.status}\n </Typography>\n );\n case 'Unhealthy':\n return (\n <Typography component=\"span\">\n <StatusError /> {`${result.status}`}\n </Typography>\n );\n case undefined:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\nconst columns: TableColumn[] = [\n {\n title: 'Name',\n width: 'auto',\n field: 'name',\n },\n {\n title: 'Target',\n width: 'auto',\n field: 'target',\n },\n {\n title: 'Type',\n width: 'auto',\n field: 'type',\n },\n {\n title: 'Status',\n width: 'auto',\n render: (row: Partial<ExternalDependency>) => (\n <Grid container direction=\"column\">\n <Grid item>\n <Typography variant=\"button\">\n {getExternalDependencyStatus(row)}\n </Typography>\n </Grid>\n <Grid item>{row.error && <Typography>{row.error}</Typography>}</Grid>\n </Grid>\n ),\n },\n];\n\n/** @public */\nexport const ExternalDependenciesContent = () => {\n const classes = useStyles();\n const { externalDependencies, loading, error } = useExternalDependencies();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n\n if (!externalDependencies || externalDependencies.length === 0) {\n return (\n <Box>\n <Paper className={classes.paperStyle}>\n <Typography>No external dependencies found</Typography>\n </Paper>\n </Box>\n );\n }\n\n return (\n <Table\n title=\"Status\"\n options={{\n paging: true,\n pageSize: 20,\n pageSizeOptions: [20, 50, 100],\n loadingType: 'linear',\n showEmptyDataSourceMessage: !loading,\n }}\n columns={columns}\n data={externalDependencies || []}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAiCA,MAAM,SAAA,GAAY,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAA,CAAa;AAAA,IACX,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAC1B,GACD;AACH,CAAA;AAEO,MAAM,2BAAA,GAA8B,CACzC,MAAA,KACG;AACH,EAAA,QAAQ,QAAQ,MAAA;AAAQ,IACtB,KAAK,SAAA;AACH,MAAA,uBACE,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EACpB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,MAAA,CAAO;AAAA,OAAA,EACvB,CAAA;AAAA,IAEJ,KAAK,WAAA;AACH,MAAA,uBACE,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EACpB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,CAAA,EAAG,OAAO,MAAM,CAAA;AAAA,OAAA,EACnC,CAAA;AAAA,IAEJ,KAAK,MAAA;AAAA,IACL;AACE,MAAA,uBACE,IAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,MAAA,EACpB,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,CAAA;AAAA,QAAE;AAAA,OAAA,EACnB,CAAA;AAAA;AAGR;AAEA,MAAM,OAAA,GAAyB;AAAA,EAC7B;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAA,qBACP,IAAA,CAAC,QAAK,SAAA,EAAS,IAAA,EAAC,WAAU,QAAA,EACxB,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EACR,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,SAAQ,QAAA,EACjB,QAAA,EAAA,2BAAA,CAA4B,GAAG,CAAA,EAClC,CAAA,EACF,CAAA;AAAA,sBACA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAI,IAAA,EAAE,QAAA,EAAA,GAAA,CAAI,yBAAS,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,GAAA,CAAI,KAAA,EAAM,CAAA,EAAc;AAAA,KAAA,EAChE;AAAA;AAGN,CAAA;AAGO,MAAM,8BAA8B,MAAM;AAC/C,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,EAAE,oBAAA,EAAsB,OAAA,EAAS,KAAA,KAAU,uBAAA,EAAwB;AAEzE,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,2BAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,EACnB,WAAW,KAAA,EAAO;AAChB,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAM,QAAA,EAAS,OAAA,EAAS,gBAAM,OAAA,EAAQ,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,CAAC,oBAAA,IAAwB,oBAAA,CAAqB,MAAA,KAAW,CAAA,EAAG;AAC9D,IAAA,uBACE,GAAA,CAAC,GAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAW,OAAA,CAAQ,UAAA,EACxB,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,QAAA,EAAA,gCAAA,EAA8B,CAAA,EAC5C,CAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,QAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,IAAA;AAAA,QACR,QAAA,EAAU,EAAA;AAAA,QACV,eAAA,EAAiB,CAAC,EAAA,EAAI,EAAA,EAAI,GAAG,CAAA;AAAA,QAC7B,WAAA,EAAa,QAAA;AAAA,QACb,4BAA4B,CAAC;AAAA,OAC/B;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,wBAAwB;AAAC;AAAA,GACjC;AAEJ;;;;"}
@@ -16,6 +16,7 @@ import '@backstage/errors';
16
16
  import '@backstage/core-plugin-api';
17
17
  import 'react-use/esm/useAsync';
18
18
  import { useInfo } from '../../../hooks/useInfo.esm.js';
19
+ import 'react';
19
20
  import { InfoDependenciesTable } from './InfoDependenciesTable.esm.js';
20
21
  import DescriptionIcon from '@material-ui/icons/Description';
21
22
  import MemoryIcon from '@material-ui/icons/Memory';
@@ -1 +1 @@
1
- {"version":3,"file":"InfoContent.esm.js","sources":["../../../../src/components/Content/InfoContent/InfoContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { Progress } from '@backstage/core-components';\nimport Avatar from '@material-ui/core/Avatar';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Paper from '@material-ui/core/Paper';\nimport Button from '@material-ui/core/Button';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useInfo } from '../../../hooks';\nimport { InfoDependenciesTable } from './InfoDependenciesTable';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport MemoryIcon from '@material-ui/icons/Memory';\nimport DeveloperBoardIcon from '@material-ui/icons/DeveloperBoard';\nimport { BackstageLogoIcon } from './BackstageLogoIcon';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { DevToolsInfo } from '@backstage/plugin-devtools-common';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n paperStyle: {\n display: 'flex',\n marginBottom: theme.spacing(2),\n },\n flexContainer: {\n display: 'flex',\n flexDirection: 'row',\n padding: 0,\n },\n copyButton: {\n float: 'left',\n margin: theme.spacing(2),\n },\n }),\n);\n\nconst copyToClipboard = ({ about }: { about: DevToolsInfo | undefined }) => {\n if (about) {\n let formatted = `OS: ${about.operatingSystem}\\nResources: ${about.resourceUtilization}\\nnode: ${about.nodeJsVersion}\\nbackstage: ${about.backstageVersion}\\nDependencies:\\n`;\n const deps = about.dependencies;\n for (const key in deps) {\n if (Object.prototype.hasOwnProperty.call(deps, key)) {\n formatted = `${formatted} ${deps[key].name}: ${deps[key].versions}\\n`;\n }\n }\n window.navigator.clipboard.writeText(formatted);\n }\n};\n\n/** @public */\nexport const InfoContent = () => {\n const classes = useStyles();\n const { about, loading, error } = useInfo();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n return (\n <Box>\n <Paper className={classes.paperStyle}>\n <List className={classes.flexContainer}>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <DeveloperBoardIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Operating System\"\n secondary={about?.operatingSystem}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <MemoryIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Resource utilization\"\n secondary={about?.resourceUtilization}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <DescriptionIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"NodeJS Version\"\n secondary={about?.nodeJsVersion}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <BackstageLogoIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Backstage Version\"\n secondary={about?.backstageVersion}\n />\n </ListItem>\n </List>\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\n <Button\n onClick={() => {\n copyToClipboard({ about });\n }}\n className={classes.copyButton}\n startIcon={<FileCopyIcon />}\n >\n Copy Info to Clipboard\n </Button>\n </Paper>\n <InfoDependenciesTable infoDependencies={about?.dependencies} />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"InfoContent.esm.js","sources":["../../../../src/components/Content/InfoContent/InfoContent.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { Progress } from '@backstage/core-components';\nimport Avatar from '@material-ui/core/Avatar';\nimport Box from '@material-ui/core/Box';\nimport Divider from '@material-ui/core/Divider';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport ListItemAvatar from '@material-ui/core/ListItemAvatar';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Paper from '@material-ui/core/Paper';\nimport Button from '@material-ui/core/Button';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\nimport { useInfo } from '../../../hooks';\nimport { InfoDependenciesTable } from './InfoDependenciesTable';\nimport DescriptionIcon from '@material-ui/icons/Description';\nimport MemoryIcon from '@material-ui/icons/Memory';\nimport DeveloperBoardIcon from '@material-ui/icons/DeveloperBoard';\nimport { BackstageLogoIcon } from './BackstageLogoIcon';\nimport FileCopyIcon from '@material-ui/icons/FileCopy';\nimport { DevToolsInfo } from '@backstage/plugin-devtools-common';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n paperStyle: {\n display: 'flex',\n marginBottom: theme.spacing(2),\n },\n flexContainer: {\n display: 'flex',\n flexDirection: 'row',\n padding: 0,\n },\n copyButton: {\n float: 'left',\n margin: theme.spacing(2),\n },\n }),\n);\n\nconst copyToClipboard = ({ about }: { about: DevToolsInfo | undefined }) => {\n if (about) {\n let formatted = `OS: ${about.operatingSystem}\\nResources: ${about.resourceUtilization}\\nnode: ${about.nodeJsVersion}\\nbackstage: ${about.backstageVersion}\\nDependencies:\\n`;\n const deps = about.dependencies;\n for (const key in deps) {\n if (Object.prototype.hasOwnProperty.call(deps, key)) {\n formatted = `${formatted} ${deps[key].name}: ${deps[key].versions}\\n`;\n }\n }\n window.navigator.clipboard.writeText(formatted);\n }\n};\n\n/** @public */\nexport const InfoContent = () => {\n const classes = useStyles();\n const { about, loading, error } = useInfo();\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n }\n return (\n <Box>\n <Paper className={classes.paperStyle}>\n <List className={classes.flexContainer}>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <DeveloperBoardIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Operating System\"\n secondary={about?.operatingSystem}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <MemoryIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Resource utilization\"\n secondary={about?.resourceUtilization}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <DescriptionIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"NodeJS Version\"\n secondary={about?.nodeJsVersion}\n />\n </ListItem>\n <ListItem>\n <ListItemAvatar>\n <Avatar>\n <BackstageLogoIcon />\n </Avatar>\n </ListItemAvatar>\n <ListItemText\n primary=\"Backstage Version\"\n secondary={about?.backstageVersion}\n />\n </ListItem>\n </List>\n <Divider orientation=\"vertical\" variant=\"middle\" flexItem />\n <Button\n onClick={() => {\n copyToClipboard({ about });\n }}\n className={classes.copyButton}\n startIcon={<FileCopyIcon />}\n >\n Copy Info to Clipboard\n </Button>\n </Paper>\n <InfoDependenciesTable infoDependencies={about?.dependencies} />\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import Grid from '@material-ui/core/Grid';
3
+ import Typography from '@material-ui/core/Typography';
4
+ import Box from '@material-ui/core/Box';
5
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
6
+ import Alert from '@material-ui/lab/Alert';
7
+
8
+ const useStyles = makeStyles(
9
+ (theme) => createStyles({
10
+ detailPanel: {
11
+ padding: theme.spacing(2),
12
+ backgroundColor: theme.palette.background.default
13
+ },
14
+ detailLabel: {
15
+ fontWeight: "bold",
16
+ marginRight: theme.spacing(1)
17
+ },
18
+ errorIcon: {
19
+ color: theme.palette.error.main,
20
+ marginRight: theme.spacing(1),
21
+ fontSize: "1.2rem"
22
+ },
23
+ detailPanelAlert: {
24
+ marginBottom: theme.spacing(2)
25
+ }
26
+ })
27
+ );
28
+ const ScheduledTaskDetailPanel = ({
29
+ rowData
30
+ }) => {
31
+ const classes = useStyles();
32
+ const lastRunError = rowData.taskState?.lastRunError;
33
+ const DetailItem = ({ title, value }) => /* @__PURE__ */ jsxs(Fragment, { children: [
34
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 3, children: /* @__PURE__ */ jsxs(Typography, { variant: "subtitle2", className: classes.detailLabel, children: [
35
+ title,
36
+ ":"
37
+ ] }) }),
38
+ /* @__PURE__ */ jsx(Grid, { item: true, xs: 9, children: /* @__PURE__ */ jsx(Typography, { variant: "body2", component: "code", children: value || "N/A" }) })
39
+ ] });
40
+ return /* @__PURE__ */ jsxs(Box, { className: classes.detailPanel, children: [
41
+ lastRunError && /* @__PURE__ */ jsxs(Alert, { severity: "error", className: classes.detailPanelAlert, children: [
42
+ /* @__PURE__ */ jsx("strong", { children: "Last Run Error:" }),
43
+ " ",
44
+ lastRunError
45
+ ] }),
46
+ /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
47
+ /* @__PURE__ */ jsx(DetailItem, { title: "Worker State", value: rowData.workerState?.status }),
48
+ /* @__PURE__ */ jsx(
49
+ DetailItem,
50
+ {
51
+ title: "Frequency (Cadence)",
52
+ value: rowData.settings?.cadence?.toString()
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsx(DetailItem, { title: "Scope", value: rowData.scope }),
56
+ /* @__PURE__ */ jsx(
57
+ DetailItem,
58
+ {
59
+ title: "Started At",
60
+ value: rowData.taskState?.status === "running" && rowData.taskState.startedAt ? new Date(rowData.taskState.startedAt).toLocaleString() : "N/A"
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsx(
64
+ DetailItem,
65
+ {
66
+ title: "Times Out At",
67
+ value: rowData.taskState?.status === "running" && rowData.taskState.timesOutAt ? new Date(rowData.taskState.timesOutAt).toLocaleString() : "N/A"
68
+ }
69
+ )
70
+ ] })
71
+ ] });
72
+ };
73
+
74
+ export { ScheduledTaskDetailPanel };
75
+ //# sourceMappingURL=ScheduledTaskDetailedPanel.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduledTaskDetailedPanel.esm.js","sources":["../../../../src/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha';\nimport Grid from '@material-ui/core/Grid';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Alert from '@material-ui/lab/Alert';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n detailPanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n detailLabel: {\n fontWeight: 'bold',\n marginRight: theme.spacing(1),\n },\n errorIcon: {\n color: theme.palette.error.main,\n marginRight: theme.spacing(1),\n fontSize: '1.2rem',\n },\n detailPanelAlert: {\n marginBottom: theme.spacing(2),\n },\n }),\n);\n\n/** @public */\nexport const ScheduledTaskDetailPanel = ({\n rowData,\n}: {\n rowData: TaskApiTasksResponse;\n}) => {\n const classes = useStyles();\n const lastRunError = rowData.taskState?.lastRunError;\n\n const DetailItem = ({ title, value }: { title: string; value: any }) => (\n <>\n <Grid item xs={3}>\n <Typography variant=\"subtitle2\" className={classes.detailLabel}>\n {title}:\n </Typography>\n </Grid>\n <Grid item xs={9}>\n <Typography variant=\"body2\" component=\"code\">\n {value || 'N/A'}\n </Typography>\n </Grid>\n </>\n );\n\n return (\n <Box className={classes.detailPanel}>\n {lastRunError && (\n <Alert severity=\"error\" className={classes.detailPanelAlert}>\n <strong>Last Run Error:</strong> {lastRunError}\n </Alert>\n )}\n\n <Grid container spacing={1}>\n <DetailItem title=\"Worker State\" value={rowData.workerState?.status} />\n <DetailItem\n title=\"Frequency (Cadence)\"\n value={rowData.settings?.cadence?.toString()}\n />\n <DetailItem title=\"Scope\" value={rowData.scope} />\n <DetailItem\n title=\"Started At\"\n value={\n rowData.taskState?.status === 'running' &&\n rowData.taskState.startedAt\n ? new Date(rowData.taskState.startedAt).toLocaleString()\n : 'N/A'\n }\n />\n <DetailItem\n title=\"Times Out At\"\n value={\n rowData.taskState?.status === 'running' &&\n rowData.taskState.timesOutAt\n ? new Date(rowData.taskState.timesOutAt).toLocaleString()\n : 'N/A'\n }\n />\n </Grid>\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,243 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { useState } from 'react';
3
+ import Box from '@material-ui/core/Box';
4
+ import Typography from '@material-ui/core/Typography';
5
+ import IconButton from '@material-ui/core/IconButton';
6
+ import Tooltip from '@material-ui/core/Tooltip';
7
+ import Autocomplete from '@material-ui/lab/Autocomplete';
8
+ import TextField from '@material-ui/core/TextField';
9
+ import { makeStyles, createStyles } from '@material-ui/core/styles';
10
+ import { Progress, ErrorPanel, Table } from '@backstage/core-components';
11
+ import Alert from '@material-ui/lab/Alert';
12
+ import '../../../api/DevToolsApi.esm.js';
13
+ import '@backstage/errors';
14
+ import { useApi, configApiRef, alertApiRef } from '@backstage/core-plugin-api';
15
+ import 'react-use/esm/useAsync';
16
+ import { useScheduledTasks } from '../../../hooks/useScheduledTasks.esm.js';
17
+ import { useTriggerScheduledTask } from '../../../hooks/useTriggerScheduledTask.esm.js';
18
+ import RefreshIcon from '@material-ui/icons/Refresh';
19
+ import NightsStay from '@material-ui/icons/NightsStay';
20
+ import ErrorIcon from '@material-ui/icons/Error';
21
+ import CircularProgress from '@material-ui/core/CircularProgress';
22
+ import { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel.esm.js';
23
+ import { RequirePermission } from '@backstage/plugin-permission-react';
24
+ import { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common/alpha';
25
+
26
+ const useStyles = makeStyles(
27
+ (theme) => createStyles({
28
+ paperStyle: {
29
+ display: "flex",
30
+ marginBottom: theme.spacing(2)
31
+ },
32
+ flexContainer: {
33
+ display: "flex",
34
+ flexDirection: "row",
35
+ padding: 0
36
+ },
37
+ formControl: {
38
+ minWidth: 240,
39
+ marginBottom: theme.spacing(2)
40
+ },
41
+ detailPanel: {
42
+ padding: theme.spacing(2),
43
+ backgroundColor: theme.palette.background.default
44
+ },
45
+ detailLabel: {
46
+ fontWeight: "bold",
47
+ marginRight: theme.spacing(1)
48
+ },
49
+ errorIcon: {
50
+ color: theme.palette.error.main,
51
+ marginRight: theme.spacing(1),
52
+ fontSize: "1.2rem"
53
+ },
54
+ detailPanelAlert: {
55
+ marginBottom: theme.spacing(2)
56
+ }
57
+ })
58
+ );
59
+ const StatusDisplay = ({
60
+ icon,
61
+ text
62
+ }) => /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
63
+ icon,
64
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", style: { marginLeft: 8 }, children: text })
65
+ ] });
66
+ const ScheduledTasksContent = () => {
67
+ const classes = useStyles();
68
+ const configApi = useApi(configApiRef);
69
+ const alertApi = useApi(alertApiRef);
70
+ const plugins = configApi.getOptionalStringArray("devTools.scheduledTasks.plugins") || [];
71
+ const [selectedPlugin, setSelectedPlugin] = useState(plugins[0] || "");
72
+ const { scheduledTasks, loading, error } = useScheduledTasks(selectedPlugin);
73
+ const { triggerTask, isTriggering, triggerError } = useTriggerScheduledTask();
74
+ const [inputValue, setInputValue] = useState("");
75
+ const handleAutocompleteChange = (_event, newValue) => {
76
+ setSelectedPlugin(newValue || "");
77
+ };
78
+ const handleCommitChange = () => {
79
+ if (inputValue !== selectedPlugin) {
80
+ setSelectedPlugin(inputValue);
81
+ }
82
+ };
83
+ const handleKeyDown = (event) => {
84
+ if (event.key === "Enter") {
85
+ handleCommitChange();
86
+ event.preventDefault();
87
+ event.stopPropagation();
88
+ }
89
+ };
90
+ if (!plugins || plugins.length === 0) {
91
+ return /* @__PURE__ */ jsx(Alert, { severity: "info", children: "No plugins configured for scheduled tasks. Please configure `devTools.scheduledTasks.plugins` in app-config.yaml." });
92
+ }
93
+ const columns = [
94
+ {
95
+ title: "Task ID",
96
+ field: "taskId",
97
+ width: "35%",
98
+ render: (rowData) => {
99
+ const errorIconStyle = {
100
+ color: "#f44336",
101
+ marginRight: "8px",
102
+ fontSize: "1.2rem",
103
+ verticalAlign: "middle"
104
+ };
105
+ return /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
106
+ rowData.taskState?.lastRunError && /* @__PURE__ */ jsx(ErrorIcon, { style: errorIconStyle }),
107
+ /* @__PURE__ */ jsx(Typography, { children: rowData.taskId })
108
+ ] });
109
+ }
110
+ },
111
+ {
112
+ title: "Status",
113
+ field: "taskState.status",
114
+ width: "15%",
115
+ render: (rowData) => {
116
+ const status = rowData.taskState?.status;
117
+ if (status === "idle") {
118
+ return /* @__PURE__ */ jsx(StatusDisplay, { icon: /* @__PURE__ */ jsx(NightsStay, { fontSize: "small" }), text: "Idle" });
119
+ }
120
+ if (status === "running") {
121
+ return /* @__PURE__ */ jsx(
122
+ StatusDisplay,
123
+ {
124
+ icon: /* @__PURE__ */ jsx(CircularProgress, { color: "inherit", size: "30px" }),
125
+ text: "Running"
126
+ }
127
+ );
128
+ }
129
+ return /* @__PURE__ */ jsx(Typography, { variant: "body2", children: status || "N/A" });
130
+ }
131
+ },
132
+ {
133
+ title: "Last Run",
134
+ field: "taskState.lastRunEndedAt",
135
+ width: "25%",
136
+ render: (rowData) => rowData.taskState?.lastRunEndedAt ? new Date(rowData.taskState.lastRunEndedAt).toLocaleString() : "N/A"
137
+ },
138
+ {
139
+ title: "Next Run",
140
+ width: "15%",
141
+ render: (rowData) => rowData.taskState?.status === "idle" && rowData.taskState.startsAt ? new Date(rowData.taskState.startsAt).toLocaleString() : "N/A"
142
+ },
143
+ {
144
+ title: "Actions",
145
+ render: (rowData) => /* @__PURE__ */ jsx(RequirePermission, { permission: devToolsTaskSchedulerCreatePermission, children: /* @__PURE__ */ jsx(Tooltip, { title: "Run Task", children: /* @__PURE__ */ jsx(
146
+ IconButton,
147
+ {
148
+ "aria-label": "Trigger",
149
+ disabled: isTriggering,
150
+ onClick: () => {
151
+ triggerTask(selectedPlugin, rowData.taskId);
152
+ if (triggerError) {
153
+ alertApi.post({
154
+ message: `Error triggering task ${rowData.taskId}: ${error}`,
155
+ severity: "error"
156
+ });
157
+ } else {
158
+ alertApi.post({
159
+ message: `Successfully triggered task ${rowData.taskId}`,
160
+ severity: "success"
161
+ });
162
+ }
163
+ },
164
+ children: /* @__PURE__ */ jsx(RefreshIcon, {})
165
+ }
166
+ ) }) }),
167
+ sorting: false,
168
+ width: "10%"
169
+ }
170
+ ];
171
+ return /* @__PURE__ */ jsxs(Box, { children: [
172
+ /* @__PURE__ */ jsx(
173
+ Autocomplete,
174
+ {
175
+ className: classes.formControl,
176
+ classes: { root: classes.formControl },
177
+ freeSolo: true,
178
+ options: plugins,
179
+ value: selectedPlugin,
180
+ inputValue,
181
+ onChange: handleAutocompleteChange,
182
+ onInputChange: (_event, newInputValue) => {
183
+ setInputValue(newInputValue);
184
+ },
185
+ renderInput: (params) => /* @__PURE__ */ jsx(
186
+ TextField,
187
+ {
188
+ ...params,
189
+ label: "Select Plugin",
190
+ variant: "outlined",
191
+ onKeyDown: handleKeyDown,
192
+ onBlur: handleCommitChange
193
+ }
194
+ )
195
+ }
196
+ ),
197
+ loading && /* @__PURE__ */ jsx(Progress, {}),
198
+ error && /* @__PURE__ */ jsxs(
199
+ ErrorPanel,
200
+ {
201
+ error: new Error(`No scheduled tasks found for "${selectedPlugin}"`),
202
+ title: "No Scheduled Tasks Found",
203
+ children: [
204
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
205
+ 'The plugin ID "',
206
+ selectedPlugin,
207
+ `" doesn't have any scheduled tasks or may contain a typo.`
208
+ ] }),
209
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", style: { marginTop: 8 }, children: "Please verify:" }),
210
+ /* @__PURE__ */ jsxs("ul", { children: [
211
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "The plugin ID is spelled correctly" }) }),
212
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "The plugin has registered scheduled tasks" }) })
213
+ ] })
214
+ ]
215
+ }
216
+ ),
217
+ !loading && !error && /* @__PURE__ */ jsx(
218
+ Table,
219
+ {
220
+ title: `Scheduled Tasks (${selectedPlugin})`,
221
+ options: {
222
+ paging: true,
223
+ search: true,
224
+ sorting: true,
225
+ searchFieldAlignment: "right"
226
+ },
227
+ columns,
228
+ data: scheduledTasks || [],
229
+ emptyContent: /* @__PURE__ */ jsxs(Alert, { severity: "info", children: [
230
+ "No scheduled tasks found for ",
231
+ selectedPlugin,
232
+ "."
233
+ ] }),
234
+ detailPanel: ({ rowData }) => {
235
+ return /* @__PURE__ */ jsx(ScheduledTaskDetailPanel, { rowData });
236
+ }
237
+ }
238
+ )
239
+ ] });
240
+ };
241
+
242
+ export { ScheduledTasksContent };
243
+ //# sourceMappingURL=ScheduledTasksContent.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduledTasksContent.esm.js","sources":["../../../../src/components/Content/ScheduledTasksContent/ScheduledTasksContent.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 { useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport { makeStyles, createStyles, Theme } from '@material-ui/core/styles';\nimport {\n ErrorPanel,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport Alert from '@material-ui/lab/Alert';\nimport { useScheduledTasks, useTriggerScheduledTask } from '../../../hooks';\nimport { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha';\nimport { alertApiRef, configApiRef, useApi } from '@backstage/core-plugin-api';\nimport RefreshIcon from '@material-ui/icons/Refresh';\nimport NightsStay from '@material-ui/icons/NightsStay';\nimport ErrorIcon from '@material-ui/icons/Error';\nimport CircularProgress from '@material-ui/core/CircularProgress';\nimport { ScheduledTaskDetailPanel } from './ScheduledTaskDetailedPanel';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { devToolsTaskSchedulerCreatePermission } from '@backstage/plugin-devtools-common/alpha';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n paperStyle: {\n display: 'flex',\n marginBottom: theme.spacing(2),\n },\n flexContainer: {\n display: 'flex',\n flexDirection: 'row',\n padding: 0,\n },\n formControl: {\n minWidth: 240,\n marginBottom: theme.spacing(2),\n },\n detailPanel: {\n padding: theme.spacing(2),\n backgroundColor: theme.palette.background.default,\n },\n detailLabel: {\n fontWeight: 'bold',\n marginRight: theme.spacing(1),\n },\n errorIcon: {\n color: theme.palette.error.main,\n marginRight: theme.spacing(1),\n fontSize: '1.2rem',\n },\n detailPanelAlert: {\n marginBottom: theme.spacing(2),\n },\n }),\n);\n\nconst StatusDisplay = ({\n icon,\n text,\n}: {\n icon: React.ReactNode;\n text: string;\n}) => (\n <Box display=\"flex\" alignItems=\"center\">\n {icon}\n <Typography variant=\"body2\" style={{ marginLeft: 8 }}>\n {text}\n </Typography>\n </Box>\n);\n\n/** @public */\nexport const ScheduledTasksContent = () => {\n const classes = useStyles();\n const configApi = useApi(configApiRef);\n const alertApi = useApi(alertApiRef);\n const plugins =\n configApi.getOptionalStringArray('devTools.scheduledTasks.plugins') || [];\n const [selectedPlugin, setSelectedPlugin] = useState(plugins[0] || '');\n const { scheduledTasks, loading, error } = useScheduledTasks(selectedPlugin);\n const { triggerTask, isTriggering, triggerError } = useTriggerScheduledTask();\n\n const [inputValue, setInputValue] = useState('');\n\n const handleAutocompleteChange = (_event: any, newValue: string | null) => {\n setSelectedPlugin(newValue || '');\n };\n\n const handleCommitChange = () => {\n if (inputValue !== selectedPlugin) {\n setSelectedPlugin(inputValue);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n handleCommitChange();\n // Prevent Autocomplete's default behavior (which might select a filtered item)\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n if (!plugins || plugins.length === 0) {\n return (\n <Alert severity=\"info\">\n No plugins configured for scheduled tasks. Please configure\n `devTools.scheduledTasks.plugins` in app-config.yaml.\n </Alert>\n );\n }\n\n const columns: TableColumn<TaskApiTasksResponse>[] = [\n {\n title: 'Task ID',\n field: 'taskId',\n width: '35%',\n render: (rowData: TaskApiTasksResponse) => {\n const errorIconStyle: React.CSSProperties = {\n color: '#f44336',\n marginRight: '8px',\n fontSize: '1.2rem',\n verticalAlign: 'middle',\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n {rowData.taskState?.lastRunError && (\n <ErrorIcon style={errorIconStyle} />\n )}\n <Typography>{rowData.taskId}</Typography>\n </Box>\n );\n },\n },\n {\n title: 'Status',\n field: 'taskState.status',\n width: '15%',\n render: (rowData: TaskApiTasksResponse) => {\n const status = rowData.taskState?.status;\n\n if (status === 'idle') {\n return (\n <StatusDisplay icon={<NightsStay fontSize=\"small\" />} text=\"Idle\" />\n );\n }\n\n if (status === 'running') {\n return (\n <StatusDisplay\n icon={<CircularProgress color=\"inherit\" size=\"30px\" />}\n text=\"Running\"\n />\n );\n }\n\n return <Typography variant=\"body2\">{status || 'N/A'}</Typography>;\n },\n },\n {\n title: 'Last Run',\n field: 'taskState.lastRunEndedAt',\n width: '25%',\n render: (rowData: TaskApiTasksResponse) =>\n rowData.taskState?.lastRunEndedAt\n ? new Date(rowData.taskState.lastRunEndedAt).toLocaleString()\n : 'N/A',\n },\n {\n title: 'Next Run',\n width: '15%',\n render: (rowData: TaskApiTasksResponse) =>\n rowData.taskState?.status === 'idle' && rowData.taskState.startsAt\n ? new Date(rowData.taskState.startsAt).toLocaleString()\n : 'N/A',\n },\n {\n title: 'Actions',\n render: (rowData: TaskApiTasksResponse) => (\n <RequirePermission permission={devToolsTaskSchedulerCreatePermission}>\n <Tooltip title=\"Run Task\">\n <IconButton\n aria-label=\"Trigger\"\n disabled={isTriggering}\n onClick={() => {\n triggerTask(selectedPlugin, rowData.taskId);\n if (triggerError) {\n alertApi.post({\n message: `Error triggering task ${rowData.taskId}: ${error}`,\n severity: 'error',\n });\n } else {\n alertApi.post({\n message: `Successfully triggered task ${rowData.taskId}`,\n severity: 'success',\n });\n }\n }}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n </RequirePermission>\n ),\n sorting: false,\n width: '10%',\n },\n ];\n\n return (\n <Box>\n <Autocomplete\n className={classes.formControl}\n classes={{ root: classes.formControl }}\n freeSolo\n options={plugins}\n value={selectedPlugin}\n inputValue={inputValue}\n onChange={handleAutocompleteChange}\n onInputChange={(_event, newInputValue) => {\n setInputValue(newInputValue);\n }}\n renderInput={params => (\n <TextField\n {...params}\n label=\"Select Plugin\"\n variant=\"outlined\"\n onKeyDown={handleKeyDown}\n onBlur={handleCommitChange}\n />\n )}\n />\n\n {loading && <Progress />}\n\n {error && (\n <ErrorPanel\n error={new Error(`No scheduled tasks found for \"${selectedPlugin}\"`)}\n title=\"No Scheduled Tasks Found\"\n >\n <Typography variant=\"body2\">\n The plugin ID \"{selectedPlugin}\" doesn't have any scheduled tasks or\n may contain a typo.\n </Typography>\n <Typography variant=\"body2\" style={{ marginTop: 8 }}>\n Please verify:\n </Typography>\n <ul>\n <li>\n <Typography variant=\"body2\">\n The plugin ID is spelled correctly\n </Typography>\n </li>\n <li>\n <Typography variant=\"body2\">\n The plugin has registered scheduled tasks\n </Typography>\n </li>\n </ul>\n </ErrorPanel>\n )}\n\n {!loading && !error && (\n <Table\n title={`Scheduled Tasks (${selectedPlugin})`}\n options={{\n paging: true,\n search: true,\n sorting: true,\n searchFieldAlignment: 'right',\n }}\n columns={columns}\n data={scheduledTasks || []}\n emptyContent={\n <Alert severity=\"info\">\n No scheduled tasks found for {selectedPlugin}.\n </Alert>\n }\n detailPanel={({ rowData }) => {\n return <ScheduledTaskDetailPanel rowData={rowData} />;\n }}\n />\n )}\n </Box>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,17 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { devToolsInfoReadPermission, devToolsConfigReadPermission } from '@backstage/plugin-devtools-common';
3
+ import { devToolsTaskSchedulerReadPermission } from '@backstage/plugin-devtools-common/alpha';
3
4
  import { ConfigContent } from '../Content/ConfigContent/ConfigContent.esm.js';
4
5
  import { DevToolsLayout } from '../DevToolsLayout/DevToolsLayout.esm.js';
5
6
  import { InfoContent } from '../Content/InfoContent/InfoContent.esm.js';
6
7
  import { RequirePermission } from '@backstage/plugin-permission-react';
8
+ import { ScheduledTasksContent } from '../Content/ScheduledTasksContent/ScheduledTasksContent.esm.js';
9
+ import '../Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js';
7
10
 
8
11
  const DefaultDevToolsPage = () => /* @__PURE__ */ jsxs(DevToolsLayout, { children: [
9
12
  /* @__PURE__ */ jsx(DevToolsLayout.Route, { path: "info", title: "Info", children: /* @__PURE__ */ jsx(RequirePermission, { permission: devToolsInfoReadPermission, children: /* @__PURE__ */ jsx(InfoContent, {}) }) }),
10
- /* @__PURE__ */ jsx(DevToolsLayout.Route, { path: "config", title: "Config", children: /* @__PURE__ */ jsx(RequirePermission, { permission: devToolsConfigReadPermission, children: /* @__PURE__ */ jsx(ConfigContent, {}) }) })
13
+ /* @__PURE__ */ jsx(DevToolsLayout.Route, { path: "config", title: "Config", children: /* @__PURE__ */ jsx(RequirePermission, { permission: devToolsConfigReadPermission, children: /* @__PURE__ */ jsx(ConfigContent, {}) }) }),
14
+ /* @__PURE__ */ jsx(DevToolsLayout.Route, { path: "scheduled-tasks", title: "Scheduled Tasks", children: /* @__PURE__ */ jsx(RequirePermission, { permission: devToolsTaskSchedulerReadPermission, children: /* @__PURE__ */ jsx(ScheduledTasksContent, {}) }) })
11
15
  ] });
12
16
 
13
17
  export { DefaultDevToolsPage };
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultDevToolsPage.esm.js","sources":["../../../src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 devToolsConfigReadPermission,\n devToolsInfoReadPermission,\n} from '@backstage/plugin-devtools-common';\n\nimport { ConfigContent } from '../Content/ConfigContent';\nimport { DevToolsLayout } from '../DevToolsLayout';\nimport { InfoContent } from '../Content/InfoContent';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\n\n/** @public */\nexport const DefaultDevToolsPage = () => (\n <DevToolsLayout>\n <DevToolsLayout.Route path=\"info\" title=\"Info\">\n <RequirePermission permission={devToolsInfoReadPermission}>\n <InfoContent />\n </RequirePermission>\n </DevToolsLayout.Route>\n <DevToolsLayout.Route path=\"config\" title=\"Config\">\n <RequirePermission permission={devToolsConfigReadPermission}>\n <ConfigContent />\n </RequirePermission>\n </DevToolsLayout.Route>\n </DevToolsLayout>\n);\n"],"names":[],"mappings":";;;;;;;AA2BO,MAAM,mBAAA,GAAsB,sBACjC,IAAA,CAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,IAAA,EAAK,QAAO,KAAA,EAAM,MAAA,EACtC,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,UAAA,EAAY,0BAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,GACf,CAAA,EACF,CAAA;AAAA,kBACA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,MAAK,QAAA,EAAS,KAAA,EAAM,QAAA,EACxC,QAAA,kBAAA,GAAA,CAAC,qBAAkB,UAAA,EAAY,4BAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,GACjB,CAAA,EACF;AAAA,CAAA,EACF;;;;"}
1
+ {"version":3,"file":"DefaultDevToolsPage.esm.js","sources":["../../../src/components/DefaultDevToolsPage/DefaultDevToolsPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 devToolsConfigReadPermission,\n devToolsInfoReadPermission,\n} from '@backstage/plugin-devtools-common';\nimport { devToolsTaskSchedulerReadPermission } from '@backstage/plugin-devtools-common/alpha';\nimport { ConfigContent } from '../Content/ConfigContent';\nimport { DevToolsLayout } from '../DevToolsLayout';\nimport { InfoContent } from '../Content/InfoContent';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { ScheduledTasksContent } from '../Content/ScheduledTasksContent';\n\n/** @public */\nexport const DefaultDevToolsPage = () => (\n <DevToolsLayout>\n <DevToolsLayout.Route path=\"info\" title=\"Info\">\n <RequirePermission permission={devToolsInfoReadPermission}>\n <InfoContent />\n </RequirePermission>\n </DevToolsLayout.Route>\n <DevToolsLayout.Route path=\"config\" title=\"Config\">\n <RequirePermission permission={devToolsConfigReadPermission}>\n <ConfigContent />\n </RequirePermission>\n </DevToolsLayout.Route>\n <DevToolsLayout.Route path=\"scheduled-tasks\" title=\"Scheduled Tasks\">\n <RequirePermission permission={devToolsTaskSchedulerReadPermission}>\n <ScheduledTasksContent />\n </RequirePermission>\n </DevToolsLayout.Route>\n </DevToolsLayout>\n);\n"],"names":[],"mappings":";;;;;;;;;;AA4BO,MAAM,mBAAA,GAAsB,sBACjC,IAAA,CAAC,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,IAAA,EAAK,QAAO,KAAA,EAAM,MAAA,EACtC,QAAA,kBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,UAAA,EAAY,0BAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,GACf,CAAA,EACF,CAAA;AAAA,kBACA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,MAAK,QAAA,EAAS,KAAA,EAAM,QAAA,EACxC,QAAA,kBAAA,GAAA,CAAC,qBAAkB,UAAA,EAAY,4BAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,aAAA,EAAA,EAAc,GACjB,CAAA,EACF,CAAA;AAAA,kBACA,GAAA,CAAC,cAAA,CAAe,KAAA,EAAf,EAAqB,MAAK,iBAAA,EAAkB,KAAA,EAAM,iBAAA,EACjD,QAAA,kBAAA,GAAA,CAAC,qBAAkB,UAAA,EAAY,mCAAA,EAC7B,QAAA,kBAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,GACzB,CAAA,EACF;AAAA,CAAA,EACF;;;;"}
@@ -0,0 +1,30 @@
1
+ import { devToolsApiRef } from '../api/DevToolsApi.esm.js';
2
+ import '@backstage/errors';
3
+ import { useApi } from '@backstage/core-plugin-api';
4
+ import useAsync from 'react-use/esm/useAsync';
5
+
6
+ const useScheduledTasks = (plugin) => {
7
+ const api = useApi(devToolsApiRef);
8
+ const {
9
+ value,
10
+ loading,
11
+ error: asyncError
12
+ } = useAsync(async () => {
13
+ return api.getScheduledTasksByPlugin(plugin);
14
+ }, [api, plugin]);
15
+ if (asyncError) {
16
+ return {
17
+ scheduledTasks: void 0,
18
+ loading: false,
19
+ error: asyncError.message
20
+ };
21
+ }
22
+ return {
23
+ scheduledTasks: value?.scheduledTasks,
24
+ loading,
25
+ error: value?.error
26
+ };
27
+ };
28
+
29
+ export { useScheduledTasks };
30
+ //# sourceMappingURL=useScheduledTasks.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScheduledTasks.esm.js","sources":["../../src/hooks/useScheduledTasks.ts"],"sourcesContent":["/*\n * Copyright 2025 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 { devToolsApiRef } from '../api';\nimport { useApi } from '@backstage/core-plugin-api';\nimport useAsync from 'react-use/esm/useAsync';\n\nexport const useScheduledTasks = (plugin: string) => {\n const api = useApi(devToolsApiRef);\n\n const {\n value,\n loading,\n error: asyncError,\n } = useAsync(async () => {\n return api.getScheduledTasksByPlugin(plugin);\n }, [api, plugin]);\n\n if (asyncError) {\n return {\n scheduledTasks: undefined,\n loading: false,\n error: asyncError.message,\n };\n }\n\n return {\n scheduledTasks: value?.scheduledTasks,\n loading,\n error: value?.error,\n };\n};\n"],"names":[],"mappings":";;;;;AAmBO,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAAmB;AACnD,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AAEjC,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT,GAAI,SAAS,YAAY;AACvB,IAAA,OAAO,GAAA,CAAI,0BAA0B,MAAM,CAAA;AAAA,EAC7C,CAAA,EAAG,CAAC,GAAA,EAAK,MAAM,CAAC,CAAA;AAEhB,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,cAAA,EAAgB,MAAA;AAAA,MAChB,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,UAAA,CAAW;AAAA,KACpB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,gBAAgB,KAAA,EAAO,cAAA;AAAA,IACvB,OAAA;AAAA,IACA,OAAO,KAAA,EAAO;AAAA,GAChB;AACF;;;;"}
@@ -0,0 +1,32 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { devToolsApiRef } from '../api/DevToolsApi.esm.js';
3
+ import '@backstage/errors';
4
+ import { useApi } from '@backstage/core-plugin-api';
5
+
6
+ const useTriggerScheduledTask = () => {
7
+ const api = useApi(devToolsApiRef);
8
+ const [isTriggering, setIsTriggering] = useState(false);
9
+ const [error, setError] = useState();
10
+ const triggerTask = useCallback(
11
+ async (plugin, taskId) => {
12
+ setIsTriggering(true);
13
+ setError(void 0);
14
+ try {
15
+ await api.triggerScheduledTask(plugin, taskId);
16
+ } catch (e) {
17
+ setError(e);
18
+ } finally {
19
+ setIsTriggering(false);
20
+ }
21
+ },
22
+ [api]
23
+ );
24
+ return {
25
+ triggerTask,
26
+ isTriggering,
27
+ triggerError: error?.message
28
+ };
29
+ };
30
+
31
+ export { useTriggerScheduledTask };
32
+ //# sourceMappingURL=useTriggerScheduledTask.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTriggerScheduledTask.esm.js","sources":["../../src/hooks/useTriggerScheduledTask.ts"],"sourcesContent":["/*\n * Copyright 2025 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, useCallback } from 'react';\nimport { devToolsApiRef } from '../api';\nimport { useApi } from '@backstage/core-plugin-api';\n\nexport const useTriggerScheduledTask = () => {\n const api = useApi(devToolsApiRef);\n const [isTriggering, setIsTriggering] = useState(false);\n const [error, setError] = useState<Error | undefined>();\n\n const triggerTask = useCallback(\n async (plugin: string, taskId: string) => {\n setIsTriggering(true);\n setError(undefined);\n\n try {\n await api.triggerScheduledTask(plugin, taskId);\n } catch (e) {\n setError(e);\n } finally {\n setIsTriggering(false);\n }\n },\n [api],\n );\n\n return {\n triggerTask,\n isTriggering,\n triggerError: error?.message,\n };\n};\n"],"names":[],"mappings":";;;;;AAmBO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAS,KAAK,CAAA;AACtD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA,EAA4B;AAEtD,EAAA,MAAM,WAAA,GAAc,WAAA;AAAA,IAClB,OAAO,QAAgB,MAAA,KAAmB;AACxC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,QAAA,CAAS,MAAS,CAAA;AAElB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC/C,SAAS,CAAA,EAAG;AACV,QAAA,QAAA,CAAS,CAAC,CAAA;AAAA,MACZ,CAAA,SAAE;AACA,QAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,MACvB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,GAAG;AAAA,GACN;AAEA,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,YAAA;AAAA,IACA,cAAc,KAAA,EAAO;AAAA,GACvB;AACF;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
+ import { TaskApiTasksResponse } from '@backstage/plugin-devtools-common/alpha';
3
4
  import { TabProps } from '@material-ui/core/Tab';
4
5
  import { ReactNode, ElementType } from 'react';
5
6
 
@@ -19,6 +20,14 @@ declare const InfoContent: () => react_jsx_runtime.JSX.Element;
19
20
  /** @public */
20
21
  declare const ExternalDependenciesContent: () => react_jsx_runtime.JSX.Element;
21
22
 
23
+ /** @public */
24
+ declare const ScheduledTasksContent: () => react_jsx_runtime.JSX.Element;
25
+
26
+ /** @public */
27
+ declare const ScheduledTaskDetailPanel: ({ rowData, }: {
28
+ rowData: TaskApiTasksResponse;
29
+ }) => react_jsx_runtime.JSX.Element;
30
+
22
31
  /** @public */
23
32
  type SubRoute = {
24
33
  path: string;
@@ -52,4 +61,5 @@ declare const DevToolsLayout: {
52
61
  Route: (props: SubRoute) => null;
53
62
  };
54
63
 
55
- export { ConfigContent, DevToolsLayout, type DevToolsLayoutProps, DevToolsPage, ExternalDependenciesContent, InfoContent, type SubRoute, devToolsPlugin };
64
+ export { ConfigContent, DevToolsLayout, DevToolsPage, ExternalDependenciesContent, InfoContent, ScheduledTaskDetailPanel, ScheduledTasksContent, devToolsPlugin };
65
+ export type { DevToolsLayoutProps, SubRoute };
package/dist/index.esm.js CHANGED
@@ -2,5 +2,7 @@ export { DevToolsPage, devToolsPlugin } from './plugin.esm.js';
2
2
  export { ConfigContent } from './components/Content/ConfigContent/ConfigContent.esm.js';
3
3
  export { InfoContent } from './components/Content/InfoContent/InfoContent.esm.js';
4
4
  export { ExternalDependenciesContent } from './components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js';
5
+ export { ScheduledTasksContent } from './components/Content/ScheduledTasksContent/ScheduledTasksContent.esm.js';
6
+ export { ScheduledTaskDetailPanel } from './components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js';
5
7
  export { DevToolsLayout } from './components/DevToolsLayout/DevToolsLayout.esm.js';
6
8
  //# sourceMappingURL=index.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
@@ -1,5 +1,5 @@
1
1
  var name = "@backstage/plugin-devtools";
2
- var version = "0.1.34-next.0";
2
+ var version = "0.1.34";
3
3
  var backstage = {
4
4
  role: "frontend-plugin",
5
5
  pluginId: "devtools",
@@ -20,7 +20,7 @@ var repository = {
20
20
  };
21
21
  var license = "Apache-2.0";
22
22
  var sideEffects = false;
23
- var exports = {
23
+ var exports$1 = {
24
24
  ".": "./src/index.ts",
25
25
  "./alpha": "./src/alpha.ts",
26
26
  "./package.json": "./package.json"
@@ -38,7 +38,8 @@ var typesVersions = {
38
38
  }
39
39
  };
40
40
  var files = [
41
- "dist"
41
+ "dist",
42
+ "config.d.ts"
42
43
  ];
43
44
  var scripts = {
44
45
  build: "backstage-cli package build",
@@ -50,6 +51,7 @@ var scripts = {
50
51
  test: "backstage-cli package test"
51
52
  };
52
53
  var dependencies = {
54
+ "@backstage/core-compat-api": "workspace:^",
53
55
  "@backstage/core-components": "workspace:^",
54
56
  "@backstage/core-plugin-api": "workspace:^",
55
57
  "@backstage/errors": "workspace:^",
@@ -59,6 +61,7 @@ var dependencies = {
59
61
  "@material-ui/core": "^4.9.13",
60
62
  "@material-ui/icons": "^4.9.1",
61
63
  "@material-ui/lab": "^4.0.0-alpha.57",
64
+ lodash: "^4.17.21",
62
65
  "react-json-view": "^1.21.3",
63
66
  "react-use": "^17.2.4"
64
67
  };
@@ -66,6 +69,7 @@ var devDependencies = {
66
69
  "@backstage/cli": "workspace:^",
67
70
  "@backstage/dev-utils": "workspace:^",
68
71
  "@testing-library/jest-dom": "^6.0.0",
72
+ "@types/lodash": "^4.14.151",
69
73
  "@types/react": "^18.0.0",
70
74
  react: "^18.0.2",
71
75
  "react-dom": "^18.0.2",
@@ -82,6 +86,7 @@ var peerDependenciesMeta = {
82
86
  optional: true
83
87
  }
84
88
  };
89
+ var configSchema = "config.d.ts";
85
90
  var _package = {
86
91
  name: name,
87
92
  version: version,
@@ -91,7 +96,7 @@ var _package = {
91
96
  repository: repository,
92
97
  license: license,
93
98
  sideEffects: sideEffects,
94
- exports: exports,
99
+ exports: exports$1,
95
100
  main: main,
96
101
  types: types,
97
102
  typesVersions: typesVersions,
@@ -100,8 +105,9 @@ var _package = {
100
105
  dependencies: dependencies,
101
106
  devDependencies: devDependencies,
102
107
  peerDependencies: peerDependencies,
103
- peerDependenciesMeta: peerDependenciesMeta
108
+ peerDependenciesMeta: peerDependenciesMeta,
109
+ configSchema: configSchema
104
110
  };
105
111
 
106
- export { backstage, _package as default, dependencies, devDependencies, exports, files, homepage, license, main, name, peerDependencies, peerDependenciesMeta, publishConfig, repository, scripts, sideEffects, types, typesVersions, version };
112
+ export { backstage, configSchema, _package as default, dependencies, devDependencies, exports$1 as exports, files, homepage, license, main, name, peerDependencies, peerDependenciesMeta, publishConfig, repository, scripts, sideEffects, types, typesVersions, version };
107
113
  //# sourceMappingURL=package.json.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"package.json.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-devtools",
3
- "version": "0.1.34-next.0",
3
+ "version": "0.1.34",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "devtools",
@@ -51,7 +51,8 @@
51
51
  }
52
52
  },
53
53
  "files": [
54
- "dist"
54
+ "dist",
55
+ "config.d.ts"
55
56
  ],
56
57
  "scripts": {
57
58
  "build": "backstage-cli package build",
@@ -63,22 +64,25 @@
63
64
  "test": "backstage-cli package test"
64
65
  },
65
66
  "dependencies": {
66
- "@backstage/core-components": "0.18.4-next.0",
67
- "@backstage/core-plugin-api": "1.12.1-next.0",
68
- "@backstage/errors": "1.2.7",
69
- "@backstage/frontend-plugin-api": "0.13.2-next.0",
70
- "@backstage/plugin-devtools-common": "0.1.19",
71
- "@backstage/plugin-permission-react": "0.4.39-next.0",
67
+ "@backstage/core-compat-api": "^0.5.5",
68
+ "@backstage/core-components": "^0.18.4",
69
+ "@backstage/core-plugin-api": "^1.12.1",
70
+ "@backstage/errors": "^1.2.7",
71
+ "@backstage/frontend-plugin-api": "^0.13.2",
72
+ "@backstage/plugin-devtools-common": "^0.1.20",
73
+ "@backstage/plugin-permission-react": "^0.4.39",
72
74
  "@material-ui/core": "^4.9.13",
73
75
  "@material-ui/icons": "^4.9.1",
74
76
  "@material-ui/lab": "^4.0.0-alpha.57",
77
+ "lodash": "^4.17.21",
75
78
  "react-json-view": "^1.21.3",
76
79
  "react-use": "^17.2.4"
77
80
  },
78
81
  "devDependencies": {
79
- "@backstage/cli": "0.34.6-next.0",
80
- "@backstage/dev-utils": "1.1.18-next.0",
82
+ "@backstage/cli": "^0.35.0",
83
+ "@backstage/dev-utils": "^1.1.18",
81
84
  "@testing-library/jest-dom": "^6.0.0",
85
+ "@types/lodash": "^4.14.151",
82
86
  "@types/react": "^18.0.0",
83
87
  "react": "^18.0.2",
84
88
  "react-dom": "^18.0.2",
@@ -95,5 +99,6 @@
95
99
  "optional": true
96
100
  }
97
101
  },
102
+ "configSchema": "config.d.ts",
98
103
  "module": "./dist/index.esm.js"
99
104
  }