@backstage-community/plugin-tekton 3.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.
Files changed (151) hide show
  1. package/CHANGELOG.md +801 -0
  2. package/README.md +369 -0
  3. package/app-config.dynamic.yaml +12 -0
  4. package/dist/components/Charts/PipelineBars.esm.js +49 -0
  5. package/dist/components/Charts/PipelineBars.esm.js.map +1 -0
  6. package/dist/components/Icons/CriticalRiskIcon.esm.js +22 -0
  7. package/dist/components/Icons/CriticalRiskIcon.esm.js.map +1 -0
  8. package/dist/components/Icons/EqualsIcon.esm.js +22 -0
  9. package/dist/components/Icons/EqualsIcon.esm.js.map +1 -0
  10. package/dist/components/Icons/LinkToSbomIcon.esm.js +37 -0
  11. package/dist/components/Icons/LinkToSbomIcon.esm.js.map +1 -0
  12. package/dist/components/Icons/OutputIcon.esm.js +36 -0
  13. package/dist/components/Icons/OutputIcon.esm.js.map +1 -0
  14. package/dist/components/Icons/SignedBadge.esm.js +16 -0
  15. package/dist/components/Icons/SignedBadge.esm.js.map +1 -0
  16. package/dist/components/Icons/ViewLogsIcon.esm.js +35 -0
  17. package/dist/components/Icons/ViewLogsIcon.esm.js.map +1 -0
  18. package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js +43 -0
  19. package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js.map +1 -0
  20. package/dist/components/PipelineRunList/PipelineRunList.esm.js +185 -0
  21. package/dist/components/PipelineRunList/PipelineRunList.esm.js.map +1 -0
  22. package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js +42 -0
  23. package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js.map +1 -0
  24. package/dist/components/PipelineRunList/PipelineRunOutput.esm.js +70 -0
  25. package/dist/components/PipelineRunList/PipelineRunOutput.esm.js.map +1 -0
  26. package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js +7 -0
  27. package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js.map +1 -0
  28. package/dist/components/PipelineRunList/PipelineRunRow.esm.js +110 -0
  29. package/dist/components/PipelineRunList/PipelineRunRow.esm.js.map +1 -0
  30. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js +137 -0
  31. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js.map +1 -0
  32. package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js +25 -0
  33. package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js.map +1 -0
  34. package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js +32 -0
  35. package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js.map +1 -0
  36. package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js +11 -0
  37. package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js.map +1 -0
  38. package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js +81 -0
  39. package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js.map +1 -0
  40. package/dist/components/PipelineRunList/PipelineTableHeader.esm.js +53 -0
  41. package/dist/components/PipelineRunList/PipelineTableHeader.esm.js.map +1 -0
  42. package/dist/components/PipelineRunList/PlrStatus.css.esm.js +7 -0
  43. package/dist/components/PipelineRunList/PlrStatus.css.esm.js.map +1 -0
  44. package/dist/components/PipelineRunList/PlrStatus.esm.js +11 -0
  45. package/dist/components/PipelineRunList/PlrStatus.esm.js.map +1 -0
  46. package/dist/components/PipelineRunList/ResourceBadge.css.esm.js +7 -0
  47. package/dist/components/PipelineRunList/ResourceBadge.css.esm.js.map +1 -0
  48. package/dist/components/PipelineRunList/ResourceBadge.esm.js +15 -0
  49. package/dist/components/PipelineRunList/ResourceBadge.esm.js.map +1 -0
  50. package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js +82 -0
  51. package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js.map +1 -0
  52. package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js +47 -0
  53. package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js.map +1 -0
  54. package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js +53 -0
  55. package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js.map +1 -0
  56. package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js +69 -0
  57. package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js.map +1 -0
  58. package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js +69 -0
  59. package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js.map +1 -0
  60. package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js +128 -0
  61. package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js.map +1 -0
  62. package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js +62 -0
  63. package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js.map +1 -0
  64. package/dist/components/Router.esm.js +16 -0
  65. package/dist/components/Router.esm.js.map +1 -0
  66. package/dist/components/Tekton/TektonCIComponent.esm.js +53 -0
  67. package/dist/components/Tekton/TektonCIComponent.esm.js.map +1 -0
  68. package/dist/components/common/ClusterSelector.css.esm.js +7 -0
  69. package/dist/components/common/ClusterSelector.css.esm.js.map +1 -0
  70. package/dist/components/common/ClusterSelector.esm.js +46 -0
  71. package/dist/components/common/ClusterSelector.esm.js.map +1 -0
  72. package/dist/components/common/ErrorPanel.esm.js +33 -0
  73. package/dist/components/common/ErrorPanel.esm.js.map +1 -0
  74. package/dist/components/common/PermissionAlert.esm.js +9 -0
  75. package/dist/components/common/PermissionAlert.esm.js.map +1 -0
  76. package/dist/components/common/ResourceStatus.css.esm.js +7 -0
  77. package/dist/components/common/ResourceStatus.css.esm.js.map +1 -0
  78. package/dist/components/common/StatusSelector.css.esm.js +7 -0
  79. package/dist/components/common/StatusSelector.css.esm.js.map +1 -0
  80. package/dist/components/common/StatusSelector.esm.js +48 -0
  81. package/dist/components/common/StatusSelector.esm.js.map +1 -0
  82. package/dist/components/common/TableExpandCollapse.esm.js +44 -0
  83. package/dist/components/common/TableExpandCollapse.esm.js.map +1 -0
  84. package/dist/components/pipeline-topology/PipelineLayout.esm.js +126 -0
  85. package/dist/components/pipeline-topology/PipelineLayout.esm.js.map +1 -0
  86. package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js +13 -0
  87. package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js.map +1 -0
  88. package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js +7 -0
  89. package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js.map +1 -0
  90. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js +132 -0
  91. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js.map +1 -0
  92. package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js +7 -0
  93. package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js.map +1 -0
  94. package/dist/components/pipeline-topology/PipelineVisualization.esm.js +24 -0
  95. package/dist/components/pipeline-topology/PipelineVisualization.esm.js.map +1 -0
  96. package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js +7 -0
  97. package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js.map +1 -0
  98. package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js +39 -0
  99. package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js.map +1 -0
  100. package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js +41 -0
  101. package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js.map +1 -0
  102. package/dist/components/pipeline-topology/TaskGroupEdge.esm.js +16 -0
  103. package/dist/components/pipeline-topology/TaskGroupEdge.esm.js.map +1 -0
  104. package/dist/components/pipeline-topology/dag.esm.js +119 -0
  105. package/dist/components/pipeline-topology/dag.esm.js.map +1 -0
  106. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js +60 -0
  107. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js.map +1 -0
  108. package/dist/consts/pipeline-topology-const.esm.js +66 -0
  109. package/dist/consts/pipeline-topology-const.esm.js.map +1 -0
  110. package/dist/consts/tekton-const.esm.js +7 -0
  111. package/dist/consts/tekton-const.esm.js.map +1 -0
  112. package/dist/hooks/TektonResourcesContext.esm.js +16 -0
  113. package/dist/hooks/TektonResourcesContext.esm.js.map +1 -0
  114. package/dist/hooks/useAllWatchResources.esm.js +35 -0
  115. package/dist/hooks/useAllWatchResources.esm.js.map +1 -0
  116. package/dist/hooks/useDarkTheme.esm.js +21 -0
  117. package/dist/hooks/useDarkTheme.esm.js.map +1 -0
  118. package/dist/hooks/usePipelineRunScanResults.esm.js +35 -0
  119. package/dist/hooks/usePipelineRunScanResults.esm.js.map +1 -0
  120. package/dist/hooks/usePodLogsOfPipelineRun.esm.js +67 -0
  121. package/dist/hooks/usePodLogsOfPipelineRun.esm.js.map +1 -0
  122. package/dist/hooks/useResourcesClusters.esm.js +24 -0
  123. package/dist/hooks/useResourcesClusters.esm.js.map +1 -0
  124. package/dist/hooks/useTektonObjectsResponse.esm.js +78 -0
  125. package/dist/hooks/useTektonObjectsResponse.esm.js.map +1 -0
  126. package/dist/hooks/useTektonViewPermission.esm.js +12 -0
  127. package/dist/hooks/useTektonViewPermission.esm.js.map +1 -0
  128. package/dist/index.d.ts +32 -0
  129. package/dist/index.esm.js +3 -0
  130. package/dist/index.esm.js.map +1 -0
  131. package/dist/models.esm.js +21 -0
  132. package/dist/models.esm.js.map +1 -0
  133. package/dist/plugin.esm.js +72 -0
  134. package/dist/plugin.esm.js.map +1 -0
  135. package/dist/types/types.esm.js +15 -0
  136. package/dist/types/types.esm.js.map +1 -0
  137. package/dist/utils/isTektonCIAvailable.esm.js +7 -0
  138. package/dist/utils/isTektonCIAvailable.esm.js.map +1 -0
  139. package/dist/utils/log-downloader-utils.esm.js +33 -0
  140. package/dist/utils/log-downloader-utils.esm.js.map +1 -0
  141. package/dist/utils/pipeline-step-utils.esm.js +53 -0
  142. package/dist/utils/pipeline-step-utils.esm.js.map +1 -0
  143. package/dist/utils/pipeline-topology-utils.esm.js +250 -0
  144. package/dist/utils/pipeline-topology-utils.esm.js.map +1 -0
  145. package/dist/utils/pipelineRun-utils.esm.js +128 -0
  146. package/dist/utils/pipelineRun-utils.esm.js.map +1 -0
  147. package/dist/utils/taskRun-utils.esm.js +50 -0
  148. package/dist/utils/taskRun-utils.esm.js.map +1 -0
  149. package/dist/utils/tekton-utils.esm.js +191 -0
  150. package/dist/utils/tekton-utils.esm.js.map +1 -0
  151. package/package.json +114 -0
@@ -0,0 +1,43 @@
1
+ const PipelineRunColumnHeader = [
2
+ {
3
+ id: "expander"
4
+ },
5
+ {
6
+ id: "name",
7
+ title: "NAME",
8
+ field: "metadata.name"
9
+ },
10
+ {
11
+ id: "vulnerabilities",
12
+ title: "VULNERABILITIES",
13
+ field: "status.results"
14
+ },
15
+ {
16
+ id: "status",
17
+ title: "STATUS",
18
+ field: "status.conditions[0].reason"
19
+ },
20
+ {
21
+ id: "task-status",
22
+ title: "TASK STATUS",
23
+ field: "status.conditions[0].reason"
24
+ },
25
+ {
26
+ id: "start-time",
27
+ title: "STARTED",
28
+ field: "status.startTime",
29
+ defaultSort: "desc"
30
+ },
31
+ {
32
+ id: "duration",
33
+ title: "DURATION",
34
+ field: "status.completionTime"
35
+ },
36
+ {
37
+ id: "actions",
38
+ title: "ACTIONS"
39
+ }
40
+ ];
41
+
42
+ export { PipelineRunColumnHeader };
43
+ //# sourceMappingURL=PipelineRunColumnHeader.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunColumnHeader.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunColumnHeader.ts"],"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 { TableColumn } from '@backstage/core-components';\n\nexport const PipelineRunColumnHeader: TableColumn[] = [\n {\n id: 'expander',\n },\n {\n id: 'name',\n title: 'NAME',\n field: 'metadata.name',\n },\n {\n id: 'vulnerabilities',\n title: 'VULNERABILITIES',\n field: 'status.results',\n },\n {\n id: 'status',\n title: 'STATUS',\n field: 'status.conditions[0].reason',\n },\n {\n id: 'task-status',\n title: 'TASK STATUS',\n field: 'status.conditions[0].reason',\n },\n {\n id: 'start-time',\n title: 'STARTED',\n field: 'status.startTime',\n defaultSort: 'desc',\n },\n {\n id: 'duration',\n title: 'DURATION',\n field: 'status.completionTime',\n },\n {\n id: 'actions',\n title: 'ACTIONS',\n },\n];\n"],"names":[],"mappings":"AAiBO,MAAM,uBAAyC,GAAA;AAAA,EACpD;AAAA,IACE,EAAI,EAAA;AAAA,GACN;AAAA,EACA;AAAA,IACE,EAAI,EAAA,MAAA;AAAA,IACJ,KAAO,EAAA,MAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAI,EAAA,iBAAA;AAAA,IACJ,KAAO,EAAA,iBAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAI,EAAA,QAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAI,EAAA,aAAA;AAAA,IACJ,KAAO,EAAA,aAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAI,EAAA,YAAA;AAAA,IACJ,KAAO,EAAA,SAAA;AAAA,IACP,KAAO,EAAA,kBAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,EAAI,EAAA,UAAA;AAAA,IACJ,KAAO,EAAA,UAAA;AAAA,IACP,KAAO,EAAA;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAI,EAAA,SAAA;AAAA,IACJ,KAAO,EAAA;AAAA;AAEX;;;;"}
@@ -0,0 +1,185 @@
1
+ import React__default from 'react';
2
+ import { Progress, InfoCard } from '@backstage/core-components';
3
+ import { makeStyles, Box, Paper, Toolbar, Typography, Table, TableBody, TableRow, TableCell, TablePagination } from '@material-ui/core';
4
+ import { ComputedStatus, pipelineRunStatus } from '@janus-idp/shared-react';
5
+ import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
6
+ import { getComparator } from '../../utils/tekton-utils.esm.js';
7
+ import { ErrorPanel } from '../common/ErrorPanel.esm.js';
8
+ import { ClusterSelector } from '../common/ClusterSelector.esm.js';
9
+ import '@patternfly/react-core';
10
+ import 'classnames';
11
+ import '../common/ResourceStatus.css.esm.js';
12
+ import { StatusSelector } from '../common/StatusSelector.esm.js';
13
+ import { TableExpandCollapse } from '../common/TableExpandCollapse.esm.js';
14
+ import { PipelineRunColumnHeader } from './PipelineRunColumnHeader.esm.js';
15
+ import { PipelineRunListSearchBar } from './PipelineRunListSearchBar.esm.js';
16
+ import { PipelineRunTableBody } from './PipelineRunTableBody.esm.js';
17
+ import { EnhancedTableHead } from './PipelineTableHeader.esm.js';
18
+
19
+ const useStyles = makeStyles((theme) => ({
20
+ root: {
21
+ alignItems: "start",
22
+ padding: theme.spacing(3, 0, 2.5, 2.5)
23
+ },
24
+ empty: {
25
+ padding: theme.spacing(2),
26
+ display: "flex",
27
+ justifyContent: "center"
28
+ },
29
+ title: {
30
+ display: "flex",
31
+ gap: "20px",
32
+ alignItems: "center"
33
+ },
34
+ footer: {
35
+ "&:nth-of-type(odd)": {
36
+ backgroundColor: `${theme.palette.background.paper}`
37
+ }
38
+ }
39
+ }));
40
+ const WrapperInfoCard = ({
41
+ children,
42
+ allErrors,
43
+ showClusterSelector = true,
44
+ titleClassName
45
+ }) => /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, allErrors && allErrors.length > 0 && /* @__PURE__ */ React__default.createElement(ErrorPanel, { allErrors }), /* @__PURE__ */ React__default.createElement(
46
+ InfoCard,
47
+ {
48
+ ...showClusterSelector && {
49
+ title: /* @__PURE__ */ React__default.createElement("div", { className: titleClassName }, /* @__PURE__ */ React__default.createElement(ClusterSelector, null), /* @__PURE__ */ React__default.createElement(StatusSelector, null), /* @__PURE__ */ React__default.createElement(TableExpandCollapse, null))
50
+ }
51
+ },
52
+ children
53
+ ));
54
+ const PipelineRunList = () => {
55
+ const {
56
+ loaded,
57
+ responseError,
58
+ watchResourcesData,
59
+ selectedClusterErrors,
60
+ clusters,
61
+ selectedCluster,
62
+ selectedStatus
63
+ } = React__default.useContext(TektonResourcesContext);
64
+ const [search, setSearch] = React__default.useState("");
65
+ const [order, setOrder] = React__default.useState("desc");
66
+ const [orderBy, setOrderBy] = React__default.useState("status.startTime");
67
+ const [orderById, setOrderById] = React__default.useState("startTime");
68
+ const [page, setPage] = React__default.useState(0);
69
+ const [rowsPerPage, setRowsPerPage] = React__default.useState(5);
70
+ const updateStateOnFilterChanges = React__default.useRef(false);
71
+ React__default.useEffect(() => {
72
+ if (updateStateOnFilterChanges.current) {
73
+ setPage(0);
74
+ } else {
75
+ updateStateOnFilterChanges.current = true;
76
+ }
77
+ }, [selectedCluster, selectedStatus, search]);
78
+ const allPipelineRuns = React__default.useMemo(() => {
79
+ const plrs = watchResourcesData?.pipelineruns?.data?.map((d) => ({
80
+ ...d,
81
+ id: d.metadata.uid
82
+ })) ?? [];
83
+ return plrs;
84
+ }, [watchResourcesData]);
85
+ const filteredPipelineRuns = React__default.useMemo(() => {
86
+ let plrs = allPipelineRuns;
87
+ if (selectedStatus && selectedStatus !== ComputedStatus.All) {
88
+ plrs = plrs.filter((plr) => pipelineRunStatus(plr) === selectedStatus);
89
+ }
90
+ if (search) {
91
+ const f = search.toLocaleUpperCase("en-US");
92
+ plrs = plrs.filter((plr) => {
93
+ const n = plr.metadata?.name?.toLocaleUpperCase("en-US");
94
+ return n?.includes(f);
95
+ });
96
+ }
97
+ plrs = plrs.sort(getComparator(order, orderBy, orderById));
98
+ return plrs;
99
+ }, [allPipelineRuns, selectedStatus, search, order, orderBy, orderById]);
100
+ const visibleRows = React__default.useMemo(() => {
101
+ return filteredPipelineRuns.slice(
102
+ page * rowsPerPage,
103
+ page * rowsPerPage + rowsPerPage
104
+ );
105
+ }, [filteredPipelineRuns, page, rowsPerPage, order, orderById]);
106
+ const handleRequestSort = React__default.useCallback(
107
+ (_event, property, id) => {
108
+ const isAsc = orderBy === property && order === "asc";
109
+ setOrder(isAsc ? "desc" : "asc");
110
+ setOrderBy(property);
111
+ setOrderById(id);
112
+ },
113
+ [order, orderBy]
114
+ );
115
+ const handleChangePage = (_event, newPage) => {
116
+ setPage(newPage);
117
+ };
118
+ const handleChangeRowsPerPage = (event) => {
119
+ setRowsPerPage(parseInt(event.target.value, 10));
120
+ setPage(0);
121
+ };
122
+ const emptyRows = page > 0 ? Math.max(
123
+ 0,
124
+ (1 + page) * rowsPerPage - (filteredPipelineRuns.length ?? 0)
125
+ ) : 0;
126
+ const classes = useStyles();
127
+ const allErrors = [
128
+ ...responseError ? [{ message: responseError }] : [],
129
+ ...selectedClusterErrors ?? []
130
+ ];
131
+ if (!loaded && !responseError)
132
+ return /* @__PURE__ */ React__default.createElement("div", { "data-testid": "tekton-progress" }, /* @__PURE__ */ React__default.createElement(Progress, null));
133
+ return /* @__PURE__ */ React__default.createElement(
134
+ WrapperInfoCard,
135
+ {
136
+ allErrors,
137
+ showClusterSelector: clusters.length > 0,
138
+ titleClassName: classes.title
139
+ },
140
+ /* @__PURE__ */ React__default.createElement(Box, null, /* @__PURE__ */ React__default.createElement(Paper, null, /* @__PURE__ */ React__default.createElement(Toolbar, null, /* @__PURE__ */ React__default.createElement(Typography, { variant: "h5", component: "h2" }, "Pipeline Runs"), /* @__PURE__ */ React__default.createElement(PipelineRunListSearchBar, { value: search, onChange: setSearch })), /* @__PURE__ */ React__default.createElement(
141
+ Table,
142
+ {
143
+ "aria-labelledby": "Pipeline Runs",
144
+ size: "small",
145
+ style: { width: "100%" }
146
+ },
147
+ /* @__PURE__ */ React__default.createElement(
148
+ EnhancedTableHead,
149
+ {
150
+ order,
151
+ orderBy,
152
+ orderById,
153
+ onRequestSort: handleRequestSort
154
+ }
155
+ ),
156
+ visibleRows?.length > 0 ? /* @__PURE__ */ React__default.createElement(TableBody, null, /* @__PURE__ */ React__default.createElement(PipelineRunTableBody, { rows: visibleRows }), emptyRows > 0 && /* @__PURE__ */ React__default.createElement(TableRow, { style: { height: 55 * emptyRows } }, /* @__PURE__ */ React__default.createElement(TableCell, { colSpan: PipelineRunColumnHeader.length })), /* @__PURE__ */ React__default.createElement(TableRow, { className: classes.footer }, /* @__PURE__ */ React__default.createElement(
157
+ TablePagination,
158
+ {
159
+ rowsPerPageOptions: [
160
+ { value: 5, label: "5 rows" },
161
+ { value: 10, label: "10 rows" },
162
+ { value: 25, label: "25 rows" }
163
+ ],
164
+ count: filteredPipelineRuns.length,
165
+ rowsPerPage,
166
+ page,
167
+ onPageChange: handleChangePage,
168
+ onRowsPerPageChange: handleChangeRowsPerPage,
169
+ labelRowsPerPage: null
170
+ }
171
+ ))) : /* @__PURE__ */ React__default.createElement("tbody", null, /* @__PURE__ */ React__default.createElement("tr", null, /* @__PURE__ */ React__default.createElement("td", { colSpan: PipelineRunColumnHeader.length }, /* @__PURE__ */ React__default.createElement(
172
+ "div",
173
+ {
174
+ "data-testid": "no-pipeline-runs",
175
+ className: classes.empty
176
+ },
177
+ "No Pipeline Runs found"
178
+ ))))
179
+ )))
180
+ );
181
+ };
182
+ var PipelineRunList$1 = React__default.memo(PipelineRunList);
183
+
184
+ export { PipelineRunList$1 as default };
185
+ //# sourceMappingURL=PipelineRunList.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunList.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunList.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';\n\nimport { InfoCard, Progress } from '@backstage/core-components';\n\nimport {\n Box,\n makeStyles,\n Paper,\n Table,\n TableBody,\n TableCell,\n TablePagination,\n TableRow,\n Toolbar,\n Typography,\n} from '@material-ui/core';\n\nimport {\n ComputedStatus,\n PipelineRunKind,\n pipelineRunStatus,\n} from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { ClusterErrors, Order } from '../../types/types';\nimport { getComparator } from '../../utils/tekton-utils';\nimport { ClusterSelector, ErrorPanel } from '../common';\nimport { StatusSelector } from '../common/StatusSelector';\nimport { TableExpandCollapse } from '../common/TableExpandCollapse';\nimport { PipelineRunColumnHeader } from './PipelineRunColumnHeader';\nimport { PipelineRunListSearchBar } from './PipelineRunListSearchBar';\nimport { PipelineRunTableBody } from './PipelineRunTableBody';\nimport { EnhancedTableHead } from './PipelineTableHeader';\n\ntype WrapperInfoCardProps = {\n allErrors?: ClusterErrors;\n showClusterSelector?: boolean;\n titleClassName?: string;\n};\n\nconst useStyles = makeStyles(theme => ({\n root: {\n alignItems: 'start',\n padding: theme.spacing(3, 0, 2.5, 2.5),\n },\n empty: {\n padding: theme.spacing(2),\n display: 'flex',\n justifyContent: 'center',\n },\n title: {\n display: 'flex',\n gap: '20px',\n alignItems: 'center',\n },\n footer: {\n '&:nth-of-type(odd)': {\n backgroundColor: `${theme.palette.background.paper}`,\n },\n },\n}));\n\nconst WrapperInfoCard = ({\n children,\n allErrors,\n showClusterSelector = true,\n titleClassName,\n}: React.PropsWithChildren<WrapperInfoCardProps>) => (\n <>\n {allErrors && allErrors.length > 0 && <ErrorPanel allErrors={allErrors} />}\n <InfoCard\n {...(showClusterSelector && {\n title: (\n <div className={titleClassName}>\n <ClusterSelector />\n <StatusSelector />\n <TableExpandCollapse />\n </div>\n ),\n })}\n >\n {children}\n </InfoCard>\n </>\n);\n\nconst PipelineRunList = () => {\n const {\n loaded,\n responseError,\n watchResourcesData,\n selectedClusterErrors,\n clusters,\n selectedCluster,\n selectedStatus,\n } = React.useContext(TektonResourcesContext);\n const [search, setSearch] = React.useState<string>('');\n const [order, setOrder] = React.useState<Order>('desc');\n const [orderBy, setOrderBy] = React.useState<string>('status.startTime');\n const [orderById, setOrderById] = React.useState<string>('startTime'); // 2 columns have the same field\n const [page, setPage] = React.useState<number>(0);\n const [rowsPerPage, setRowsPerPage] = React.useState<number>(5);\n\n // Jump to first page when cluster, status and search filter changed\n const updateStateOnFilterChanges = React.useRef(false);\n React.useEffect(() => {\n if (updateStateOnFilterChanges.current) {\n setPage(0);\n } else {\n updateStateOnFilterChanges.current = true;\n }\n }, [selectedCluster, selectedStatus, search]);\n\n const allPipelineRuns = React.useMemo(() => {\n const plrs =\n watchResourcesData?.pipelineruns?.data?.map(d => ({\n ...d,\n id: d.metadata.uid,\n })) ?? [];\n return plrs as PipelineRunKind[];\n }, [watchResourcesData]);\n\n const filteredPipelineRuns = React.useMemo(() => {\n let plrs = allPipelineRuns;\n\n if (selectedStatus && selectedStatus !== ComputedStatus.All) {\n plrs = plrs.filter(plr => pipelineRunStatus(plr) === selectedStatus);\n }\n\n if (search) {\n const f = search.toLocaleUpperCase('en-US');\n plrs = plrs.filter((plr: PipelineRunKind) => {\n const n = plr.metadata?.name?.toLocaleUpperCase('en-US');\n return n?.includes(f);\n });\n }\n\n plrs = plrs.sort(getComparator(order, orderBy, orderById));\n\n return plrs;\n }, [allPipelineRuns, selectedStatus, search, order, orderBy, orderById]);\n\n const visibleRows = React.useMemo(() => {\n return filteredPipelineRuns.slice(\n page * rowsPerPage,\n page * rowsPerPage + rowsPerPage,\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filteredPipelineRuns, page, rowsPerPage, order, orderById]);\n\n const handleRequestSort = React.useCallback(\n (_event: React.MouseEvent<unknown>, property: string, id: string) => {\n const isAsc = orderBy === property && order === 'asc';\n setOrder(isAsc ? 'desc' : 'asc');\n setOrderBy(property);\n setOrderById(id);\n },\n [order, orderBy],\n );\n\n const handleChangePage = (_event: unknown, newPage: number) => {\n setPage(newPage);\n };\n\n const handleChangeRowsPerPage = (\n event: React.ChangeEvent<HTMLInputElement>,\n ) => {\n setRowsPerPage(parseInt(event.target.value, 10));\n setPage(0);\n };\n\n // Avoid a layout jump when reaching the last page with empty rows.\n const emptyRows =\n page > 0\n ? Math.max(\n 0,\n (1 + page) * rowsPerPage - (filteredPipelineRuns.length ?? 0),\n )\n : 0;\n\n const classes = useStyles();\n\n const allErrors: ClusterErrors = [\n ...(responseError ? [{ message: responseError }] : []),\n ...(selectedClusterErrors ?? []),\n ];\n\n if (!loaded && !responseError)\n return (\n <div data-testid=\"tekton-progress\">\n <Progress />\n </div>\n );\n\n return (\n <WrapperInfoCard\n allErrors={allErrors}\n showClusterSelector={clusters.length > 0}\n titleClassName={classes.title}\n >\n <Box>\n <Paper>\n <Toolbar>\n <Typography variant=\"h5\" component=\"h2\">\n Pipeline Runs\n </Typography>\n <PipelineRunListSearchBar value={search} onChange={setSearch} />\n </Toolbar>\n <Table\n aria-labelledby=\"Pipeline Runs\"\n size=\"small\"\n style={{ width: '100%' }}\n >\n <EnhancedTableHead\n order={order}\n orderBy={orderBy}\n orderById={orderById}\n onRequestSort={handleRequestSort}\n />\n {visibleRows?.length > 0 ? (\n <TableBody>\n <PipelineRunTableBody rows={visibleRows} />\n {emptyRows > 0 && (\n <TableRow style={{ height: 55 * emptyRows }}>\n <TableCell colSpan={PipelineRunColumnHeader.length} />\n </TableRow>\n )}\n <TableRow className={classes.footer}>\n <TablePagination\n rowsPerPageOptions={[\n { value: 5, label: '5 rows' },\n { value: 10, label: '10 rows' },\n { value: 25, label: '25 rows' },\n ]}\n count={filteredPipelineRuns.length}\n rowsPerPage={rowsPerPage}\n page={page}\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n labelRowsPerPage={null}\n />\n </TableRow>\n </TableBody>\n ) : (\n <tbody>\n <tr>\n <td colSpan={PipelineRunColumnHeader.length}>\n <div\n data-testid=\"no-pipeline-runs\"\n className={classes.empty}\n >\n No Pipeline Runs found\n </div>\n </td>\n </tr>\n </tbody>\n )}\n </Table>\n </Paper>\n </Box>\n </WrapperInfoCard>\n );\n};\n\nexport default React.memo(PipelineRunList);\n"],"names":["React"],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import React__default from 'react';
2
+ import { makeStyles, FormControl, Input, InputAdornment, IconButton } from '@material-ui/core';
3
+ import Clear from '@material-ui/icons/Clear';
4
+ import Search from '@material-ui/icons/Search';
5
+
6
+ const useStyles = makeStyles({
7
+ formControl: {
8
+ alignItems: "flex-end",
9
+ flexGrow: 1
10
+ }
11
+ });
12
+ const PipelineRunListSearchBar = ({
13
+ value,
14
+ onChange
15
+ }) => {
16
+ const classes = useStyles();
17
+ return /* @__PURE__ */ React__default.createElement(FormControl, { className: classes.formControl }, /* @__PURE__ */ React__default.createElement(
18
+ Input,
19
+ {
20
+ "aria-label": "search",
21
+ placeholder: "Search",
22
+ autoComplete: "off",
23
+ onChange: (event) => onChange(event.target.value),
24
+ value,
25
+ startAdornment: /* @__PURE__ */ React__default.createElement(InputAdornment, { position: "start" }, /* @__PURE__ */ React__default.createElement(Search, null)),
26
+ endAdornment: /* @__PURE__ */ React__default.createElement(InputAdornment, { position: "end" }, /* @__PURE__ */ React__default.createElement(
27
+ IconButton,
28
+ {
29
+ "aria-label": "clear search",
30
+ onClick: () => onChange(""),
31
+ edge: "end",
32
+ disabled: !value,
33
+ "data-testid": "clear-search"
34
+ },
35
+ /* @__PURE__ */ React__default.createElement(Clear, null)
36
+ ))
37
+ }
38
+ ));
39
+ };
40
+
41
+ export { PipelineRunListSearchBar };
42
+ //# sourceMappingURL=PipelineRunListSearchBar.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunListSearchBar.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunListSearchBar.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';\n\nimport {\n FormControl,\n IconButton,\n Input,\n InputAdornment,\n makeStyles,\n} from '@material-ui/core';\nimport Clear from '@material-ui/icons/Clear';\nimport Search from '@material-ui/icons/Search';\n\ntype PipelineRunListSearchBarProps = {\n value: string;\n onChange: (filter: string) => void;\n};\n\nconst useStyles = makeStyles({\n formControl: {\n alignItems: 'flex-end',\n flexGrow: 1,\n },\n});\n\nexport const PipelineRunListSearchBar = ({\n value,\n onChange,\n}: PipelineRunListSearchBarProps) => {\n const classes = useStyles();\n\n return (\n <FormControl className={classes.formControl}>\n <Input\n aria-label=\"search\"\n placeholder=\"Search\"\n autoComplete=\"off\"\n onChange={event => onChange(event.target.value)}\n value={value}\n startAdornment={\n <InputAdornment position=\"start\">\n <Search />\n </InputAdornment>\n }\n endAdornment={\n <InputAdornment position=\"end\">\n <IconButton\n aria-label=\"clear search\"\n onClick={() => onChange('')}\n edge=\"end\"\n disabled={!value}\n data-testid=\"clear-search\"\n >\n <Clear />\n </IconButton>\n </InputAdornment>\n }\n />\n </FormControl>\n );\n};\n"],"names":["React"],"mappings":";;;;;AAgCA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,WAAa,EAAA;AAAA,IACX,UAAY,EAAA,UAAA;AAAA,IACZ,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAEM,MAAM,2BAA2B,CAAC;AAAA,EACvC,KAAA;AAAA,EACA;AACF,CAAqC,KAAA;AACnC,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,WAAA,EAAA,EAAY,SAAW,EAAA,OAAA,CAAQ,WAC9B,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,YAAW,EAAA,QAAA;AAAA,MACX,WAAY,EAAA,QAAA;AAAA,MACZ,YAAa,EAAA,KAAA;AAAA,MACb,QAAU,EAAA,CAAA,KAAA,KAAS,QAAS,CAAA,KAAA,CAAM,OAAO,KAAK,CAAA;AAAA,MAC9C,KAAA;AAAA,MACA,gCACGA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,UAAS,OACvB,EAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,YAAO,CACV,CAAA;AAAA,MAEF,YACE,kBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,QAAA,EAAS,KACvB,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UACC,YAAW,EAAA,cAAA;AAAA,UACX,OAAA,EAAS,MAAM,QAAA,CAAS,EAAE,CAAA;AAAA,UAC1B,IAAK,EAAA,KAAA;AAAA,UACL,UAAU,CAAC,KAAA;AAAA,UACX,aAAY,EAAA;AAAA,SAAA;AAAA,qDAEX,KAAM,EAAA,IAAA;AAAA,OAEX;AAAA;AAAA,GAGN,CAAA;AAEJ;;;;"}
@@ -0,0 +1,70 @@
1
+ import React__default from 'react';
2
+ import { Progress } from '@backstage/core-components';
3
+ import { useApi } from '@backstage/core-plugin-api';
4
+ import { usePipelineRunOutput, Output } from '@aonic-ui/pipelines';
5
+ import { Grid, Paper, Typography } from '@material-ui/core';
6
+ import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
7
+ import { kubernetesProxyApiRef } from '../../types/types.esm.js';
8
+
9
+ const PipelineRunOutput = ({
10
+ pipelineRun,
11
+ taskRuns
12
+ }) => {
13
+ const { clusters, selectedCluster } = React__default.useContext(TektonResourcesContext);
14
+ const kubernetesProxyApi = useApi(kubernetesProxyApiRef);
15
+ const currCluster = clusters.length > 0 && clusters[selectedCluster || 0] || "";
16
+ const getLogs = React__default.useCallback(
17
+ async (podName, containerName) => {
18
+ return await kubernetesProxyApi.getPodLogs({
19
+ podName,
20
+ namespace: pipelineRun?.metadata?.namespace ?? "",
21
+ containerName,
22
+ clusterName: currCluster
23
+ }).then((res) => res?.text);
24
+ },
25
+ [kubernetesProxyApi, currCluster, pipelineRun]
26
+ );
27
+ const outputGroup = usePipelineRunOutput(
28
+ pipelineRun,
29
+ taskRuns,
30
+ getLogs
31
+ );
32
+ const stillLoading = outputGroup?.ec?.loading && (outputGroup?.acsImageScan?.loading || outputGroup?.acsImageCheck?.loading || outputGroup?.acsDeploymentCheck?.loading);
33
+ const isEmpty = (data) => Object.keys(data).length === 0;
34
+ const noDataAvailable = outputGroup?.ec?.data.length === 0 && outputGroup.results.data.length === 0 && isEmpty(outputGroup?.acsImageScan?.data) && isEmpty(outputGroup?.acsImageScan?.data) && isEmpty(outputGroup?.acsImageScan?.data);
35
+ const renderOutput = () => {
36
+ if (stillLoading && noDataAvailable) {
37
+ return /* @__PURE__ */ React__default.createElement(Progress, null);
38
+ }
39
+ if (!stillLoading && noDataAvailable) {
40
+ return /* @__PURE__ */ React__default.createElement(Typography, { align: "center", variant: "body2" }, "No output found");
41
+ }
42
+ const metadata = outputGroup?.acsImageCheck?.data?.results?.[0]?.metadata?.additionalInfo;
43
+ if (metadata?.name?.includes("@")) {
44
+ metadata.name = metadata?.name.substr(0, metadata?.name.lastIndexOf("@"));
45
+ }
46
+ return /* @__PURE__ */ React__default.createElement(
47
+ Output,
48
+ {
49
+ enterpriseContractPolicies: outputGroup?.ec?.data ?? [],
50
+ acsImageScanResult: outputGroup?.acsImageScan?.data,
51
+ acsImageCheckResults: outputGroup?.acsImageCheck?.data,
52
+ acsDeploymentCheckResults: outputGroup?.acsDeploymentCheck?.data,
53
+ pipelineRunName: pipelineRun?.metadata?.name ?? "",
54
+ pipelineRunStatus: outputGroup.status,
55
+ results: outputGroup.results.data
56
+ }
57
+ );
58
+ };
59
+ return /* @__PURE__ */ React__default.createElement(Grid, null, /* @__PURE__ */ React__default.createElement("div", { style: { height: "80vh" } }, /* @__PURE__ */ React__default.createElement(
60
+ Paper,
61
+ {
62
+ elevation: 1,
63
+ style: { height: "100%", width: "100%", minHeight: "30rem" }
64
+ },
65
+ renderOutput()
66
+ )));
67
+ };
68
+
69
+ export { PipelineRunOutput as default };
70
+ //# sourceMappingURL=PipelineRunOutput.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunOutput.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunOutput.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';\n\nimport { Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\nimport {\n ACSCheckResults,\n ACSImageScanResult,\n Output,\n PipelineRunKind as PipelineRunV1Kind,\n TaskRunKind as TaskRunV1Kind,\n usePipelineRunOutput,\n} from '@aonic-ui/pipelines';\nimport { Grid, Paper, Typography } from '@material-ui/core';\n\nimport { PipelineRunKind, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport {\n kubernetesProxyApiRef,\n TektonResourcesContextData,\n} from '../../types/types';\n\ntype PipelineRunOutputProps = {\n pipelineRun: PipelineRunKind;\n taskRuns: TaskRunKind[];\n};\n\nconst PipelineRunOutput: React.FC<PipelineRunOutputProps> = ({\n pipelineRun,\n taskRuns,\n}) => {\n const { clusters, selectedCluster } =\n React.useContext<TektonResourcesContextData>(TektonResourcesContext);\n const kubernetesProxyApi = useApi(kubernetesProxyApiRef);\n\n const currCluster =\n (clusters.length > 0 && clusters[selectedCluster || 0]) || '';\n\n const getLogs = React.useCallback(\n async (podName: string, containerName: string): Promise<string> => {\n return await kubernetesProxyApi\n .getPodLogs({\n podName: podName,\n namespace: pipelineRun?.metadata?.namespace ?? '',\n containerName: containerName,\n clusterName: currCluster,\n })\n .then(res => res?.text);\n },\n [kubernetesProxyApi, currCluster, pipelineRun],\n );\n\n const outputGroup = usePipelineRunOutput(\n pipelineRun as PipelineRunV1Kind,\n taskRuns as TaskRunV1Kind[],\n getLogs,\n );\n\n const stillLoading =\n outputGroup?.ec?.loading &&\n (outputGroup?.acsImageScan?.loading ||\n outputGroup?.acsImageCheck?.loading ||\n outputGroup?.acsDeploymentCheck?.loading);\n\n const isEmpty = (data: ACSCheckResults | ACSImageScanResult) =>\n Object.keys(data).length === 0;\n const noDataAvailable =\n outputGroup?.ec?.data.length === 0 &&\n outputGroup.results.data.length === 0 &&\n isEmpty(outputGroup?.acsImageScan?.data) &&\n isEmpty(outputGroup?.acsImageScan?.data) &&\n isEmpty(outputGroup?.acsImageScan?.data);\n\n const renderOutput = () => {\n if (stillLoading && noDataAvailable) {\n return <Progress />;\n }\n\n if (!stillLoading && noDataAvailable) {\n return (\n <Typography align=\"center\" variant=\"body2\">\n No output found\n </Typography>\n );\n }\n\n const metadata =\n outputGroup?.acsImageCheck?.data?.results?.[0]?.metadata?.additionalInfo;\n if (metadata?.name?.includes('@')) {\n metadata.name = metadata?.name.substr(0, metadata?.name.lastIndexOf('@'));\n }\n\n return (\n <Output\n enterpriseContractPolicies={outputGroup?.ec?.data ?? []}\n acsImageScanResult={outputGroup?.acsImageScan?.data}\n acsImageCheckResults={outputGroup?.acsImageCheck?.data}\n acsDeploymentCheckResults={outputGroup?.acsDeploymentCheck?.data}\n pipelineRunName={pipelineRun?.metadata?.name ?? ''}\n pipelineRunStatus={outputGroup.status}\n results={outputGroup.results.data}\n />\n );\n };\n\n return (\n <Grid>\n <div style={{ height: '80vh' }}>\n <Paper\n elevation={1}\n style={{ height: '100%', width: '100%', minHeight: '30rem' }}\n >\n {renderOutput()}\n </Paper>\n </div>\n </Grid>\n );\n};\nexport default PipelineRunOutput;\n"],"names":["React"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import styleInject from '../../node_modules/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = ".bs-tkn-timestamp {\n color: inherit;\n}\n";
4
+ styleInject(css_248z);
5
+
6
+ export { css_248z as default };
7
+ //# sourceMappingURL=PipelineRunRow.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunRow.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
@@ -0,0 +1,110 @@
1
+ import React__default from 'react';
2
+ import { makeStyles, TableRow, TableCell, IconButton, Collapse, Box } from '@material-ui/core';
3
+ import KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';
4
+ import KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight';
5
+ import { Timestamp, Tooltip } from '@patternfly/react-core';
6
+ import { TEKTON_SIGNED_ANNOTATION } from '../../consts/tekton-const.esm.js';
7
+ import { tektonGroupColor } from '../../types/types.esm.js';
8
+ import { pipelineRunDuration } from '../../utils/tekton-utils.esm.js';
9
+ import '@material-ui/core/styles';
10
+ import '../../utils/pipeline-topology-utils.esm.js';
11
+ import '@patternfly/react-topology';
12
+ import '../../consts/pipeline-topology-const.esm.js';
13
+ import '../pipeline-topology/PipelineTaskNode.esm.js';
14
+ import '../pipeline-topology/TaskGroupEdge.esm.js';
15
+ import '../pipeline-topology/PipelineVisualization.css.esm.js';
16
+ import { PipelineRunVisualization } from '../pipeline-topology/PipelineRunVisualization.esm.js';
17
+ import PipelineRunRowActions from './PipelineRunRowActions.esm.js';
18
+ import PipelineRunTaskStatus from './PipelineRunTaskStatus.esm.js';
19
+ import PipelineRunVulnerabilities from './PipelineRunVulnerabilities.esm.js';
20
+ import PlrStatus from './PlrStatus.esm.js';
21
+ import ResourceBadge from './ResourceBadge.esm.js';
22
+ import './PipelineRunRow.css.esm.js';
23
+ import classNames from 'classnames';
24
+ import SignedBadgeIcon from '../Icons/SignedBadge.esm.js';
25
+
26
+ const useStyles = makeStyles((theme) => ({
27
+ plrRow: {
28
+ "&:nth-of-type(odd)": {
29
+ backgroundColor: `${theme.palette.background.paper}`
30
+ }
31
+ },
32
+ plrVisRow: {
33
+ borderBottom: `1px solid ${theme.palette.grey.A100}`
34
+ },
35
+ signedIndicator: {
36
+ display: "inline-block",
37
+ width: theme.spacing(2.5),
38
+ position: "relative",
39
+ top: theme.spacing(0.5)
40
+ }
41
+ }));
42
+ const PipelineRunName = ({ row }) => {
43
+ const classes = useStyles();
44
+ const name = row.metadata?.name;
45
+ const signed = row?.metadata?.annotations?.[TEKTON_SIGNED_ANNOTATION] === "true";
46
+ return /* @__PURE__ */ React__default.createElement("div", null, name ? /* @__PURE__ */ React__default.createElement(
47
+ ResourceBadge,
48
+ {
49
+ color: tektonGroupColor,
50
+ abbr: "PLR",
51
+ name: name || "",
52
+ suffix: signed ? /* @__PURE__ */ React__default.createElement(Tooltip, { content: "Signed" }, /* @__PURE__ */ React__default.createElement(
53
+ "div",
54
+ {
55
+ className: classNames(
56
+ classes.signedIndicator,
57
+ "signed-indicator"
58
+ )
59
+ },
60
+ /* @__PURE__ */ React__default.createElement(SignedBadgeIcon, null)
61
+ )) : null
62
+ }
63
+ ) : "-");
64
+ };
65
+ const PipelineRunRow = ({
66
+ row,
67
+ startTime,
68
+ isExpanded = false,
69
+ open,
70
+ setOpen
71
+ }) => {
72
+ const classes = useStyles();
73
+ const uid = row.metadata?.uid;
74
+ React__default.useEffect(() => {
75
+ return setOpen((val) => {
76
+ return {
77
+ ...val,
78
+ ...uid && { [uid]: isExpanded }
79
+ };
80
+ });
81
+ }, [isExpanded, uid, setOpen]);
82
+ const expandCollapseClickHandler = () => {
83
+ setOpen((val) => {
84
+ return {
85
+ ...val,
86
+ ...uid && {
87
+ [uid]: !val[uid]
88
+ }
89
+ };
90
+ });
91
+ };
92
+ return /* @__PURE__ */ React__default.createElement(React__default.Fragment, { key: uid }, /* @__PURE__ */ React__default.createElement(TableRow, { className: classes.plrRow }, /* @__PURE__ */ React__default.createElement(TableCell, null, /* @__PURE__ */ React__default.createElement(
93
+ IconButton,
94
+ {
95
+ "aria-label": "expand row",
96
+ size: "small",
97
+ onClick: expandCollapseClickHandler
98
+ },
99
+ open ? /* @__PURE__ */ React__default.createElement(KeyboardArrowDownIcon, null) : /* @__PURE__ */ React__default.createElement(KeyboardArrowRightIcon, null)
100
+ )), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, /* @__PURE__ */ React__default.createElement(PipelineRunName, { row })), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, /* @__PURE__ */ React__default.createElement(PipelineRunVulnerabilities, { pipelineRun: row, condensed: true })), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, /* @__PURE__ */ React__default.createElement(PlrStatus, { obj: row })), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, /* @__PURE__ */ React__default.createElement(PipelineRunTaskStatus, { pipelineRun: row })), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, startTime ? /* @__PURE__ */ React__default.createElement(
101
+ Timestamp,
102
+ {
103
+ className: "bs-tkn-timestamp",
104
+ date: new Date(startTime)
105
+ }
106
+ ) : "-"), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, pipelineRunDuration(row)), /* @__PURE__ */ React__default.createElement(TableCell, { align: "left" }, /* @__PURE__ */ React__default.createElement(PipelineRunRowActions, { pipelineRun: row }))), /* @__PURE__ */ React__default.createElement(TableRow, { className: classes.plrVisRow }, /* @__PURE__ */ React__default.createElement(TableCell, { style: { paddingBottom: 0, paddingTop: 0 }, colSpan: 8 }, /* @__PURE__ */ React__default.createElement(Collapse, { in: open, timeout: "auto", unmountOnExit: true }, /* @__PURE__ */ React__default.createElement(Box, { marginTop: 1, marginBottom: 1 }, /* @__PURE__ */ React__default.createElement(PipelineRunVisualization, { pipelineRunName: row.metadata?.name }))))));
107
+ };
108
+
109
+ export { PipelineRunRow };
110
+ //# sourceMappingURL=PipelineRunRow.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PipelineRunRow.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunRow.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';\n\nimport {\n Box,\n Collapse,\n IconButton,\n makeStyles,\n TableCell,\n TableRow,\n Theme,\n} from '@material-ui/core';\nimport KeyboardArrowDownIcon from '@material-ui/icons/KeyboardArrowDown';\nimport KeyboardArrowRightIcon from '@material-ui/icons/KeyboardArrowRight';\nimport { Timestamp, Tooltip } from '@patternfly/react-core';\n\nimport { PipelineRunKind } from '@janus-idp/shared-react';\n\nimport { TEKTON_SIGNED_ANNOTATION } from '../../consts/tekton-const';\nimport { OpenRowStatus, tektonGroupColor } from '../../types/types';\nimport { pipelineRunDuration } from '../../utils/tekton-utils';\nimport { PipelineRunVisualization } from '../pipeline-topology';\nimport PipelineRunRowActions from './PipelineRunRowActions';\nimport PipelineRunTaskStatus from './PipelineRunTaskStatus';\nimport PipelineRunVulnerabilities from './PipelineRunVulnerabilities';\nimport PlrStatus from './PlrStatus';\nimport ResourceBadge from './ResourceBadge';\n\nimport './PipelineRunRow.css';\n\nimport classNames from 'classnames';\n\nimport SignedBadgeIcon from '../Icons/SignedBadge';\n\nconst useStyles = makeStyles((theme: Theme) => ({\n plrRow: {\n '&:nth-of-type(odd)': {\n backgroundColor: `${theme.palette.background.paper}`,\n },\n },\n plrVisRow: {\n borderBottom: `1px solid ${theme.palette.grey.A100}`,\n },\n signedIndicator: {\n display: 'inline-block',\n width: theme.spacing(2.5),\n position: 'relative',\n top: theme.spacing(0.5),\n },\n}));\n\ntype PipelineRunRowProps = {\n row: PipelineRunKind;\n startTime: string;\n isExpanded?: boolean;\n open: boolean;\n setOpen: React.Dispatch<React.SetStateAction<OpenRowStatus>>;\n};\n\ntype PipelineRunNameProps = { row: PipelineRunKind };\n\nconst PipelineRunName = ({ row }: PipelineRunNameProps) => {\n const classes = useStyles();\n const name = row.metadata?.name;\n const signed =\n row?.metadata?.annotations?.[TEKTON_SIGNED_ANNOTATION] === 'true';\n\n return (\n <div>\n {name ? (\n <ResourceBadge\n color={tektonGroupColor}\n abbr=\"PLR\"\n name={name || ''}\n suffix={\n signed ? (\n <Tooltip content=\"Signed\">\n <div\n className={classNames(\n classes.signedIndicator,\n 'signed-indicator',\n )}\n >\n <SignedBadgeIcon />\n </div>\n </Tooltip>\n ) : null\n }\n />\n ) : (\n '-'\n )}\n </div>\n );\n};\n\nexport const PipelineRunRow = ({\n row,\n startTime,\n isExpanded = false,\n open,\n setOpen,\n}: PipelineRunRowProps) => {\n const classes = useStyles();\n const uid = row.metadata?.uid;\n\n React.useEffect(() => {\n return setOpen((val: OpenRowStatus) => {\n return {\n ...val,\n ...(uid && { [uid]: isExpanded }),\n };\n });\n }, [isExpanded, uid, setOpen]);\n\n const expandCollapseClickHandler = () => {\n setOpen((val: OpenRowStatus) => {\n return {\n ...val,\n ...(uid && {\n [uid]: !val[uid],\n }),\n };\n });\n };\n\n return (\n <React.Fragment key={uid}>\n <TableRow className={classes.plrRow}>\n <TableCell>\n <IconButton\n aria-label=\"expand row\"\n size=\"small\"\n onClick={expandCollapseClickHandler}\n >\n {open ? <KeyboardArrowDownIcon /> : <KeyboardArrowRightIcon />}\n </IconButton>\n </TableCell>\n <TableCell align=\"left\">\n <PipelineRunName row={row} />\n </TableCell>\n <TableCell align=\"left\">\n <PipelineRunVulnerabilities pipelineRun={row} condensed />\n </TableCell>\n <TableCell align=\"left\">\n <PlrStatus obj={row} />\n </TableCell>\n <TableCell align=\"left\">\n <PipelineRunTaskStatus pipelineRun={row} />\n </TableCell>\n <TableCell align=\"left\">\n {startTime ? (\n <Timestamp\n className=\"bs-tkn-timestamp\"\n date={new Date(startTime)}\n />\n ) : (\n '-'\n )}\n </TableCell>\n <TableCell align=\"left\">{pipelineRunDuration(row)}</TableCell>\n <TableCell align=\"left\">\n <PipelineRunRowActions pipelineRun={row} />\n </TableCell>\n </TableRow>\n <TableRow className={classes.plrVisRow}>\n <TableCell style={{ paddingBottom: 0, paddingTop: 0 }} colSpan={8}>\n <Collapse in={open} timeout=\"auto\" unmountOnExit>\n <Box marginTop={1} marginBottom={1}>\n <PipelineRunVisualization pipelineRunName={row.metadata?.name} />\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n </React.Fragment>\n );\n};\n"],"names":["React"],"mappings":"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"}