@backstage-community/plugin-tekton 3.19.0 → 3.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +9 -0
  3. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js +3 -3
  4. package/dist/components/PipelineRunList/PipelineRunRowActions.esm.js.map +1 -1
  5. package/dist/components/PipelineRunLogs/PipelineRunLogDialog.esm.js +1 -1
  6. package/dist/components/PipelineRunLogs/PodLogsDownloadLink.esm.js +1 -1
  7. package/dist/components/PipelineRunLogs/TaskStatusStepper.esm.js +1 -1
  8. package/dist/components/PipelineRunOutput/PipelineRunOutputDialog.esm.js +1 -1
  9. package/dist/components/common/PermissionAlert.esm.js +6 -1
  10. package/dist/components/common/PermissionAlert.esm.js.map +1 -1
  11. package/dist/components/pipeline-topology/PipelineLayout.esm.js +2 -2
  12. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js +2 -2
  13. package/dist/components/pipeline-topology/PipelineTaskNode.esm.js.map +1 -1
  14. package/dist/components/pipeline-topology/PipelineVisualization.esm.js +1 -1
  15. package/dist/components/pipeline-topology/PipelineVisualization.esm.js.map +1 -1
  16. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js +3 -3
  17. package/dist/components/pipeline-topology/pipelineComponentFactory.esm.js.map +1 -1
  18. package/dist/hooks/useResourcesClusters.esm.js +1 -1
  19. package/dist/hooks/useResourcesClusters.esm.js.map +1 -1
  20. package/dist/hooks/useTektonViewPermission.esm.js +7 -4
  21. package/dist/hooks/useTektonViewPermission.esm.js.map +1 -1
  22. package/dist/models.esm.js +0 -4
  23. package/dist/models.esm.js.map +1 -1
  24. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js +1 -1
  25. package/dist/node_modules_dist/style-inject/dist/style-inject.es.esm.js.map +1 -1
  26. package/dist/plugin.esm.js +1 -1
  27. package/dist/utils/pipeline-topology-utils.esm.js +3 -3
  28. package/dist/utils/pipeline-topology-utils.esm.js.map +1 -1
  29. package/dist/utils/pipelineRun-utils.esm.js +1 -1
  30. package/dist/utils/taskRun-utils.esm.js +2 -2
  31. package/package.json +10 -10
package/CHANGELOG.md CHANGED
@@ -1,5 +1,36 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 3.21.0
4
+
5
+ ### Minor Changes
6
+
7
+ - d5a2be5: Update Kubernetes plugin dependencies
8
+
9
+ ### Patch Changes
10
+
11
+ - a8e2f2c: Updated dependency `@material-ui/lab` to `4.0.0-alpha.61`.
12
+ Updated dependency `@mui/icons-material` to `5.16.14`.
13
+ Updated dependency `@mui/material` to `5.16.14`.
14
+ Updated dependency `@mui/styles` to `5.16.14`.
15
+ Updated dependency `@mui/x-charts` to `6.19.8`.
16
+ Updated dependency `@mui/lab` to `5.0.0-alpha.175`.
17
+ - Updated dependencies [d5a2be5]
18
+ - @backstage-community/plugin-tekton-common@1.7.0
19
+
20
+ ## 3.20.0
21
+
22
+ ### Minor Changes
23
+
24
+ - 48e0647: Use Kubernetes plugin permissions for Tekton plugin, remove tekton-specific permissions from tekton-common plugin
25
+ - 585f020: Update aonic-ui/pipelines version
26
+
27
+ ### Patch Changes
28
+
29
+ - 0ac3320: Updated dependency `@types/lodash` to `4.17.15`.
30
+ - 3e35324: Updated dependency `start-server-and-test` to `2.0.10`.
31
+ - Updated dependencies [48e0647]
32
+ - @backstage-community/plugin-tekton-common@1.6.0
33
+
3
34
  ## 3.19.0
4
35
 
5
36
  ### Minor Changes
package/README.md CHANGED
@@ -140,6 +140,15 @@ The Tekton plugin enables you to visualize the `PipelineRun` resources available
140
140
  );
141
141
  ```
142
142
 
143
+ #### Permissions
144
+
145
+ If you are using permissions, please ensure that the following Kubernetes permissions are enabled:
146
+
147
+ - `kubernetes.clusters.read`
148
+ - `kubernetes.resources.read`
149
+
150
+ Read [the documentation](https://github.com/backstage/backstage/blob/master/docs/features/kubernetes/permissions.md) for more info on these permissions.
151
+
143
152
  ## For users
144
153
 
145
154
  ### Using the Tekton plugin in Backstage
@@ -6,7 +6,7 @@ import { Flex, FlexItem } from '@patternfly/react-core';
6
6
  import { Tooltip } from '@patternfly/react-core/dist/esm/components/Tooltip/Tooltip';
7
7
  import { ComputedStatus, pipelineRunFilterReducer } from '@janus-idp/shared-react';
8
8
  import { TektonResourcesContext } from '../../hooks/TektonResourcesContext.esm.js';
9
- import { getTaskrunsOutputGroup, isSbomTaskRun, hasExternalLink } from '../../utils/taskRun-utils.esm.js';
9
+ import { getTaskrunsOutputGroup, hasExternalLink, isSbomTaskRun } from '../../utils/taskRun-utils.esm.js';
10
10
  import OutputIcon from '../Icons/OutputIcon.esm.js';
11
11
  import ViewLogsIcon from '../Icons/ViewLogsIcon.esm.js';
12
12
  import PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog.esm.js';
@@ -69,7 +69,7 @@ const PipelineRunRowActions = ({
69
69
  closeDialog,
70
70
  pods,
71
71
  taskRuns,
72
- activeTask: noActiveTask ? undefined : activeTaskName
72
+ activeTask: noActiveTask ? void 0 : activeTaskName
73
73
  }
74
74
  ), /* @__PURE__ */ React.createElement(
75
75
  PipelineRunOutputDialog,
@@ -108,7 +108,7 @@ const PipelineRunRowActions = ({
108
108
  "data-testid": "view-sbom-icon",
109
109
  disabled: !sbomTaskRun || !isSbomTaskRun(sbomTaskRun),
110
110
  size: "small",
111
- onClick: !hasExternalLink(sbomTaskRun) ? () => openDialog() : undefined,
111
+ onClick: !hasExternalLink(sbomTaskRun) ? () => openDialog() : void 0,
112
112
  style: { pointerEvents: "auto", padding: 0 }
113
113
  },
114
114
  /* @__PURE__ */ React.createElement(PipelineRunSBOMLink, { sbomTaskRun })
@@ -1 +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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"}
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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"}
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { ErrorBoundary } from '@backstage/core-components';
3
- import { makeStyles, createStyles, Dialog, DialogTitle, Box, IconButton, DialogContent } from '@material-ui/core';
3
+ import { makeStyles, Dialog, DialogTitle, Box, IconButton, DialogContent, createStyles } from '@material-ui/core';
4
4
  import CloseIcon from '@mui/icons-material/Close';
5
5
  import { tektonGroupColor } from '../../types/types.esm.js';
6
6
  import ResourceBadge from '../PipelineRunList/ResourceBadge.esm.js';
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
- import { makeStyles, createStyles, Link } from '@material-ui/core';
3
+ import { makeStyles, Link, createStyles } from '@material-ui/core';
4
4
  import DownloadIcon from '@mui/icons-material/FileDownloadOutlined';
5
5
  import classNames from 'classnames';
6
6
  import { downloadLogFile } from '@janus-idp/shared-react';
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import useInterval from 'react-use/lib/useInterval';
3
- import { makeStyles, createStyles, StepButton, CircularProgress } from '@material-ui/core';
3
+ import { makeStyles, StepButton, createStyles, CircularProgress } from '@material-ui/core';
4
4
  import Step from '@material-ui/core/Step';
5
5
  import StepLabel from '@material-ui/core/StepLabel';
6
6
  import Stepper from '@material-ui/core/Stepper';
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
2
  import { ErrorBoundary } from '@backstage/core-components';
3
- import { makeStyles, createStyles, Dialog, DialogTitle, Box, IconButton, DialogContent } from '@material-ui/core';
3
+ import { makeStyles, Dialog, DialogTitle, Box, IconButton, DialogContent, createStyles } from '@material-ui/core';
4
4
  import CloseIcon from '@mui/icons-material/Close';
5
5
  import { tektonGroupColor } from '../../types/types.esm.js';
6
6
  import PipelineRunOutput from '../PipelineRunList/PipelineRunOutput.esm.js';
@@ -1,8 +1,13 @@
1
1
  import React__default from 'react';
2
2
  import { Alert, AlertTitle } from '@material-ui/lab';
3
+ import { kubernetesClustersReadPermission, kubernetesResourcesReadPermission } from '@backstage/plugin-kubernetes-common';
3
4
 
5
+ const permissions = [
6
+ kubernetesClustersReadPermission,
7
+ kubernetesResourcesReadPermission
8
+ ].map((p) => p.name).join(", ");
4
9
  const PermissionAlert = () => {
5
- return /* @__PURE__ */ React__default.createElement(Alert, { severity: "warning", "data-testid": "no-permission-alert" }, /* @__PURE__ */ React__default.createElement(AlertTitle, null, "Permission required"), "To view Tekton Pipeline Runs, contact your administrator to give you the tekton.view.read permission.");
10
+ return /* @__PURE__ */ React__default.createElement(Alert, { severity: "warning", "data-testid": "no-permission-alert" }, /* @__PURE__ */ React__default.createElement(AlertTitle, null, "Permission required"), "To view Tekton Pipeline Runs, contact your administrator to give you the following permission(s): ", permissions, ".");
6
11
  };
7
12
 
8
13
  export { PermissionAlert as default };
@@ -1 +1 @@
1
- {"version":3,"file":"PermissionAlert.esm.js","sources":["../../../src/components/common/PermissionAlert.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 { Alert, AlertTitle } from '@material-ui/lab';\n\nconst PermissionAlert = () => {\n return (\n <Alert severity=\"warning\" data-testid=\"no-permission-alert\">\n <AlertTitle>Permission required</AlertTitle>\n To view Tekton Pipeline Runs, contact your administrator to give you the\n tekton.view.read permission.\n </Alert>\n );\n};\nexport default PermissionAlert;\n"],"names":["React"],"mappings":";;;AAmBA,MAAM,kBAAkB,MAAM;AAC5B,EACE,uBAAAA,cAAA,CAAA,aAAA,CAAC,KAAM,EAAA,EAAA,QAAA,EAAS,SAAU,EAAA,aAAA,EAAY,yCACnCA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA,EAAW,qBAAmB,CAAA,EAAa,uGAG9C,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PermissionAlert.esm.js","sources":["../../../src/components/common/PermissionAlert.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 { Alert, AlertTitle } from '@material-ui/lab';\nimport {\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n} from '@backstage/plugin-kubernetes-common';\n\nconst permissions = [\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n]\n .map(p => p.name)\n .join(', ');\n\nconst PermissionAlert = () => {\n return (\n <Alert severity=\"warning\" data-testid=\"no-permission-alert\">\n <AlertTitle>Permission required</AlertTitle>\n To view Tekton Pipeline Runs, contact your administrator to give you the\n following permission(s): {permissions}.\n </Alert>\n );\n};\nexport default PermissionAlert;\n"],"names":["React"],"mappings":";;;;AAuBA,MAAM,WAAc,GAAA;AAAA,EAClB,gCAAA;AAAA,EACA;AACF,CAAA,CACG,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAI,CAAA,CACf,KAAK,IAAI,CAAA;AAEZ,MAAM,kBAAkB,MAAM;AAC5B,EAAA,uBACGA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,SAAA,EAAU,aAAY,EAAA,qBAAA,EAAA,kBACnCA,cAAA,CAAA,aAAA,CAAA,UAAA,EAAA,IAAA,EAAW,qBAAmB,CAAA,EAAa,oGAElB,EAAA,WAAA,EAAY,GACxC,CAAA;AAEJ;;;;"}
@@ -1,6 +1,6 @@
1
1
  import React__default from 'react';
2
- import { Visualization, GRAPH_POSITION_CHANGE_EVENT, GRAPH_LAYOUT_END_EVENT, VisualizationProvider, TopologyView, VisualizationSurface, TopologyControlBar, createTopologyControlButtons, defaultControlButtonsOptions, action } from '@patternfly/react-topology';
3
- import { DROP_SHADOW_SPACING, TOOLBAR_HEIGHT, GRAPH_MIN_WIDTH, NODE_HEIGHT } from '../../consts/pipeline-topology-const.esm.js';
2
+ import { Visualization, GRAPH_POSITION_CHANGE_EVENT, GRAPH_LAYOUT_END_EVENT, VisualizationProvider, TopologyView, VisualizationSurface, TopologyControlBar, createTopologyControlButtons, action, defaultControlButtonsOptions } from '@patternfly/react-topology';
3
+ import { DROP_SHADOW_SPACING, GRAPH_MIN_WIDTH, TOOLBAR_HEIGHT, NODE_HEIGHT } from '../../consts/pipeline-topology-const.esm.js';
4
4
  import { getLayoutData } from '../../utils/pipeline-topology-utils.esm.js';
5
5
  import pipelineComponentFactory, { layoutFactory } from './pipelineComponentFactory.esm.js';
6
6
 
@@ -48,7 +48,7 @@ const PipelineTaskNode = ({
48
48
  const passedData = React__default.useMemo(() => {
49
49
  const newData = { ...data };
50
50
  Object.keys(newData).forEach((key) => {
51
- if (newData[key] === undefined) {
51
+ if (newData[key] === void 0) {
52
52
  delete newData[key];
53
53
  }
54
54
  });
@@ -81,7 +81,7 @@ const PipelineTaskNode = ({
81
81
  {
82
82
  className: "bs-tkn-pipeline-task-node",
83
83
  element,
84
- onContextMenu: data.showContextMenu ? onContextMenu : undefined,
84
+ onContextMenu: data.showContextMenu ? onContextMenu : void 0,
85
85
  contextMenuOpen,
86
86
  scaleNode: (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high,
87
87
  hideDetailsAtMedium: true,
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineTaskNode.esm.js","sources":["../../../src/components/pipeline-topology/PipelineTaskNode.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 { Tooltip } from '@patternfly/react-core';\nimport {\n DEFAULT_LAYER,\n DEFAULT_WHEN_OFFSET,\n GraphElement,\n Layer,\n Node,\n RunStatus,\n ScaleDetailsLevel,\n TaskNode,\n TOP_LAYER,\n useDetailsLevel,\n useHover,\n WhenDecorator,\n WithContextMenuProps,\n WithSelectionProps,\n} from '@patternfly/react-topology';\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { observer } from 'mobx-react';\n\nimport { PipelineTaskWithStatus, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { NodeType } from '../../consts/pipeline-topology-const';\nimport {\n TEKTON_PIPELINE_RUN,\n TEKTON_PIPELINE_TASK,\n} from '../../consts/tekton-const';\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { StepStatus } from '../../types/taskRun';\nimport { TektonResourcesContextData } from '../../types/types';\nimport { createStepStatus } from '../../utils/pipeline-step-utils';\nimport { getTaskStatus } from '../../utils/pipelineRun-utils';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport { PipelineVisualizationStepList } from './PipelineVisualizationStepList';\n\nimport './PipelineTaskNode.css';\n\ntype PipelineTaskNodeProps = {\n element: Node;\n} & WithContextMenuProps &\n WithSelectionProps &\n GraphElement;\n\nconst PipelineTaskNode = ({\n element,\n onContextMenu,\n contextMenuOpen,\n ...rest\n}: PipelineTaskNodeProps) => {\n const [open, setOpen] = React.useState<boolean>(false);\n const { watchResourcesData } = React.useContext<TektonResourcesContextData>(\n TektonResourcesContext,\n );\n const data = element.getData();\n const triggerRef = React.useRef<SVGGElement | null>(null);\n\n const pipelineRun = data.pipelineRun;\n const [hover, hoverRef] = useHover();\n const detailsLevel = useDetailsLevel();\n const isFinallyTask = element.getType() === NodeType.FINALLY_NODE;\n\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const computedTask: PipelineTaskWithStatus = data.task;\n const stepList =\n computedTask?.status?.steps || computedTask?.taskSpec?.steps || [];\n\n const taskStatus = getTaskStatus(data.pipelineRun, data.task);\n\n const stepStatusList: StepStatus[] = stepList.map((step: { name: string }) =>\n createStepStatus(step, taskStatus),\n );\n const succeededStepsCount = stepStatusList.filter(\n ({ status }) => status === RunStatus.Succeeded,\n ).length;\n\n const badge =\n stepStatusList.length > 0 && data.status\n ? `${succeededStepsCount}/${stepStatusList.length}`\n : null;\n\n const passedData = React.useMemo(() => {\n const newData = { ...data };\n Object.keys(newData).forEach(key => {\n if (newData[key] === undefined) {\n delete newData[key];\n }\n });\n return newData;\n }, [data]);\n\n const hasTaskIcon = !!(data.taskIconClass || data.taskIcon);\n const whenDecorator = data.whenStatus ? (\n <WhenDecorator\n element={element}\n status={data.whenStatus}\n leftOffset={\n hasTaskIcon\n ? DEFAULT_WHEN_OFFSET + (element.getBounds().height - 4) * 0.75\n : DEFAULT_WHEN_OFFSET\n }\n />\n ) : null;\n const activeTaskId = taskRuns.find(\n (tr: TaskRunKind) =>\n tr?.metadata?.labels?.[TEKTON_PIPELINE_RUN] ===\n pipelineRun?.metadata?.name &&\n tr?.metadata?.labels?.[TEKTON_PIPELINE_TASK] === data.task?.name,\n )?.metadata?.name;\n\n const taskNode = (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={activeTaskId}\n />\n <TaskNode\n className=\"bs-tkn-pipeline-task-node\"\n element={element}\n onContextMenu={data.showContextMenu ? onContextMenu : undefined}\n contextMenuOpen={contextMenuOpen}\n scaleNode={\n (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high\n }\n hideDetailsAtMedium\n {...passedData}\n {...rest}\n badge={badge}\n truncateLength={element.getData()?.label?.length}\n onSelect={activeTaskId && openDialog}\n >\n {whenDecorator}\n </TaskNode>\n </>\n );\n\n return (\n <Layer\n id={\n detailsLevel !== ScaleDetailsLevel.high && (hover || contextMenuOpen)\n ? TOP_LAYER\n : DEFAULT_LAYER\n }\n >\n <g\n data-test={`task ${element.getLabel()}`}\n className=\"bs-tkn-pipeline-task-node\"\n ref={hoverRef as React.LegacyRef<SVGGElement>}\n >\n <Tooltip\n position=\"bottom\"\n enableFlip={false}\n content={\n <PipelineVisualizationStepList\n isSpecOverview={!data.status}\n taskName={element.getLabel()}\n steps={stepStatusList}\n isFinallyTask={isFinallyTask}\n />\n }\n triggerRef={triggerRef}\n >\n <g ref={triggerRef}>{taskNode}</g>\n </Tooltip>\n </g>\n </Layer>\n );\n};\n\nexport default React.memo(observer(PipelineTaskNode));\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"PipelineTaskNode.esm.js","sources":["../../../src/components/pipeline-topology/PipelineTaskNode.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 { Tooltip } from '@patternfly/react-core';\nimport {\n DEFAULT_LAYER,\n DEFAULT_WHEN_OFFSET,\n GraphElement,\n Layer,\n Node,\n RunStatus,\n ScaleDetailsLevel,\n TaskNode,\n TOP_LAYER,\n useDetailsLevel,\n useHover,\n WhenDecorator,\n WithContextMenuProps,\n WithSelectionProps,\n} from '@patternfly/react-topology';\n// eslint-disable-next-line @backstage/no-undeclared-imports\nimport { observer } from 'mobx-react';\n\nimport { PipelineTaskWithStatus, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { NodeType } from '../../consts/pipeline-topology-const';\nimport {\n TEKTON_PIPELINE_RUN,\n TEKTON_PIPELINE_TASK,\n} from '../../consts/tekton-const';\nimport { TektonResourcesContext } from '../../hooks/TektonResourcesContext';\nimport { StepStatus } from '../../types/taskRun';\nimport { TektonResourcesContextData } from '../../types/types';\nimport { createStepStatus } from '../../utils/pipeline-step-utils';\nimport { getTaskStatus } from '../../utils/pipelineRun-utils';\nimport PipelineRunLogDialog from '../PipelineRunLogs/PipelineRunLogDialog';\nimport { PipelineVisualizationStepList } from './PipelineVisualizationStepList';\n\nimport './PipelineTaskNode.css';\n\ntype PipelineTaskNodeProps = {\n element: Node;\n} & WithContextMenuProps &\n WithSelectionProps &\n GraphElement;\n\nconst PipelineTaskNode = ({\n element,\n onContextMenu,\n contextMenuOpen,\n ...rest\n}: PipelineTaskNodeProps) => {\n const [open, setOpen] = React.useState<boolean>(false);\n const { watchResourcesData } = React.useContext<TektonResourcesContextData>(\n TektonResourcesContext,\n );\n const data = element.getData();\n const triggerRef = React.useRef<SVGGElement | null>(null);\n\n const pipelineRun = data.pipelineRun;\n const [hover, hoverRef] = useHover();\n const detailsLevel = useDetailsLevel();\n const isFinallyTask = element.getType() === NodeType.FINALLY_NODE;\n\n const pods = watchResourcesData?.pods?.data || [];\n const taskRuns = watchResourcesData?.taskruns?.data || [];\n const openDialog = () => {\n setOpen(true);\n };\n\n const closeDialog = () => {\n setOpen(false);\n };\n\n const computedTask: PipelineTaskWithStatus = data.task;\n const stepList =\n computedTask?.status?.steps || computedTask?.taskSpec?.steps || [];\n\n const taskStatus = getTaskStatus(data.pipelineRun, data.task);\n\n const stepStatusList: StepStatus[] = stepList.map((step: { name: string }) =>\n createStepStatus(step, taskStatus),\n );\n const succeededStepsCount = stepStatusList.filter(\n ({ status }) => status === RunStatus.Succeeded,\n ).length;\n\n const badge =\n stepStatusList.length > 0 && data.status\n ? `${succeededStepsCount}/${stepStatusList.length}`\n : null;\n\n const passedData = React.useMemo(() => {\n const newData = { ...data };\n Object.keys(newData).forEach(key => {\n if (newData[key] === undefined) {\n delete newData[key];\n }\n });\n return newData;\n }, [data]);\n\n const hasTaskIcon = !!(data.taskIconClass || data.taskIcon);\n const whenDecorator = data.whenStatus ? (\n <WhenDecorator\n element={element}\n status={data.whenStatus}\n leftOffset={\n hasTaskIcon\n ? DEFAULT_WHEN_OFFSET + (element.getBounds().height - 4) * 0.75\n : DEFAULT_WHEN_OFFSET\n }\n />\n ) : null;\n const activeTaskId = taskRuns.find(\n (tr: TaskRunKind) =>\n tr?.metadata?.labels?.[TEKTON_PIPELINE_RUN] ===\n pipelineRun?.metadata?.name &&\n tr?.metadata?.labels?.[TEKTON_PIPELINE_TASK] === data.task?.name,\n )?.metadata?.name;\n\n const taskNode = (\n <>\n <PipelineRunLogDialog\n pipelineRun={pipelineRun}\n open={open}\n closeDialog={closeDialog}\n pods={pods}\n taskRuns={taskRuns}\n activeTask={activeTaskId}\n />\n <TaskNode\n className=\"bs-tkn-pipeline-task-node\"\n element={element}\n onContextMenu={data.showContextMenu ? onContextMenu : undefined}\n contextMenuOpen={contextMenuOpen}\n scaleNode={\n (hover || contextMenuOpen) && detailsLevel !== ScaleDetailsLevel.high\n }\n hideDetailsAtMedium\n {...passedData}\n {...rest}\n badge={badge}\n truncateLength={element.getData()?.label?.length}\n onSelect={activeTaskId && openDialog}\n >\n {whenDecorator}\n </TaskNode>\n </>\n );\n\n return (\n <Layer\n id={\n detailsLevel !== ScaleDetailsLevel.high && (hover || contextMenuOpen)\n ? TOP_LAYER\n : DEFAULT_LAYER\n }\n >\n <g\n data-test={`task ${element.getLabel()}`}\n className=\"bs-tkn-pipeline-task-node\"\n ref={hoverRef as React.LegacyRef<SVGGElement>}\n >\n <Tooltip\n position=\"bottom\"\n enableFlip={false}\n content={\n <PipelineVisualizationStepList\n isSpecOverview={!data.status}\n taskName={element.getLabel()}\n steps={stepStatusList}\n isFinallyTask={isFinallyTask}\n />\n }\n triggerRef={triggerRef}\n >\n <g ref={triggerRef}>{taskNode}</g>\n </Tooltip>\n </g>\n </Layer>\n );\n};\n\nexport default React.memo(observer(PipelineTaskNode));\n"],"names":["React"],"mappings":";;;;;;;;;;;;;AA4DA,MAAM,mBAAmB,CAAC;AAAA,EACxB,OAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAG;AACL,CAA6B,KAAA;AAC3B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAAkB,KAAK,CAAA;AACrD,EAAM,MAAA,EAAE,kBAAmB,EAAA,GAAIA,cAAM,CAAA,UAAA;AAAA,IACnC;AAAA,GACF;AACA,EAAM,MAAA,IAAA,GAAO,QAAQ,OAAQ,EAAA;AAC7B,EAAM,MAAA,UAAA,GAAaA,cAAM,CAAA,MAAA,CAA2B,IAAI,CAAA;AAExD,EAAA,MAAM,cAAc,IAAK,CAAA,WAAA;AACzB,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAS,EAAA;AACnC,EAAA,MAAM,eAAe,eAAgB,EAAA;AACrC,EAAA,MAAM,aAAgB,GAAA,OAAA,CAAQ,OAAQ,EAAA,KAAM,QAAS,CAAA,YAAA;AAErD,EAAA,MAAM,IAAO,GAAA,kBAAA,EAAoB,IAAM,EAAA,IAAA,IAAQ,EAAC;AAChD,EAAA,MAAM,QAAW,GAAA,kBAAA,EAAoB,QAAU,EAAA,IAAA,IAAQ,EAAC;AACxD,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,OAAA,CAAQ,IAAI,CAAA;AAAA,GACd;AAEA,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,GACf;AAEA,EAAA,MAAM,eAAuC,IAAK,CAAA,IAAA;AAClD,EAAA,MAAM,WACJ,YAAc,EAAA,MAAA,EAAQ,SAAS,YAAc,EAAA,QAAA,EAAU,SAAS,EAAC;AAEnE,EAAA,MAAM,UAAa,GAAA,aAAA,CAAc,IAAK,CAAA,WAAA,EAAa,KAAK,IAAI,CAAA;AAE5D,EAAA,MAAM,iBAA+B,QAAS,CAAA,GAAA;AAAA,IAAI,CAAC,IAAA,KACjD,gBAAiB,CAAA,IAAA,EAAM,UAAU;AAAA,GACnC;AACA,EAAA,MAAM,sBAAsB,cAAe,CAAA,MAAA;AAAA,IACzC,CAAC,EAAE,MAAO,EAAA,KAAM,WAAW,SAAU,CAAA;AAAA,GACrC,CAAA,MAAA;AAEF,EAAM,MAAA,KAAA,GACJ,cAAe,CAAA,MAAA,GAAS,CAAK,IAAA,IAAA,CAAK,MAC9B,GAAA,CAAA,EAAG,mBAAmB,CAAA,CAAA,EAAI,cAAe,CAAA,MAAM,CAC/C,CAAA,GAAA,IAAA;AAEN,EAAM,MAAA,UAAA,GAAaA,cAAM,CAAA,OAAA,CAAQ,MAAM;AACrC,IAAM,MAAA,OAAA,GAAU,EAAE,GAAG,IAAK,EAAA;AAC1B,IAAA,MAAA,CAAO,IAAK,CAAA,OAAO,CAAE,CAAA,OAAA,CAAQ,CAAO,GAAA,KAAA;AAClC,MAAI,IAAA,OAAA,CAAQ,GAAG,CAAA,KAAM,MAAW,EAAA;AAC9B,QAAA,OAAO,QAAQ,GAAG,CAAA;AAAA;AACpB,KACD,CAAA;AACD,IAAO,OAAA,OAAA;AAAA,GACT,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,WAAc,GAAA,CAAC,EAAE,IAAA,CAAK,iBAAiB,IAAK,CAAA,QAAA,CAAA;AAClD,EAAM,MAAA,aAAA,GAAgB,KAAK,UACzB,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,aAAA;AAAA,IAAA;AAAA,MACC,OAAA;AAAA,MACA,QAAQ,IAAK,CAAA,UAAA;AAAA,MACb,UAAA,EACE,cACI,mBAAuB,GAAA,CAAA,OAAA,CAAQ,WAAY,CAAA,MAAA,GAAS,KAAK,IACzD,GAAA;AAAA;AAAA,GAGN,GAAA,IAAA;AACJ,EAAA,MAAM,eAAe,QAAS,CAAA,IAAA;AAAA,IAC5B,CAAC,EACC,KAAA,EAAA,EAAI,QAAU,EAAA,MAAA,GAAS,mBAAmB,CACxC,KAAA,WAAA,EAAa,QAAU,EAAA,IAAA,IACzB,IAAI,QAAU,EAAA,MAAA,GAAS,oBAAoB,CAAA,KAAM,KAAK,IAAM,EAAA;AAAA,KAC7D,QAAU,EAAA,IAAA;AAEb,EAAA,MAAM,2BAEFA,cAAA,CAAA,aAAA,CAAAA,cAAA,CAAA,QAAA,EAAA,IAAA,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,oBAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAY,EAAA;AAAA;AAAA,GAEd,kBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,2BAAA;AAAA,MACV,OAAA;AAAA,MACA,aAAA,EAAe,IAAK,CAAA,eAAA,GAAkB,aAAgB,GAAA,MAAA;AAAA,MACtD,eAAA;AAAA,MACA,SACG,EAAA,CAAA,KAAA,IAAS,eAAoB,KAAA,YAAA,KAAiB,iBAAkB,CAAA,IAAA;AAAA,MAEnE,mBAAmB,EAAA,IAAA;AAAA,MAClB,GAAG,UAAA;AAAA,MACH,GAAG,IAAA;AAAA,MACJ,KAAA;AAAA,MACA,cAAgB,EAAA,OAAA,CAAQ,OAAQ,EAAA,EAAG,KAAO,EAAA,MAAA;AAAA,MAC1C,UAAU,YAAgB,IAAA;AAAA,KAAA;AAAA,IAEzB;AAAA,GAEL,CAAA;AAGF,EACE,uBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IACE,YAAiB,KAAA,iBAAA,CAAkB,IAAS,KAAA,KAAA,IAAS,mBACjD,SACA,GAAA;AAAA,KAAA;AAAA,oBAGNA,cAAA,CAAA,aAAA;AAAA,MAAC,GAAA;AAAA,MAAA;AAAA,QACC,WAAW,EAAA,CAAA,KAAA,EAAQ,OAAQ,CAAA,QAAA,EAAU,CAAA,CAAA;AAAA,QACrC,SAAU,EAAA,2BAAA;AAAA,QACV,GAAK,EAAA;AAAA,OAAA;AAAA,sBAELA,cAAA,CAAA,aAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,QAAS,EAAA,QAAA;AAAA,UACT,UAAY,EAAA,KAAA;AAAA,UACZ,OACE,kBAAAA,cAAA,CAAA,aAAA;AAAA,YAAC,6BAAA;AAAA,YAAA;AAAA,cACC,cAAA,EAAgB,CAAC,IAAK,CAAA,MAAA;AAAA,cACtB,QAAA,EAAU,QAAQ,QAAS,EAAA;AAAA,cAC3B,KAAO,EAAA,cAAA;AAAA,cACP;AAAA;AAAA,WACF;AAAA,UAEF;AAAA,SAAA;AAAA,wBAECA,cAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAE,GAAK,EAAA,UAAA,EAAA,EAAa,QAAS;AAAA;AAChC;AACF,GACF;AAEJ,CAAA;AAEA,yBAAeA,cAAM,CAAA,IAAA,CAAK,QAAS,CAAA,gBAAgB,CAAC,CAAA;;;;"}
@@ -9,7 +9,7 @@ const PipelineVisualization = ({
9
9
  taskRuns
10
10
  }) => {
11
11
  useDarkTheme();
12
- const model = getGraphDataModel(pipelineRun ?? undefined, taskRuns ?? []);
12
+ const model = getGraphDataModel(pipelineRun ?? void 0, taskRuns ?? []);
13
13
  return /* @__PURE__ */ React__default.createElement(React__default.Fragment, null, !model || model.nodes.length === 0 && model.edges.length === 0 ? /* @__PURE__ */ React__default.createElement("div", { "data-testid": "pipeline-no-tasks" }, "This Pipeline Run has no tasks to visualize") : /* @__PURE__ */ React__default.createElement(
14
14
  "div",
15
15
  {
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineVisualization.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualization.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, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { useDarkTheme } from '../../hooks/useDarkTheme';\nimport { getGraphDataModel } from '../../utils/pipeline-topology-utils';\nimport { PipelineLayout } from './PipelineLayout';\n\nimport './PipelineVisualization.css';\n\ntype PipelineVisualizationProps = {\n pipelineRun: PipelineRunKind | null;\n taskRuns: TaskRunKind[];\n};\n\nexport const PipelineVisualization = ({\n pipelineRun,\n taskRuns,\n}: PipelineVisualizationProps) => {\n useDarkTheme();\n\n const model = getGraphDataModel(pipelineRun ?? undefined, taskRuns ?? []);\n\n return (\n <>\n {!model || (model.nodes.length === 0 && model.edges.length === 0) ? (\n <div data-testid=\"pipeline-no-tasks\">\n This Pipeline Run has no tasks to visualize\n </div>\n ) : (\n <div\n data-testid=\"pipelineRun-visualization\"\n className=\"bs-tkn-pipeline-visualization__layout\"\n >\n <PipelineLayout model={model} />\n </div>\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;AA8BO,MAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAa,YAAA,EAAA;AAEb,EAAA,MAAM,QAAQ,iBAAkB,CAAA,WAAA,IAAe,SAAW,EAAA,QAAA,IAAY,EAAE,CAAA;AAExE,EAAA,mFAEK,CAAC,KAAA,IAAU,KAAM,CAAA,KAAA,CAAM,WAAW,CAAK,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,KAAW,oBAC5DA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,aAAY,EAAA,mBAAA,EAAA,EAAoB,6CAErC,CAEA,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,2BAAA;AAAA,MACZ,SAAU,EAAA;AAAA,KAAA;AAAA,oBAEVA,cAAA,CAAA,aAAA,CAAC,kBAAe,KAAc,EAAA;AAAA,GAGpC,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PipelineVisualization.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualization.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, TaskRunKind } from '@janus-idp/shared-react';\n\nimport { useDarkTheme } from '../../hooks/useDarkTheme';\nimport { getGraphDataModel } from '../../utils/pipeline-topology-utils';\nimport { PipelineLayout } from './PipelineLayout';\n\nimport './PipelineVisualization.css';\n\ntype PipelineVisualizationProps = {\n pipelineRun: PipelineRunKind | null;\n taskRuns: TaskRunKind[];\n};\n\nexport const PipelineVisualization = ({\n pipelineRun,\n taskRuns,\n}: PipelineVisualizationProps) => {\n useDarkTheme();\n\n const model = getGraphDataModel(pipelineRun ?? undefined, taskRuns ?? []);\n\n return (\n <>\n {!model || (model.nodes.length === 0 && model.edges.length === 0) ? (\n <div data-testid=\"pipeline-no-tasks\">\n This Pipeline Run has no tasks to visualize\n </div>\n ) : (\n <div\n data-testid=\"pipelineRun-visualization\"\n className=\"bs-tkn-pipeline-visualization__layout\"\n >\n <PipelineLayout model={model} />\n </div>\n )}\n </>\n );\n};\n"],"names":["React"],"mappings":";;;;;;AA8BO,MAAM,wBAAwB,CAAC;AAAA,EACpC,WAAA;AAAA,EACA;AACF,CAAkC,KAAA;AAChC,EAAa,YAAA,EAAA;AAEb,EAAA,MAAM,QAAQ,iBAAkB,CAAA,WAAA,IAAe,MAAW,EAAA,QAAA,IAAY,EAAE,CAAA;AAExE,EAAA,mFAEK,CAAC,KAAA,IAAU,KAAM,CAAA,KAAA,CAAM,WAAW,CAAK,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,KAAW,oBAC5DA,cAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,aAAY,EAAA,mBAAA,EAAA,EAAoB,6CAErC,CAEA,mBAAAA,cAAA,CAAA,aAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,aAAY,EAAA,2BAAA;AAAA,MACZ,SAAU,EAAA;AAAA,KAAA;AAAA,oBAEVA,cAAA,CAAA,aAAA,CAAC,kBAAe,KAAc,EAAA;AAAA,GAGpC,CAAA;AAEJ;;;;"}
@@ -24,7 +24,7 @@ const layoutFactory = (type, graph) => {
24
24
  case PipelineLayout.DAGRE_VIEWER:
25
25
  return new PipelineDagreLayout(graph, { nodesep: 25 });
26
26
  default:
27
- return undefined;
27
+ return void 0;
28
28
  }
29
29
  };
30
30
  const pipelineComponentFactory = (kind, type) => {
@@ -50,10 +50,10 @@ const pipelineComponentFactory = (kind, type) => {
50
50
  case GROUPED_EDGE_TYPE:
51
51
  return TaskGroupEdge;
52
52
  default:
53
- return undefined;
53
+ return void 0;
54
54
  }
55
55
  }
56
- return undefined;
56
+ return void 0;
57
57
  };
58
58
 
59
59
  export { pipelineComponentFactory as default, layoutFactory };
@@ -1 +1 @@
1
- {"version":3,"file":"pipelineComponentFactory.esm.js","sources":["../../../src/components/pipeline-topology/pipelineComponentFactory.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 ComponentFactory,\n DagreLayout,\n DefaultTaskGroup,\n Graph,\n GraphComponent,\n GraphElement,\n LayoutFactory,\n ModelKind,\n PipelineDagreLayout,\n SpacerNode,\n TaskEdge,\n withPanZoom,\n} from '@patternfly/react-topology';\n\nimport { NodeType, PipelineLayout } from '../../consts/pipeline-topology-const';\nimport { getLayoutData } from '../../utils/pipeline-topology-utils';\nimport PipelineTaskNode from './PipelineTaskNode';\nimport TaskGroupEdge from './TaskGroupEdge';\n\nconst GROUPED_EDGE_TYPE = 'GROUPED_EDGE';\n\nexport const layoutFactory: LayoutFactory = (type: string, graph: Graph) => {\n switch (type) {\n case PipelineLayout.DAGRE_BUILDER:\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return new DagreLayout(graph, {\n // Hack to get around undesirable defaults\n linkDistance: 0,\n nodeDistance: 0,\n groupDistance: 0,\n collideDistance: 0,\n simulationSpeed: 0,\n chargeStrength: 0,\n allowDrag: false,\n layoutOnDrag: false,\n ...getLayoutData(type),\n });\n case PipelineLayout.DAGRE_VIEWER:\n return new PipelineDagreLayout(graph, { nodesep: 25 });\n default:\n return undefined;\n }\n};\n\nconst pipelineComponentFactory: ComponentFactory = (\n kind: ModelKind,\n type: string,\n): React.ComponentType<{ element: GraphElement }> | undefined => {\n if (kind === ModelKind.graph) {\n return withPanZoom()(GraphComponent) as React.ComponentType<{\n element: GraphElement;\n }>;\n }\n if (kind === ModelKind.edge) {\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n }\n if (kind === ModelKind.node) {\n switch (type) {\n case NodeType.TASK_NODE:\n case NodeType.FINALLY_NODE:\n return PipelineTaskNode as React.ComponentType<any>;\n case 'task-group':\n case NodeType.FINALLY_GROUP:\n return DefaultTaskGroup as React.ComponentType<{\n element: GraphElement;\n }>;\n case NodeType.SPACER_NODE:\n return SpacerNode as React.ComponentType<{ element: GraphElement }>;\n case 'finally-spacer-edge':\n case NodeType.EDGE:\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n case GROUPED_EDGE_TYPE:\n return TaskGroupEdge as React.ComponentType<{ element: GraphElement }>;\n default:\n return undefined;\n }\n }\n return undefined;\n};\n\nexport default pipelineComponentFactory;\n"],"names":[],"mappings":";;;;;;AAqCA,MAAM,iBAAoB,GAAA,cAAA;AAEb,MAAA,aAAA,GAA+B,CAAC,IAAA,EAAc,KAAiB,KAAA;AAC1E,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,cAAe,CAAA,aAAA;AAAA,IACpB,KAAK,cAAe,CAAA,oBAAA;AAClB,MAAO,OAAA,IAAI,YAAY,KAAO,EAAA;AAAA;AAAA,QAE5B,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,QACd,aAAe,EAAA,CAAA;AAAA,QACf,eAAiB,EAAA,CAAA;AAAA,QACjB,eAAiB,EAAA,CAAA;AAAA,QACjB,cAAgB,EAAA,CAAA;AAAA,QAChB,SAAW,EAAA,KAAA;AAAA,QACX,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,cAAc,IAAI;AAAA,OACtB,CAAA;AAAA,IACH,KAAK,cAAe,CAAA,YAAA;AAClB,MAAA,OAAO,IAAI,mBAAoB,CAAA,KAAA,EAAO,EAAE,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD;AACE,MAAO,OAAA,SAAA;AAAA;AAEb;AAEM,MAAA,wBAAA,GAA6C,CACjD,IAAA,EACA,IAC+D,KAAA;AAC/D,EAAI,IAAA,IAAA,KAAS,UAAU,KAAO,EAAA;AAC5B,IAAO,OAAA,WAAA,GAAc,cAAc,CAAA;AAAA;AAIrC,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAO,OAAA,QAAA;AAAA;AAET,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,QAAS,CAAA,SAAA;AAAA,MACd,KAAK,QAAS,CAAA,YAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,QAAS,CAAA,aAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MAGT,KAAK,QAAS,CAAA,WAAA;AACZ,QAAO,OAAA,UAAA;AAAA,MACT,KAAK,qBAAA;AAAA,MACL,KAAK,QAAS,CAAA,IAAA;AACZ,QAAO,OAAA,QAAA;AAAA,MACT,KAAK,iBAAA;AACH,QAAO,OAAA,aAAA;AAAA,MACT;AACE,QAAO,OAAA,SAAA;AAAA;AACX;AAEF,EAAO,OAAA,SAAA;AACT;;;;"}
1
+ {"version":3,"file":"pipelineComponentFactory.esm.js","sources":["../../../src/components/pipeline-topology/pipelineComponentFactory.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 ComponentFactory,\n DagreLayout,\n DefaultTaskGroup,\n Graph,\n GraphComponent,\n GraphElement,\n LayoutFactory,\n ModelKind,\n PipelineDagreLayout,\n SpacerNode,\n TaskEdge,\n withPanZoom,\n} from '@patternfly/react-topology';\n\nimport { NodeType, PipelineLayout } from '../../consts/pipeline-topology-const';\nimport { getLayoutData } from '../../utils/pipeline-topology-utils';\nimport PipelineTaskNode from './PipelineTaskNode';\nimport TaskGroupEdge from './TaskGroupEdge';\n\nconst GROUPED_EDGE_TYPE = 'GROUPED_EDGE';\n\nexport const layoutFactory: LayoutFactory = (type: string, graph: Graph) => {\n switch (type) {\n case PipelineLayout.DAGRE_BUILDER:\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return new DagreLayout(graph, {\n // Hack to get around undesirable defaults\n linkDistance: 0,\n nodeDistance: 0,\n groupDistance: 0,\n collideDistance: 0,\n simulationSpeed: 0,\n chargeStrength: 0,\n allowDrag: false,\n layoutOnDrag: false,\n ...getLayoutData(type),\n });\n case PipelineLayout.DAGRE_VIEWER:\n return new PipelineDagreLayout(graph, { nodesep: 25 });\n default:\n return undefined;\n }\n};\n\nconst pipelineComponentFactory: ComponentFactory = (\n kind: ModelKind,\n type: string,\n): React.ComponentType<{ element: GraphElement }> | undefined => {\n if (kind === ModelKind.graph) {\n return withPanZoom()(GraphComponent) as React.ComponentType<{\n element: GraphElement;\n }>;\n }\n if (kind === ModelKind.edge) {\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n }\n if (kind === ModelKind.node) {\n switch (type) {\n case NodeType.TASK_NODE:\n case NodeType.FINALLY_NODE:\n return PipelineTaskNode as React.ComponentType<any>;\n case 'task-group':\n case NodeType.FINALLY_GROUP:\n return DefaultTaskGroup as React.ComponentType<{\n element: GraphElement;\n }>;\n case NodeType.SPACER_NODE:\n return SpacerNode as React.ComponentType<{ element: GraphElement }>;\n case 'finally-spacer-edge':\n case NodeType.EDGE:\n return TaskEdge as React.ComponentType<{ element: GraphElement }>;\n case GROUPED_EDGE_TYPE:\n return TaskGroupEdge as React.ComponentType<{ element: GraphElement }>;\n default:\n return undefined;\n }\n }\n return undefined;\n};\n\nexport default pipelineComponentFactory;\n"],"names":[],"mappings":";;;;;;AAqCA,MAAM,iBAAoB,GAAA,cAAA;AAEb,MAAA,aAAA,GAA+B,CAAC,IAAA,EAAc,KAAiB,KAAA;AAC1E,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,cAAe,CAAA,aAAA;AAAA,IACpB,KAAK,cAAe,CAAA,oBAAA;AAClB,MAAO,OAAA,IAAI,YAAY,KAAO,EAAA;AAAA;AAAA,QAE5B,YAAc,EAAA,CAAA;AAAA,QACd,YAAc,EAAA,CAAA;AAAA,QACd,aAAe,EAAA,CAAA;AAAA,QACf,eAAiB,EAAA,CAAA;AAAA,QACjB,eAAiB,EAAA,CAAA;AAAA,QACjB,cAAgB,EAAA,CAAA;AAAA,QAChB,SAAW,EAAA,KAAA;AAAA,QACX,YAAc,EAAA,KAAA;AAAA,QACd,GAAG,cAAc,IAAI;AAAA,OACtB,CAAA;AAAA,IACH,KAAK,cAAe,CAAA,YAAA;AAClB,MAAA,OAAO,IAAI,mBAAoB,CAAA,KAAA,EAAO,EAAE,OAAA,EAAS,IAAI,CAAA;AAAA,IACvD;AACE,MAAO,OAAA,MAAA;AAAA;AAEb;AAEM,MAAA,wBAAA,GAA6C,CACjD,IAAA,EACA,IAC+D,KAAA;AAC/D,EAAI,IAAA,IAAA,KAAS,UAAU,KAAO,EAAA;AAC5B,IAAO,OAAA,WAAA,GAAc,cAAc,CAAA;AAAA;AAIrC,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAO,OAAA,QAAA;AAAA;AAET,EAAI,IAAA,IAAA,KAAS,UAAU,IAAM,EAAA;AAC3B,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,QAAS,CAAA,SAAA;AAAA,MACd,KAAK,QAAS,CAAA,YAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MACT,KAAK,YAAA;AAAA,MACL,KAAK,QAAS,CAAA,aAAA;AACZ,QAAO,OAAA,gBAAA;AAAA,MAGT,KAAK,QAAS,CAAA,WAAA;AACZ,QAAO,OAAA,UAAA;AAAA,MACT,KAAK,qBAAA;AAAA,MACL,KAAK,QAAS,CAAA,IAAA;AACZ,QAAO,OAAA,QAAA;AAAA,MACT,KAAK,iBAAA;AACH,QAAO,OAAA,aAAA;AAAA,MACT;AACE,QAAO,OAAA,MAAA;AAAA;AACX;AAEF,EAAO,OAAA,MAAA;AACT;;;;"}
@@ -9,7 +9,7 @@ const useResourcesClusters = (k8sObjectsResponse) => {
9
9
  let isMounted = true;
10
10
  if (isMounted && !loading && kubernetesObjects && !error) {
11
11
  const k8sResourcesClusters = getClusters(kubernetesObjects);
12
- {
12
+ if (k8sResourcesClusters) {
13
13
  setClusters(k8sResourcesClusters);
14
14
  }
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useResourcesClusters.esm.js","sources":["../../src/hooks/useResourcesClusters.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 { useEffect, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from '@janus-idp/shared-react';\n\nimport { ClusterErrors } from '../types/types';\nimport { getClusters } from '../utils/tekton-utils';\n\nexport const useResourcesClusters = (k8sObjectsResponse: KubernetesObjects) => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [clusters, setClusters] = useState<{\n clusters: string[];\n errors: ClusterErrors[];\n }>({ clusters: [], errors: [] });\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const k8sResourcesClusters = getClusters(kubernetesObjects);\n if (k8sResourcesClusters) {\n setClusters(k8sResourcesClusters);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error]);\n\n return useDeepCompareMemoize(clusters);\n};\n"],"names":[],"mappings":";;;;AAwBa,MAAA,oBAAA,GAAuB,CAAC,kBAA0C,KAAA;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAS,EAAA,KAAA,EAAU,GAAA,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAG7B,CAAA,EAAE,QAAU,EAAA,EAAI,EAAA,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAY,GAAA,IAAA;AAChB,IAAA,IAAI,SAAa,IAAA,CAAC,OAAW,IAAA,iBAAA,IAAqB,CAAC,KAAO,EAAA;AACxD,MAAM,MAAA,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,MAA0B;AACxB,QAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA;AAClC;AAEF,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,KAAA;AAAA,KACd;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAEtC,EAAA,OAAO,sBAAsB,QAAQ,CAAA;AACvC;;;;"}
1
+ {"version":3,"file":"useResourcesClusters.esm.js","sources":["../../src/hooks/useResourcesClusters.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 { useEffect, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from '@janus-idp/shared-react';\n\nimport { ClusterErrors } from '../types/types';\nimport { getClusters } from '../utils/tekton-utils';\n\nexport const useResourcesClusters = (k8sObjectsResponse: KubernetesObjects) => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [clusters, setClusters] = useState<{\n clusters: string[];\n errors: ClusterErrors[];\n }>({ clusters: [], errors: [] });\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const k8sResourcesClusters = getClusters(kubernetesObjects);\n if (k8sResourcesClusters) {\n setClusters(k8sResourcesClusters);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error]);\n\n return useDeepCompareMemoize(clusters);\n};\n"],"names":[],"mappings":";;;;AAwBa,MAAA,oBAAA,GAAuB,CAAC,kBAA0C,KAAA;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAS,EAAA,KAAA,EAAU,GAAA,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAG7B,CAAA,EAAE,QAAU,EAAA,EAAI,EAAA,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAY,GAAA,IAAA;AAChB,IAAA,IAAI,SAAa,IAAA,CAAC,OAAW,IAAA,iBAAA,IAAqB,CAAC,KAAO,EAAA;AACxD,MAAM,MAAA,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,MAAA,IAAI,oBAAsB,EAAA;AACxB,QAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA;AAClC;AAEF,IAAA,OAAO,MAAM;AACX,MAAY,SAAA,GAAA,KAAA;AAAA,KACd;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAEtC,EAAA,OAAO,sBAAsB,QAAQ,CAAA;AACvC;;;;"}
@@ -1,11 +1,14 @@
1
1
  import { usePermission } from '@backstage/plugin-permission-react';
2
- import { tektonViewPermission } from '@backstage-community/plugin-tekton-common';
2
+ import { kubernetesClustersReadPermission, kubernetesResourcesReadPermission } from '@backstage/plugin-kubernetes-common';
3
3
 
4
4
  const useTektonViewPermission = () => {
5
- const tektonViewPermissionResult = usePermission({
6
- permission: tektonViewPermission
5
+ const clusterReadPermission = usePermission({
6
+ permission: kubernetesClustersReadPermission
7
7
  });
8
- return tektonViewPermissionResult.allowed;
8
+ const clusterResourcesReadPermission = usePermission({
9
+ permission: kubernetesResourcesReadPermission
10
+ });
11
+ return clusterReadPermission.allowed && clusterResourcesReadPermission.allowed;
9
12
  };
10
13
 
11
14
  export { useTektonViewPermission };
@@ -1 +1 @@
1
- {"version":3,"file":"useTektonViewPermission.esm.js","sources":["../../src/hooks/useTektonViewPermission.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 { usePermission } from '@backstage/plugin-permission-react';\n\nimport { tektonViewPermission } from '@backstage-community/plugin-tekton-common';\n\nexport const useTektonViewPermission = () => {\n const tektonViewPermissionResult = usePermission({\n permission: tektonViewPermission,\n });\n\n return tektonViewPermissionResult.allowed;\n};\n"],"names":[],"mappings":";;;AAmBO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,6BAA6B,aAAc,CAAA;AAAA,IAC/C,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,OAAO,0BAA2B,CAAA,OAAA;AACpC;;;;"}
1
+ {"version":3,"file":"useTektonViewPermission.esm.js","sources":["../../src/hooks/useTektonViewPermission.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 { usePermission } from '@backstage/plugin-permission-react';\n\nimport {\n kubernetesClustersReadPermission,\n kubernetesResourcesReadPermission,\n} from '@backstage/plugin-kubernetes-common';\n\nexport const useTektonViewPermission = () => {\n const clusterReadPermission = usePermission({\n permission: kubernetesClustersReadPermission,\n });\n\n const clusterResourcesReadPermission = usePermission({\n permission: kubernetesResourcesReadPermission,\n });\n\n return (\n clusterReadPermission.allowed && clusterResourcesReadPermission.allowed\n );\n};\n"],"names":[],"mappings":";;;AAsBO,MAAM,0BAA0B,MAAM;AAC3C,EAAA,MAAM,wBAAwB,aAAc,CAAA;AAAA,IAC1C,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,MAAM,iCAAiC,aAAc,CAAA;AAAA,IACnD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EACE,OAAA,qBAAA,CAAsB,WAAW,8BAA+B,CAAA,OAAA;AAEpE;;;;"}
@@ -1,13 +1,9 @@
1
1
  import './types/types.esm.js';
2
2
 
3
3
  const PipelineRunGVK = {
4
- apiVersion: "v1",
5
- apiGroup: "tekton.dev",
6
4
  kind: "PipelineRun"
7
5
  };
8
6
  const TaskRunGVK = {
9
- apiVersion: "v1",
10
- apiGroup: "tekton.dev",
11
7
  kind: "TaskRun"
12
8
  };
13
9
  var ModelsPlural = /* @__PURE__ */ ((ModelsPlural2) => {
@@ -1 +1 @@
1
- {"version":3,"file":"models.esm.js","sources":["../src/models.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 { GroupVersionKind, tektonGroupColor } from './types/types';\n\nexport const PipelineRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'PipelineRun',\n};\n\nexport const PipelineRunModel = {\n ...PipelineRunGVK,\n abbr: 'PLR',\n color: tektonGroupColor,\n};\n\nexport const TaskRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'TaskRun',\n};\n\nexport enum ModelsPlural {\n pipelineruns = 'pipelineruns',\n taskruns = 'taskruns',\n pods = 'pods',\n}\n\nexport const tektonResourceModels: { [key: string]: GroupVersionKind } = {\n [ModelsPlural.pipelineruns]: PipelineRunGVK,\n [ModelsPlural.taskruns]: TaskRunGVK,\n};\n"],"names":["ModelsPlural"],"mappings":";;AAiBO,MAAM,cAAmC,GAAA;AAAA,EAC9C,UAAY,EAAA,IAAA;AAAA,EACZ,QAAU,EAAA,YAAA;AAAA,EACV,IAAM,EAAA;AACR;AAQO,MAAM,UAA+B,GAAA;AAAA,EAC1C,UAAY,EAAA,IAAA;AAAA,EACZ,QAAU,EAAA,YAAA;AAAA,EACV,IAAM,EAAA;AACR;AAEY,IAAA,YAAA,qBAAAA,aAAL,KAAA;AACL,EAAAA,cAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,cAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,cAAA,MAAO,CAAA,GAAA,MAAA;AAHG,EAAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
1
+ {"version":3,"file":"models.esm.js","sources":["../src/models.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 { GroupVersionKind, tektonGroupColor } from './types/types';\n\nexport const PipelineRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'PipelineRun',\n};\n\nexport const PipelineRunModel = {\n ...PipelineRunGVK,\n abbr: 'PLR',\n color: tektonGroupColor,\n};\n\nexport const TaskRunGVK: GroupVersionKind = {\n apiVersion: 'v1',\n apiGroup: 'tekton.dev',\n kind: 'TaskRun',\n};\n\nexport enum ModelsPlural {\n pipelineruns = 'pipelineruns',\n taskruns = 'taskruns',\n pods = 'pods',\n}\n\nexport const tektonResourceModels: { [key: string]: GroupVersionKind } = {\n [ModelsPlural.pipelineruns]: PipelineRunGVK,\n [ModelsPlural.taskruns]: TaskRunGVK,\n};\n"],"names":["ModelsPlural"],"mappings":";;AAiBO,MAAM,cAAmC,GAAA;AAAA,EAG9C,IAAM,EAAA;AACR;AAQO,MAAM,UAA+B,GAAA;AAAA,EAG1C,IAAM,EAAA;AACR;AAEY,IAAA,YAAA,qBAAAA,aAAL,KAAA;AACL,EAAAA,cAAA,cAAe,CAAA,GAAA,cAAA;AACf,EAAAA,cAAA,UAAW,CAAA,GAAA,UAAA;AACX,EAAAA,cAAA,MAAO,CAAA,GAAA,MAAA;AAHG,EAAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;;;;"}
@@ -1,5 +1,5 @@
1
1
  function styleInject(css, ref) {
2
- if ( ref === undefined ) ref = {};
2
+ if ( ref === void 0 ) ref = {};
3
3
  var insertAt = ref.insertAt;
4
4
 
5
5
  if (!css || typeof document === 'undefined') { return; }
@@ -1 +1 @@
1
- {"version":3,"file":"style-inject.es.esm.js","sources":["../../../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,SAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO;;AAExD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B;AACA,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B;;AAEA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD;AACA;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"style-inject.es.esm.js","sources":["../../../../../../node_modules/style-inject/dist/style-inject.es.js"],"sourcesContent":["function styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nexport default styleInject;\n"],"names":[],"mappings":"AAAA,SAAS,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;AAC/B,EAAE,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,GAAG,EAAE;AAChC,EAAE,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ;;AAE7B,EAAE,IAAI,CAAC,GAAG,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,EAAE,OAAO;;AAExD,EAAE,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACtE,EAAE,IAAI,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC;AAC7C,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU;;AAEzB,EAAE,IAAI,QAAQ,KAAK,KAAK,EAAE;AAC1B,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE;AACzB,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;AAC/C,KAAK,MAAM;AACX,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B;AACA,GAAG,MAAM;AACT,IAAI,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;AAC3B;;AAEA,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE;AACxB,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG;AAClC,GAAG,MAAM;AACT,IAAI,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;AACnD;AACA;;;;","x_google_ignoreList":[0]}
@@ -1,4 +1,4 @@
1
- import { createPlugin, createApiFactory, gitlabAuthApiRef, googleAuthApiRef, microsoftAuthApiRef, oktaAuthApiRef, oneloginAuthApiRef, discoveryApiRef, fetchApiRef, createComponentExtension } from '@backstage/core-plugin-api';
1
+ import { createPlugin, createApiFactory, oneloginAuthApiRef, oktaAuthApiRef, microsoftAuthApiRef, googleAuthApiRef, gitlabAuthApiRef, fetchApiRef, discoveryApiRef, createComponentExtension } from '@backstage/core-plugin-api';
2
2
  import { KubernetesAuthProviders, KubernetesBackendClient, KubernetesProxyClient } from '@backstage/plugin-kubernetes-react';
3
3
  import { kubernetesAuthProvidersApiRef, kubernetesApiRef, kubernetesProxyApiRef } from './types/types.esm.js';
4
4
 
@@ -2,7 +2,7 @@ import { RunStatus, getSpacerNodes, getEdgesFromNodes, ModelKind, WhenStatus } f
2
2
  import { uniq, minBy } from 'lodash';
3
3
  import { ComputedStatus } from '@janus-idp/shared-react';
4
4
  import { DAG } from '../components/pipeline-topology/dag.esm.js';
5
- import { NodeType, NODE_HEIGHT, NODE_WIDTH, DEFAULT_BADGE_WIDTH, NODE_PADDING, DEFAULT_NODE_ICON_WIDTH, DEFAULT_FINALLLY_GROUP_PADDING, DEFAULT_NODE_HEIGHT, PipelineLayout, DAGRE_BUILDER_SPACED_PROPS, DAGRE_VIEWER_SPACED_PROPS, DAGRE_VIEWER_PROPS, DAGRE_BUILDER_PROPS, REGEX_EXTRACT_DEPS } from '../consts/pipeline-topology-const.esm.js';
5
+ import { DEFAULT_BADGE_WIDTH, NODE_WIDTH, NODE_HEIGHT, NODE_PADDING, DEFAULT_NODE_ICON_WIDTH, NodeType, DEFAULT_FINALLLY_GROUP_PADDING, PipelineLayout, DEFAULT_NODE_HEIGHT, DAGRE_BUILDER_SPACED_PROPS, DAGRE_VIEWER_SPACED_PROPS, DAGRE_VIEWER_PROPS, DAGRE_BUILDER_PROPS, REGEX_EXTRACT_DEPS } from '../consts/pipeline-topology-const.esm.js';
6
6
  import { getPLRTaskRuns, appendPipelineRunStatus } from './pipelineRun-utils.esm.js';
7
7
 
8
8
  const createGenericNode = (type, width, height) => (name, data) => ({
@@ -68,12 +68,12 @@ const getWhenStatus = (status) => {
68
68
  case ComputedStatus.Idle:
69
69
  return WhenStatus.Unmet;
70
70
  default:
71
- return undefined;
71
+ return void 0;
72
72
  }
73
73
  };
74
74
  const getTaskWhenStatus = (task) => {
75
75
  if (!task.when) {
76
- return undefined;
76
+ return void 0;
77
77
  }
78
78
  return getWhenStatus(task.status?.reason);
79
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline-topology-utils.esm.js","sources":["../../src/utils/pipeline-topology-utils.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 {\n EdgeModel,\n getEdgesFromNodes,\n getSpacerNodes,\n GraphModel,\n ModelKind,\n RunStatus,\n WhenStatus,\n} from '@patternfly/react-topology';\nimport * as dagre from 'dagre';\nimport { minBy, uniq } from 'lodash';\n\nimport {\n ComputedStatus,\n PipelineRunKind,\n PipelineTask,\n PipelineTaskParam,\n PipelineTaskWithStatus,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { DAG, Vertex } from '../components/pipeline-topology/dag';\nimport {\n DAGRE_BUILDER_PROPS,\n DAGRE_BUILDER_SPACED_PROPS,\n DAGRE_VIEWER_PROPS,\n DAGRE_VIEWER_SPACED_PROPS,\n DEFAULT_BADGE_WIDTH,\n DEFAULT_FINALLLY_GROUP_PADDING,\n DEFAULT_NODE_HEIGHT,\n DEFAULT_NODE_ICON_WIDTH,\n FINALLY_NODE_PADDING,\n NODE_HEIGHT,\n NODE_PADDING,\n NODE_WIDTH,\n NodeType,\n PipelineLayout,\n REGEX_EXTRACT_DEPS,\n WHEN_EXPRESSION_SPACING,\n} from '../consts/pipeline-topology-const';\nimport {\n FinallyNodeModel,\n LoadingNodeModel,\n NodeCreator,\n NodeCreatorSetup,\n PipelineEdgeModel,\n PipelineMixedNodeModel,\n PipelineRunAfterNodeModelData,\n} from '../types/pipeline-topology-types';\nimport { appendPipelineRunStatus, getPLRTaskRuns } from './pipelineRun-utils';\n\nconst createGenericNode: NodeCreatorSetup =\n (type, width?, height?) => (name, data) => ({\n id: name,\n label: data?.label || name,\n runAfterTasks: data?.runAfterTasks || [],\n ...(data && { data }),\n height: height ?? NODE_HEIGHT,\n width: width ?? NODE_WIDTH,\n type,\n });\n\nconst getMaxFinallyNode = (finallyTaskList: PipelineTaskWithStatus[]) => {\n const sortedFinallyTaskList = [...finallyTaskList].sort(\n (a, b) => b.name.length - a.name.length,\n );\n return sortedFinallyTaskList[0]?.name || '';\n};\n\nexport const createFinallyNode = (\n height: number,\n): NodeCreator<FinallyNodeModel> =>\n createGenericNode(\n NodeType.FINALLY_NODE,\n NODE_WIDTH + WHEN_EXPRESSION_SPACING + FINALLY_NODE_PADDING * 2,\n height,\n );\n\nexport const createLoadingNode: NodeCreator<LoadingNodeModel> =\n createGenericNode(NodeType.LOADING_NODE);\n\nconst createPipelineTaskNode = (\n type: NodeType,\n data: PipelineRunAfterNodeModelData,\n) => createGenericNode(type, data.width, data.height)(data.id ?? '', data);\n\nexport const getTextWidth = (\n text: string,\n font: string = '0.8rem RedHatText',\n): number => {\n if (!text || text.length === 0) {\n return 0;\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n return text.length;\n }\n context.font = font;\n const { width } = context.measureText(text);\n return width;\n};\n\nexport const extractDepsFromContextVariables = (\n contextVariable: string | null | undefined,\n) => {\n let matches;\n const deps: string[] = [];\n if (!contextVariable) {\n return deps;\n }\n // eslint-disable-next-line no-cond-assign\n while ((matches = REGEX_EXTRACT_DEPS.exec(contextVariable)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (matches.index === REGEX_EXTRACT_DEPS.lastIndex) {\n REGEX_EXTRACT_DEPS.lastIndex++;\n }\n if (matches) {\n if (!deps.includes(matches[1])) {\n deps.push(matches[1]);\n }\n }\n }\n return deps;\n};\n\nexport const getSpacerNode = (\n node: PipelineMixedNodeModel,\n): PipelineMixedNodeModel => ({\n ...node,\n height: 1,\n width: 1,\n});\n\nexport const getWhenStatus = (\n status: ComputedStatus,\n): WhenStatus | undefined => {\n switch (status) {\n case ComputedStatus.Succeeded:\n case ComputedStatus.Failed:\n return WhenStatus.Met;\n case ComputedStatus.Skipped:\n case ComputedStatus['In Progress']:\n case ComputedStatus.Idle:\n return WhenStatus.Unmet;\n default:\n return undefined;\n }\n};\n\nexport const getTaskWhenStatus = (\n task: PipelineTaskWithStatus,\n): WhenStatus | undefined => {\n if (!task.when) {\n return undefined;\n }\n return getWhenStatus(task.status?.reason as ComputedStatus);\n};\n\nconst getDepsFromContextVariables = (task: PipelineTask) => {\n const depsFromContextVariables: string[] = [];\n if (task.params) {\n task.params.forEach((p: PipelineTaskParam) => {\n if (Array.isArray(p.value)) {\n p.value.forEach(paramValue => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(paramValue),\n );\n });\n } else {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(p.value),\n );\n }\n });\n }\n if (task?.when) {\n task.when.forEach(({ input, values }) => {\n depsFromContextVariables.push(...extractDepsFromContextVariables(input));\n values.forEach((whenValue: string) => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(whenValue),\n );\n });\n });\n }\n return depsFromContextVariables;\n};\n\nconst getRunAfterTasks = (task: PipelineTask, dag: DAG, vertex: Vertex) => {\n const runAfterTasks: string[] = [];\n const depsFromContextVariables = getDepsFromContextVariables(task);\n\n const dependancies = uniq([...vertex.dependancyNames]);\n if (dependancies) {\n dependancies.forEach(dep => {\n const depObj = dag.vertices.get(dep) as Vertex;\n if (\n depObj.level - vertex.level <= 1 ||\n vertex.data.runAfter?.includes(depObj.name)\n ) {\n runAfterTasks.push(dep);\n }\n });\n }\n if (depsFromContextVariables.length > 0) {\n const v = depsFromContextVariables.map(d => {\n return dag.vertices.get(d) as Vertex;\n });\n const minLevelDep = minBy(v, (d: Vertex) => d.level) as Vertex;\n const nearestDeps = v.filter(v1 => v1.level === minLevelDep.level);\n nearestDeps.forEach(nd => {\n if (nd.level - vertex.level <= 1 || vertex.dependancyNames.length === 0) {\n runAfterTasks.push(nd.name);\n }\n });\n }\n return runAfterTasks;\n};\n\nexport const getGraphDataModel = (\n pipelineRun: PipelineRunKind | undefined,\n taskRuns: TaskRunKind[],\n): {\n graph: GraphModel;\n nodes: PipelineMixedNodeModel[];\n edges: EdgeModel[];\n} | null => {\n if (!pipelineRun) {\n return null;\n }\n\n const plrTaskRuns = getPLRTaskRuns(taskRuns, pipelineRun?.metadata?.name);\n\n const taskList = appendPipelineRunStatus(pipelineRun, plrTaskRuns);\n\n const dag = new DAG();\n taskList?.forEach((task: PipelineTask) => {\n dag.addEdges(task.name, task, '', task.runAfter || []);\n });\n\n const nodes: PipelineMixedNodeModel[] = [];\n const maxWidthForLevel: { [key: string]: number } = {};\n dag.topologicalSort((v: Vertex) => {\n if (!maxWidthForLevel[v.level]) {\n maxWidthForLevel[v.level] = getTextWidth(v.name);\n } else {\n maxWidthForLevel[v.level] = Math.max(\n maxWidthForLevel[v.level],\n getTextWidth(v.name),\n );\n }\n });\n dag.topologicalSort((vertex: Vertex) => {\n const task = vertex.data as PipelineTask;\n const runAfterTasks = getRunAfterTasks(task, dag, vertex);\n const badgePadding =\n Object.keys(pipelineRun.spec)?.length > 0 ? DEFAULT_BADGE_WIDTH : 0;\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === task.name,\n );\n nodes.push(\n createPipelineTaskNode(NodeType.TASK_NODE, {\n id: vertex.name,\n label: vertex.name,\n width:\n maxWidthForLevel[vertex.level] +\n NODE_PADDING * 2 +\n DEFAULT_NODE_ICON_WIDTH +\n badgePadding,\n runAfterTasks,\n status: isTaskSkipped ? RunStatus.Skipped : vertex.data.status?.reason,\n whenStatus: getTaskWhenStatus(vertex.data),\n task: vertex.data,\n pipelineRun,\n }),\n );\n });\n\n const finallyTaskList = appendPipelineRunStatus(\n pipelineRun,\n plrTaskRuns,\n true,\n );\n\n const finallyNodes = finallyTaskList.map(fTask => {\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === fTask.name,\n );\n\n return createPipelineTaskNode(NodeType.FINALLY_NODE, {\n id: fTask.name,\n label: fTask.name,\n width:\n getTextWidth(getMaxFinallyNode(finallyTaskList)) +\n NODE_PADDING * 2 +\n DEFAULT_FINALLLY_GROUP_PADDING * 2,\n height: DEFAULT_NODE_HEIGHT,\n runAfterTasks: [],\n status: isTaskSkipped\n ? RunStatus.Skipped\n : (fTask.status?.reason as RunStatus),\n whenStatus: getTaskWhenStatus(fTask),\n task: fTask,\n pipelineRun,\n });\n });\n\n const finallyGroup = finallyNodes.length\n ? [\n {\n id: 'finally-group-id',\n type: NodeType.FINALLY_GROUP,\n children: finallyNodes.map(n => n.id),\n group: true,\n style: { padding: DEFAULT_FINALLLY_GROUP_PADDING },\n },\n ]\n : [];\n const spacerNodes: PipelineMixedNodeModel[] = (\n getSpacerNodes([...nodes, ...finallyNodes], NodeType.SPACER_NODE, [\n NodeType.FINALLY_NODE,\n ]) as PipelineMixedNodeModel[]\n ).map(getSpacerNode);\n\n const edges: PipelineEdgeModel[] = getEdgesFromNodes(\n [...nodes, ...spacerNodes, ...finallyNodes],\n NodeType.SPACER_NODE,\n NodeType.EDGE,\n NodeType.EDGE,\n [NodeType.FINALLY_NODE],\n NodeType.EDGE,\n );\n\n return {\n graph: {\n id: `${pipelineRun?.metadata?.name}-graph`,\n type: ModelKind.graph,\n layout: PipelineLayout.DAGRE_VIEWER,\n scaleExtent: [0.5, 1],\n },\n nodes: [\n ...nodes,\n ...spacerNodes,\n ...finallyNodes,\n ...finallyGroup,\n ] as PipelineMixedNodeModel[],\n edges,\n };\n};\n\nexport const getLayoutData = (\n layout: PipelineLayout,\n): dagre.GraphLabel | null => {\n switch (layout) {\n case PipelineLayout.DAGRE_BUILDER:\n return DAGRE_BUILDER_PROPS;\n case PipelineLayout.DAGRE_VIEWER:\n return DAGRE_VIEWER_PROPS;\n case PipelineLayout.DAGRE_VIEWER_SPACED:\n return DAGRE_VIEWER_SPACED_PROPS;\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return DAGRE_BUILDER_SPACED_PROPS;\n default:\n return null;\n }\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline-topology-utils.esm.js","sources":["../../src/utils/pipeline-topology-utils.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 {\n EdgeModel,\n getEdgesFromNodes,\n getSpacerNodes,\n GraphModel,\n ModelKind,\n RunStatus,\n WhenStatus,\n} from '@patternfly/react-topology';\nimport * as dagre from 'dagre';\nimport { minBy, uniq } from 'lodash';\n\nimport {\n ComputedStatus,\n PipelineRunKind,\n PipelineTask,\n PipelineTaskParam,\n PipelineTaskWithStatus,\n TaskRunKind,\n} from '@janus-idp/shared-react';\n\nimport { DAG, Vertex } from '../components/pipeline-topology/dag';\nimport {\n DAGRE_BUILDER_PROPS,\n DAGRE_BUILDER_SPACED_PROPS,\n DAGRE_VIEWER_PROPS,\n DAGRE_VIEWER_SPACED_PROPS,\n DEFAULT_BADGE_WIDTH,\n DEFAULT_FINALLLY_GROUP_PADDING,\n DEFAULT_NODE_HEIGHT,\n DEFAULT_NODE_ICON_WIDTH,\n FINALLY_NODE_PADDING,\n NODE_HEIGHT,\n NODE_PADDING,\n NODE_WIDTH,\n NodeType,\n PipelineLayout,\n REGEX_EXTRACT_DEPS,\n WHEN_EXPRESSION_SPACING,\n} from '../consts/pipeline-topology-const';\nimport {\n FinallyNodeModel,\n LoadingNodeModel,\n NodeCreator,\n NodeCreatorSetup,\n PipelineEdgeModel,\n PipelineMixedNodeModel,\n PipelineRunAfterNodeModelData,\n} from '../types/pipeline-topology-types';\nimport { appendPipelineRunStatus, getPLRTaskRuns } from './pipelineRun-utils';\n\nconst createGenericNode: NodeCreatorSetup =\n (type, width?, height?) => (name, data) => ({\n id: name,\n label: data?.label || name,\n runAfterTasks: data?.runAfterTasks || [],\n ...(data && { data }),\n height: height ?? NODE_HEIGHT,\n width: width ?? NODE_WIDTH,\n type,\n });\n\nconst getMaxFinallyNode = (finallyTaskList: PipelineTaskWithStatus[]) => {\n const sortedFinallyTaskList = [...finallyTaskList].sort(\n (a, b) => b.name.length - a.name.length,\n );\n return sortedFinallyTaskList[0]?.name || '';\n};\n\nexport const createFinallyNode = (\n height: number,\n): NodeCreator<FinallyNodeModel> =>\n createGenericNode(\n NodeType.FINALLY_NODE,\n NODE_WIDTH + WHEN_EXPRESSION_SPACING + FINALLY_NODE_PADDING * 2,\n height,\n );\n\nexport const createLoadingNode: NodeCreator<LoadingNodeModel> =\n createGenericNode(NodeType.LOADING_NODE);\n\nconst createPipelineTaskNode = (\n type: NodeType,\n data: PipelineRunAfterNodeModelData,\n) => createGenericNode(type, data.width, data.height)(data.id ?? '', data);\n\nexport const getTextWidth = (\n text: string,\n font: string = '0.8rem RedHatText',\n): number => {\n if (!text || text.length === 0) {\n return 0;\n }\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n if (!context) {\n return text.length;\n }\n context.font = font;\n const { width } = context.measureText(text);\n return width;\n};\n\nexport const extractDepsFromContextVariables = (\n contextVariable: string | null | undefined,\n) => {\n let matches;\n const deps: string[] = [];\n if (!contextVariable) {\n return deps;\n }\n // eslint-disable-next-line no-cond-assign\n while ((matches = REGEX_EXTRACT_DEPS.exec(contextVariable)) !== null) {\n // This is necessary to avoid infinite loops with zero-width matches\n if (matches.index === REGEX_EXTRACT_DEPS.lastIndex) {\n REGEX_EXTRACT_DEPS.lastIndex++;\n }\n if (matches) {\n if (!deps.includes(matches[1])) {\n deps.push(matches[1]);\n }\n }\n }\n return deps;\n};\n\nexport const getSpacerNode = (\n node: PipelineMixedNodeModel,\n): PipelineMixedNodeModel => ({\n ...node,\n height: 1,\n width: 1,\n});\n\nexport const getWhenStatus = (\n status: ComputedStatus,\n): WhenStatus | undefined => {\n switch (status) {\n case ComputedStatus.Succeeded:\n case ComputedStatus.Failed:\n return WhenStatus.Met;\n case ComputedStatus.Skipped:\n case ComputedStatus['In Progress']:\n case ComputedStatus.Idle:\n return WhenStatus.Unmet;\n default:\n return undefined;\n }\n};\n\nexport const getTaskWhenStatus = (\n task: PipelineTaskWithStatus,\n): WhenStatus | undefined => {\n if (!task.when) {\n return undefined;\n }\n return getWhenStatus(task.status?.reason as ComputedStatus);\n};\n\nconst getDepsFromContextVariables = (task: PipelineTask) => {\n const depsFromContextVariables: string[] = [];\n if (task.params) {\n task.params.forEach((p: PipelineTaskParam) => {\n if (Array.isArray(p.value)) {\n p.value.forEach(paramValue => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(paramValue),\n );\n });\n } else {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(p.value),\n );\n }\n });\n }\n if (task?.when) {\n task.when.forEach(({ input, values }) => {\n depsFromContextVariables.push(...extractDepsFromContextVariables(input));\n values.forEach((whenValue: string) => {\n depsFromContextVariables.push(\n ...extractDepsFromContextVariables(whenValue),\n );\n });\n });\n }\n return depsFromContextVariables;\n};\n\nconst getRunAfterTasks = (task: PipelineTask, dag: DAG, vertex: Vertex) => {\n const runAfterTasks: string[] = [];\n const depsFromContextVariables = getDepsFromContextVariables(task);\n\n const dependancies = uniq([...vertex.dependancyNames]);\n if (dependancies) {\n dependancies.forEach(dep => {\n const depObj = dag.vertices.get(dep) as Vertex;\n if (\n depObj.level - vertex.level <= 1 ||\n vertex.data.runAfter?.includes(depObj.name)\n ) {\n runAfterTasks.push(dep);\n }\n });\n }\n if (depsFromContextVariables.length > 0) {\n const v = depsFromContextVariables.map(d => {\n return dag.vertices.get(d) as Vertex;\n });\n const minLevelDep = minBy(v, (d: Vertex) => d.level) as Vertex;\n const nearestDeps = v.filter(v1 => v1.level === minLevelDep.level);\n nearestDeps.forEach(nd => {\n if (nd.level - vertex.level <= 1 || vertex.dependancyNames.length === 0) {\n runAfterTasks.push(nd.name);\n }\n });\n }\n return runAfterTasks;\n};\n\nexport const getGraphDataModel = (\n pipelineRun: PipelineRunKind | undefined,\n taskRuns: TaskRunKind[],\n): {\n graph: GraphModel;\n nodes: PipelineMixedNodeModel[];\n edges: EdgeModel[];\n} | null => {\n if (!pipelineRun) {\n return null;\n }\n\n const plrTaskRuns = getPLRTaskRuns(taskRuns, pipelineRun?.metadata?.name);\n\n const taskList = appendPipelineRunStatus(pipelineRun, plrTaskRuns);\n\n const dag = new DAG();\n taskList?.forEach((task: PipelineTask) => {\n dag.addEdges(task.name, task, '', task.runAfter || []);\n });\n\n const nodes: PipelineMixedNodeModel[] = [];\n const maxWidthForLevel: { [key: string]: number } = {};\n dag.topologicalSort((v: Vertex) => {\n if (!maxWidthForLevel[v.level]) {\n maxWidthForLevel[v.level] = getTextWidth(v.name);\n } else {\n maxWidthForLevel[v.level] = Math.max(\n maxWidthForLevel[v.level],\n getTextWidth(v.name),\n );\n }\n });\n dag.topologicalSort((vertex: Vertex) => {\n const task = vertex.data as PipelineTask;\n const runAfterTasks = getRunAfterTasks(task, dag, vertex);\n const badgePadding =\n Object.keys(pipelineRun.spec)?.length > 0 ? DEFAULT_BADGE_WIDTH : 0;\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === task.name,\n );\n nodes.push(\n createPipelineTaskNode(NodeType.TASK_NODE, {\n id: vertex.name,\n label: vertex.name,\n width:\n maxWidthForLevel[vertex.level] +\n NODE_PADDING * 2 +\n DEFAULT_NODE_ICON_WIDTH +\n badgePadding,\n runAfterTasks,\n status: isTaskSkipped ? RunStatus.Skipped : vertex.data.status?.reason,\n whenStatus: getTaskWhenStatus(vertex.data),\n task: vertex.data,\n pipelineRun,\n }),\n );\n });\n\n const finallyTaskList = appendPipelineRunStatus(\n pipelineRun,\n plrTaskRuns,\n true,\n );\n\n const finallyNodes = finallyTaskList.map(fTask => {\n const isTaskSkipped = pipelineRun?.status?.skippedTasks?.some(\n t => t.name === fTask.name,\n );\n\n return createPipelineTaskNode(NodeType.FINALLY_NODE, {\n id: fTask.name,\n label: fTask.name,\n width:\n getTextWidth(getMaxFinallyNode(finallyTaskList)) +\n NODE_PADDING * 2 +\n DEFAULT_FINALLLY_GROUP_PADDING * 2,\n height: DEFAULT_NODE_HEIGHT,\n runAfterTasks: [],\n status: isTaskSkipped\n ? RunStatus.Skipped\n : (fTask.status?.reason as RunStatus),\n whenStatus: getTaskWhenStatus(fTask),\n task: fTask,\n pipelineRun,\n });\n });\n\n const finallyGroup = finallyNodes.length\n ? [\n {\n id: 'finally-group-id',\n type: NodeType.FINALLY_GROUP,\n children: finallyNodes.map(n => n.id),\n group: true,\n style: { padding: DEFAULT_FINALLLY_GROUP_PADDING },\n },\n ]\n : [];\n const spacerNodes: PipelineMixedNodeModel[] = (\n getSpacerNodes([...nodes, ...finallyNodes], NodeType.SPACER_NODE, [\n NodeType.FINALLY_NODE,\n ]) as PipelineMixedNodeModel[]\n ).map(getSpacerNode);\n\n const edges: PipelineEdgeModel[] = getEdgesFromNodes(\n [...nodes, ...spacerNodes, ...finallyNodes],\n NodeType.SPACER_NODE,\n NodeType.EDGE,\n NodeType.EDGE,\n [NodeType.FINALLY_NODE],\n NodeType.EDGE,\n );\n\n return {\n graph: {\n id: `${pipelineRun?.metadata?.name}-graph`,\n type: ModelKind.graph,\n layout: PipelineLayout.DAGRE_VIEWER,\n scaleExtent: [0.5, 1],\n },\n nodes: [\n ...nodes,\n ...spacerNodes,\n ...finallyNodes,\n ...finallyGroup,\n ] as PipelineMixedNodeModel[],\n edges,\n };\n};\n\nexport const getLayoutData = (\n layout: PipelineLayout,\n): dagre.GraphLabel | null => {\n switch (layout) {\n case PipelineLayout.DAGRE_BUILDER:\n return DAGRE_BUILDER_PROPS;\n case PipelineLayout.DAGRE_VIEWER:\n return DAGRE_VIEWER_PROPS;\n case PipelineLayout.DAGRE_VIEWER_SPACED:\n return DAGRE_VIEWER_SPACED_PROPS;\n case PipelineLayout.DAGRE_BUILDER_SPACED:\n return DAGRE_BUILDER_SPACED_PROPS;\n default:\n return null;\n }\n};\n"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { isEmpty, get, find, cloneDeep, isFinite, each, trim } from 'lodash';
2
- import { ComputedStatus, pipelineRunFilterReducer, SucceedConditionReason, pipelineRunStatus } from '@janus-idp/shared-react';
2
+ import { ComputedStatus, SucceedConditionReason, pipelineRunStatus, pipelineRunFilterReducer } from '@janus-idp/shared-react';
3
3
  import { TEKTON_PIPELINE_RUN, TEKTON_PIPELINE_TASK } from '../consts/tekton-const.esm.js';
4
4
 
5
5
  const s = 1e3;
@@ -1,6 +1,6 @@
1
- import { TaskRunResultsAnnotations, TaskRunResultsKeyValue, TaskRunResultsTypeValue } from '@aonic-ui/pipelines';
1
+ import { TaskRunResultsAnnotations, TaskRunResultsTypeValue, TaskRunResultsKeyValue } from '@aonic-ui/pipelines';
2
2
  import { pipelineRunFilterReducer } from '@janus-idp/shared-react';
3
- import { TEKTON_PIPELINE_TASK, TEKTON_PIPELINE_RUN } from '../consts/tekton-const.esm.js';
3
+ import { TEKTON_PIPELINE_RUN, TEKTON_PIPELINE_TASK } from '../consts/tekton-const.esm.js';
4
4
 
5
5
  const getSortedTaskRuns = (tRuns) => {
6
6
  if (!tRuns || tRuns.length === 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-tekton",
3
- "version": "3.19.0",
3
+ "version": "3.21.0",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "backstage": {
13
13
  "role": "frontend-plugin",
14
- "supported-versions": "1.35.0",
14
+ "supported-versions": "1.36.0",
15
15
  "pluginId": "tekton",
16
16
  "pluginPackage": "@backstage-community/plugin-tekton",
17
17
  "pluginPackages": [
@@ -34,15 +34,15 @@
34
34
  "prepublish": "./fix-style-inject-imports.sh"
35
35
  },
36
36
  "dependencies": {
37
- "@aonic-ui/pipelines": "^3.0.0",
38
- "@backstage-community/plugin-tekton-common": "^1.5.0",
37
+ "@aonic-ui/pipelines": "^3.1.0",
38
+ "@backstage-community/plugin-tekton-common": "^1.7.0",
39
39
  "@backstage/catalog-model": "^1.7.3",
40
40
  "@backstage/core-components": "^0.16.3",
41
41
  "@backstage/core-plugin-api": "^1.10.3",
42
42
  "@backstage/plugin-catalog-react": "^1.15.1",
43
- "@backstage/plugin-kubernetes": "^0.12.3",
44
- "@backstage/plugin-kubernetes-common": "^0.9.2",
45
- "@backstage/plugin-kubernetes-react": "^0.5.3",
43
+ "@backstage/plugin-kubernetes": "^0.12.4",
44
+ "@backstage/plugin-kubernetes-common": "^0.9.3",
45
+ "@backstage/plugin-kubernetes-react": "^0.5.4",
46
46
  "@backstage/plugin-permission-react": "^0.4.30",
47
47
  "@backstage/theme": "^0.6.3",
48
48
  "@janus-idp/shared-react": "^2.16.0",
@@ -50,7 +50,7 @@
50
50
  "@material-ui/core": "^4.9.13",
51
51
  "@material-ui/icons": "^4.11.3",
52
52
  "@material-ui/lab": "^4.0.0-alpha.45",
53
- "@mui/icons-material": "5.15.17",
53
+ "@mui/icons-material": "5.16.14",
54
54
  "@patternfly/patternfly": "^6.0.0",
55
55
  "@patternfly/react-charts": "^7.1.1",
56
56
  "@patternfly/react-core": "^6.0.0",
@@ -79,12 +79,12 @@
79
79
  "@testing-library/react-hooks": "8.0.1",
80
80
  "@testing-library/user-event": "14.5.2",
81
81
  "@types/dagre": "^0.7.52",
82
- "@types/lodash": "4.17.13",
82
+ "@types/lodash": "4.17.15",
83
83
  "@types/node": "18.19.68",
84
84
  "cross-fetch": "4.0.0",
85
85
  "msw": "1.3.5",
86
86
  "prettier": "3.4.2",
87
- "start-server-and-test": "2.0.9"
87
+ "start-server-and-test": "2.0.10"
88
88
  },
89
89
  "files": [
90
90
  "app-config.dynamic.yaml",