@backstage-community/plugin-github-actions 0.6.24 → 0.6.26
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 +12 -0
- package/README.md +1 -17
- package/alpha/package.json +1 -1
- package/dist/alpha/entityCards.esm.js +5 -4
- package/dist/alpha/entityCards.esm.js.map +1 -1
- package/dist/alpha/entityContent.esm.js +2 -1
- package/dist/alpha/entityContent.esm.js.map +1 -1
- package/dist/components/WorkflowRunsTable/WorkflowRunsTable.esm.js +14 -1
- package/dist/components/WorkflowRunsTable/WorkflowRunsTable.esm.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage-community/plugin-github-actions
|
|
2
2
|
|
|
3
|
+
## 0.6.26
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a130288: Truncate commit message to first newline
|
|
8
|
+
|
|
9
|
+
## 0.6.25
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- e657f8d: Add default filtering based on required annotation to the new frontend system components
|
|
14
|
+
|
|
3
15
|
## 0.6.24
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -120,7 +120,7 @@ const serviceEntityPage = (
|
|
|
120
120
|
|
|
121
121
|
Follow this section if you are using Backstage's [new frontend system](https://backstage.io/docs/frontend-system/).
|
|
122
122
|
|
|
123
|
-
|
|
123
|
+
Import `githubActionsPlugin` in your `App.tsx` and add it to your app's `features` array:
|
|
124
124
|
|
|
125
125
|
```typescript
|
|
126
126
|
import githubActionsPlugin from '@backstage-community/plugin-github-actions/alpha';
|
|
@@ -136,22 +136,6 @@ export const app = createApp({
|
|
|
136
136
|
});
|
|
137
137
|
```
|
|
138
138
|
|
|
139
|
-
2. Next, enable your desired extensions in `app-config.yaml`. By default, the content and cards will only appear on entities
|
|
140
|
-
that are Components. You can override that behavior here by adding a config block, demonstrated on the 'recent-workflow' card.
|
|
141
|
-
|
|
142
|
-
```yaml
|
|
143
|
-
app:
|
|
144
|
-
extensions:
|
|
145
|
-
- entity-content:github-actions/entity
|
|
146
|
-
- entity-card:github-actions/latest-workflow-run
|
|
147
|
-
- entity-card:github-actions/latest-branch-workflow-runs
|
|
148
|
-
- entity-card:github-actions/recent-workflow-runs:
|
|
149
|
-
config:
|
|
150
|
-
filter: kind:component,api,group
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
3. Whichever extensions you've enabled should now appear in your entity page.
|
|
154
|
-
|
|
155
139
|
### Self-hosted / Enterprise GitHub
|
|
156
140
|
|
|
157
141
|
The plugin will try to use `backstage.io/source-location` or `backstage.io/managed-by-location`
|
package/alpha/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
3
|
+
import { isGithubActionsAvailable } from '../components/Router.esm.js';
|
|
3
4
|
|
|
4
5
|
const entityGithubActionsCard = EntityCardBlueprint.make({
|
|
5
6
|
name: "workflow-runs",
|
|
6
7
|
params: {
|
|
7
|
-
filter:
|
|
8
|
+
filter: isGithubActionsAvailable,
|
|
8
9
|
loader: () => import('../components/Router.esm.js').then((m) => /* @__PURE__ */ React.createElement(m.Router, { view: "cards" }))
|
|
9
10
|
}
|
|
10
11
|
});
|
|
@@ -19,7 +20,7 @@ const entityLatestGithubActionRunCard = EntityCardBlueprint.makeWithOverrides({
|
|
|
19
20
|
},
|
|
20
21
|
factory(originalFactory, { config }) {
|
|
21
22
|
return originalFactory({
|
|
22
|
-
filter:
|
|
23
|
+
filter: isGithubActionsAvailable,
|
|
23
24
|
loader: async () => import('../components/Cards/index.esm.js').then((m) => /* @__PURE__ */ React.createElement(m.LatestWorkflowRunCard, { ...config.props }))
|
|
24
25
|
});
|
|
25
26
|
}
|
|
@@ -35,7 +36,7 @@ const entityLatestGithubActionsForBranchCard = EntityCardBlueprint.makeWithOverr
|
|
|
35
36
|
},
|
|
36
37
|
factory(originalFactory, { config }) {
|
|
37
38
|
return originalFactory({
|
|
38
|
-
filter:
|
|
39
|
+
filter: isGithubActionsAvailable,
|
|
39
40
|
loader: async () => import('../components/Cards/index.esm.js').then((m) => /* @__PURE__ */ React.createElement(m.LatestWorkflowsForBranchCard, { ...config.props }))
|
|
40
41
|
});
|
|
41
42
|
}
|
|
@@ -53,7 +54,7 @@ const entityRecentGithubActionsRunsCard = EntityCardBlueprint.makeWithOverrides(
|
|
|
53
54
|
},
|
|
54
55
|
factory(originalFactory, { config }) {
|
|
55
56
|
return originalFactory({
|
|
56
|
-
filter:
|
|
57
|
+
filter: isGithubActionsAvailable,
|
|
57
58
|
loader: async () => import('../components/Cards/index.esm.js').then((m) => /* @__PURE__ */ React.createElement(m.RecentWorkflowRunsCard, { ...config.props }))
|
|
58
59
|
});
|
|
59
60
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityCards.esm.js","sources":["../../src/alpha/entityCards.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 React from 'react';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\n\n/**\n * @alpha\n */\nexport const entityGithubActionsCard = EntityCardBlueprint.make({\n name: 'workflow-runs',\n params: {\n filter:
|
|
1
|
+
{"version":3,"file":"entityCards.esm.js","sources":["../../src/alpha/entityCards.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 React from 'react';\nimport { EntityCardBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { isGithubActionsAvailable } from '../components/Router';\n\n/**\n * @alpha\n */\nexport const entityGithubActionsCard = EntityCardBlueprint.make({\n name: 'workflow-runs',\n params: {\n filter: isGithubActionsAvailable,\n loader: () =>\n import('../components/Router').then(m => <m.Router view=\"cards\" />),\n },\n});\n\n/**\n * @alpha\n */\nexport const entityLatestGithubActionRunCard =\n EntityCardBlueprint.makeWithOverrides({\n name: 'latest-workflow-run',\n config: {\n schema: {\n props: z =>\n z\n .object({\n branch: z.string().default('master'),\n })\n .default({}),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n filter: isGithubActionsAvailable,\n loader: async () =>\n import('../components/Cards').then(m => (\n <m.LatestWorkflowRunCard {...config.props} />\n )),\n });\n },\n });\n\n/**\n * @alpha\n */\nexport const entityLatestGithubActionsForBranchCard =\n EntityCardBlueprint.makeWithOverrides({\n name: 'latest-branch-workflow-runs',\n config: {\n schema: {\n props: z =>\n z\n .object({\n branch: z.string().default('master'),\n })\n .default({}),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n filter: isGithubActionsAvailable,\n loader: async () =>\n import('../components/Cards').then(m => (\n <m.LatestWorkflowsForBranchCard {...config.props} />\n )),\n });\n },\n });\n\n/**\n * @alpha\n */\nexport const entityRecentGithubActionsRunsCard =\n EntityCardBlueprint.makeWithOverrides({\n name: 'recent-workflow-runs',\n config: {\n schema: {\n props: z =>\n z\n .object({\n branch: z.string().default('master'),\n dense: z.boolean().default(false),\n limit: z.number().default(5).optional(),\n })\n .default({}),\n },\n },\n factory(originalFactory, { config }) {\n return originalFactory({\n filter: isGithubActionsAvailable,\n loader: async () =>\n import('../components/Cards').then(m => (\n <m.RecentWorkflowRunsCard {...config.props} />\n )),\n });\n },\n });\n"],"names":[],"mappings":";;;;AAsBa,MAAA,uBAAA,GAA0B,oBAAoB,IAAK,CAAA;AAAA,EAC9D,IAAM,EAAA,eAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,wBAAA;AAAA,IACR,MAAQ,EAAA,MACN,OAAO,6BAAsB,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,CAAE,CAAA,MAAA,EAAF,EAAS,IAAA,EAAK,SAAQ,CAAE,CAAA;AAAA,GACtE;AACF,CAAC,EAAA;AAKY,MAAA,+BAAA,GACX,oBAAoB,iBAAkB,CAAA;AAAA,EACpC,IAAM,EAAA,qBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,KAAA,EAAO,CACL,CAAA,KAAA,CAAA,CACG,MAAO,CAAA;AAAA,QACN,MAAQ,EAAA,CAAA,CAAE,MAAO,EAAA,CAAE,QAAQ,QAAQ,CAAA;AAAA,OACpC,CAAA,CACA,OAAQ,CAAA,EAAE,CAAA;AAAA,KACjB;AAAA,GACF;AAAA,EACA,OAAQ,CAAA,eAAA,EAAiB,EAAE,MAAA,EAAU,EAAA;AACnC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,MAAQ,EAAA,wBAAA;AAAA,MACR,MAAQ,EAAA,YACN,OAAO,kCAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,qBAChC,KAAA,CAAA,aAAA,CAAA,CAAA,CAAE,qBAAF,EAAA,EAAyB,GAAG,MAAA,CAAO,OAAO,CAC5C,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAKU,MAAA,sCAAA,GACX,oBAAoB,iBAAkB,CAAA;AAAA,EACpC,IAAM,EAAA,6BAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,KAAA,EAAO,CACL,CAAA,KAAA,CAAA,CACG,MAAO,CAAA;AAAA,QACN,MAAQ,EAAA,CAAA,CAAE,MAAO,EAAA,CAAE,QAAQ,QAAQ,CAAA;AAAA,OACpC,CAAA,CACA,OAAQ,CAAA,EAAE,CAAA;AAAA,KACjB;AAAA,GACF;AAAA,EACA,OAAQ,CAAA,eAAA,EAAiB,EAAE,MAAA,EAAU,EAAA;AACnC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,MAAQ,EAAA,wBAAA;AAAA,MACR,MAAQ,EAAA,YACN,OAAO,kCAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,qBAChC,KAAA,CAAA,aAAA,CAAA,CAAA,CAAE,4BAAF,EAAA,EAAgC,GAAG,MAAA,CAAO,OAAO,CACnD,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GACH;AACF,CAAC,EAAA;AAKU,MAAA,iCAAA,GACX,oBAAoB,iBAAkB,CAAA;AAAA,EACpC,IAAM,EAAA,sBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA;AAAA,MACN,KAAA,EAAO,CACL,CAAA,KAAA,CAAA,CACG,MAAO,CAAA;AAAA,QACN,MAAQ,EAAA,CAAA,CAAE,MAAO,EAAA,CAAE,QAAQ,QAAQ,CAAA;AAAA,QACnC,KAAO,EAAA,CAAA,CAAE,OAAQ,EAAA,CAAE,QAAQ,KAAK,CAAA;AAAA,QAChC,OAAO,CAAE,CAAA,MAAA,GAAS,OAAQ,CAAA,CAAC,EAAE,QAAS,EAAA;AAAA,OACvC,CAAA,CACA,OAAQ,CAAA,EAAE,CAAA;AAAA,KACjB;AAAA,GACF;AAAA,EACA,OAAQ,CAAA,eAAA,EAAiB,EAAE,MAAA,EAAU,EAAA;AACnC,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,MAAQ,EAAA,wBAAA;AAAA,MACR,MAAQ,EAAA,YACN,OAAO,kCAAqB,EAAE,IAAK,CAAA,CAAA,CAAA,qBAChC,KAAA,CAAA,aAAA,CAAA,CAAA,CAAE,sBAAF,EAAA,EAA0B,GAAG,MAAA,CAAO,OAAO,CAC7C,CAAA;AAAA,KACJ,CAAA,CAAA;AAAA,GACH;AACF,CAAC;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { convertLegacyRouteRef } from '@backstage/core-compat-api';
|
|
3
3
|
import { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';
|
|
4
|
+
import { isGithubActionsAvailable } from '../components/Router.esm.js';
|
|
4
5
|
import { rootRouteRef } from '../routes.esm.js';
|
|
5
6
|
|
|
6
7
|
const entityGithubActionsContent = EntityContentBlueprint.make({
|
|
@@ -8,7 +9,7 @@ const entityGithubActionsContent = EntityContentBlueprint.make({
|
|
|
8
9
|
params: {
|
|
9
10
|
defaultPath: "github-actions",
|
|
10
11
|
defaultTitle: "GitHub Actions",
|
|
11
|
-
filter:
|
|
12
|
+
filter: isGithubActionsAvailable,
|
|
12
13
|
routeRef: convertLegacyRouteRef(rootRouteRef),
|
|
13
14
|
loader: () => import('../components/Router.esm.js').then((m) => /* @__PURE__ */ React.createElement(m.Router, { view: "table" }))
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entityContent.esm.js","sources":["../../src/alpha/entityContent.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 React from 'react';\nimport { convertLegacyRouteRef } from '@backstage/core-compat-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { rootRouteRef } from '../routes';\n\n/**\n * @alpha\n */\nexport const entityGithubActionsContent = EntityContentBlueprint.make({\n name: 'entity',\n params: {\n defaultPath: 'github-actions',\n defaultTitle: 'GitHub Actions',\n filter:
|
|
1
|
+
{"version":3,"file":"entityContent.esm.js","sources":["../../src/alpha/entityContent.tsx"],"sourcesContent":["/*\n * Copyright 2024 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 React from 'react';\nimport { convertLegacyRouteRef } from '@backstage/core-compat-api';\nimport { EntityContentBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { isGithubActionsAvailable } from '../components/Router';\nimport { rootRouteRef } from '../routes';\n\n/**\n * @alpha\n */\nexport const entityGithubActionsContent = EntityContentBlueprint.make({\n name: 'entity',\n params: {\n defaultPath: 'github-actions',\n defaultTitle: 'GitHub Actions',\n filter: isGithubActionsAvailable,\n routeRef: convertLegacyRouteRef(rootRouteRef),\n loader: () =>\n import('../components/Router').then(m => <m.Router view=\"table\" />),\n },\n});\n"],"names":[],"mappings":";;;;;;AAwBa,MAAA,0BAAA,GAA6B,uBAAuB,IAAK,CAAA;AAAA,EACpE,IAAM,EAAA,QAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,WAAa,EAAA,gBAAA;AAAA,IACb,YAAc,EAAA,gBAAA;AAAA,IACd,MAAQ,EAAA,wBAAA;AAAA,IACR,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,MAAQ,EAAA,MACN,OAAO,6BAAsB,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,CAAE,CAAA,MAAA,EAAF,EAAS,IAAA,EAAK,SAAQ,CAAE,CAAA;AAAA,GACtE;AACF,CAAC;;;;"}
|
|
@@ -16,6 +16,10 @@ import { EmptyState, Table, Link } from '@backstage/core-components';
|
|
|
16
16
|
import { useRouteRef } from '@backstage/core-plugin-api';
|
|
17
17
|
import { getHostnameFromEntity } from '../getHostnameFromEntity.esm.js';
|
|
18
18
|
|
|
19
|
+
const truncateAtNewline = (str) => {
|
|
20
|
+
const newlineIndex = str.indexOf("\n");
|
|
21
|
+
return newlineIndex !== -1 ? str.substring(0, newlineIndex) : str;
|
|
22
|
+
};
|
|
19
23
|
const generatedColumns = [
|
|
20
24
|
{
|
|
21
25
|
title: "ID",
|
|
@@ -30,7 +34,16 @@ const generatedColumns = [
|
|
|
30
34
|
render: (row) => {
|
|
31
35
|
const LinkWrapper = () => {
|
|
32
36
|
const routeLink = useRouteRef(buildRouteRef);
|
|
33
|
-
|
|
37
|
+
const truncatedMessage = truncateAtNewline(row.message);
|
|
38
|
+
return /* @__PURE__ */ React.createElement(
|
|
39
|
+
Link,
|
|
40
|
+
{
|
|
41
|
+
component: Link$1,
|
|
42
|
+
to: routeLink({ id: row.id }),
|
|
43
|
+
title: row.message
|
|
44
|
+
},
|
|
45
|
+
truncatedMessage
|
|
46
|
+
);
|
|
34
47
|
};
|
|
35
48
|
return /* @__PURE__ */ React.createElement(LinkWrapper, null);
|
|
36
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkflowRunsTable.esm.js","sources":["../../../src/components/WorkflowRunsTable/WorkflowRunsTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Button from '@material-ui/core/Button';\nimport RetryIcon from '@material-ui/icons/Replay';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useWorkflowRuns, WorkflowRun } from '../useWorkflowRuns';\nimport { WorkflowRunStatus } from '../WorkflowRunStatus';\nimport SyncIcon from '@material-ui/icons/Sync';\nimport { buildRouteRef } from '../../routes';\nimport { getProjectNameFromEntity } from '../getProjectNameFromEntity';\nimport { Entity } from '@backstage/catalog-model';\n\nimport {\n EmptyState,\n Table,\n TableColumn,\n Link,\n} from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { getHostnameFromEntity } from '../getHostnameFromEntity';\nimport { getStatusDescription } from '../WorkflowRunStatus/WorkflowRunStatus';\n\nconst generatedColumns: TableColumn<Partial<WorkflowRun>>[] = [\n {\n title: 'ID',\n field: 'id',\n type: 'numeric',\n width: '150px',\n },\n {\n title: 'Message',\n field: 'message',\n highlight: true,\n render: row => {\n const LinkWrapper = () => {\n const routeLink = useRouteRef(buildRouteRef);\n return (\n <Link component={RouterLink} to={routeLink({ id: row.id! })}>\n {row.message}\n </Link>\n );\n };\n\n return <LinkWrapper />;\n },\n },\n {\n title: 'Source',\n render: row => (\n <Typography variant=\"body2\" noWrap>\n <Typography paragraph variant=\"body2\">\n {row.source?.branchName}\n </Typography>\n <Typography paragraph variant=\"body2\">\n {row.source?.commit.hash}\n </Typography>\n </Typography>\n ),\n },\n {\n title: 'Workflow',\n field: 'workflowName',\n },\n {\n title: 'Status',\n customSort: (d1, d2) => {\n return getStatusDescription(d1).localeCompare(getStatusDescription(d2));\n },\n render: row => (\n <Box display=\"flex\" alignItems=\"center\">\n <WorkflowRunStatus status={row.status} conclusion={row.conclusion} />\n </Box>\n ),\n },\n {\n title: 'Actions',\n render: (row: Partial<WorkflowRun>) => (\n <Tooltip title=\"Rerun workflow\">\n <IconButton onClick={row.onReRunClick}>\n <RetryIcon />\n </IconButton>\n </Tooltip>\n ),\n width: '10%',\n },\n];\n\ntype Props = {\n loading: boolean;\n retry: () => void;\n runs?: WorkflowRun[];\n projectName: string;\n page: number;\n onChangePage: (page: number) => void;\n total: number;\n pageSize: number;\n onChangePageSize: (pageSize: number) => void;\n};\n\nexport const WorkflowRunsTableView = ({\n projectName,\n loading,\n pageSize,\n page,\n retry,\n runs,\n onChangePage,\n onChangePageSize,\n total,\n}: Props) => {\n return (\n <Table\n isLoading={loading}\n options={{ paging: true, pageSize, padding: 'dense' }}\n totalCount={total}\n page={page}\n actions={[\n {\n icon: () => <SyncIcon />,\n tooltip: 'Reload workflow runs',\n isFreeAction: true,\n onClick: () => retry(),\n },\n ]}\n data={runs ?? []}\n onPageChange={onChangePage}\n onRowsPerPageChange={onChangePageSize}\n style={{ width: '100%' }}\n title={\n <Box display=\"flex\" alignItems=\"center\">\n <GitHubIcon />\n <Box mr={1} />\n <Typography variant=\"h6\">{projectName}</Typography>\n </Box>\n }\n columns={generatedColumns}\n />\n );\n};\n\nexport const WorkflowRunsTable = ({\n entity,\n branch,\n}: {\n entity: Entity;\n branch?: string;\n}) => {\n const projectName = getProjectNameFromEntity(entity);\n const hostname = getHostnameFromEntity(entity);\n const [owner, repo] = (projectName ?? '/').split('/');\n const [{ runs, ...tableProps }, { retry, setPage, setPageSize }] =\n useWorkflowRuns({\n hostname,\n owner,\n repo,\n branch,\n });\n\n const githubHost = hostname || 'github.com';\n const hasNoRuns = !tableProps.loading && !runs;\n\n return hasNoRuns ? (\n <EmptyState\n missing=\"data\"\n title=\"No Workflow Data\"\n description=\"This component has GitHub Actions enabled, but no data was found. Have you created any Workflows? Click the button below to create a new Workflow.\"\n action={\n <Button\n variant=\"contained\"\n color=\"primary\"\n href={`https://${githubHost}/${projectName}/actions/new`}\n >\n Create new Workflow\n </Button>\n }\n />\n ) : (\n <WorkflowRunsTableView\n {...tableProps}\n runs={runs}\n loading={tableProps.loading}\n retry={retry}\n onChangePageSize={setPageSize}\n onChangePage={setPage}\n />\n );\n};\n"],"names":["RouterLink"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"WorkflowRunsTable.esm.js","sources":["../../../src/components/WorkflowRunsTable/WorkflowRunsTable.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport Typography from '@material-ui/core/Typography';\nimport Box from '@material-ui/core/Box';\nimport IconButton from '@material-ui/core/IconButton';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Button from '@material-ui/core/Button';\nimport RetryIcon from '@material-ui/icons/Replay';\nimport GitHubIcon from '@material-ui/icons/GitHub';\nimport { Link as RouterLink } from 'react-router-dom';\nimport { useWorkflowRuns, WorkflowRun } from '../useWorkflowRuns';\nimport { WorkflowRunStatus } from '../WorkflowRunStatus';\nimport SyncIcon from '@material-ui/icons/Sync';\nimport { buildRouteRef } from '../../routes';\nimport { getProjectNameFromEntity } from '../getProjectNameFromEntity';\nimport { Entity } from '@backstage/catalog-model';\n\nimport {\n EmptyState,\n Table,\n TableColumn,\n Link,\n} from '@backstage/core-components';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { getHostnameFromEntity } from '../getHostnameFromEntity';\nimport { getStatusDescription } from '../WorkflowRunStatus/WorkflowRunStatus';\n\n// Utility function to truncate string at the first newline character\nconst truncateAtNewline = (str: string) => {\n const newlineIndex = str.indexOf('\\n');\n return newlineIndex !== -1 ? str.substring(0, newlineIndex) : str;\n};\n\nconst generatedColumns: TableColumn<Partial<WorkflowRun>>[] = [\n {\n title: 'ID',\n field: 'id',\n type: 'numeric',\n width: '150px',\n },\n {\n title: 'Message',\n field: 'message',\n highlight: true,\n render: row => {\n const LinkWrapper = () => {\n const routeLink = useRouteRef(buildRouteRef);\n const truncatedMessage = truncateAtNewline(row.message!);\n return (\n <Link\n component={RouterLink}\n to={routeLink({ id: row.id! })}\n title={row.message} // display full message on hover\n >\n {truncatedMessage}\n </Link>\n );\n };\n\n return <LinkWrapper />;\n },\n },\n {\n title: 'Source',\n render: row => (\n <Typography variant=\"body2\" noWrap>\n <Typography paragraph variant=\"body2\">\n {row.source?.branchName}\n </Typography>\n <Typography paragraph variant=\"body2\">\n {row.source?.commit.hash}\n </Typography>\n </Typography>\n ),\n },\n {\n title: 'Workflow',\n field: 'workflowName',\n },\n {\n title: 'Status',\n customSort: (d1, d2) => {\n return getStatusDescription(d1).localeCompare(getStatusDescription(d2));\n },\n render: row => (\n <Box display=\"flex\" alignItems=\"center\">\n <WorkflowRunStatus status={row.status} conclusion={row.conclusion} />\n </Box>\n ),\n },\n {\n title: 'Actions',\n render: (row: Partial<WorkflowRun>) => (\n <Tooltip title=\"Rerun workflow\">\n <IconButton onClick={row.onReRunClick}>\n <RetryIcon />\n </IconButton>\n </Tooltip>\n ),\n width: '10%',\n },\n];\n\ntype Props = {\n loading: boolean;\n retry: () => void;\n runs?: WorkflowRun[];\n projectName: string;\n page: number;\n onChangePage: (page: number) => void;\n total: number;\n pageSize: number;\n onChangePageSize: (pageSize: number) => void;\n};\n\nexport const WorkflowRunsTableView = ({\n projectName,\n loading,\n pageSize,\n page,\n retry,\n runs,\n onChangePage,\n onChangePageSize,\n total,\n}: Props) => {\n return (\n <Table\n isLoading={loading}\n options={{ paging: true, pageSize, padding: 'dense' }}\n totalCount={total}\n page={page}\n actions={[\n {\n icon: () => <SyncIcon />,\n tooltip: 'Reload workflow runs',\n isFreeAction: true,\n onClick: () => retry(),\n },\n ]}\n data={runs ?? []}\n onPageChange={onChangePage}\n onRowsPerPageChange={onChangePageSize}\n style={{ width: '100%' }}\n title={\n <Box display=\"flex\" alignItems=\"center\">\n <GitHubIcon />\n <Box mr={1} />\n <Typography variant=\"h6\">{projectName}</Typography>\n </Box>\n }\n columns={generatedColumns}\n />\n );\n};\n\nexport const WorkflowRunsTable = ({\n entity,\n branch,\n}: {\n entity: Entity;\n branch?: string;\n}) => {\n const projectName = getProjectNameFromEntity(entity);\n const hostname = getHostnameFromEntity(entity);\n const [owner, repo] = (projectName ?? '/').split('/');\n const [{ runs, ...tableProps }, { retry, setPage, setPageSize }] =\n useWorkflowRuns({\n hostname,\n owner,\n repo,\n branch,\n });\n\n const githubHost = hostname || 'github.com';\n const hasNoRuns = !tableProps.loading && !runs;\n\n return hasNoRuns ? (\n <EmptyState\n missing=\"data\"\n title=\"No Workflow Data\"\n description=\"This component has GitHub Actions enabled, but no data was found. Have you created any Workflows? Click the button below to create a new Workflow.\"\n action={\n <Button\n variant=\"contained\"\n color=\"primary\"\n href={`https://${githubHost}/${projectName}/actions/new`}\n >\n Create new Workflow\n </Button>\n }\n />\n ) : (\n <WorkflowRunsTableView\n {...tableProps}\n runs={runs}\n loading={tableProps.loading}\n retry={retry}\n onChangePageSize={setPageSize}\n onChangePage={setPage}\n />\n );\n};\n"],"names":["RouterLink"],"mappings":"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"}
|