@backstage-community/plugin-tekton 3.30.1 → 3.30.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 3.30.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 6c5b40c: Move Status and hooks into plugin
8
+ - 9f1486f: Updated dependency `@testing-library/jest-dom` to `6.9.1`.
9
+
3
10
  ## 3.30.1
4
11
 
5
12
  ### Patch Changes
@@ -1,5 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
- import { pipelineRunFilterReducer, Status } from '@janus-idp/shared-react';
2
+ import { pipelineRunFilterReducer } from '@janus-idp/shared-react';
3
+ import { Status } from '../common/Status.esm.js';
3
4
  import './PlrStatus.css.esm.js';
4
5
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
5
6
  import '../../translations/index.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"PlrStatus.esm.js","sources":["../../../src/components/PipelineRunList/PlrStatus.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n pipelineRunFilterReducer,\n PipelineRunKind,\n Status,\n} from '@janus-idp/shared-react';\n\nimport './PlrStatus.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { tektonTranslationRef } from '../../translations/index.ts';\n\ntype PlrStatusProps = { obj: PipelineRunKind };\n\nconst PlrStatus = ({ obj }: PlrStatusProps) => {\n const plrStatus = pipelineRunFilterReducer(obj);\n const { t } = useTranslationRef(tektonTranslationRef);\n return (\n <Status\n status={plrStatus}\n displayStatusText={t(`pipelineRunStatus.${plrStatus}` as any, {\n defaultValue: plrStatus,\n })}\n className=\"bs-tkn-plrstatus\"\n />\n );\n};\n\nexport default PlrStatus;\n"],"names":[],"mappings":";;;;;;;AA2BA,MAAM,SAAA,GAAY,CAAC,EAAE,GAAA,EAAI,KAAsB;AAC7C,EAAA,MAAM,SAAA,GAAY,yBAAyB,GAAG,CAAA;AAC9C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,oBAAoB,CAAA;AACpD,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,SAAA;AAAA,MACR,iBAAA,EAAmB,CAAA,CAAE,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,EAAW;AAAA,QAC5D,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;;;;"}
1
+ {"version":3,"file":"PlrStatus.esm.js","sources":["../../../src/components/PipelineRunList/PlrStatus.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n pipelineRunFilterReducer,\n PipelineRunKind,\n} from '@janus-idp/shared-react';\n\nimport { Status } from '../common/Status';\n\nimport './PlrStatus.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { tektonTranslationRef } from '../../translations/index.ts';\n\ntype PlrStatusProps = { obj: PipelineRunKind };\n\nconst PlrStatus = ({ obj }: PlrStatusProps) => {\n const plrStatus = pipelineRunFilterReducer(obj);\n const { t } = useTranslationRef(tektonTranslationRef);\n return (\n <Status\n status={plrStatus}\n displayStatusText={t(`pipelineRunStatus.${plrStatus}` as any, {\n defaultValue: plrStatus,\n })}\n className=\"bs-tkn-plrstatus\"\n />\n );\n};\n\nexport default PlrStatus;\n"],"names":[],"mappings":";;;;;;;;AA4BA,MAAM,SAAA,GAAY,CAAC,EAAE,GAAA,EAAI,KAAsB;AAC7C,EAAA,MAAM,SAAA,GAAY,yBAAyB,GAAG,CAAA;AAC9C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,oBAAoB,CAAA;AACpD,EAAA,uBACE,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAA,EAAQ,SAAA;AAAA,MACR,iBAAA,EAAmB,CAAA,CAAE,CAAA,kBAAA,EAAqB,SAAS,CAAA,CAAA,EAAW;AAAA,QAC5D,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,MACD,SAAA,EAAU;AAAA;AAAA,GACZ;AAEJ;;;;"}
@@ -0,0 +1,22 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Fragment } from 'react';
3
+
4
+ const MEMO = {};
5
+ const CamelCaseWrap = ({ value, dataTest }) => {
6
+ if (!value) {
7
+ return "-";
8
+ }
9
+ if (MEMO[value]) {
10
+ return MEMO[value];
11
+ }
12
+ const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);
13
+ const rendered = /* @__PURE__ */ jsx("span", { "data-testid": dataTest, children: words?.map((word, i) => /* @__PURE__ */ jsxs(Fragment, { children: [
14
+ word,
15
+ i !== words.length - 1 && /* @__PURE__ */ jsx("wbr", {})
16
+ ] }, word)) });
17
+ MEMO[value] = rendered;
18
+ return rendered;
19
+ };
20
+
21
+ export { CamelCaseWrap, CamelCaseWrap as default };
22
+ //# sourceMappingURL=CamelCaseWrap.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CamelCaseWrap.esm.js","sources":["../../../src/components/common/CamelCaseWrap.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { Fragment } from 'react';\n\nconst MEMO: { [key: string]: any } = {};\n\ntype CamelCaseWrapProps = {\n value: string;\n dataTest?: string;\n};\n\nexport const CamelCaseWrap = ({ value, dataTest }: CamelCaseWrapProps) => {\n if (!value) {\n return '-';\n }\n\n if (MEMO[value]) {\n return MEMO[value];\n }\n\n // Add word break points before capital letters (but keep consecutive capital letters together).\n const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);\n const rendered = (\n <span data-testid={dataTest}>\n {words?.map((word, i) => (\n <Fragment key={word}>\n {word}\n {i !== words.length - 1 && <wbr />}\n </Fragment>\n ))}\n </span>\n );\n MEMO[value] = rendered;\n return rendered;\n};\n\nexport default CamelCaseWrap;\n"],"names":[],"mappings":";;;AAkBA,MAAM,OAA+B,EAAC;AAO/B,MAAM,aAAA,GAAgB,CAAC,EAAE,KAAA,EAAO,UAAS,KAA0B;AACxE,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,KAAK,CAAA,EAAG;AACf,IAAA,OAAO,KAAK,KAAK,CAAA;AAAA,EACnB;AAGA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,wBAAwB,CAAA;AAClD,EAAA,MAAM,QAAA,mBACJ,GAAA,CAAC,MAAA,EAAA,EAAK,aAAA,EAAa,QAAA,EAChB,QAAA,EAAA,KAAA,EAAO,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBACjB,IAAA,CAAC,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,IACA,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA,wBAAM,KAAA,EAAA,EAAI;AAAA,GAAA,EAAA,EAFnB,IAGf,CACD,CAAA,EACH,CAAA;AAEF,EAAA,IAAA,CAAK,KAAK,CAAA,GAAI,QAAA;AACd,EAAA,OAAO,QAAA;AACT;;;;"}
@@ -0,0 +1,223 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { StatusError, StatusWarning, StatusRunning, StatusPending, StatusOK } from '@backstage/core-components';
3
+ import { makeStyles, createStyles } from '@material-ui/core';
4
+ import OffIcon from '@mui/icons-material/DoNotDisturbOnOutlined';
5
+ import UnknownIcon from '@mui/icons-material/HelpOutline';
6
+ import AngleDoubleRightIcon from '@mui/icons-material/KeyboardDoubleArrowRight';
7
+ import BanIcon from '@mui/icons-material/NotInterestedOutlined';
8
+ import PauseIcon from '@mui/icons-material/PauseCircleOutlineOutlined';
9
+ import classNames from 'classnames';
10
+ import { StatusIconAndText } from './StatusIconAndText.esm.js';
11
+
12
+ const useStyles = makeStyles(
13
+ (theme) => createStyles({
14
+ iconStyles: {
15
+ height: "0.8em",
16
+ width: "0.8em",
17
+ top: "0.125em",
18
+ position: "relative",
19
+ flexShrink: 0,
20
+ marginRight: theme.spacing(0.6)
21
+ }
22
+ })
23
+ );
24
+ const DASH = "-";
25
+ const useStatusStyles = makeStyles((theme) => ({
26
+ success: {
27
+ "& svg": {
28
+ fill: theme.palette.status.ok
29
+ }
30
+ },
31
+ running: {
32
+ "& svg": {
33
+ fill: theme.palette.status.running
34
+ }
35
+ },
36
+ pending: {
37
+ "& svg": {
38
+ fill: theme.palette.status.pending
39
+ }
40
+ },
41
+ warning: {
42
+ "& svg": {
43
+ fill: theme.palette.status.warning
44
+ }
45
+ },
46
+ error: {
47
+ "& svg": {
48
+ fill: theme.palette.status.error
49
+ }
50
+ }
51
+ }));
52
+ const StatusIcon = ({
53
+ statusKey,
54
+ className
55
+ }) => {
56
+ const statusStyles = useStatusStyles();
57
+ switch (statusKey) {
58
+ case "ok":
59
+ return /* @__PURE__ */ jsxs("g", { className: classNames(statusStyles.success, className), children: [
60
+ /* @__PURE__ */ jsx(StatusOK, {}),
61
+ " "
62
+ ] });
63
+ case "pending":
64
+ return /* @__PURE__ */ jsxs("g", { className: classNames(statusStyles.pending, className), children: [
65
+ /* @__PURE__ */ jsx(StatusPending, {}),
66
+ " "
67
+ ] });
68
+ case "running":
69
+ return /* @__PURE__ */ jsxs("g", { className: classNames(statusStyles.running, className), children: [
70
+ /* @__PURE__ */ jsx(StatusRunning, {}),
71
+ " "
72
+ ] });
73
+ case "warning":
74
+ return /* @__PURE__ */ jsxs("g", { className: classNames(statusStyles.warning, className), children: [
75
+ /* @__PURE__ */ jsx(StatusWarning, {}),
76
+ " "
77
+ ] });
78
+ case "error":
79
+ return /* @__PURE__ */ jsxs("g", { className: classNames(statusStyles.error, className), children: [
80
+ /* @__PURE__ */ jsx(StatusError, {}),
81
+ " "
82
+ ] });
83
+ default:
84
+ return null;
85
+ }
86
+ };
87
+ const Status = ({
88
+ status,
89
+ iconOnly,
90
+ className,
91
+ displayStatusText,
92
+ dataTestId,
93
+ iconStyles,
94
+ iconClassName
95
+ }) => {
96
+ const classes = useStyles();
97
+ const statusProps = {
98
+ title: displayStatusText || status || "",
99
+ iconOnly,
100
+ className,
101
+ dataTestId
102
+ };
103
+ switch (status) {
104
+ case "New":
105
+ case "Idle":
106
+ case "Pending":
107
+ case "PipelineNotStarted":
108
+ return /* @__PURE__ */ jsx(
109
+ StatusIconAndText,
110
+ {
111
+ ...statusProps,
112
+ icon: /* @__PURE__ */ jsx(StatusIcon, { statusKey: "pending", className: iconClassName })
113
+ }
114
+ );
115
+ case "In Progress":
116
+ case "Progress":
117
+ case "Progressing":
118
+ case "Installing":
119
+ case "InstallReady":
120
+ case "Replacing":
121
+ case "Running":
122
+ case "Updating":
123
+ case "Upgrading":
124
+ case "PendingInstall":
125
+ return /* @__PURE__ */ jsx(
126
+ StatusIconAndText,
127
+ {
128
+ ...statusProps,
129
+ icon: /* @__PURE__ */ jsx(StatusIcon, { statusKey: "running", className: iconClassName })
130
+ }
131
+ );
132
+ case "Cancelled":
133
+ case "Deleting":
134
+ case "Expired":
135
+ case "Not Ready":
136
+ case "Cancelling":
137
+ case "Terminating":
138
+ case "Superseded":
139
+ case "Uninstalling":
140
+ return /* @__PURE__ */ jsx(
141
+ StatusIconAndText,
142
+ {
143
+ ...statusProps,
144
+ icon: /* @__PURE__ */ jsx(BanIcon, { className: classes.iconStyles, style: iconStyles })
145
+ }
146
+ );
147
+ case "Warning":
148
+ case "RequiresApproval":
149
+ return /* @__PURE__ */ jsx(
150
+ StatusIconAndText,
151
+ {
152
+ ...statusProps,
153
+ icon: /* @__PURE__ */ jsx(StatusIcon, { statusKey: "warning", className: iconClassName })
154
+ }
155
+ );
156
+ case "ImagePullBackOff":
157
+ case "Error":
158
+ case "Failed":
159
+ case "Failure":
160
+ case "CrashLoopBackOff":
161
+ case "ErrImagePull":
162
+ return /* @__PURE__ */ jsx(
163
+ StatusIconAndText,
164
+ {
165
+ ...statusProps,
166
+ icon: /* @__PURE__ */ jsx(StatusIcon, { statusKey: "error", className: iconClassName })
167
+ }
168
+ );
169
+ case "Completed":
170
+ case "Succeeded":
171
+ case "Synced":
172
+ return /* @__PURE__ */ jsx(
173
+ StatusIconAndText,
174
+ {
175
+ ...statusProps,
176
+ icon: /* @__PURE__ */ jsx(StatusIcon, { statusKey: "ok", className: iconClassName })
177
+ }
178
+ );
179
+ case "Skipped":
180
+ return /* @__PURE__ */ jsx(
181
+ StatusIconAndText,
182
+ {
183
+ ...statusProps,
184
+ icon: /* @__PURE__ */ jsx(
185
+ AngleDoubleRightIcon,
186
+ {
187
+ className: classes.iconStyles,
188
+ style: iconStyles
189
+ }
190
+ )
191
+ }
192
+ );
193
+ case "Paused":
194
+ return /* @__PURE__ */ jsx(
195
+ StatusIconAndText,
196
+ {
197
+ ...statusProps,
198
+ icon: /* @__PURE__ */ jsx(PauseIcon, { className: classes.iconStyles, style: iconStyles })
199
+ }
200
+ );
201
+ case "Stopped":
202
+ return /* @__PURE__ */ jsx(
203
+ StatusIconAndText,
204
+ {
205
+ ...statusProps,
206
+ icon: /* @__PURE__ */ jsx(OffIcon, { className: classes.iconStyles, style: iconStyles })
207
+ }
208
+ );
209
+ case "Unknown":
210
+ return /* @__PURE__ */ jsx(
211
+ StatusIconAndText,
212
+ {
213
+ ...statusProps,
214
+ icon: /* @__PURE__ */ jsx(UnknownIcon, { className: classes.iconStyles, style: iconStyles })
215
+ }
216
+ );
217
+ default:
218
+ return /* @__PURE__ */ jsx(Fragment, { children: status || DASH });
219
+ }
220
+ };
221
+
222
+ export { Status };
223
+ //# sourceMappingURL=Status.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Status.esm.js","sources":["../../../src/components/common/Status.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { ReactElement, CSSProperties } from 'react';\nimport {\n StatusClassKey,\n StatusError,\n StatusOK,\n StatusPending,\n StatusRunning,\n StatusWarning,\n} from '@backstage/core-components';\n\nimport { createStyles, makeStyles, Theme } from '@material-ui/core';\nimport OffIcon from '@mui/icons-material/DoNotDisturbOnOutlined';\nimport UnknownIcon from '@mui/icons-material/HelpOutline';\nimport AngleDoubleRightIcon from '@mui/icons-material/KeyboardDoubleArrowRight';\nimport BanIcon from '@mui/icons-material/NotInterestedOutlined';\nimport PauseIcon from '@mui/icons-material/PauseCircleOutlineOutlined';\nimport cx from 'classnames';\n\nimport { StatusIconAndText } from './StatusIconAndText';\n\nconst useStyles = makeStyles<Theme>(theme =>\n createStyles({\n iconStyles: {\n height: '0.8em',\n width: '0.8em',\n top: '0.125em',\n position: 'relative',\n flexShrink: 0,\n marginRight: theme.spacing(0.6),\n },\n }),\n);\n\nconst DASH = '-';\n\nconst useStatusStyles = makeStyles(theme => ({\n success: {\n '& svg': {\n fill: theme.palette.status.ok,\n },\n },\n running: {\n '& svg': {\n fill: theme.palette.status.running,\n },\n },\n pending: {\n '& svg': {\n fill: theme.palette.status.pending,\n },\n },\n warning: {\n '& svg': {\n fill: theme.palette.status.warning,\n },\n },\n error: {\n '& svg': {\n fill: theme.palette.status.error,\n },\n },\n}));\n\nconst StatusIcon = ({\n statusKey,\n className,\n}: {\n statusKey: StatusClassKey;\n className?: string;\n}) => {\n const statusStyles = useStatusStyles();\n\n switch (statusKey) {\n case 'ok':\n return (\n <g className={cx(statusStyles.success, className)}>\n <StatusOK />{' '}\n </g>\n );\n case 'pending':\n return (\n <g className={cx(statusStyles.pending, className)}>\n <StatusPending />{' '}\n </g>\n );\n case 'running':\n return (\n <g className={cx(statusStyles.running, className)}>\n <StatusRunning />{' '}\n </g>\n );\n case 'warning':\n return (\n <g className={cx(statusStyles.warning, className)}>\n <StatusWarning />{' '}\n </g>\n );\n case 'error':\n return (\n <g className={cx(statusStyles.error, className)}>\n <StatusError />{' '}\n </g>\n );\n default:\n return null;\n }\n};\n\n/**\n * Component for displaying a status message\n * @param {string} status - type of status to be displayed\n * @param {boolean} [iconOnly] - (optional) if true, only displays icon\n * @param {string} [className] - (optional) additional class name for the component\n * @param {string} [displayStatusText] - (optional) use a different text to display the status\n\n * @example\n * ```tsx\n * <Status status='Warning' />\n * ```\n */\nexport const Status = ({\n status,\n iconOnly,\n className,\n displayStatusText,\n dataTestId,\n iconStyles,\n iconClassName,\n}: {\n status: string | null;\n displayStatusText?: string;\n iconOnly?: boolean;\n className?: string;\n dataTestId?: string;\n iconStyles?: CSSProperties;\n iconClassName?: string;\n}): ReactElement => {\n const classes = useStyles();\n const statusProps = {\n title: displayStatusText || status || '',\n iconOnly,\n className,\n dataTestId,\n };\n\n switch (status) {\n case 'New':\n case 'Idle':\n case 'Pending':\n case 'PipelineNotStarted':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<StatusIcon statusKey=\"pending\" className={iconClassName} />}\n />\n );\n\n case 'In Progress':\n case 'Progress':\n case 'Progressing':\n case 'Installing':\n case 'InstallReady':\n case 'Replacing':\n case 'Running':\n case 'Updating':\n case 'Upgrading':\n case 'PendingInstall':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<StatusIcon statusKey=\"running\" className={iconClassName} />}\n />\n );\n\n case 'Cancelled':\n case 'Deleting':\n case 'Expired':\n case 'Not Ready':\n case 'Cancelling':\n case 'Terminating':\n case 'Superseded':\n case 'Uninstalling':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<BanIcon className={classes.iconStyles} style={iconStyles} />}\n />\n );\n\n case 'Warning':\n case 'RequiresApproval':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<StatusIcon statusKey=\"warning\" className={iconClassName} />}\n />\n );\n\n case 'ImagePullBackOff':\n case 'Error':\n case 'Failed':\n case 'Failure':\n case 'CrashLoopBackOff':\n case 'ErrImagePull':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<StatusIcon statusKey=\"error\" className={iconClassName} />}\n />\n );\n\n case 'Completed':\n case 'Succeeded':\n case 'Synced':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<StatusIcon statusKey=\"ok\" className={iconClassName} />}\n />\n );\n\n case 'Skipped':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={\n <AngleDoubleRightIcon\n className={classes.iconStyles}\n style={iconStyles}\n />\n }\n />\n );\n case 'Paused':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<PauseIcon className={classes.iconStyles} style={iconStyles} />}\n />\n );\n case 'Stopped':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={<OffIcon className={classes.iconStyles} style={iconStyles} />}\n />\n );\n\n case 'Unknown':\n return (\n <StatusIconAndText\n {...statusProps}\n icon={\n <UnknownIcon className={classes.iconStyles} style={iconStyles} />\n }\n />\n );\n\n default:\n return <>{status || DASH}</>;\n }\n};\n"],"names":["cx"],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { cloneElement } from 'react';
3
+ import { makeStyles } from '@material-ui/core/styles';
4
+ import { Typography } from '@material-ui/core';
5
+ import classNames from 'classnames';
6
+ import { CamelCaseWrap } from './CamelCaseWrap.esm.js';
7
+
8
+ const DASH = "-";
9
+ const useStyles = makeStyles({
10
+ iconAndText: {
11
+ display: "flex",
12
+ fontWeight: 400,
13
+ fontSize: "14px"
14
+ },
15
+ flexChild: {
16
+ flex: " 0 0 auto",
17
+ position: "relative",
18
+ top: "0.125em"
19
+ }
20
+ });
21
+ const StatusIconAndText = ({
22
+ icon,
23
+ title,
24
+ spin,
25
+ iconOnly,
26
+ className,
27
+ dataTestId
28
+ }) => {
29
+ const styles = useStyles();
30
+ if (!title) {
31
+ return /* @__PURE__ */ jsx(Fragment, { children: DASH });
32
+ }
33
+ if (iconOnly) {
34
+ return /* @__PURE__ */ jsx(Fragment, { children: cloneElement(icon, {
35
+ "data-testid": dataTestId ?? `icon-only-${title}`,
36
+ className: icon.props.className
37
+ }) });
38
+ }
39
+ return /* @__PURE__ */ jsxs(
40
+ Typography,
41
+ {
42
+ className: classNames(styles.iconAndText, className),
43
+ "data-testid": dataTestId ?? `icon-with-title-${title}`,
44
+ title,
45
+ children: [
46
+ cloneElement(icon, {
47
+ className: classNames(
48
+ spin && "fa-spin",
49
+ icon.props.className,
50
+ styles.flexChild
51
+ )
52
+ }),
53
+ /* @__PURE__ */ jsx(CamelCaseWrap, { value: title, dataTest: "status-text" })
54
+ ]
55
+ }
56
+ );
57
+ };
58
+
59
+ export { StatusIconAndText, StatusIconAndText as default };
60
+ //# sourceMappingURL=StatusIconAndText.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusIconAndText.esm.js","sources":["../../../src/components/common/StatusIconAndText.tsx"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { ReactElement, cloneElement } from 'react';\n\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Typography } from '@material-ui/core';\nimport classNames from 'classnames';\n\nimport CamelCaseWrap from './CamelCaseWrap';\n\nconst DASH = '-';\n\nconst useStyles = makeStyles({\n iconAndText: {\n display: 'flex',\n fontWeight: 400,\n fontSize: '14px',\n },\n\n flexChild: {\n flex: ' 0 0 auto',\n position: 'relative',\n top: '0.125em',\n },\n});\n\nexport const StatusIconAndText = ({\n icon,\n title,\n spin,\n iconOnly,\n className,\n dataTestId,\n}: {\n title: string;\n iconOnly?: boolean;\n className?: string;\n icon: ReactElement;\n spin?: boolean;\n dataTestId?: string;\n}): ReactElement => {\n const styles = useStyles();\n if (!title) {\n return <>{DASH}</>;\n }\n\n if (iconOnly) {\n return (\n <>\n {cloneElement(icon, {\n 'data-testid': dataTestId ?? `icon-only-${title}`,\n className: icon.props.className,\n })}\n </>\n );\n }\n\n return (\n <Typography\n className={classNames(styles.iconAndText, className)}\n data-testid={dataTestId ?? `icon-with-title-${title}`}\n title={title}\n >\n {cloneElement(icon, {\n className: classNames(\n spin && 'fa-spin',\n icon.props.className,\n styles.flexChild,\n ),\n })}\n <CamelCaseWrap value={title} dataTest=\"status-text\" />\n </Typography>\n );\n};\n\nexport default StatusIconAndText;\n"],"names":[],"mappings":";;;;;;;AAwBA,MAAM,IAAA,GAAO,GAAA;AAEb,MAAM,YAAY,UAAA,CAAW;AAAA,EAC3B,WAAA,EAAa;AAAA,IACX,OAAA,EAAS,MAAA;AAAA,IACT,UAAA,EAAY,GAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,GAAA,EAAK;AAAA;AAET,CAAC,CAAA;AAEM,MAAM,oBAAoB,CAAC;AAAA,EAChC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAOoB;AAClB,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,uCAAU,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACG,uBAAa,IAAA,EAAM;AAAA,MAClB,aAAA,EAAe,UAAA,IAAc,CAAA,UAAA,EAAa,KAAK,CAAA,CAAA;AAAA,MAC/C,SAAA,EAAW,KAAK,KAAA,CAAM;AAAA,KACvB,CAAA,EACH,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,SAAS,CAAA;AAAA,MACnD,aAAA,EAAa,UAAA,IAAc,CAAA,gBAAA,EAAmB,KAAK,CAAA,CAAA;AAAA,MACnD,KAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,IAAA,EAAM;AAAA,UAClB,SAAA,EAAW,UAAA;AAAA,YACT,IAAA,IAAQ,SAAA;AAAA,YACR,KAAK,KAAA,CAAM,SAAA;AAAA,YACX,MAAA,CAAO;AAAA;AACT,SACD,CAAA;AAAA,wBACD,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,KAAA,EAAO,UAAS,aAAA,EAAc;AAAA;AAAA;AAAA,GACtD;AAEJ;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import classNames from 'classnames';
3
- import { Status } from '@janus-idp/shared-react';
3
+ import { Status } from '../common/Status.esm.js';
4
4
  import './PipelineVisualizationStepList.css.esm.js';
5
5
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
6
  import '../../translations/index.esm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"PipelineVisualizationStepList.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualizationStepList.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 { RunStatus } from '@patternfly/react-topology';\nimport classNames from 'classnames';\n\nimport { Status } from '@janus-idp/shared-react';\n\nimport { StepStatus } from '../../types/taskRun';\n\nimport './PipelineVisualizationStepList.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { tektonTranslationRef } from '../../translations/index.ts';\n\nexport type PipelineVisualizationStepListProps = {\n isSpecOverview: boolean;\n taskName: string;\n steps: StepStatus[];\n isFinallyTask?: boolean;\n hideHeader?: boolean;\n};\n\ntype TooltipColoredStatusIconProps = {\n status: RunStatus;\n};\n\nconst TooltipColoredStatusIcon = ({\n status,\n}: TooltipColoredStatusIconProps) => {\n const icon = <Status status={status} iconOnly />;\n return icon;\n};\n\nexport const PipelineVisualizationStepList = ({\n isSpecOverview,\n taskName,\n steps,\n isFinallyTask,\n hideHeader,\n}: PipelineVisualizationStepListProps) => {\n const { t } = useTranslationRef(tektonTranslationRef);\n return (\n <div className=\"bs-tkn-pipeline-visualization-step-list\">\n {!hideHeader && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__task-name\">\n {taskName}\n </div>\n )}\n {isFinallyTask && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__task-type\">\n {t('pipelineVisualization.stepList.finallyTaskTitle')}\n </div>\n )}\n {steps?.map(({ duration, name, status }) => {\n return (\n <div\n className={classNames(\n 'bs-tkn-pipeline-visualization-step-list__step',\n {\n 'bs-tkn-pipeline-visualization-step-list__step--task-run':\n !isSpecOverview,\n },\n )}\n key={name}\n >\n {!isSpecOverview ? (\n <div className=\"bs-tkn-pipeline-visualization-step-list__icon\">\n <TooltipColoredStatusIcon status={status} />\n </div>\n ) : (\n <span className=\"bs-tkn-pipeline-visualization-step-list__bullet\">\n &bull;\n </span>\n )}\n <div className=\"bs-tkn-pipeline-visualization-step-list__name\">\n {name}\n </div>\n {!isSpecOverview && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__duration\">\n {duration}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAsCA,MAAM,2BAA2B,CAAC;AAAA,EAChC;AACF,CAAA,KAAqC;AACnC,EAAA,MAAM,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,MAAA,EAAgB,UAAQ,IAAA,EAAC,CAAA;AAC9C,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,MAAM,gCAAgC,CAAC;AAAA,EAC5C,cAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA0C;AACxC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,oBAAoB,CAAA;AACpD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,CAAC,UAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACZ,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,IAED,iCACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EACZ,QAAA,EAAA,CAAA,CAAE,iDAAiD,CAAA,EACtD,CAAA;AAAA,IAED,OAAO,GAAA,CAAI,CAAC,EAAE,QAAA,EAAU,IAAA,EAAM,QAAO,KAAM;AAC1C,MAAA,uBACE,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,YACT,+CAAA;AAAA,YACA;AAAA,cACE,2DACE,CAAC;AAAA;AACL,WACF;AAAA,UAGC,QAAA,EAAA;AAAA,YAAA,CAAC,cAAA,mBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EAAyB,MAAA,EAAgB,CAAA,EAC5C,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAkD,QAAA,EAAA,QAAA,EAElE,CAAA;AAAA,4BAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,YACC,CAAC,cAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACZ,QAAA,EAAA,QAAA,EACH;AAAA;AAAA,SAAA;AAAA,QAjBG;AAAA,OAmBP;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PipelineVisualizationStepList.esm.js","sources":["../../../src/components/pipeline-topology/PipelineVisualizationStepList.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 { RunStatus } from '@patternfly/react-topology';\nimport classNames from 'classnames';\n\nimport { Status } from '../common/Status';\nimport { StepStatus } from '../../types/taskRun';\n\nimport './PipelineVisualizationStepList.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { tektonTranslationRef } from '../../translations/index.ts';\n\nexport type PipelineVisualizationStepListProps = {\n isSpecOverview: boolean;\n taskName: string;\n steps: StepStatus[];\n isFinallyTask?: boolean;\n hideHeader?: boolean;\n};\n\ntype TooltipColoredStatusIconProps = {\n status: RunStatus;\n};\n\nconst TooltipColoredStatusIcon = ({\n status,\n}: TooltipColoredStatusIconProps) => {\n const icon = <Status status={status} iconOnly />;\n return icon;\n};\n\nexport const PipelineVisualizationStepList = ({\n isSpecOverview,\n taskName,\n steps,\n isFinallyTask,\n hideHeader,\n}: PipelineVisualizationStepListProps) => {\n const { t } = useTranslationRef(tektonTranslationRef);\n return (\n <div className=\"bs-tkn-pipeline-visualization-step-list\">\n {!hideHeader && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__task-name\">\n {taskName}\n </div>\n )}\n {isFinallyTask && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__task-type\">\n {t('pipelineVisualization.stepList.finallyTaskTitle')}\n </div>\n )}\n {steps?.map(({ duration, name, status }) => {\n return (\n <div\n className={classNames(\n 'bs-tkn-pipeline-visualization-step-list__step',\n {\n 'bs-tkn-pipeline-visualization-step-list__step--task-run':\n !isSpecOverview,\n },\n )}\n key={name}\n >\n {!isSpecOverview ? (\n <div className=\"bs-tkn-pipeline-visualization-step-list__icon\">\n <TooltipColoredStatusIcon status={status} />\n </div>\n ) : (\n <span className=\"bs-tkn-pipeline-visualization-step-list__bullet\">\n &bull;\n </span>\n )}\n <div className=\"bs-tkn-pipeline-visualization-step-list__name\">\n {name}\n </div>\n {!isSpecOverview && (\n <div className=\"bs-tkn-pipeline-visualization-step-list__duration\">\n {duration}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAqCA,MAAM,2BAA2B,CAAC;AAAA,EAChC;AACF,CAAA,KAAqC;AACnC,EAAA,MAAM,IAAA,mBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,MAAA,EAAgB,UAAQ,IAAA,EAAC,CAAA;AAC9C,EAAA,OAAO,IAAA;AACT,CAAA;AAEO,MAAM,gCAAgC,CAAC;AAAA,EAC5C,cAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA0C;AACxC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,oBAAoB,CAAA;AACpD,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yCAAA,EACZ,QAAA,EAAA;AAAA,IAAA,CAAC,UAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sDACZ,QAAA,EAAA,QAAA,EACH,CAAA;AAAA,IAED,iCACC,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,oDAAA,EACZ,QAAA,EAAA,CAAA,CAAE,iDAAiD,CAAA,EACtD,CAAA;AAAA,IAED,OAAO,GAAA,CAAI,CAAC,EAAE,QAAA,EAAU,IAAA,EAAM,QAAO,KAAM;AAC1C,MAAA,uBACE,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,UAAA;AAAA,YACT,+CAAA;AAAA,YACA;AAAA,cACE,2DACE,CAAC;AAAA;AACL,WACF;AAAA,UAGC,QAAA,EAAA;AAAA,YAAA,CAAC,cAAA,mBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iDACb,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EAAyB,MAAA,EAAgB,CAAA,EAC5C,CAAA,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mDAAkD,QAAA,EAAA,QAAA,EAElE,CAAA;AAAA,4BAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,YACC,CAAC,cAAA,oBACA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qDACZ,QAAA,EAAA,QAAA,EACH;AAAA;AAAA,SAAA;AAAA,QAjBG;AAAA,OAmBP;AAAA,IAEJ,CAAC;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useState, useEffect, useMemo } from 'react';
2
- import { useDeepCompareMemoize } from '@janus-idp/shared-react';
2
+ import { useDeepCompareMemoize } from './useDeepCompareMemoize.esm.js';
3
3
  import { getTektonResources } from '../utils/tekton-utils.esm.js';
4
4
 
5
5
  const useAllWatchResources = (k8sObjectsResponse, cluster, watchedResource = []) => {
@@ -1 +1 @@
1
- {"version":3,"file":"useAllWatchResources.esm.js","sources":["../../src/hooks/useAllWatchResources.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, useMemo, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from '@janus-idp/shared-react';\n\nimport { TektonResponseData } from '../types/types';\nimport { getTektonResources } from '../utils/tekton-utils';\n\nexport const useAllWatchResources = (\n k8sObjectsResponse: KubernetesObjects,\n cluster: number,\n watchedResource: string[] = [],\n): TektonResponseData => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [resources, setResources] = useState<TektonResponseData>({});\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const tektonResources: TektonResponseData = getTektonResources(\n cluster,\n kubernetesObjects,\n );\n if (tektonResources) {\n setResources(tektonResources);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error, cluster]);\n\n const watchResourcesData = useMemo(() => {\n return watchedResource.reduce((acc: TektonResponseData, resKind) => {\n if (resources[resKind]) {\n acc[resKind] = resources[resKind];\n }\n return acc;\n }, {});\n }, [watchedResource, resources]);\n\n return useDeepCompareMemoize(watchResourcesData);\n};\n"],"names":[],"mappings":";;;;AAwBO,MAAM,uBAAuB,CAClC,kBAAA,EACA,OAAA,EACA,eAAA,GAA4B,EAAC,KACN;AACvB,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAA;AAC9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA,CAA6B,EAAE,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,IAAW,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACxD,MAAA,MAAM,eAAA,GAAsC,kBAAA;AAAA,QAC1C,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,YAAA,CAAa,eAAe,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,iBAAA,EAAmB,KAAA,EAAO,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAyB,OAAA,KAAY;AAClE,MAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,SAAA,CAAU,OAAO,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,CAAC,eAAA,EAAiB,SAAS,CAAC,CAAA;AAE/B,EAAA,OAAO,sBAAsB,kBAAkB,CAAA;AACjD;;;;"}
1
+ {"version":3,"file":"useAllWatchResources.esm.js","sources":["../../src/hooks/useAllWatchResources.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, useMemo, useState } from 'react';\n\nimport { KubernetesObjects } from '@backstage/plugin-kubernetes-react';\n\nimport { useDeepCompareMemoize } from './useDeepCompareMemoize';\nimport { TektonResponseData } from '../types/types';\nimport { getTektonResources } from '../utils/tekton-utils';\n\nexport const useAllWatchResources = (\n k8sObjectsResponse: KubernetesObjects,\n cluster: number,\n watchedResource: string[] = [],\n): TektonResponseData => {\n const { kubernetesObjects, loading, error } = k8sObjectsResponse;\n const [resources, setResources] = useState<TektonResponseData>({});\n\n useEffect(() => {\n let isMounted = true;\n if (isMounted && !loading && kubernetesObjects && !error) {\n const tektonResources: TektonResponseData = getTektonResources(\n cluster,\n kubernetesObjects,\n );\n if (tektonResources) {\n setResources(tektonResources);\n }\n }\n return () => {\n isMounted = false;\n };\n }, [loading, kubernetesObjects, error, cluster]);\n\n const watchResourcesData = useMemo(() => {\n return watchedResource.reduce((acc: TektonResponseData, resKind) => {\n if (resources[resKind]) {\n acc[resKind] = resources[resKind];\n }\n return acc;\n }, {});\n }, [watchedResource, resources]);\n\n return useDeepCompareMemoize(watchResourcesData);\n};\n"],"names":[],"mappings":";;;;AAuBO,MAAM,uBAAuB,CAClC,kBAAA,EACA,OAAA,EACA,eAAA,GAA4B,EAAC,KACN;AACvB,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAA;AAC9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,QAAA,CAA6B,EAAE,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,IAAW,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACxD,MAAA,MAAM,eAAA,GAAsC,kBAAA;AAAA,QAC1C,OAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,YAAA,CAAa,eAAe,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,CAAA;AAAA,EACF,GAAG,CAAC,OAAA,EAAS,iBAAA,EAAmB,KAAA,EAAO,OAAO,CAAC,CAAA;AAE/C,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,OAAO,eAAA,CAAgB,MAAA,CAAO,CAAC,GAAA,EAAyB,OAAA,KAAY;AAClE,MAAA,IAAI,SAAA,CAAU,OAAO,CAAA,EAAG;AACtB,QAAA,GAAA,CAAI,OAAO,CAAA,GAAI,SAAA,CAAU,OAAO,CAAA;AAAA,MAClC;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,EAAG,EAAE,CAAA;AAAA,EACP,CAAA,EAAG,CAAC,eAAA,EAAiB,SAAS,CAAC,CAAA;AAE/B,EAAA,OAAO,sBAAsB,kBAAkB,CAAA;AACjD;;;;"}
@@ -0,0 +1,22 @@
1
+ import { useRef, useMemo } from 'react';
2
+ import { debounce } from 'lodash';
3
+ import { useDeepCompareMemoize } from './useDeepCompareMemoize.esm.js';
4
+
5
+ const useDebounceCallback = (callback, timeout = 500, debounceParams = {
6
+ leading: false,
7
+ trailing: true
8
+ }) => {
9
+ const memDebounceParams = useDeepCompareMemoize(debounceParams);
10
+ const callbackRef = useRef();
11
+ callbackRef.current = callback;
12
+ return useMemo(() => {
13
+ return debounce(
14
+ (...args) => callbackRef.current?.(...args),
15
+ timeout,
16
+ memDebounceParams
17
+ );
18
+ }, [memDebounceParams, timeout]);
19
+ };
20
+
21
+ export { useDebounceCallback };
22
+ //# sourceMappingURL=useDebounceCallback.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDebounceCallback.esm.js","sources":["../../src/hooks/useDebounceCallback.ts"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { useRef, useMemo } from 'react';\n\nimport { debounce } from 'lodash';\n\nimport { useDeepCompareMemoize } from './useDeepCompareMemoize';\n\ninterface Cancelable {\n cancel(): void;\n flush(): void;\n}\n\nexport const useDebounceCallback = <T extends (...args: any[]) => any>(\n callback: T,\n timeout: number = 500,\n debounceParams: {\n leading?: boolean;\n trailing?: boolean;\n maxWait?: number;\n } = {\n leading: false,\n trailing: true,\n },\n): ((...args: any) => any) & Cancelable => {\n const memDebounceParams = useDeepCompareMemoize(debounceParams);\n const callbackRef = useRef<T>();\n callbackRef.current = callback;\n\n return useMemo(() => {\n return debounce(\n (...args) => callbackRef.current?.(...args),\n timeout,\n memDebounceParams,\n );\n }, [memDebounceParams, timeout]);\n};\n"],"names":[],"mappings":";;;;AA2BO,MAAM,mBAAA,GAAsB,CACjC,QAAA,EACA,OAAA,GAAkB,KAClB,cAAA,GAII;AAAA,EACF,OAAA,EAAS,KAAA;AAAA,EACT,QAAA,EAAU;AACZ,CAAA,KACyC;AACzC,EAAA,MAAM,iBAAA,GAAoB,sBAAsB,cAAc,CAAA;AAC9D,EAAA,MAAM,cAAc,MAAA,EAAU;AAC9B,EAAA,WAAA,CAAY,OAAA,GAAU,QAAA;AAEtB,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAA,OAAO,QAAA;AAAA,MACL,CAAA,GAAI,IAAA,KAAS,WAAA,CAAY,OAAA,GAAU,GAAG,IAAI,CAAA;AAAA,MAC1C,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,iBAAA,EAAmB,OAAO,CAAC,CAAA;AACjC;;;;"}
@@ -0,0 +1,13 @@
1
+ import { useRef } from 'react';
2
+ import { isEqual } from 'lodash';
3
+
4
+ const useDeepCompareMemoize = (value, stringify) => {
5
+ const ref = useRef();
6
+ if (!isEqual(value, ref.current)) {
7
+ ref.current = value;
8
+ }
9
+ return ref.current;
10
+ };
11
+
12
+ export { useDeepCompareMemoize };
13
+ //# sourceMappingURL=useDeepCompareMemoize.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDeepCompareMemoize.esm.js","sources":["../../src/hooks/useDeepCompareMemoize.ts"],"sourcesContent":["/*\n * Copyright 2025 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 */\n\nimport { useRef } from 'react';\n\nimport { isEqual } from 'lodash';\n\nexport const useDeepCompareMemoize = <T = any>(\n value: T,\n stringify?: boolean,\n): T => {\n const ref = useRef<T>();\n\n if (\n stringify\n ? JSON.stringify(value) !== JSON.stringify(ref.current)\n : !isEqual(value, ref.current)\n ) {\n ref.current = value;\n }\n\n return ref.current as T;\n};\n"],"names":[],"mappings":";;;AAoBO,MAAM,qBAAA,GAAwB,CACnC,KAAA,EACA,SAAA,KACM;AACN,EAAA,MAAM,MAAM,MAAA,EAAU;AAEtB,EAAA,IAGM,CAAC,OAAA,CAAQ,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAC/B;AACA,IAAA,GAAA,CAAI,OAAA,GAAU,KAAA;AAAA,EAChB;AAEA,EAAA,OAAO,GAAA,CAAI,OAAA;AACb;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useState, useEffect } from 'react';
2
- import { useDeepCompareMemoize } from '@janus-idp/shared-react';
2
+ import { useDeepCompareMemoize } from './useDeepCompareMemoize.esm.js';
3
3
  import { getClusters } from '../utils/tekton-utils.esm.js';
4
4
 
5
5
  const useResourcesClusters = (k8sObjectsResponse) => {
@@ -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":";;;;AAwBO,MAAM,oBAAA,GAAuB,CAAC,kBAAA,KAA0C;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAG7B,EAAE,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,IAAW,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACxD,MAAA,MAAM,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,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 './useDeepCompareMemoize';\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":";;;;AAuBO,MAAM,oBAAA,GAAuB,CAAC,kBAAA,KAA0C;AAC7E,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAA;AAC9C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,CAG7B,EAAE,QAAA,EAAU,EAAC,EAAG,MAAA,EAAQ,EAAC,EAAG,CAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,IAAA;AAChB,IAAA,IAAI,SAAA,IAAa,CAAC,OAAA,IAAW,iBAAA,IAAqB,CAAC,KAAA,EAAO;AACxD,MAAA,MAAM,oBAAA,GAAuB,YAAY,iBAAiB,CAAA;AAC1D,MAAA,IAAI,oBAAA,EAAsB;AACxB,QAAA,WAAA,CAAY,oBAAoB,CAAA;AAAA,MAClC;AAAA,IACF;AACA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,KAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,iBAAA,EAAmB,KAAK,CAAC,CAAA;AAEtC,EAAA,OAAO,sBAAsB,QAAQ,CAAA;AACvC;;;;"}
@@ -1,10 +1,11 @@
1
1
  import { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import { useEntity } from '@backstage/plugin-catalog-react';
3
3
  import { isEqual } from 'lodash';
4
- import { useDebounceCallback, useDeepCompareMemoize } from '@janus-idp/shared-react';
5
4
  import { useKubernetesObjects } from '@backstage/plugin-kubernetes-react';
6
5
  import { useAllWatchResources } from './useAllWatchResources.esm.js';
7
6
  import { useResourcesClusters } from './useResourcesClusters.esm.js';
7
+ import { useDebounceCallback } from './useDebounceCallback.esm.js';
8
+ import { useDeepCompareMemoize } from './useDeepCompareMemoize.esm.js';
8
9
 
9
10
  const useTektonObjectsResponse = (watchedResource) => {
10
11
  const { entity } = useEntity();
@@ -1 +1 @@
1
- {"version":3,"file":"useTektonObjectsResponse.esm.js","sources":["../../src/hooks/useTektonObjectsResponse.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 { useState, useRef, useEffect, useCallback } from 'react';\n\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport { isEqual } from 'lodash';\n\nimport {\n ComputedStatus,\n useDebounceCallback,\n useDeepCompareMemoize,\n} from '@janus-idp/shared-react';\n\nimport { useKubernetesObjects } from '@backstage/plugin-kubernetes-react';\nimport { TektonResourcesContextData, TektonResponseData } from '../types/types';\nimport { useAllWatchResources } from './useAllWatchResources';\nimport { useResourcesClusters } from './useResourcesClusters';\n\nexport const useTektonObjectsResponse = (\n watchedResource: string[],\n): TektonResourcesContextData => {\n const { entity } = useEntity();\n const { kubernetesObjects, loading, error } = useKubernetesObjects(entity);\n const [selectedCluster, setSelectedCluster] = useState<number>(0);\n const [selectedStatus, setSelectedStatus] = useState<ComputedStatus>(\n 'All' as ComputedStatus,\n );\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const [loaded, setLoaded] = useState<boolean>(false);\n const [errorState, setErrorState] = useState<string>();\n const [pipelinesData, setPipelinesData] = useState<\n TektonResponseData | undefined\n >();\n\n const mounted = useRef(false);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const watchResourcesData = useAllWatchResources(\n { kubernetesObjects, loading, error },\n selectedCluster,\n watchedResource,\n );\n\n const resourcesClusters = useResourcesClusters({\n kubernetesObjects,\n loading,\n error,\n });\n\n const updateResults = useCallback(\n (\n resData: TektonResponseData,\n isLoading: boolean,\n errorData: string | undefined,\n ) => {\n if (!isLoading && !errorData && mounted.current) {\n setLoaded(true);\n setPipelinesData(prevPipelinesData => {\n if (isEqual(prevPipelinesData, resData)) {\n return prevPipelinesData;\n }\n return resData;\n });\n } else if (errorData && mounted.current) {\n setLoaded(true);\n setErrorState(errorData);\n }\n },\n [setLoaded, setPipelinesData, setErrorState],\n );\n\n const debouncedUpdateResources = useDebounceCallback(updateResults, 250);\n\n useEffect(() => {\n debouncedUpdateResources?.(watchResourcesData, loading, error);\n }, [debouncedUpdateResources, watchResourcesData, loading, error]);\n\n return useDeepCompareMemoize({\n watchResourcesData: pipelinesData,\n loaded,\n responseError: errorState,\n selectedClusterErrors: resourcesClusters?.errors?.[selectedCluster] ?? [],\n clusters: resourcesClusters?.clusters || [],\n selectedCluster,\n setSelectedCluster,\n selectedStatus,\n setSelectedStatus,\n isExpanded,\n setIsExpanded,\n });\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTektonObjectsResponse.esm.js","sources":["../../src/hooks/useTektonObjectsResponse.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 { useState, useRef, useEffect, useCallback } from 'react';\n\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport { isEqual } from 'lodash';\n\nimport { ComputedStatus } from '@janus-idp/shared-react';\n\nimport { useKubernetesObjects } from '@backstage/plugin-kubernetes-react';\nimport { TektonResourcesContextData, TektonResponseData } from '../types/types';\nimport { useAllWatchResources } from './useAllWatchResources';\nimport { useResourcesClusters } from './useResourcesClusters';\nimport { useDebounceCallback } from './useDebounceCallback';\nimport { useDeepCompareMemoize } from './useDeepCompareMemoize';\n\nexport const useTektonObjectsResponse = (\n watchedResource: string[],\n): TektonResourcesContextData => {\n const { entity } = useEntity();\n const { kubernetesObjects, loading, error } = useKubernetesObjects(entity);\n const [selectedCluster, setSelectedCluster] = useState<number>(0);\n const [selectedStatus, setSelectedStatus] = useState<ComputedStatus>(\n 'All' as ComputedStatus,\n );\n const [isExpanded, setIsExpanded] = useState<boolean>(false);\n const [loaded, setLoaded] = useState<boolean>(false);\n const [errorState, setErrorState] = useState<string>();\n const [pipelinesData, setPipelinesData] = useState<\n TektonResponseData | undefined\n >();\n\n const mounted = useRef(false);\n\n useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n };\n }, []);\n\n const watchResourcesData = useAllWatchResources(\n { kubernetesObjects, loading, error },\n selectedCluster,\n watchedResource,\n );\n\n const resourcesClusters = useResourcesClusters({\n kubernetesObjects,\n loading,\n error,\n });\n\n const updateResults = useCallback(\n (\n resData: TektonResponseData,\n isLoading: boolean,\n errorData: string | undefined,\n ) => {\n if (!isLoading && !errorData && mounted.current) {\n setLoaded(true);\n setPipelinesData(prevPipelinesData => {\n if (isEqual(prevPipelinesData, resData)) {\n return prevPipelinesData;\n }\n return resData;\n });\n } else if (errorData && mounted.current) {\n setLoaded(true);\n setErrorState(errorData);\n }\n },\n [setLoaded, setPipelinesData, setErrorState],\n );\n\n const debouncedUpdateResources = useDebounceCallback(updateResults, 250);\n\n useEffect(() => {\n debouncedUpdateResources?.(watchResourcesData, loading, error);\n }, [debouncedUpdateResources, watchResourcesData, loading, error]);\n\n return useDeepCompareMemoize({\n watchResourcesData: pipelinesData,\n loaded,\n responseError: errorState,\n selectedClusterErrors: resourcesClusters?.errors?.[selectedCluster] ?? [],\n clusters: resourcesClusters?.clusters || [],\n selectedCluster,\n setSelectedCluster,\n selectedStatus,\n setSelectedStatus,\n isExpanded,\n setIsExpanded,\n });\n};\n"],"names":[],"mappings":";;;;;;;;;AA8BO,MAAM,wBAAA,GAA2B,CACtC,eAAA,KAC+B;AAC/B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM,GAAI,qBAAqB,MAAM,CAAA;AACzE,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAiB,CAAC,CAAA;AAChE,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,QAAA;AAAA,IAC1C;AAAA,GACF;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC3D,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAkB,KAAK,CAAA;AACnD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA,EAAiB;AACrD,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,EAExC;AAEF,EAAA,MAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAClB,IAAA,OAAO,MAAM;AACX,MAAA,OAAA,CAAQ,OAAA,GAAU,KAAA;AAAA,IACpB,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,kBAAA,GAAqB,oBAAA;AAAA,IACzB,EAAE,iBAAA,EAAmB,OAAA,EAAS,KAAA,EAAM;AAAA,IACpC,eAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,oBAAoB,oBAAA,CAAqB;AAAA,IAC7C,iBAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IACpB,CACE,OAAA,EACA,SAAA,EACA,SAAA,KACG;AACH,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,IAAa,QAAQ,OAAA,EAAS;AAC/C,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,gBAAA,CAAiB,CAAA,iBAAA,KAAqB;AACpC,UAAA,IAAI,OAAA,CAAQ,iBAAA,EAAmB,OAAO,CAAA,EAAG;AACvC,YAAA,OAAO,iBAAA;AAAA,UACT;AACA,UAAA,OAAO,OAAA;AAAA,QACT,CAAC,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,SAAA,IAAa,OAAA,CAAQ,OAAA,EAAS;AACvC,QAAA,SAAA,CAAU,IAAI,CAAA;AACd,QAAA,aAAA,CAAc,SAAS,CAAA;AAAA,MACzB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,gBAAA,EAAkB,aAAa;AAAA,GAC7C;AAEA,EAAA,MAAM,wBAAA,GAA2B,mBAAA,CAAoB,aAAA,EAAe,GAAG,CAAA;AAEvE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,wBAAA,GAA2B,kBAAA,EAAoB,SAAS,KAAK,CAAA;AAAA,EAC/D,GAAG,CAAC,wBAAA,EAA0B,kBAAA,EAAoB,OAAA,EAAS,KAAK,CAAC,CAAA;AAEjE,EAAA,OAAO,qBAAA,CAAsB;AAAA,IAC3B,kBAAA,EAAoB,aAAA;AAAA,IACpB,MAAA;AAAA,IACA,aAAA,EAAe,UAAA;AAAA,IACf,qBAAA,EAAuB,iBAAA,EAAmB,MAAA,GAAS,eAAe,KAAK,EAAC;AAAA,IACxE,QAAA,EAAU,iBAAA,EAAmB,QAAA,IAAY,EAAC;AAAA,IAC1C,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage-community/plugin-tekton",
3
- "version": "3.30.1",
3
+ "version": "3.30.2",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "Apache-2.0",
@@ -70,7 +70,7 @@
70
70
  "@backstage/dev-utils": "^1.1.14",
71
71
  "@backstage/test-utils": "^1.7.11",
72
72
  "@playwright/test": "^1.52.0",
73
- "@testing-library/jest-dom": "6.8.0",
73
+ "@testing-library/jest-dom": "6.9.1",
74
74
  "@testing-library/react": "14.3.1",
75
75
  "@types/dagre": "^0.7.52",
76
76
  "@types/lodash": "4.17.20",