@backstage-community/plugin-azure-devops 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @backstage-community/plugin-azure-devops
2
2
 
3
+ ## 0.16.0
4
+
5
+ ### Minor Changes
6
+
7
+ - dd67a17: Backstage version bump to v1.39.0
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [dd67a17]
12
+ - @backstage-community/plugin-azure-devops-common@0.11.0
13
+
14
+ ## 0.15.0
15
+
16
+ ### Minor Changes
17
+
18
+ - 8e54e8e: **BREAKING** If the specified build definition is not found, return no results and display a message explaining why.
19
+
3
20
  ## 0.14.0
4
21
 
5
22
  ### Minor Changes
package/dist/alpha.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /// <reference types="react" />
2
- import * as _backstage_catalog_model_index from '@backstage/catalog-model/index';
2
+ import * as _backstage_catalog_model from '@backstage/catalog-model';
3
3
  import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
4
4
  import * as react from 'react';
5
5
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
@@ -7,7 +7,7 @@ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
7
7
 
8
8
  /** @alpha */
9
9
  declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
10
- "api:azure-devops": _backstage_frontend_plugin_api.ExtensionDefinition<{
10
+ [x: `api:${string}`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
11
11
  kind: "api";
12
12
  name: undefined;
13
13
  config: {};
@@ -18,7 +18,7 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
18
18
  factory: _backstage_core_plugin_api.AnyApiFactory;
19
19
  };
20
20
  }>;
21
- "entity-card:azure-devops/readme": _backstage_frontend_plugin_api.ExtensionDefinition<{
21
+ [x: `entity-card:${string}/readme`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
22
22
  kind: "entity-card";
23
23
  name: "readme";
24
24
  config: {
@@ -29,7 +29,7 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
29
29
  filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
30
30
  type?: "content" | "summary" | "info" | undefined;
31
31
  };
32
- output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model_index.Entity) => boolean, "catalog.entity-filter-function", {
32
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
33
33
  optional: true;
34
34
  }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
35
35
  optional: true;
@@ -39,11 +39,11 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
39
39
  inputs: {};
40
40
  params: {
41
41
  loader: () => Promise<JSX.Element>;
42
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
42
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean) | undefined;
43
43
  type?: _backstage_plugin_catalog_react_alpha.EntityCardType | undefined;
44
44
  };
45
45
  }>;
46
- "entity-content:azure-devops/git-tags": _backstage_frontend_plugin_api.ExtensionDefinition<{
46
+ [x: `entity-content:${string}/git-tags`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
47
47
  kind: "entity-content";
48
48
  name: "git-tags";
49
49
  config: {
@@ -60,7 +60,7 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
60
60
  };
61
61
  output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
62
62
  optional: true;
63
- }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model_index.Entity) => boolean, "catalog.entity-filter-function", {
63
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
64
64
  optional: true;
65
65
  }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
66
66
  optional: true;
@@ -74,10 +74,10 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
74
74
  defaultTitle: string;
75
75
  defaultGroup?: (string & {}) | "development" | "deployment" | "overview" | "documentation" | "operation" | "observability" | undefined;
76
76
  routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
77
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
77
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean) | undefined;
78
78
  };
79
79
  }>;
80
- "entity-content:azure-devops/pipelines": _backstage_frontend_plugin_api.ExtensionDefinition<{
80
+ [x: `entity-content:${string}/pipelines`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
81
81
  kind: "entity-content";
82
82
  name: "pipelines";
83
83
  config: {
@@ -94,7 +94,7 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
94
94
  };
95
95
  output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
96
96
  optional: true;
97
- }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model_index.Entity) => boolean, "catalog.entity-filter-function", {
97
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
98
98
  optional: true;
99
99
  }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
100
100
  optional: true;
@@ -108,10 +108,10 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
108
108
  defaultTitle: string;
109
109
  defaultGroup?: (string & {}) | "development" | "deployment" | "overview" | "documentation" | "operation" | "observability" | undefined;
110
110
  routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
111
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
111
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean) | undefined;
112
112
  };
113
113
  }>;
114
- "entity-content:azure-devops/pull-requests": _backstage_frontend_plugin_api.ExtensionDefinition<{
114
+ [x: `entity-content:${string}/pull-requests`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
115
115
  kind: "entity-content";
116
116
  name: "pull-requests";
117
117
  config: {
@@ -128,7 +128,7 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
128
128
  };
129
129
  output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<react.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
130
130
  optional: true;
131
- }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model_index.Entity) => boolean, "catalog.entity-filter-function", {
131
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-content-title", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
132
132
  optional: true;
133
133
  }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
134
134
  optional: true;
@@ -142,10 +142,10 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{}, {}, {
142
142
  defaultTitle: string;
143
143
  defaultGroup?: (string & {}) | "development" | "deployment" | "overview" | "documentation" | "operation" | "observability" | undefined;
144
144
  routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
145
- filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model_index.Entity) => boolean) | undefined;
145
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean) | undefined;
146
146
  };
147
147
  }>;
148
- "page:azure-devops": _backstage_frontend_plugin_api.ExtensionDefinition<{
148
+ [x: `page:${string}`]: _backstage_frontend_plugin_api.ExtensionDefinition<{
149
149
  kind: "page";
150
150
  name: undefined;
151
151
  config: {
@@ -9,6 +9,7 @@ import { AzurePipelinesIcon } from '../AzurePipelinesIcon/AzurePipelinesIcon.esm
9
9
  import { DateTime } from 'luxon';
10
10
  import { getDurationFromDates } from '../../utils/getDurationFromDates.esm.js';
11
11
  import { BuildLogDrawer } from './lib/BuildLogDrawer/BuildLogDrawer.esm.js';
12
+ import { EmptyBuildResults } from './lib/EmptyBuildResults/EmptyBuildResults.esm.js';
12
13
 
13
14
  const getBuildResultComponent = (result) => {
14
15
  switch (result) {
@@ -72,7 +73,12 @@ const getBuildStateComponent = (status, result) => {
72
73
  ] });
73
74
  }
74
75
  };
75
- const BuildTable = ({ items, loading, error }) => {
76
+ const BuildTable = ({
77
+ items,
78
+ loading,
79
+ error,
80
+ entity
81
+ }) => {
76
82
  const [selectedBuildId, setSelectedBuildId] = useState(
77
83
  void 0
78
84
  );
@@ -164,7 +170,8 @@ const BuildTable = ({ items, loading, error }) => {
164
170
  items ? items.length : 0,
165
171
  ")"
166
172
  ] }),
167
- data: items ?? []
173
+ data: items ?? [],
174
+ emptyContent: /* @__PURE__ */ jsx(EmptyBuildResults, { entity })
168
175
  }
169
176
  ),
170
177
  /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"BuildTable.esm.js","sources":["../../../src/components/BuildTable/BuildTable.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport {\n BuildResult,\n BuildRun,\n BuildStatus,\n} from '@backstage-community/plugin-azure-devops-common';\nimport {\n Link,\n ResponseErrorPanel,\n StatusAborted,\n StatusError,\n StatusOK,\n StatusPending,\n StatusRunning,\n StatusWarning,\n Table,\n TableColumn,\n} from '@backstage/core-components';\n\nimport { AzurePipelinesIcon } from '../AzurePipelinesIcon';\nimport { DateTime } from 'luxon';\nimport { getDurationFromDates } from '../../utils/getDurationFromDates';\nimport { BuildLogDrawer } from './lib/BuildLogDrawer';\n\nexport const getBuildResultComponent = (result: number | undefined) => {\n switch (result) {\n case BuildResult.Succeeded:\n return (\n <Typography component=\"span\">\n <StatusOK /> Succeeded\n </Typography>\n );\n case BuildResult.PartiallySucceeded:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Partially Succeeded\n </Typography>\n );\n case BuildResult.Failed:\n return (\n <Typography component=\"span\">\n <StatusError /> Failed\n </Typography>\n );\n case BuildResult.Canceled:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Canceled\n </Typography>\n );\n case BuildResult.None:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\nexport const getBuildStateComponent = (\n status: number | undefined,\n result: number | undefined,\n) => {\n switch (status) {\n case BuildStatus.InProgress:\n return (\n <Typography component=\"span\">\n <StatusRunning /> In Progress\n </Typography>\n );\n case BuildStatus.Completed:\n return getBuildResultComponent(result);\n case BuildStatus.Cancelling:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Cancelling\n </Typography>\n );\n case BuildStatus.Postponed:\n return (\n <Typography component=\"span\">\n <StatusPending /> Postponed\n </Typography>\n );\n case BuildStatus.NotStarted:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Not Started\n </Typography>\n );\n case BuildStatus.None:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\ntype BuildTableProps = {\n items?: BuildRun[];\n loading: boolean;\n error?: Error;\n};\n\nexport const BuildTable = ({ items, loading, error }: BuildTableProps) => {\n // State for log drawer\n const [selectedBuildId, setSelectedBuildId] = useState<number | undefined>(\n undefined,\n );\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n\n const handleOpenDrawer = (buildId?: number) => {\n setSelectedBuildId(buildId);\n setIsDrawerOpen(true);\n };\n\n const handleCloseDrawer = () => {\n setIsDrawerOpen(false);\n };\n\n // Cache build logs\n const [logsCache, setLogsCache] = useState<Record<number, string[]>>({});\n\n const updateLogsCache = (buildId: number, logs: string[]) => {\n setLogsCache(prev => ({\n ...prev,\n [buildId]: logs,\n }));\n };\n\n if (error) {\n return (\n <div>\n <ResponseErrorPanel error={error} />\n </div>\n );\n }\n\n const columns: TableColumn[] = [\n {\n title: 'ID',\n field: 'id',\n highlight: false,\n width: 'auto',\n },\n {\n title: 'Build',\n field: 'title',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Link to={row.link || ''}>{row.title}</Link>\n ),\n },\n {\n title: 'Source',\n field: 'source',\n width: 'auto',\n },\n {\n title: 'State',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography variant=\"button\">\n {getBuildStateComponent(row.status, row.result)}\n </Typography>\n </Box>\n ),\n },\n {\n title: 'Duration',\n field: 'queueTime',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography>\n {getDurationFromDates(row.startTime, row.finishTime)}\n </Typography>\n </Box>\n ),\n },\n {\n title: 'Age',\n field: 'queueTime',\n width: 'auto',\n render: (row: Partial<BuildRun>) =>\n (row.queueTime\n ? DateTime.fromISO(row.queueTime)\n : DateTime.now()\n ).toRelative(),\n },\n {\n title: 'Logs',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n onClick={() => handleOpenDrawer(row.id)}\n disabled={!row.id}\n >\n View Logs\n </Button>\n ),\n },\n ];\n\n return (\n <>\n <Table\n isLoading={loading}\n columns={columns}\n options={{\n search: true,\n paging: true,\n pageSize: 5,\n showEmptyDataSourceMessage: !loading,\n }}\n title={\n <Box display=\"flex\" alignItems=\"center\">\n <AzurePipelinesIcon style={{ fontSize: 30 }} />\n <Box mr={1} />\n Azure Pipelines - Builds ({items ? items.length : 0})\n </Box>\n }\n data={items ?? []}\n />\n\n <BuildLogDrawer\n buildId={selectedBuildId}\n open={isDrawerOpen}\n onClose={handleCloseDrawer}\n logsCache={logsCache}\n updateCache={updateLogsCache}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BuildTable.esm.js","sources":["../../../src/components/BuildTable/BuildTable.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useState } from 'react';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Typography from '@material-ui/core/Typography';\nimport {\n BuildResult,\n BuildRun,\n BuildStatus,\n} from '@backstage-community/plugin-azure-devops-common';\nimport {\n Link,\n ResponseErrorPanel,\n StatusAborted,\n StatusError,\n StatusOK,\n StatusPending,\n StatusRunning,\n StatusWarning,\n Table,\n TableColumn,\n} from '@backstage/core-components';\n\nimport { AzurePipelinesIcon } from '../AzurePipelinesIcon';\nimport { DateTime } from 'luxon';\nimport { getDurationFromDates } from '../../utils/getDurationFromDates';\nimport { BuildLogDrawer } from './lib/BuildLogDrawer';\nimport { EmptyBuildResults } from './lib/EmptyBuildResults';\nimport { Entity } from '@backstage/catalog-model';\n\nexport const getBuildResultComponent = (result: number | undefined) => {\n switch (result) {\n case BuildResult.Succeeded:\n return (\n <Typography component=\"span\">\n <StatusOK /> Succeeded\n </Typography>\n );\n case BuildResult.PartiallySucceeded:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Partially Succeeded\n </Typography>\n );\n case BuildResult.Failed:\n return (\n <Typography component=\"span\">\n <StatusError /> Failed\n </Typography>\n );\n case BuildResult.Canceled:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Canceled\n </Typography>\n );\n case BuildResult.None:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\nexport const getBuildStateComponent = (\n status: number | undefined,\n result: number | undefined,\n) => {\n switch (status) {\n case BuildStatus.InProgress:\n return (\n <Typography component=\"span\">\n <StatusRunning /> In Progress\n </Typography>\n );\n case BuildStatus.Completed:\n return getBuildResultComponent(result);\n case BuildStatus.Cancelling:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Cancelling\n </Typography>\n );\n case BuildStatus.Postponed:\n return (\n <Typography component=\"span\">\n <StatusPending /> Postponed\n </Typography>\n );\n case BuildStatus.NotStarted:\n return (\n <Typography component=\"span\">\n <StatusAborted /> Not Started\n </Typography>\n );\n case BuildStatus.None:\n default:\n return (\n <Typography component=\"span\">\n <StatusWarning /> Unknown\n </Typography>\n );\n }\n};\n\ntype BuildTableProps = {\n items?: BuildRun[];\n loading: boolean;\n error?: Error;\n entity?: Entity;\n};\n\nexport const BuildTable = ({\n items,\n loading,\n error,\n entity,\n}: BuildTableProps) => {\n // State for log drawer\n const [selectedBuildId, setSelectedBuildId] = useState<number | undefined>(\n undefined,\n );\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n\n const handleOpenDrawer = (buildId?: number) => {\n setSelectedBuildId(buildId);\n setIsDrawerOpen(true);\n };\n\n const handleCloseDrawer = () => {\n setIsDrawerOpen(false);\n };\n\n // Cache build logs\n const [logsCache, setLogsCache] = useState<Record<number, string[]>>({});\n\n const updateLogsCache = (buildId: number, logs: string[]) => {\n setLogsCache(prev => ({\n ...prev,\n [buildId]: logs,\n }));\n };\n\n if (error) {\n return (\n <div>\n <ResponseErrorPanel error={error} />\n </div>\n );\n }\n\n const columns: TableColumn[] = [\n {\n title: 'ID',\n field: 'id',\n highlight: false,\n width: 'auto',\n },\n {\n title: 'Build',\n field: 'title',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Link to={row.link || ''}>{row.title}</Link>\n ),\n },\n {\n title: 'Source',\n field: 'source',\n width: 'auto',\n },\n {\n title: 'State',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography variant=\"button\">\n {getBuildStateComponent(row.status, row.result)}\n </Typography>\n </Box>\n ),\n },\n {\n title: 'Duration',\n field: 'queueTime',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography>\n {getDurationFromDates(row.startTime, row.finishTime)}\n </Typography>\n </Box>\n ),\n },\n {\n title: 'Age',\n field: 'queueTime',\n width: 'auto',\n render: (row: Partial<BuildRun>) =>\n (row.queueTime\n ? DateTime.fromISO(row.queueTime)\n : DateTime.now()\n ).toRelative(),\n },\n {\n title: 'Logs',\n width: 'auto',\n render: (row: Partial<BuildRun>) => (\n <Button\n variant=\"contained\"\n color=\"primary\"\n size=\"small\"\n onClick={() => handleOpenDrawer(row.id)}\n disabled={!row.id}\n >\n View Logs\n </Button>\n ),\n },\n ];\n\n return (\n <>\n <Table\n isLoading={loading}\n columns={columns}\n options={{\n search: true,\n paging: true,\n pageSize: 5,\n showEmptyDataSourceMessage: !loading,\n }}\n title={\n <Box display=\"flex\" alignItems=\"center\">\n <AzurePipelinesIcon style={{ fontSize: 30 }} />\n <Box mr={1} />\n Azure Pipelines - Builds ({items ? items.length : 0})\n </Box>\n }\n data={items ?? []}\n emptyContent={<EmptyBuildResults entity={entity} />}\n />\n\n <BuildLogDrawer\n buildId={selectedBuildId}\n open={isDrawerOpen}\n onClose={handleCloseDrawer}\n logsCache={logsCache}\n updateCache={updateLogsCache}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import Box from '@material-ui/core/Box';
3
+ import Typography from '@material-ui/core/Typography';
4
+ import 'luxon';
5
+ import 'humanize-duration';
6
+ import { getAnnotationValuesFromEntity } from '../../../../utils/getAnnotationValuesFromEntity.esm.js';
7
+
8
+ const EmptyBuildResults = ({ entity }) => {
9
+ const annotations = entity ? getAnnotationValuesFromEntity(entity) : void 0;
10
+ const repoName = annotations?.repo;
11
+ const buildDefinition = annotations?.definition;
12
+ return /* @__PURE__ */ jsxs(Box, { padding: 2, children: [
13
+ /* @__PURE__ */ jsx(Typography, { component: "p", align: "center", variant: "body1", children: "No records to display" }),
14
+ /* @__PURE__ */ jsxs(Typography, { component: "p", align: "center", variant: "body2", children: [
15
+ "No builds could be found with repository name",
16
+ " ",
17
+ repoName ?? "(no value provided)",
18
+ " or build definition",
19
+ " ",
20
+ buildDefinition ?? "(no value provided)",
21
+ "."
22
+ ] })
23
+ ] });
24
+ };
25
+
26
+ export { EmptyBuildResults };
27
+ //# sourceMappingURL=EmptyBuildResults.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmptyBuildResults.esm.js","sources":["../../../../../src/components/BuildTable/lib/EmptyBuildResults/EmptyBuildResults.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 { Entity } from '@backstage/catalog-model';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { getAnnotationValuesFromEntity } from '../../../../utils';\n\nexport const EmptyBuildResults = ({ entity }: { entity?: Entity }) => {\n const annotations = entity\n ? getAnnotationValuesFromEntity(entity)\n : undefined;\n const repoName = annotations?.repo;\n const buildDefinition = annotations?.definition;\n\n return (\n <Box padding={2}>\n <Typography component=\"p\" align=\"center\" variant=\"body1\">\n No records to display\n </Typography>\n <Typography component=\"p\" align=\"center\" variant=\"body2\">\n No builds could be found with repository name{' '}\n {repoName ?? '(no value provided)'} or build definition{' '}\n {buildDefinition ?? '(no value provided)'}.\n </Typography>\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;AAoBO,MAAM,iBAAoB,GAAA,CAAC,EAAE,MAAA,EAAkC,KAAA;AACpE,EAAA,MAAM,WAAc,GAAA,MAAA,GAChB,6BAA8B,CAAA,MAAM,CACpC,GAAA,KAAA,CAAA;AACJ,EAAA,MAAM,WAAW,WAAa,EAAA,IAAA;AAC9B,EAAA,MAAM,kBAAkB,WAAa,EAAA,UAAA;AAErC,EACE,uBAAA,IAAA,CAAC,GAAI,EAAA,EAAA,OAAA,EAAS,CACZ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAW,SAAU,EAAA,GAAA,EAAI,OAAM,QAAS,EAAA,OAAA,EAAQ,SAAQ,QAEzD,EAAA,uBAAA,EAAA,CAAA;AAAA,yBACC,UAAW,EAAA,EAAA,SAAA,EAAU,KAAI,KAAM,EAAA,QAAA,EAAS,SAAQ,OAAQ,EAAA,QAAA,EAAA;AAAA,MAAA,+CAAA;AAAA,MACT,GAAA;AAAA,MAC7C,QAAY,IAAA,qBAAA;AAAA,MAAsB,sBAAA;AAAA,MAAqB,GAAA;AAAA,MACvD,eAAmB,IAAA,qBAAA;AAAA,MAAsB;AAAA,KAC5C,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -24,7 +24,15 @@ const EntityPageAzurePipelines = (props) => {
24
24
  permission: azureDevOpsPipelineReadPermission,
25
25
  resourceRef: stringifyEntityRef(entity),
26
26
  errorPage: null,
27
- children: /* @__PURE__ */ jsx(BuildTable, { items, loading, error })
27
+ children: /* @__PURE__ */ jsx(
28
+ BuildTable,
29
+ {
30
+ items,
31
+ loading,
32
+ error,
33
+ entity
34
+ }
35
+ )
28
36
  }
29
37
  );
30
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPageAzurePipelines.esm.js","sources":["../../../src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BuildTable } from '../BuildTable/BuildTable';\nimport { useBuildRuns } from '../../hooks';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { azureDevOpsPipelineReadPermission } from '@backstage-community/plugin-azure-devops-common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\n\nexport const EntityPageAzurePipelines = (props: { defaultLimit?: number }) => {\n const { entity } = useEntity();\n\n const { items, loading, error } = useBuildRuns(entity, props.defaultLimit);\n\n return (\n <RequirePermission\n permission={azureDevOpsPipelineReadPermission}\n resourceRef={stringifyEntityRef(entity)}\n errorPage={null}\n >\n <BuildTable items={items} loading={loading} error={error} />\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuBa,MAAA,wBAAA,GAA2B,CAAC,KAAqC,KAAA;AAC5E,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAE7B,EAAM,MAAA,EAAE,OAAO,OAAS,EAAA,KAAA,KAAU,YAAa,CAAA,MAAA,EAAQ,MAAM,YAAY,CAAA;AAEzE,EACE,uBAAA,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,iCAAA;AAAA,MACZ,WAAA,EAAa,mBAAmB,MAAM,CAAA;AAAA,MACtC,SAAW,EAAA,IAAA;AAAA,MAEX,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,KAAc,EAAA,OAAA,EAAkB,KAAc,EAAA;AAAA;AAAA,GAC5D;AAEJ;;;;"}
1
+ {"version":3,"file":"EntityPageAzurePipelines.esm.js","sources":["../../../src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BuildTable } from '../BuildTable/BuildTable';\nimport { useBuildRuns } from '../../hooks';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { azureDevOpsPipelineReadPermission } from '@backstage-community/plugin-azure-devops-common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\n\nexport const EntityPageAzurePipelines = (props: { defaultLimit?: number }) => {\n const { entity } = useEntity();\n\n const { items, loading, error } = useBuildRuns(entity, props.defaultLimit);\n\n return (\n <RequirePermission\n permission={azureDevOpsPipelineReadPermission}\n resourceRef={stringifyEntityRef(entity)}\n errorPage={null}\n >\n <BuildTable\n items={items}\n loading={loading}\n error={error}\n entity={entity}\n />\n </RequirePermission>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAuBa,MAAA,wBAAA,GAA2B,CAAC,KAAqC,KAAA;AAC5E,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAE7B,EAAM,MAAA,EAAE,OAAO,OAAS,EAAA,KAAA,KAAU,YAAa,CAAA,MAAA,EAAQ,MAAM,YAAY,CAAA;AAEzE,EACE,uBAAA,GAAA;AAAA,IAAC,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,iCAAA;AAAA,MACZ,WAAA,EAAa,mBAAmB,MAAM,CAAA;AAAA,MACtC,SAAW,EAAA,IAAA;AAAA,MAEX,QAAA,kBAAA,GAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,KAAA;AAAA,UACA,OAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-azure-devops",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "backstage": {
5
5
  "role": "frontend-plugin",
6
6
  "pluginId": "azure-devops",
@@ -63,15 +63,15 @@
63
63
  "test": "backstage-cli package test"
64
64
  },
65
65
  "dependencies": {
66
- "@backstage-community/plugin-azure-devops-common": "^0.10.0",
67
- "@backstage/catalog-model": "^1.7.3",
68
- "@backstage/core-compat-api": "^0.4.1",
69
- "@backstage/core-components": "^0.17.1",
70
- "@backstage/core-plugin-api": "^1.10.6",
66
+ "@backstage-community/plugin-azure-devops-common": "^0.11.0",
67
+ "@backstage/catalog-model": "^1.7.4",
68
+ "@backstage/core-compat-api": "^0.4.2",
69
+ "@backstage/core-components": "^0.17.2",
70
+ "@backstage/core-plugin-api": "^1.10.7",
71
71
  "@backstage/errors": "^1.2.7",
72
- "@backstage/frontend-plugin-api": "^0.10.1",
73
- "@backstage/plugin-catalog-react": "^1.17.0",
74
- "@backstage/plugin-permission-react": "^0.4.33",
72
+ "@backstage/frontend-plugin-api": "^0.10.2",
73
+ "@backstage/plugin-catalog-react": "^1.18.0",
74
+ "@backstage/plugin-permission-react": "^0.4.34",
75
75
  "@material-ui/core": "^4.12.2",
76
76
  "@material-ui/icons": "^4.9.1",
77
77
  "@types/react": "^16.13.1 || ^17.0.0 || ^18.0.0",
@@ -80,9 +80,9 @@
80
80
  "react-use": "^17.2.4"
81
81
  },
82
82
  "devDependencies": {
83
- "@backstage/cli": "^0.32.0",
84
- "@backstage/dev-utils": "^1.1.9",
85
- "@backstage/test-utils": "^1.7.7",
83
+ "@backstage/cli": "^0.32.1",
84
+ "@backstage/dev-utils": "^1.1.10",
85
+ "@backstage/test-utils": "^1.7.8",
86
86
  "@testing-library/dom": "^10.0.0",
87
87
  "@testing-library/jest-dom": "^6.0.0",
88
88
  "@testing-library/react": "^15.0.0",