@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.
- package/CHANGELOG.md +801 -0
- package/README.md +369 -0
- package/app-config.dynamic.yaml +12 -0
- package/dist/components/Charts/PipelineBars.esm.js +49 -0
- package/dist/components/Charts/PipelineBars.esm.js.map +1 -0
- package/dist/components/Icons/CriticalRiskIcon.esm.js +22 -0
- package/dist/components/Icons/CriticalRiskIcon.esm.js.map +1 -0
- package/dist/components/Icons/EqualsIcon.esm.js +22 -0
- package/dist/components/Icons/EqualsIcon.esm.js.map +1 -0
- package/dist/components/Icons/LinkToSbomIcon.esm.js +37 -0
- package/dist/components/Icons/LinkToSbomIcon.esm.js.map +1 -0
- package/dist/components/Icons/OutputIcon.esm.js +36 -0
- package/dist/components/Icons/OutputIcon.esm.js.map +1 -0
- package/dist/components/Icons/SignedBadge.esm.js +16 -0
- package/dist/components/Icons/SignedBadge.esm.js.map +1 -0
- package/dist/components/Icons/ViewLogsIcon.esm.js +35 -0
- package/dist/components/Icons/ViewLogsIcon.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js +43 -0
- package/dist/components/PipelineRunList/PipelineRunColumnHeader.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunList.esm.js +185 -0
- package/dist/components/PipelineRunList/PipelineRunList.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js +42 -0
- package/dist/components/PipelineRunList/PipelineRunListSearchBar.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunOutput.esm.js +70 -0
- package/dist/components/PipelineRunList/PipelineRunOutput.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js +7 -0
- package/dist/components/PipelineRunList/PipelineRunRow.css.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunRow.esm.js +110 -0
- package/dist/components/PipelineRunList/PipelineRunRow.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js +137 -0
- package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js +25 -0
- package/dist/components/PipelineRunList/PipelineRunSBOMLink.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js +32 -0
- package/dist/components/PipelineRunList/PipelineRunTableBody.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js +11 -0
- package/dist/components/PipelineRunList/PipelineRunTaskStatus.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js +81 -0
- package/dist/components/PipelineRunList/PipelineRunVulnerabilities.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PipelineTableHeader.esm.js +53 -0
- package/dist/components/PipelineRunList/PipelineTableHeader.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PlrStatus.css.esm.js +7 -0
- package/dist/components/PipelineRunList/PlrStatus.css.esm.js.map +1 -0
- package/dist/components/PipelineRunList/PlrStatus.esm.js +11 -0
- package/dist/components/PipelineRunList/PlrStatus.esm.js.map +1 -0
- package/dist/components/PipelineRunList/ResourceBadge.css.esm.js +7 -0
- package/dist/components/PipelineRunList/ResourceBadge.css.esm.js.map +1 -0
- package/dist/components/PipelineRunList/ResourceBadge.esm.js +15 -0
- package/dist/components/PipelineRunList/ResourceBadge.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js +82 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js +47 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogDownloader.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js +53 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogViewer.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js +69 -0
- package/dist/components/PipelineRunLogs/PipelineRunLogs.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js +69 -0
- package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js.map +1 -0
- package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js +128 -0
- package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js.map +1 -0
- package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js +62 -0
- package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js.map +1 -0
- package/dist/components/Router.esm.js +16 -0
- package/dist/components/Router.esm.js.map +1 -0
- package/dist/components/Tekton/TektonCIComponent.esm.js +53 -0
- package/dist/components/Tekton/TektonCIComponent.esm.js.map +1 -0
- package/dist/components/common/ClusterSelector.css.esm.js +7 -0
- package/dist/components/common/ClusterSelector.css.esm.js.map +1 -0
- package/dist/components/common/ClusterSelector.esm.js +46 -0
- package/dist/components/common/ClusterSelector.esm.js.map +1 -0
- package/dist/components/common/ErrorPanel.esm.js +33 -0
- package/dist/components/common/ErrorPanel.esm.js.map +1 -0
- package/dist/components/common/PermissionAlert.esm.js +9 -0
- package/dist/components/common/PermissionAlert.esm.js.map +1 -0
- package/dist/components/common/ResourceStatus.css.esm.js +7 -0
- package/dist/components/common/ResourceStatus.css.esm.js.map +1 -0
- package/dist/components/common/StatusSelector.css.esm.js +7 -0
- package/dist/components/common/StatusSelector.css.esm.js.map +1 -0
- package/dist/components/common/StatusSelector.esm.js +48 -0
- package/dist/components/common/StatusSelector.esm.js.map +1 -0
- package/dist/components/common/TableExpandCollapse.esm.js +44 -0
- package/dist/components/common/TableExpandCollapse.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineLayout.esm.js +126 -0
- package/dist/components/pipeline-topology/PipelineLayout.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js +13 -0
- package/dist/components/pipeline-topology/PipelineRunVisualization.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js +7 -0
- package/dist/components/pipeline-topology/PipelineTaskNode.css.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineTaskNode.esm.js +132 -0
- package/dist/components/pipeline-topology/PipelineTaskNode.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js +7 -0
- package/dist/components/pipeline-topology/PipelineVisualization.css.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineVisualization.esm.js +24 -0
- package/dist/components/pipeline-topology/PipelineVisualization.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js +7 -0
- package/dist/components/pipeline-topology/PipelineVisualizationStepList.css.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js +39 -0
- package/dist/components/pipeline-topology/PipelineVisualizationStepList.esm.js.map +1 -0
- package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js +41 -0
- package/dist/components/pipeline-topology/PipelineVisualizationView.esm.js.map +1 -0
- package/dist/components/pipeline-topology/TaskGroupEdge.esm.js +16 -0
- package/dist/components/pipeline-topology/TaskGroupEdge.esm.js.map +1 -0
- package/dist/components/pipeline-topology/dag.esm.js +119 -0
- package/dist/components/pipeline-topology/dag.esm.js.map +1 -0
- package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js +60 -0
- package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js.map +1 -0
- package/dist/consts/pipeline-topology-const.esm.js +66 -0
- package/dist/consts/pipeline-topology-const.esm.js.map +1 -0
- package/dist/consts/tekton-const.esm.js +7 -0
- package/dist/consts/tekton-const.esm.js.map +1 -0
- package/dist/hooks/TektonResourcesContext.esm.js +16 -0
- package/dist/hooks/TektonResourcesContext.esm.js.map +1 -0
- package/dist/hooks/useAllWatchResources.esm.js +35 -0
- package/dist/hooks/useAllWatchResources.esm.js.map +1 -0
- package/dist/hooks/useDarkTheme.esm.js +21 -0
- package/dist/hooks/useDarkTheme.esm.js.map +1 -0
- package/dist/hooks/usePipelineRunScanResults.esm.js +35 -0
- package/dist/hooks/usePipelineRunScanResults.esm.js.map +1 -0
- package/dist/hooks/usePodLogsOfPipelineRun.esm.js +67 -0
- package/dist/hooks/usePodLogsOfPipelineRun.esm.js.map +1 -0
- package/dist/hooks/useResourcesClusters.esm.js +24 -0
- package/dist/hooks/useResourcesClusters.esm.js.map +1 -0
- package/dist/hooks/useTektonObjectsResponse.esm.js +78 -0
- package/dist/hooks/useTektonObjectsResponse.esm.js.map +1 -0
- package/dist/hooks/useTektonViewPermission.esm.js +12 -0
- package/dist/hooks/useTektonViewPermission.esm.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.esm.js +3 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/models.esm.js +21 -0
- package/dist/models.esm.js.map +1 -0
- package/dist/plugin.esm.js +72 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/types/types.esm.js +15 -0
- package/dist/types/types.esm.js.map +1 -0
- package/dist/utils/isTektonCIAvailable.esm.js +7 -0
- package/dist/utils/isTektonCIAvailable.esm.js.map +1 -0
- package/dist/utils/log-downloader-utils.esm.js +33 -0
- package/dist/utils/log-downloader-utils.esm.js.map +1 -0
- package/dist/utils/pipeline-step-utils.esm.js +53 -0
- package/dist/utils/pipeline-step-utils.esm.js.map +1 -0
- package/dist/utils/pipeline-topology-utils.esm.js +250 -0
- package/dist/utils/pipeline-topology-utils.esm.js.map +1 -0
- package/dist/utils/pipelineRun-utils.esm.js +128 -0
- package/dist/utils/pipelineRun-utils.esm.js.map +1 -0
- package/dist/utils/taskRun-utils.esm.js +50 -0
- package/dist/utils/taskRun-utils.esm.js.map +1 -0
- package/dist/utils/tekton-utils.esm.js +191 -0
- package/dist/utils/tekton-utils.esm.js.map +1 -0
- 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 @@
|
|
|
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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"}
|