@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.
- package/CHANGELOG.md +14 -0
- package/README.md +17 -0
- package/config.d.ts +30 -0
- package/dist/api/DevToolsApi.esm.js.map +1 -1
- package/dist/api/DevToolsClient.esm.js +26 -0
- package/dist/api/DevToolsClient.esm.js.map +1 -1
- package/dist/components/Content/ConfigContent/ConfigContent.esm.js +1 -0
- package/dist/components/Content/ConfigContent/ConfigContent.esm.js.map +1 -1
- package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js +1 -0
- package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js.map +1 -1
- package/dist/components/Content/InfoContent/InfoContent.esm.js +1 -0
- package/dist/components/Content/InfoContent/InfoContent.esm.js.map +1 -1
- package/dist/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js +75 -0
- package/dist/components/Content/ScheduledTasksContent/ScheduledTaskDetailedPanel.esm.js.map +1 -0
- package/dist/components/Content/ScheduledTasksContent/ScheduledTasksContent.esm.js +243 -0
- package/dist/components/Content/ScheduledTasksContent/ScheduledTasksContent.esm.js.map +1 -0
- package/dist/components/DefaultDevToolsPage/DefaultDevToolsPage.esm.js +5 -1
- package/dist/components/DefaultDevToolsPage/DefaultDevToolsPage.esm.js.map +1 -1
- package/dist/hooks/useScheduledTasks.esm.js +30 -0
- package/dist/hooks/useScheduledTasks.esm.js.map +1 -0
- package/dist/hooks/useTriggerScheduledTask.esm.js +32 -0
- package/dist/hooks/useTriggerScheduledTask.esm.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/package.json.esm.js +12 -6
- package/dist/package.json.esm.js.map +1 -1
- 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
|

|
|
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
|
+

|
|
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":";;
|
|
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":";;
|
|
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;;;;"}
|
|
@@ -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":"
|
|
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;;;;"}
|
package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js
CHANGED
|
@@ -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({
|
package/dist/components/Content/ExternalDependenciesContent/ExternalDependenciesContent.esm.js.map
CHANGED
|
@@ -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":"
|
|
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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"}
|
|
@@ -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":"
|
|
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';\
|
|
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,
|
|
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
|
package/dist/index.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
package/dist/package.json.esm.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
var name = "@backstage/plugin-devtools";
|
|
2
|
-
var version = "0.1.34
|
|
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
|
|
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-
|
|
67
|
-
"@backstage/core-
|
|
68
|
-
"@backstage/
|
|
69
|
-
"@backstage/
|
|
70
|
-
"@backstage/plugin-
|
|
71
|
-
"@backstage/plugin-
|
|
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.
|
|
80
|
-
"@backstage/dev-utils": "1.1.18
|
|
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
|
}
|