@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,137 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common';
|
|
3
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
4
|
+
import { IconButton } from '@material-ui/core';
|
|
5
|
+
import { Flex, FlexItem } from '@patternfly/react-core';
|
|
6
|
+
import { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';
|
|
7
|
+
import { ComputedStatus, pipelineRunFilterReducer } from '@janus-idp/shared-react';
|
|
8
|
+
import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
|
|
9
|
+
import { getTaskrunsOutputGroup, isSbomTaskRun, hasExternalLink } from '../../utils/taskRun-utils.esm.js';
|
|
10
|
+
import OutputIcon from '../Icons/OutputIcon.esm.js';
|
|
11
|
+
import ViewLogsIcon from '../Icons/ViewLogsIcon.esm.js';
|
|
12
|
+
import PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog.esm.js';
|
|
13
|
+
import PipelineRunOutputDialog from '../PipelineRunOutput/PipelineRunOutputDialog.esm.js';
|
|
14
|
+
import PipelineRunSBOMLink from './PipelineRunSBOMLink.esm.js';
|
|
15
|
+
|
|
16
|
+
const PipelineRunRowActions = ({
|
|
17
|
+
pipelineRun
|
|
18
|
+
}) => {
|
|
19
|
+
const { watchResourcesData } = React.useContext(TektonResourcesContext);
|
|
20
|
+
const [open, setOpen] = React.useState(false);
|
|
21
|
+
const [openOutput, setOpenOutput] = React.useState(false);
|
|
22
|
+
const [noActiveTask, setNoActiveTask] = React.useState(false);
|
|
23
|
+
const pods = watchResourcesData?.pods?.data || [];
|
|
24
|
+
const taskRuns = watchResourcesData?.taskruns?.data || [];
|
|
25
|
+
const { sbomTaskRun } = getTaskrunsOutputGroup(
|
|
26
|
+
pipelineRun?.metadata?.name,
|
|
27
|
+
taskRuns
|
|
28
|
+
);
|
|
29
|
+
const activeTaskName = sbomTaskRun?.metadata?.name;
|
|
30
|
+
const hasKubernetesProxyAccess = usePermission({
|
|
31
|
+
permission: kubernetesProxyPermission
|
|
32
|
+
});
|
|
33
|
+
const openDialog = (viewLogs) => {
|
|
34
|
+
if (viewLogs) setNoActiveTask(true);
|
|
35
|
+
setOpen(true);
|
|
36
|
+
};
|
|
37
|
+
const openOutputDialog = () => {
|
|
38
|
+
setOpenOutput(true);
|
|
39
|
+
};
|
|
40
|
+
const closeDialog = () => {
|
|
41
|
+
setNoActiveTask(false);
|
|
42
|
+
setOpen(false);
|
|
43
|
+
};
|
|
44
|
+
const {
|
|
45
|
+
acsImageScanTaskRun,
|
|
46
|
+
acsImageCheckTaskRun,
|
|
47
|
+
acsDeploymentCheckTaskRun,
|
|
48
|
+
ecTaskRun
|
|
49
|
+
} = getTaskrunsOutputGroup(pipelineRun?.metadata?.name, taskRuns);
|
|
50
|
+
const finishedTaskruns = [
|
|
51
|
+
...acsImageScanTaskRun ? [acsImageScanTaskRun] : [],
|
|
52
|
+
...acsImageCheckTaskRun ? [acsImageCheckTaskRun] : [],
|
|
53
|
+
...acsDeploymentCheckTaskRun ? [acsDeploymentCheckTaskRun] : [],
|
|
54
|
+
...ecTaskRun ? [ecTaskRun] : []
|
|
55
|
+
].filter(
|
|
56
|
+
(taskRun) => [
|
|
57
|
+
ComputedStatus.Succeeded,
|
|
58
|
+
ComputedStatus.Failed,
|
|
59
|
+
ComputedStatus.Skipped
|
|
60
|
+
].includes(pipelineRunFilterReducer(taskRun))
|
|
61
|
+
);
|
|
62
|
+
const results = pipelineRun?.status?.pipelineResults || pipelineRun?.status?.results || [];
|
|
63
|
+
const disabled = results.length === 0 ? finishedTaskruns.length === 0 : results.length === 0;
|
|
64
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(
|
|
65
|
+
PipelineRunLogDialog,
|
|
66
|
+
{
|
|
67
|
+
pipelineRun,
|
|
68
|
+
open,
|
|
69
|
+
closeDialog,
|
|
70
|
+
pods,
|
|
71
|
+
taskRuns,
|
|
72
|
+
activeTask: noActiveTask ? void 0 : activeTaskName
|
|
73
|
+
}
|
|
74
|
+
), /* @__PURE__ */ React.createElement(
|
|
75
|
+
PipelineRunOutputDialog,
|
|
76
|
+
{
|
|
77
|
+
pipelineRun,
|
|
78
|
+
taskRuns,
|
|
79
|
+
open: openOutput,
|
|
80
|
+
closeDialog: () => {
|
|
81
|
+
setOpenOutput(false);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
), /* @__PURE__ */ React.createElement(Flex, { gap: { default: "gapXs" } }, /* @__PURE__ */ React.createElement(FlexItem, null, /* @__PURE__ */ React.createElement(
|
|
85
|
+
Tooltip,
|
|
86
|
+
{
|
|
87
|
+
content: hasKubernetesProxyAccess.allowed ? "View logs" : "Unauthorized to view logs"
|
|
88
|
+
},
|
|
89
|
+
/* @__PURE__ */ React.createElement(
|
|
90
|
+
IconButton,
|
|
91
|
+
{
|
|
92
|
+
size: "small",
|
|
93
|
+
"data-testid": "view-logs-icon",
|
|
94
|
+
onClick: () => openDialog(true),
|
|
95
|
+
disabled: !hasKubernetesProxyAccess.allowed,
|
|
96
|
+
style: { pointerEvents: "auto", padding: 0 }
|
|
97
|
+
},
|
|
98
|
+
/* @__PURE__ */ React.createElement(ViewLogsIcon, { disabled: !hasKubernetesProxyAccess.allowed })
|
|
99
|
+
)
|
|
100
|
+
)), /* @__PURE__ */ React.createElement(FlexItem, { align: { default: "alignLeft" } }, /* @__PURE__ */ React.createElement(
|
|
101
|
+
Tooltip,
|
|
102
|
+
{
|
|
103
|
+
content: !sbomTaskRun ? "View SBOM is not applicable for this PipelineRun" : "View SBOM"
|
|
104
|
+
},
|
|
105
|
+
/* @__PURE__ */ React.createElement(
|
|
106
|
+
IconButton,
|
|
107
|
+
{
|
|
108
|
+
"data-testid": "view-sbom-icon",
|
|
109
|
+
disabled: !sbomTaskRun || !isSbomTaskRun(sbomTaskRun),
|
|
110
|
+
size: "small",
|
|
111
|
+
onClick: !hasExternalLink(sbomTaskRun) ? () => openDialog() : void 0,
|
|
112
|
+
style: { pointerEvents: "auto", padding: 0 }
|
|
113
|
+
},
|
|
114
|
+
/* @__PURE__ */ React.createElement(PipelineRunSBOMLink, { sbomTaskRun })
|
|
115
|
+
)
|
|
116
|
+
)), /* @__PURE__ */ React.createElement(FlexItem, { align: { default: "alignLeft" } }, /* @__PURE__ */ React.createElement(
|
|
117
|
+
Tooltip,
|
|
118
|
+
{
|
|
119
|
+
content: disabled ? "View Output is not applicable for this PipelineRun" : "View Output"
|
|
120
|
+
},
|
|
121
|
+
/* @__PURE__ */ React.createElement(
|
|
122
|
+
IconButton,
|
|
123
|
+
{
|
|
124
|
+
"data-testid": "view-output-icon",
|
|
125
|
+
disabled,
|
|
126
|
+
size: "small",
|
|
127
|
+
onClick: () => openOutputDialog(),
|
|
128
|
+
style: { pointerEvents: "auto", padding: 0 }
|
|
129
|
+
},
|
|
130
|
+
/* @__PURE__ */ React.createElement(OutputIcon, { disabled })
|
|
131
|
+
)
|
|
132
|
+
))));
|
|
133
|
+
};
|
|
134
|
+
var PipelineRunRowActions$1 = React.memo(PipelineRunRowActions);
|
|
135
|
+
|
|
136
|
+
export { PipelineRunRowActions$1 as default };
|
|
137
|
+
//# sourceMappingURL=PipelineRunRowActions.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunRowActions.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunRowActions.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 * as React from 'react';\n\nimport { kubernetesProxyPermission } from '@backstage/plugin-kubernetes-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nimport { IconButton } from '@material-ui/core';\nimport { Flex, FlexItem } from '@patternfly/react-core';\nimport { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';\n\nimport {\n ComputedStatus,\n pipelineRunFilterReducer,\n PipelineRunKind,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport {\n getTaskrunsOutputGroup,\n hasExternalLink,\n isSbomTaskRun,\n} from '../../utils/taskRun-utils';\nimport OutputIcon from '../Icons/OutputIcon';\nimport ViewLogsIcon from '../Icons/ViewLogsIcon';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport PipelineRunOutputDialog from '../PipelineRunOutput/PipelineRunOutputDialog';\nimport PipelineRunSBOMLink from './PipelineRunSBOMLink';\n\nconst PipelineRunRowActions: React.FC<{ pipelineRun: PipelineRunKind }> = ({\n pipelineRun,\n}) => {\n const { watchResourcesData } = React.useContext(TektonResourcesContext);\n const [open, setOpen] = React.useState<boolean>(false);\n\n const [openOutput, setOpenOutput] = React.useState<boolean>(false);\n const [noActiveTask, setNoActiveTask] = React.useState(false);\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const { sbomTaskRun } = getTaskrunsOutputGroup(\n pipelineRun?.metadata?.name,\n taskRuns,\n );\n const activeTaskName = sbomTaskRun?.metadata?.name;\n\n const hasKubernetesProxyAccess = usePermission({\n permission: kubernetesProxyPermission,\n });\n\n const openDialog = (viewLogs?: boolean) => {\n if (viewLogs) setNoActiveTask(true);\n setOpen(true);\n };\n\n const openOutputDialog = () => {\n setOpenOutput(true);\n };\n\n const closeDialog = () => {\n setNoActiveTask(false);\n setOpen(false);\n };\n\n const {\n acsImageScanTaskRun,\n acsImageCheckTaskRun,\n acsDeploymentCheckTaskRun,\n ecTaskRun,\n } = getTaskrunsOutputGroup(pipelineRun?.metadata?.name, taskRuns);\n\n const finishedTaskruns = [\n ...(acsImageScanTaskRun ? [acsImageScanTaskRun] : []),\n ...(acsImageCheckTaskRun ? [acsImageCheckTaskRun] : []),\n ...(acsDeploymentCheckTaskRun ? [acsDeploymentCheckTaskRun] : []),\n ...(ecTaskRun ? [ecTaskRun] : []),\n ].filter((taskRun: TaskRunKind) =>\n [\n ComputedStatus.Succeeded,\n ComputedStatus.Failed,\n ComputedStatus.Skipped,\n ].includes(pipelineRunFilterReducer(taskRun)),\n );\n\n const results =\n pipelineRun?.status?.pipelineResults || pipelineRun?.status?.results || [];\n\n const disabled =\n results.length === 0 ? finishedTaskruns.length === 0 : results.length === 0;\n\n return (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={noActiveTask ? undefined : activeTaskName}\n />\n\n <PipelineRunOutputDialog\n pipelineRun={pipelineRun}\n taskRuns={taskRuns}\n open={openOutput}\n closeDialog={() => {\n setOpenOutput(false);\n }}\n />\n <Flex gap={{ default: 'gapXs' }}>\n <FlexItem>\n <Tooltip\n content={\n hasKubernetesProxyAccess.allowed\n ? 'View logs'\n : 'Unauthorized to view logs'\n }\n >\n <IconButton\n size=\"small\"\n data-testid=\"view-logs-icon\"\n onClick={() => openDialog(true)}\n disabled={!hasKubernetesProxyAccess.allowed}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <ViewLogsIcon disabled={!hasKubernetesProxyAccess.allowed} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n !sbomTaskRun\n ? 'View SBOM is not applicable for this PipelineRun'\n : 'View SBOM'\n }\n >\n <IconButton\n data-testid=\"view-sbom-icon\"\n disabled={!sbomTaskRun || !isSbomTaskRun(sbomTaskRun)}\n size=\"small\"\n onClick={\n !hasExternalLink(sbomTaskRun) ? () => openDialog() : undefined\n }\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <PipelineRunSBOMLink sbomTaskRun={sbomTaskRun} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n <FlexItem align={{ default: 'alignLeft' }}>\n <Tooltip\n content={\n disabled\n ? 'View Output is not applicable for this PipelineRun'\n : 'View Output'\n }\n >\n <IconButton\n data-testid=\"view-output-icon\"\n disabled={disabled}\n size=\"small\"\n onClick={() => openOutputDialog()}\n style={{ pointerEvents: 'auto', padding: 0 }}\n >\n <OutputIcon disabled={disabled} />\n </IconButton>\n </Tooltip>\n </FlexItem>\n </Flex>\n </>\n );\n};\nexport default React.memo(PipelineRunRowActions);\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
import { isSbomTaskRun, hasExternalLink, getSbomLink } from '../../utils/taskRun-utils.esm.js';
|
|
4
|
+
import LinkToSBomIcon from '../Icons/LinkToSbomIcon.esm.js';
|
|
5
|
+
|
|
6
|
+
const PipelineRunSBOMLink = ({ sbomTaskRun }) => {
|
|
7
|
+
const isSBOMTask = isSbomTaskRun(sbomTaskRun);
|
|
8
|
+
const isExternalLink = hasExternalLink(sbomTaskRun);
|
|
9
|
+
const linkToSbom = getSbomLink(sbomTaskRun);
|
|
10
|
+
if (isSBOMTask && isExternalLink && (linkToSbom?.startsWith("http://") || linkToSbom?.startsWith("https://"))) {
|
|
11
|
+
return /* @__PURE__ */ React__default.createElement(Link, { target: "_blank", to: linkToSbom }, /* @__PURE__ */ React__default.createElement(LinkToSBomIcon, { dataTestId: "external-sbom-link" }));
|
|
12
|
+
} else if (isSBOMTask && linkToSbom) {
|
|
13
|
+
return /* @__PURE__ */ React__default.createElement(LinkToSBomIcon, { dataTestId: "internal-sbom-link" });
|
|
14
|
+
}
|
|
15
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
16
|
+
LinkToSBomIcon,
|
|
17
|
+
{
|
|
18
|
+
disabled: !sbomTaskRun || !isSBOMTask,
|
|
19
|
+
dataTestId: "icon-space-holder"
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export { PipelineRunSBOMLink as default };
|
|
25
|
+
//# sourceMappingURL=PipelineRunSBOMLink.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunSBOMLink.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunSBOMLink.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { Link } from 'react-router-dom';\n\nimport { TaskRunKind } from '@janus-idp/shared-react';\n\nimport {\n getSbomLink,\n hasExternalLink,\n isSbomTaskRun,\n} from '../../utils/taskRun-utils';\nimport LinkToSBomIcon from '../Icons/LinkToSbomIcon';\n\nconst PipelineRunSBOMLink: React.FC<{\n sbomTaskRun: TaskRunKind | undefined;\n}> = ({ sbomTaskRun }): React.ReactElement | null => {\n const isSBOMTask = isSbomTaskRun(sbomTaskRun);\n const isExternalLink: boolean = hasExternalLink(sbomTaskRun);\n const linkToSbom = getSbomLink(sbomTaskRun);\n\n if (\n isSBOMTask &&\n isExternalLink &&\n (linkToSbom?.startsWith('http://') || linkToSbom?.startsWith('https://'))\n ) {\n // Link to external page\n return (\n <Link target=\"_blank\" to={linkToSbom}>\n <LinkToSBomIcon dataTestId=\"external-sbom-link\" />\n </Link>\n );\n } else if (isSBOMTask && linkToSbom) {\n // Link to internal taskrun page\n return <LinkToSBomIcon dataTestId=\"internal-sbom-link\" />;\n }\n\n return (\n <LinkToSBomIcon\n disabled={!sbomTaskRun || !isSBOMTask}\n dataTestId=\"icon-space-holder\"\n />\n );\n};\n\nexport default PipelineRunSBOMLink;\n"],"names":["React"],"mappings":";;;;;AA2BA,MAAM,mBAED,GAAA,CAAC,EAAE,WAAA,EAA6C,KAAA;AACnD,EAAM,MAAA,UAAA,GAAa,cAAc,WAAW,CAAA;AAC5C,EAAM,MAAA,cAAA,GAA0B,gBAAgB,WAAW,CAAA;AAC3D,EAAM,MAAA,UAAA,GAAa,YAAY,WAAW,CAAA;AAE1C,EACE,IAAA,UAAA,IACA,mBACC,UAAY,EAAA,UAAA,CAAW,SAAS,CAAK,IAAA,UAAA,EAAY,UAAW,CAAA,UAAU,CACvE,CAAA,EAAA;AAEA,IACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,MAAA,EAAO,QAAS,EAAA,EAAA,EAAI,8BACvBA,cAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,UAAW,EAAA,oBAAA,EAAqB,CAClD,CAAA;AAAA,GAEJ,MAAA,IAAW,cAAc,UAAY,EAAA;AAEnC,IAAO,uBAAAA,cAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,UAAA,EAAW,oBAAqB,EAAA,CAAA;AAAA;AAGzD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,QAAA,EAAU,CAAC,WAAA,IAAe,CAAC,UAAA;AAAA,MAC3B,UAAW,EAAA;AAAA;AAAA,GACb;AAEJ;;;;"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
|
|
3
|
+
import { PipelineRunRow } from './PipelineRunRow.esm.js';
|
|
4
|
+
|
|
5
|
+
const PipelineRunTableBody = ({ rows }) => {
|
|
6
|
+
const { isExpanded } = React.useContext(TektonResourcesContext);
|
|
7
|
+
const [open, setOpen] = React.useState(
|
|
8
|
+
rows.reduce((acc, row) => {
|
|
9
|
+
if (row.metadata?.uid) {
|
|
10
|
+
acc[row.metadata?.uid] = isExpanded ?? false;
|
|
11
|
+
}
|
|
12
|
+
return acc;
|
|
13
|
+
}, {})
|
|
14
|
+
);
|
|
15
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, rows.map((row) => {
|
|
16
|
+
const startTime = row.status?.startTime || "";
|
|
17
|
+
return /* @__PURE__ */ React.createElement(
|
|
18
|
+
PipelineRunRow,
|
|
19
|
+
{
|
|
20
|
+
row,
|
|
21
|
+
startTime,
|
|
22
|
+
isExpanded,
|
|
23
|
+
key: row.metadata?.uid,
|
|
24
|
+
open: row.metadata?.uid ? open[row.metadata.uid] : false,
|
|
25
|
+
setOpen
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
}));
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { PipelineRunTableBody };
|
|
32
|
+
//# sourceMappingURL=PipelineRunTableBody.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunTableBody.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunTableBody.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 * as React from 'react';\n\nimport { PipelineRunKind } from '@janus-idp/shared-react';\n\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { OpenRowStatus } from '../../types/types';\nimport { PipelineRunRow } from './PipelineRunRow';\n\ntype PipelineRunTableBodyProps = {\n rows: PipelineRunKind[];\n};\n\nexport const PipelineRunTableBody = ({ rows }: PipelineRunTableBodyProps) => {\n const { isExpanded } = React.useContext(TektonResourcesContext);\n const [open, setOpen] = React.useState<OpenRowStatus>(\n rows.reduce((acc, row) => {\n if (row.metadata?.uid) {\n acc[row.metadata?.uid] = isExpanded ?? false;\n }\n return acc;\n }, {} as OpenRowStatus),\n );\n\n return (\n <>\n {rows.map((row: PipelineRunKind) => {\n const startTime = row.status?.startTime || '';\n\n return (\n <PipelineRunRow\n row={row}\n startTime={startTime}\n isExpanded={isExpanded}\n key={row.metadata?.uid}\n open={row.metadata?.uid ? open[row.metadata.uid] : false}\n setOpen={setOpen}\n />\n );\n })}\n </>\n );\n};\n"],"names":[],"mappings":";;;;AA2BO,MAAM,oBAAuB,GAAA,CAAC,EAAE,IAAA,EAAsC,KAAA;AAC3E,EAAA,MAAM,EAAE,UAAA,EAAe,GAAA,KAAA,CAAM,WAAW,sBAAsB,CAAA;AAC9D,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,KAAM,CAAA,QAAA;AAAA,IAC5B,IAAK,CAAA,MAAA,CAAO,CAAC,GAAA,EAAK,GAAQ,KAAA;AACxB,MAAI,IAAA,GAAA,CAAI,UAAU,GAAK,EAAA;AACrB,QAAA,GAAA,CAAI,GAAI,CAAA,QAAA,EAAU,GAAG,CAAA,GAAI,UAAc,IAAA,KAAA;AAAA;AAEzC,MAAO,OAAA,GAAA;AAAA,KACT,EAAG,EAAmB;AAAA,GACxB;AAEA,EAAA,uBAEK,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAyB,KAAA;AAClC,IAAM,MAAA,SAAA,GAAY,GAAI,CAAA,MAAA,EAAQ,SAAa,IAAA,EAAA;AAE3C,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,SAAA;AAAA,QACA,UAAA;AAAA,QACA,GAAA,EAAK,IAAI,QAAU,EAAA,GAAA;AAAA,QACnB,IAAA,EAAM,IAAI,QAAU,EAAA,GAAA,GAAM,KAAK,GAAI,CAAA,QAAA,CAAS,GAAG,CAAI,GAAA,KAAA;AAAA,QACnD;AAAA;AAAA,KACF;AAAA,GAEH,CACH,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import PipelineBars from '../Charts/PipelineBars.esm.js';
|
|
3
|
+
|
|
4
|
+
const PipelineRunTaskStatus = ({
|
|
5
|
+
pipelineRun
|
|
6
|
+
}) => {
|
|
7
|
+
return pipelineRun?.metadata?.name ? /* @__PURE__ */ React__default.createElement(PipelineBars, { key: pipelineRun.metadata.name, pipelineRun }) : null;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { PipelineRunTaskStatus as default };
|
|
11
|
+
//# sourceMappingURL=PipelineRunTaskStatus.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunTaskStatus.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunTaskStatus.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 { PipelineRunKind } from '@janus-idp/shared-react';\n\nimport PipelineBars from '../Charts/PipelineBars';\n\nconst PipelineRunTaskStatus = ({\n pipelineRun,\n}: {\n pipelineRun: PipelineRunKind;\n}) => {\n return pipelineRun?.metadata?.name ? (\n <PipelineBars key={pipelineRun.metadata.name} pipelineRun={pipelineRun} />\n ) : null;\n};\n\nexport default PipelineRunTaskStatus;\n"],"names":["React"],"mappings":";;;AAqBA,MAAM,wBAAwB,CAAC;AAAA,EAC7B;AACF,CAEM,KAAA;AACJ,EAAO,OAAA,WAAA,EAAa,QAAU,EAAA,IAAA,mBAC3BA,cAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,KAAK,WAAY,CAAA,QAAA,CAAS,IAAM,EAAA,WAAA,EAA0B,CACtE,GAAA,IAAA;AACN;;;;"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { makeStyles } from '@material-ui/core';
|
|
3
|
+
import AngleDoubleDownIcon from '@mui/icons-material/KeyboardDoubleArrowDownOutlined';
|
|
4
|
+
import AngleDoubleUpIcon from '@mui/icons-material/KeyboardDoubleArrowUpOutlined';
|
|
5
|
+
import { Tooltip } from '@patternfly/react-core';
|
|
6
|
+
import { global_palette_gold_400 } from '@patternfly/react-tokens/dist/js/global_palette_gold_400';
|
|
7
|
+
import { global_palette_orange_300 } from '@patternfly/react-tokens/dist/js/global_palette_orange_300';
|
|
8
|
+
import classNames from 'classnames';
|
|
9
|
+
import { usePipelineRunScanResults } from '../../hooks/usePipelineRunScanResults.esm.js';
|
|
10
|
+
import CriticalRiskIcon from '../Icons/CriticalRiskIcon.esm.js';
|
|
11
|
+
import EqualsIcon from '../Icons/EqualsIcon.esm.js';
|
|
12
|
+
|
|
13
|
+
const useVStyles = makeStyles((theme) => ({
|
|
14
|
+
pipelineVulnerabilities: {
|
|
15
|
+
display: "flex",
|
|
16
|
+
flexWrap: "wrap",
|
|
17
|
+
gap: theme.spacing(1)
|
|
18
|
+
},
|
|
19
|
+
severityContainer: {
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
display: "flex",
|
|
22
|
+
flexWrap: "nowrap",
|
|
23
|
+
gap: theme.spacing(0.5)
|
|
24
|
+
},
|
|
25
|
+
severityStatus: {
|
|
26
|
+
alignItems: "center",
|
|
27
|
+
display: "flex",
|
|
28
|
+
flexWrap: "nowrap",
|
|
29
|
+
gap: theme.spacing(0.5)
|
|
30
|
+
},
|
|
31
|
+
severityCount: {
|
|
32
|
+
fontWeight: "bold"
|
|
33
|
+
},
|
|
34
|
+
criticalStatus: {
|
|
35
|
+
height: "1em",
|
|
36
|
+
width: "1em"
|
|
37
|
+
},
|
|
38
|
+
highStatus: {
|
|
39
|
+
color: global_palette_orange_300.value,
|
|
40
|
+
height: "0.8em",
|
|
41
|
+
width: "0.8em"
|
|
42
|
+
},
|
|
43
|
+
mediumStatus: {
|
|
44
|
+
color: global_palette_gold_400.value,
|
|
45
|
+
height: "1.3em",
|
|
46
|
+
width: "1.3em"
|
|
47
|
+
},
|
|
48
|
+
lowStatus: {
|
|
49
|
+
height: "0.8em",
|
|
50
|
+
width: "0.8em"
|
|
51
|
+
}
|
|
52
|
+
}));
|
|
53
|
+
const PipelineRunVulnerabilities = ({
|
|
54
|
+
pipelineRun,
|
|
55
|
+
condensed
|
|
56
|
+
}) => {
|
|
57
|
+
const classes = useVStyles();
|
|
58
|
+
const scanResults = usePipelineRunScanResults(pipelineRun);
|
|
59
|
+
return /* @__PURE__ */ React.createElement("div", { className: classes.pipelineVulnerabilities }, scanResults?.vulnerabilities ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: classNames(classes.severityContainer, "severity") }, /* @__PURE__ */ React.createElement("span", { className: classes.severityStatus }, /* @__PURE__ */ React.createElement(Tooltip, { content: "Critical" }, /* @__PURE__ */ React.createElement(
|
|
60
|
+
CriticalRiskIcon,
|
|
61
|
+
{
|
|
62
|
+
className: classes.criticalStatus,
|
|
63
|
+
title: "Critical"
|
|
64
|
+
}
|
|
65
|
+
)), !condensed ? "Critical" : null), /* @__PURE__ */ React.createElement("span", { className: classes.severityCount }, scanResults.vulnerabilities.critical || 0)), /* @__PURE__ */ React.createElement("div", { className: classNames(classes.severityContainer, "severity") }, /* @__PURE__ */ React.createElement("span", { className: classes.severityStatus }, /* @__PURE__ */ React.createElement(Tooltip, { content: "High" }, /* @__PURE__ */ React.createElement(
|
|
66
|
+
AngleDoubleUpIcon,
|
|
67
|
+
{
|
|
68
|
+
className: classes.highStatus,
|
|
69
|
+
titleAccess: "High"
|
|
70
|
+
}
|
|
71
|
+
)), !condensed ? "High" : null), /* @__PURE__ */ React.createElement("span", { className: classes.severityCount }, scanResults.vulnerabilities.high || 0)), /* @__PURE__ */ React.createElement("div", { className: classNames(classes.severityContainer, "severity") }, /* @__PURE__ */ React.createElement("span", { className: classes.severityStatus }, /* @__PURE__ */ React.createElement(Tooltip, { content: "Medium" }, /* @__PURE__ */ React.createElement(EqualsIcon, { className: classes.mediumStatus, title: "Medium" })), !condensed ? "Medium" : null), /* @__PURE__ */ React.createElement("span", { className: classes.severityCount }, scanResults.vulnerabilities.medium || 0)), /* @__PURE__ */ React.createElement("div", { className: classNames(classes.severityContainer, "severity") }, /* @__PURE__ */ React.createElement("span", { className: classes.severityStatus }, /* @__PURE__ */ React.createElement(Tooltip, { content: "Low" }, /* @__PURE__ */ React.createElement(
|
|
72
|
+
AngleDoubleDownIcon,
|
|
73
|
+
{
|
|
74
|
+
className: classes.lowStatus,
|
|
75
|
+
titleAccess: "Low"
|
|
76
|
+
}
|
|
77
|
+
)), !condensed ? "Low" : null), /* @__PURE__ */ React.createElement("span", { className: classes.severityCount }, scanResults.vulnerabilities.low || 0))) : "-");
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export { PipelineRunVulnerabilities as default };
|
|
81
|
+
//# sourceMappingURL=PipelineRunVulnerabilities.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunVulnerabilities.esm.js","sources":["../../../src/components/PipelineRunList/PipelineRunVulnerabilities.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 * as React from 'react';\n\nimport { makeStyles, Theme } from '@material-ui/core';\nimport AngleDoubleDownIcon from '@mui/icons-material/KeyboardDoubleArrowDownOutlined';\nimport AngleDoubleUpIcon from '@mui/icons-material/KeyboardDoubleArrowUpOutlined';\nimport { Tooltip } from '@patternfly/react-core';\nimport { global_palette_gold_400 as mediumColor } from '@patternfly/react-tokens/dist/js/global_palette_gold_400';\nimport { global_palette_orange_300 as highColor } from '@patternfly/react-tokens/dist/js/global_palette_orange_300';\nimport classNames from 'classnames';\n\nimport { PipelineRunKind } from '@janus-idp/shared-react';\n\nimport { usePipelineRunScanResults } from '../../hooks/usePipelineRunScanResults';\nimport CriticalRiskIcon from '../Icons/CriticalRiskIcon';\nimport EqualsIcon from '../Icons/EqualsIcon';\n\nconst useVStyles = makeStyles((theme: Theme) => ({\n pipelineVulnerabilities: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: theme.spacing(1),\n },\n severityContainer: {\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'nowrap',\n gap: theme.spacing(0.5),\n },\n severityStatus: {\n alignItems: 'center',\n display: 'flex',\n flexWrap: 'nowrap',\n gap: theme.spacing(0.5),\n },\n severityCount: {\n fontWeight: 'bold',\n },\n criticalStatus: {\n height: '1em',\n width: '1em',\n },\n highStatus: {\n color: highColor.value,\n height: '0.8em',\n width: '0.8em',\n },\n mediumStatus: {\n color: mediumColor.value,\n height: '1.3em',\n width: '1.3em',\n },\n lowStatus: {\n height: '0.8em',\n width: '0.8em',\n },\n}));\n\ntype PipelineRunVulnerabilitiesProps = {\n pipelineRun: PipelineRunKind;\n condensed?: boolean;\n};\n\nconst PipelineRunVulnerabilities: React.FC<PipelineRunVulnerabilitiesProps> = ({\n pipelineRun,\n condensed,\n}) => {\n const classes = useVStyles();\n const scanResults = usePipelineRunScanResults(pipelineRun);\n\n return (\n <div className={classes.pipelineVulnerabilities}>\n {scanResults?.vulnerabilities ? (\n <>\n <div className={classNames(classes.severityContainer, 'severity')}>\n <span className={classes.severityStatus}>\n <Tooltip content=\"Critical\">\n <CriticalRiskIcon\n className={classes.criticalStatus}\n title=\"Critical\"\n />\n </Tooltip>\n {!condensed ? 'Critical' : null}\n </span>\n <span className={classes.severityCount}>\n {scanResults.vulnerabilities.critical || 0}\n </span>\n </div>\n <div className={classNames(classes.severityContainer, 'severity')}>\n <span className={classes.severityStatus}>\n <Tooltip content=\"High\">\n <AngleDoubleUpIcon\n className={classes.highStatus}\n titleAccess=\"High\"\n />\n </Tooltip>\n {!condensed ? 'High' : null}\n </span>\n <span className={classes.severityCount}>\n {scanResults.vulnerabilities.high || 0}\n </span>\n </div>\n <div className={classNames(classes.severityContainer, 'severity')}>\n <span className={classes.severityStatus}>\n <Tooltip content=\"Medium\">\n <EqualsIcon className={classes.mediumStatus} title=\"Medium\" />\n </Tooltip>\n {!condensed ? 'Medium' : null}\n </span>\n <span className={classes.severityCount}>\n {scanResults.vulnerabilities.medium || 0}\n </span>\n </div>\n <div className={classNames(classes.severityContainer, 'severity')}>\n <span className={classes.severityStatus}>\n <Tooltip content=\"Low\">\n <AngleDoubleDownIcon\n className={classes.lowStatus}\n titleAccess=\"Low\"\n />\n </Tooltip>\n {!condensed ? 'Low' : null}\n </span>\n <span className={classes.severityCount}>\n {scanResults.vulnerabilities.low || 0}\n </span>\n </div>\n </>\n ) : (\n '-'\n )}\n </div>\n );\n};\n\nexport default PipelineRunVulnerabilities;\n"],"names":["highColor","mediumColor"],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { makeStyles, TableHead, TableRow, TableCell, TableSortLabel } from '@material-ui/core';
|
|
3
|
+
import { PipelineRunColumnHeader } from './PipelineRunColumnHeader.esm.js';
|
|
4
|
+
|
|
5
|
+
const useStyles = makeStyles((theme) => ({
|
|
6
|
+
header: {
|
|
7
|
+
padding: theme.spacing(1, 2, 1, 2.5),
|
|
8
|
+
borderTop: `1px solid ${theme.palette.grey.A100}`,
|
|
9
|
+
borderBottom: `1px solid ${theme.palette.grey.A100}`,
|
|
10
|
+
// withStyles hasn't a generic overload for theme
|
|
11
|
+
fontWeight: "bold",
|
|
12
|
+
position: "static",
|
|
13
|
+
wordBreak: "normal"
|
|
14
|
+
}
|
|
15
|
+
}));
|
|
16
|
+
const EnhancedTableHead = ({
|
|
17
|
+
order,
|
|
18
|
+
orderBy,
|
|
19
|
+
orderById,
|
|
20
|
+
onRequestSort
|
|
21
|
+
}) => {
|
|
22
|
+
const createSortHandler = (property, id) => (event) => {
|
|
23
|
+
onRequestSort(event, property, id);
|
|
24
|
+
};
|
|
25
|
+
const classes = useStyles();
|
|
26
|
+
return /* @__PURE__ */ React.createElement(TableHead, null, /* @__PURE__ */ React.createElement(TableRow, null, PipelineRunColumnHeader.map((headCell) => {
|
|
27
|
+
return /* @__PURE__ */ React.createElement(
|
|
28
|
+
TableCell,
|
|
29
|
+
{
|
|
30
|
+
className: classes.header,
|
|
31
|
+
key: headCell.id,
|
|
32
|
+
align: "left",
|
|
33
|
+
padding: "normal",
|
|
34
|
+
sortDirection: orderBy === headCell.field ? headCell.defaultSort : false
|
|
35
|
+
},
|
|
36
|
+
headCell.field ? /* @__PURE__ */ React.createElement(
|
|
37
|
+
TableSortLabel,
|
|
38
|
+
{
|
|
39
|
+
active: orderBy === headCell.field && orderById === headCell.id,
|
|
40
|
+
direction: order,
|
|
41
|
+
onClick: createSortHandler(
|
|
42
|
+
headCell.field,
|
|
43
|
+
headCell.id
|
|
44
|
+
)
|
|
45
|
+
},
|
|
46
|
+
headCell.title
|
|
47
|
+
) : /* @__PURE__ */ React.createElement(React.Fragment, null, " ", headCell.title)
|
|
48
|
+
);
|
|
49
|
+
})));
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export { EnhancedTableHead };
|
|
53
|
+
//# sourceMappingURL=PipelineTableHeader.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineTableHeader.esm.js","sources":["../../../src/components/PipelineRunList/PipelineTableHeader.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 * as React from 'react';\n\nimport {\n makeStyles,\n TableCell,\n TableHead,\n TableRow,\n TableSortLabel,\n} from '@material-ui/core';\n\nimport { Order } from '../../types/types';\nimport { PipelineRunColumnHeader } from './PipelineRunColumnHeader';\n\ntype EnhancedTableProps = {\n onRequestSort: (\n event: React.MouseEvent<unknown>,\n property: string,\n id: string,\n ) => void;\n order: Order;\n orderBy: string;\n orderById: string;\n};\n\nconst useStyles = makeStyles(theme => ({\n header: {\n padding: theme.spacing(1, 2, 1, 2.5),\n borderTop: `1px solid ${theme.palette.grey.A100}`,\n borderBottom: `1px solid ${theme.palette.grey.A100}`,\n // withStyles hasn't a generic overload for theme\n fontWeight: 'bold',\n position: 'static',\n wordBreak: 'normal',\n },\n}));\n\nexport const EnhancedTableHead = ({\n order,\n orderBy,\n orderById,\n onRequestSort,\n}: EnhancedTableProps) => {\n const createSortHandler =\n (property: string, id: string) => (event: React.MouseEvent<unknown>) => {\n onRequestSort(event, property, id);\n };\n const classes = useStyles();\n\n return (\n <TableHead>\n <TableRow>\n {PipelineRunColumnHeader.map(headCell => {\n return (\n <TableCell\n className={classes.header}\n key={headCell.id as string}\n align=\"left\"\n padding=\"normal\"\n sortDirection={\n orderBy === headCell.field ? headCell.defaultSort : false\n }\n >\n {headCell.field ? (\n <TableSortLabel\n active={\n orderBy === headCell.field && orderById === headCell.id\n }\n direction={order}\n onClick={createSortHandler(\n headCell.field as string,\n headCell.id as string,\n )}\n >\n {headCell.title}\n </TableSortLabel>\n ) : (\n <> {headCell.title}</>\n )}\n </TableCell>\n );\n })}\n </TableRow>\n </TableHead>\n );\n};\n"],"names":[],"mappings":";;;;AAuCA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,MAAQ,EAAA;AAAA,IACN,SAAS,KAAM,CAAA,OAAA,CAAQ,CAAG,EAAA,CAAA,EAAG,GAAG,GAAG,CAAA;AAAA,IACnC,SAAW,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,KAAK,IAAI,CAAA,CAAA;AAAA,IAC/C,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,KAAK,IAAI,CAAA,CAAA;AAAA;AAAA,IAElD,UAAY,EAAA,MAAA;AAAA,IACZ,QAAU,EAAA,QAAA;AAAA,IACV,SAAW,EAAA;AAAA;AAEf,CAAE,CAAA,CAAA;AAEK,MAAM,oBAAoB,CAAC;AAAA,EAChC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAA0B,KAAA;AACxB,EAAA,MAAM,iBACJ,GAAA,CAAC,QAAkB,EAAA,EAAA,KAAe,CAAC,KAAqC,KAAA;AACtE,IAAc,aAAA,CAAA,KAAA,EAAO,UAAU,EAAE,CAAA;AAAA,GACnC;AACF,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAA,2CACG,SACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QACE,EAAA,IAAA,EAAA,uBAAA,CAAwB,IAAI,CAAY,QAAA,KAAA;AACvC,IACE,uBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAW,OAAQ,CAAA,MAAA;AAAA,QACnB,KAAK,QAAS,CAAA,EAAA;AAAA,QACd,KAAM,EAAA,MAAA;AAAA,QACN,OAAQ,EAAA,QAAA;AAAA,QACR,aACE,EAAA,OAAA,KAAY,QAAS,CAAA,KAAA,GAAQ,SAAS,WAAc,GAAA;AAAA,OAAA;AAAA,MAGrD,SAAS,KACR,mBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,cAAA;AAAA,QAAA;AAAA,UACC,MACE,EAAA,OAAA,KAAY,QAAS,CAAA,KAAA,IAAS,cAAc,QAAS,CAAA,EAAA;AAAA,UAEvD,SAAW,EAAA,KAAA;AAAA,UACX,OAAS,EAAA,iBAAA;AAAA,YACP,QAAS,CAAA,KAAA;AAAA,YACT,QAAS,CAAA;AAAA;AACX,SAAA;AAAA,QAEC,QAAS,CAAA;AAAA,OAGZ,mBAAA,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAE,GAAE,EAAA,QAAA,CAAS,KAAM;AAAA,KAEvB;AAAA,GAEH,CACH,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -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-plrstatus {\n display: flex;\n align-items: center;\n}\n\n.bs-tkn-plrstatus svg {\n top: 0;\n}\n";
|
|
4
|
+
styleInject(css_248z);
|
|
5
|
+
|
|
6
|
+
export { css_248z as default };
|
|
7
|
+
//# sourceMappingURL=PlrStatus.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlrStatus.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { pipelineRunFilterReducer, Status } from '@janus-idp/shared-react';
|
|
3
|
+
import './PlrStatus.css.esm.js';
|
|
4
|
+
|
|
5
|
+
const PlrStatus = ({ obj }) => {
|
|
6
|
+
const plrStatus = pipelineRunFilterReducer(obj);
|
|
7
|
+
return /* @__PURE__ */ React__default.createElement(Status, { status: plrStatus, className: "bs-tkn-plrstatus" });
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { PlrStatus as default };
|
|
11
|
+
//# sourceMappingURL=PlrStatus.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PlrStatus.esm.js","sources":["../../../src/components/PipelineRunList/PlrStatus.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 pipelineRunFilterReducer,\n PipelineRunKind,\n Status,\n} from '@janus-idp/shared-react';\n\nimport './PlrStatus.css';\n\ntype PlrStatusProps = { obj: PipelineRunKind };\n\nconst PlrStatus = ({ obj }: PlrStatusProps) => {\n const plrStatus = pipelineRunFilterReducer(obj);\n return <Status status={plrStatus} className=\"bs-tkn-plrstatus\" />;\n};\n\nexport default PlrStatus;\n"],"names":["React"],"mappings":";;;;AA2BA,MAAM,SAAY,GAAA,CAAC,EAAE,GAAA,EAA0B,KAAA;AAC7C,EAAM,MAAA,SAAA,GAAY,yBAAyB,GAAG,CAAA;AAC9C,EAAA,uBAAQA,cAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,MAAQ,EAAA,SAAA,EAAW,WAAU,kBAAmB,EAAA,CAAA;AACjE;;;;"}
|
|
@@ -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-pipeline-visualization__label {\n align-items: baseline;\n}\n\n.bs-tkn-pipeline-visualization__label .badge {\n font-size: 12px;\n line-height: 20px;\n margin-right: 4px;\n min-width: 24px;\n padding: 0 7px;\n border-radius: 20px;\n color: var(--pf-v5-global--palette--white);\n display: inline-block;\n text-align: center;\n white-space: nowrap;\n width: 100%;\n}\n";
|
|
4
|
+
styleInject(css_248z);
|
|
5
|
+
|
|
6
|
+
export { css_248z as default };
|
|
7
|
+
//# sourceMappingURL=ResourceBadge.css.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceBadge.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { Split, SplitItem } from '@patternfly/react-core';
|
|
3
|
+
import './ResourceBadge.css.esm.js';
|
|
4
|
+
|
|
5
|
+
const ResourceBadge = ({
|
|
6
|
+
color,
|
|
7
|
+
abbr,
|
|
8
|
+
name,
|
|
9
|
+
suffix
|
|
10
|
+
}) => {
|
|
11
|
+
return /* @__PURE__ */ React__default.createElement(Split, { className: "bs-tkn-pipeline-visualization__label" }, /* @__PURE__ */ React__default.createElement(SplitItem, { style: { marginRight: "var(--pf-v5-global--spacer--sm)" } }, /* @__PURE__ */ React__default.createElement("span", { className: "badge", style: { backgroundColor: color } }, abbr)), /* @__PURE__ */ React__default.createElement(SplitItem, null, /* @__PURE__ */ React__default.createElement("span", null, name)), suffix ? /* @__PURE__ */ React__default.createElement(SplitItem, { style: { marginLeft: "var(--pf-v5-global--spacer--sm)" } }, suffix) : null);
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export { ResourceBadge as default };
|
|
15
|
+
//# sourceMappingURL=ResourceBadge.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResourceBadge.esm.js","sources":["../../../src/components/PipelineRunList/ResourceBadge.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 { Split, SplitItem } from '@patternfly/react-core';\n\nimport './ResourceBadge.css';\n\nconst ResourceBadge = ({\n color,\n abbr,\n name,\n suffix,\n}: {\n color: string;\n abbr: string;\n name: string;\n suffix?: React.ReactNode;\n}) => {\n return (\n <Split className=\"bs-tkn-pipeline-visualization__label\">\n <SplitItem style={{ marginRight: 'var(--pf-v5-global--spacer--sm)' }}>\n <span className=\"badge\" style={{ backgroundColor: color }}>\n {abbr}\n </span>\n </SplitItem>\n <SplitItem>\n <span>{name}</span>\n </SplitItem>\n {suffix ? (\n <SplitItem style={{ marginLeft: 'var(--pf-v5-global--spacer--sm)' }}>\n {suffix}\n </SplitItem>\n ) : null}\n </Split>\n );\n};\n\nexport default ResourceBadge;\n"],"names":["React"],"mappings":";;;;AAqBA,MAAM,gBAAgB,CAAC;AAAA,EACrB,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAKM,KAAA;AACJ,EAAA,oDACG,KAAM,EAAA,EAAA,SAAA,EAAU,0DACdA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,OAAO,EAAE,WAAA,EAAa,iCAAkC,EAAA,EAAA,+CAChE,MAAK,EAAA,EAAA,SAAA,EAAU,SAAQ,KAAO,EAAA,EAAE,iBAAiB,KAAM,EAAA,EAAA,EACrD,IACH,CACF,mBACCA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,IAAA,+CACE,MAAM,EAAA,IAAA,EAAA,IAAK,CACd,CACC,EAAA,MAAA,mBACEA,cAAA,CAAA,aAAA,CAAA,SAAA,EAAA,EAAU,OAAO,EAAE,UAAA,EAAY,mCAC7B,EAAA,EAAA,MACH,IACE,IACN,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { ErrorBoundary } from '@backstage/core-components';
|
|
3
|
+
import { makeStyles, createStyles, Dialog, DialogTitle, Box, IconButton, DialogContent } from '@material-ui/core';
|
|
4
|
+
import CloseIcon from '@mui/icons-material/Close';
|
|
5
|
+
import { tektonGroupColor } from '../../types/types.esm.js';
|
|
6
|
+
import ResourceBadge from '../PipelineRunList/ResourceBadge.esm.js';
|
|
7
|
+
import PipelineRunLogDownloader from './PipelineRunLogDownloader.esm.js';
|
|
8
|
+
import { PipelineRunLogs } from './PipelineRunLogs.esm.js';
|
|
9
|
+
|
|
10
|
+
const useStyles = makeStyles(
|
|
11
|
+
(theme) => createStyles({
|
|
12
|
+
titleContainer: {
|
|
13
|
+
display: "flex",
|
|
14
|
+
alignItems: "center",
|
|
15
|
+
gap: theme.spacing(1)
|
|
16
|
+
},
|
|
17
|
+
closeButton: {
|
|
18
|
+
position: "absolute",
|
|
19
|
+
right: theme.spacing(1),
|
|
20
|
+
top: theme.spacing(1),
|
|
21
|
+
color: theme.palette.grey[500]
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
);
|
|
25
|
+
const PipelineRunLogDialog = ({
|
|
26
|
+
open,
|
|
27
|
+
closeDialog,
|
|
28
|
+
pipelineRun,
|
|
29
|
+
pods,
|
|
30
|
+
taskRuns,
|
|
31
|
+
activeTask
|
|
32
|
+
}) => {
|
|
33
|
+
const classes = useStyles();
|
|
34
|
+
const [task, setTask] = React__default.useState(activeTask);
|
|
35
|
+
return /* @__PURE__ */ React__default.createElement(
|
|
36
|
+
Dialog,
|
|
37
|
+
{
|
|
38
|
+
"data-testid": "pipelinerun-logs-dialog",
|
|
39
|
+
maxWidth: "xl",
|
|
40
|
+
fullWidth: true,
|
|
41
|
+
open,
|
|
42
|
+
onClose: closeDialog
|
|
43
|
+
},
|
|
44
|
+
/* @__PURE__ */ React__default.createElement(DialogTitle, { id: "pipelinerun-logs", title: "PipelineRun Logs" }, /* @__PURE__ */ React__default.createElement(Box, { className: classes.titleContainer }, /* @__PURE__ */ React__default.createElement(
|
|
45
|
+
ResourceBadge,
|
|
46
|
+
{
|
|
47
|
+
color: tektonGroupColor,
|
|
48
|
+
abbr: "PLR",
|
|
49
|
+
name: pipelineRun?.metadata?.name ?? ""
|
|
50
|
+
}
|
|
51
|
+
), /* @__PURE__ */ React__default.createElement(
|
|
52
|
+
IconButton,
|
|
53
|
+
{
|
|
54
|
+
"aria-label": "close",
|
|
55
|
+
className: classes.closeButton,
|
|
56
|
+
onClick: closeDialog
|
|
57
|
+
},
|
|
58
|
+
/* @__PURE__ */ React__default.createElement(CloseIcon, null)
|
|
59
|
+
))),
|
|
60
|
+
/* @__PURE__ */ React__default.createElement(DialogContent, null, /* @__PURE__ */ React__default.createElement(ErrorBoundary, null, /* @__PURE__ */ React__default.createElement(
|
|
61
|
+
PipelineRunLogDownloader,
|
|
62
|
+
{
|
|
63
|
+
pods,
|
|
64
|
+
activeTask: task,
|
|
65
|
+
pipelineRun
|
|
66
|
+
}
|
|
67
|
+
), /* @__PURE__ */ React__default.createElement(
|
|
68
|
+
PipelineRunLogs,
|
|
69
|
+
{
|
|
70
|
+
pipelineRun,
|
|
71
|
+
taskRuns,
|
|
72
|
+
pods,
|
|
73
|
+
activeTask: task,
|
|
74
|
+
setActiveTask: setTask
|
|
75
|
+
}
|
|
76
|
+
)))
|
|
77
|
+
);
|
|
78
|
+
};
|
|
79
|
+
var PipelineRunLogDialog$1 = React__default.memo(PipelineRunLogDialog);
|
|
80
|
+
|
|
81
|
+
export { PipelineRunLogDialog$1 as default };
|
|
82
|
+
//# sourceMappingURL=PipelineRunLogDialog.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PipelineRunLogDialog.esm.js","sources":["../../../src/components/PipelineRunLogs/PipelineRunLogDialog.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 { ErrorBoundary } from '@backstage/core-components';\n\nimport { V1Pod } from '@kubernetes/client-node';\nimport {\n Box,\n createStyles,\n Dialog,\n DialogContent,\n DialogTitle,\n IconButton,\n makeStyles,\n Theme,\n} from '@material-ui/core';\nimport CloseIcon from '@mui/icons-material/Close';\n\nimport { PipelineRunKind, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { tektonGroupColor } from '../../types/types';\nimport ResourceBadge from '../PipelineRunList/ResourceBadge';\nimport PipelineRunLogDownloader from './PipelineRunLogDownloader';\nimport PipelineRunLogs from './PipelineRunLogs';\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n titleContainer: {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n },\n closeButton: {\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n color: theme.palette.grey[500],\n },\n }),\n);\n\ntype PipelineRunLogDialogProps = {\n open: boolean;\n closeDialog: () => void;\n pipelineRun: PipelineRunKind;\n taskRuns: TaskRunKind[];\n pods: V1Pod[];\n activeTask?: string;\n};\nconst PipelineRunLogDialog = ({\n open,\n closeDialog,\n pipelineRun,\n pods,\n taskRuns,\n activeTask,\n}: PipelineRunLogDialogProps) => {\n const classes = useStyles();\n\n const [task, setTask] = React.useState(activeTask);\n\n return (\n <Dialog\n data-testid=\"pipelinerun-logs-dialog\"\n maxWidth=\"xl\"\n fullWidth\n open={open}\n onClose={closeDialog}\n >\n <DialogTitle id=\"pipelinerun-logs\" title=\"PipelineRun Logs\">\n <Box className={classes.titleContainer}>\n <ResourceBadge\n color={tektonGroupColor}\n abbr=\"PLR\"\n name={pipelineRun?.metadata?.name ?? ''}\n />\n <IconButton\n aria-label=\"close\"\n className={classes.closeButton}\n onClick={closeDialog}\n >\n <CloseIcon />\n </IconButton>\n </Box>\n </DialogTitle>\n <DialogContent>\n <ErrorBoundary>\n <PipelineRunLogDownloader\n pods={pods}\n activeTask={task}\n pipelineRun={pipelineRun}\n />\n <PipelineRunLogs\n pipelineRun={pipelineRun}\n taskRuns={taskRuns}\n pods={pods}\n activeTask={task}\n setActiveTask={setTask}\n />\n </ErrorBoundary>\n </DialogContent>\n </Dialog>\n );\n};\n\nexport default React.memo(PipelineRunLogDialog);\n"],"names":["React"],"mappings":";;;;;;;;;AAuCA,MAAM,SAAY,GAAA,UAAA;AAAA,EAAW,CAAC,UAC5B,YAAa,CAAA;AAAA,IACX,cAAgB,EAAA;AAAA,MACd,OAAS,EAAA,MAAA;AAAA,MACT,UAAY,EAAA,QAAA;AAAA,MACZ,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,KACtB;AAAA,IACA,WAAa,EAAA;AAAA,MACX,QAAU,EAAA,UAAA;AAAA,MACV,KAAA,EAAO,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,KAAO,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,CAAK,GAAG;AAAA;AAC/B,GACD;AACH,CAAA;AAUA,MAAM,uBAAuB,CAAC;AAAA,EAC5B,IAAA;AAAA,EACA,WAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAiC,KAAA;AAC/B,EAAA,MAAM,UAAU,SAAU,EAAA;AAE1B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAAS,UAAU,CAAA;AAEjD,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,yBAAA;AAAA,MACZ,QAAS,EAAA,IAAA;AAAA,MACT,SAAS,EAAA,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAS,EAAA;AAAA,KAAA;AAAA,oBAETA,cAAA,CAAA,aAAA,CAAC,WAAY,EAAA,EAAA,EAAA,EAAG,kBAAmB,EAAA,KAAA,EAAM,sCACtCA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,SAAW,EAAA,OAAA,CAAQ,cACtB,EAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,aAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA,gBAAA;AAAA,QACP,IAAK,EAAA,KAAA;AAAA,QACL,IAAA,EAAM,WAAa,EAAA,QAAA,EAAU,IAAQ,IAAA;AAAA;AAAA,KAEvC,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAW,EAAA,OAAA;AAAA,QACX,WAAW,OAAQ,CAAA,WAAA;AAAA,QACnB,OAAS,EAAA;AAAA,OAAA;AAAA,mDAER,SAAU,EAAA,IAAA;AAAA,KAEf,CACF,CAAA;AAAA,oBACAA,cAAA,CAAA,aAAA,CAAC,aACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA,CAAC,aACC,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,UAAY,EAAA,IAAA;AAAA,QACZ;AAAA;AAAA,KAEF,kBAAAA,cAAA,CAAA,aAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAY,EAAA,IAAA;AAAA,QACZ,aAAe,EAAA;AAAA;AAAA,KAEnB,CACF;AAAA,GACF;AAEJ,CAAA;AAEA,6BAAeA,cAAA,CAAM,KAAK,oBAAoB,CAAA;;;;"}
|