@backstage/plugin-scaffolder 1.15.1 → 1.16.0-next.1

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.
@@ -1,322 +0,0 @@
1
- import { parseEntityRef } from '@backstage/catalog-model';
2
- import { DismissableBanner, Link, Page, Header, Content, ErrorPage, Progress, LogViewer } from '@backstage/core-components';
3
- import { useApp, useRouteRef, useApi, useRouteRefParams } from '@backstage/core-plugin-api';
4
- import { Box, makeStyles, Grid, Typography, StepButton, Paper, Button, CircularProgress } from '@material-ui/core';
5
- import Grid$1 from '@material-ui/core/Grid';
6
- import Step from '@material-ui/core/Step';
7
- import StepLabel from '@material-ui/core/StepLabel';
8
- import Stepper from '@material-ui/core/Stepper';
9
- import { makeStyles as makeStyles$1, createStyles } from '@material-ui/core/styles';
10
- import Typography$1 from '@material-ui/core/Typography';
11
- import Cancel from '@material-ui/icons/Cancel';
12
- import Check from '@material-ui/icons/Check';
13
- import FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';
14
- import classNames from 'classnames';
15
- import { DateTime, Interval } from 'luxon';
16
- import qs from 'qs';
17
- import React, { useRef, useEffect, memo, useState, useMemo } from 'react';
18
- import { useNavigate } from 'react-router-dom';
19
- import useInterval from 'react-use/lib/useInterval';
20
- import { scaffolderApiRef, useTaskEventStream } from '@backstage/plugin-scaffolder-react';
21
- import { entityRouteRef } from '@backstage/plugin-catalog-react';
22
- import LanguageIcon from '@material-ui/icons/Language';
23
- import { r as rootRouteRef, n as selectedTemplateRouteRef, o as scaffolderTaskRouteRef } from './plugin-76d8b756.esm.js';
24
-
25
- const TaskErrors = ({ error }) => {
26
- const id = useRef("");
27
- useEffect(() => {
28
- id.current = String(Math.random());
29
- }, [error]);
30
- return error ? /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(
31
- DismissableBanner,
32
- {
33
- id: id.current,
34
- variant: "warning",
35
- message: error.message
36
- }
37
- )) : null;
38
- };
39
-
40
- const useStyles$1 = makeStyles({
41
- svgIcon: {
42
- display: "inline-block",
43
- "& svg": {
44
- display: "inline-block",
45
- fontSize: "inherit",
46
- verticalAlign: "baseline"
47
- }
48
- }
49
- });
50
- const IconLink = (props) => {
51
- const { href, text, Icon, ...linkProps } = props;
52
- const classes = useStyles$1();
53
- return /* @__PURE__ */ React.createElement(Grid, { container: true, direction: "row", spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Typography, { component: "div", className: classes.svgIcon }, Icon ? /* @__PURE__ */ React.createElement(Icon, null) : /* @__PURE__ */ React.createElement(LanguageIcon, null))), /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(Link, { to: href, ...linkProps }, text || href)));
54
- };
55
-
56
- const TaskPageLinks = ({ output }) => {
57
- const { links = [] } = output;
58
- const app = useApp();
59
- const entityRoute = useRouteRef(entityRouteRef);
60
- const iconResolver = (key) => {
61
- var _a;
62
- return key ? (_a = app.getSystemIcon(key)) != null ? _a : LanguageIcon : LanguageIcon;
63
- };
64
- return /* @__PURE__ */ React.createElement(Box, { px: 3, pb: 3 }, links.filter(({ url, entityRef }) => url || entityRef).map(({ url, entityRef, title, icon }) => {
65
- if (entityRef) {
66
- const entityName = parseEntityRef(entityRef, {
67
- defaultKind: "<unknown>",
68
- defaultNamespace: "<unknown>"
69
- });
70
- const target = entityRoute(entityName);
71
- return { title, icon, url: target };
72
- }
73
- return { title, icon, url };
74
- }).map(({ url, title, icon }, i) => /* @__PURE__ */ React.createElement(
75
- IconLink,
76
- {
77
- key: `output-link-${i}`,
78
- href: url,
79
- text: title != null ? title : url,
80
- Icon: iconResolver(icon),
81
- target: "_blank"
82
- }
83
- )));
84
- };
85
-
86
- const humanizeDuration = require("humanize-duration");
87
- const useStyles = makeStyles$1(
88
- (theme) => createStyles({
89
- root: {
90
- width: "100%"
91
- },
92
- button: {
93
- marginBottom: theme.spacing(2),
94
- marginLeft: theme.spacing(2)
95
- },
96
- actionsContainer: {
97
- marginBottom: theme.spacing(2)
98
- },
99
- resetContainer: {
100
- padding: theme.spacing(3)
101
- },
102
- labelWrapper: {
103
- display: "flex",
104
- flex: 1,
105
- flexDirection: "row",
106
- justifyContent: "space-between"
107
- },
108
- stepWrapper: {
109
- width: "100%"
110
- }
111
- })
112
- );
113
- const StepTimeTicker = ({ step }) => {
114
- const [time, setTime] = useState("");
115
- useInterval(() => {
116
- if (!step.startedAt) {
117
- setTime("");
118
- return;
119
- }
120
- const end = step.endedAt ? DateTime.fromISO(step.endedAt) : DateTime.local();
121
- const startedAt = DateTime.fromISO(step.startedAt);
122
- const formatted = Interval.fromDateTimes(startedAt, end).toDuration().valueOf();
123
- setTime(humanizeDuration(formatted, { round: true }));
124
- }, 1e3);
125
- return /* @__PURE__ */ React.createElement(Typography$1, { variant: "caption" }, time);
126
- };
127
- const useStepIconStyles = makeStyles$1(
128
- (theme) => createStyles({
129
- root: {
130
- color: theme.palette.text.disabled,
131
- display: "flex",
132
- height: 22,
133
- alignItems: "center"
134
- },
135
- completed: {
136
- color: theme.palette.status.ok
137
- },
138
- error: {
139
- color: theme.palette.status.error
140
- }
141
- })
142
- );
143
- function TaskStepIconComponent(props) {
144
- const classes = useStepIconStyles();
145
- const { active, completed, error } = props;
146
- const getMiddle = () => {
147
- if (active) {
148
- return /* @__PURE__ */ React.createElement(CircularProgress, { size: "24px" });
149
- }
150
- if (completed) {
151
- return /* @__PURE__ */ React.createElement(Check, null);
152
- }
153
- if (error) {
154
- return /* @__PURE__ */ React.createElement(Cancel, null);
155
- }
156
- return /* @__PURE__ */ React.createElement(FiberManualRecordIcon, null);
157
- };
158
- return /* @__PURE__ */ React.createElement(
159
- "div",
160
- {
161
- className: classNames(classes.root, {
162
- [classes.completed]: completed,
163
- [classes.error]: error
164
- })
165
- },
166
- getMiddle()
167
- );
168
- }
169
- const TaskStatusStepper = memo(
170
- (props) => {
171
- const { steps, currentStepId, onUserStepChange } = props;
172
- const classes = useStyles(props);
173
- return /* @__PURE__ */ React.createElement("div", { className: classes.root }, /* @__PURE__ */ React.createElement(
174
- Stepper,
175
- {
176
- activeStep: steps.findIndex((s) => s.id === currentStepId),
177
- orientation: "vertical",
178
- nonLinear: true
179
- },
180
- steps.map((step, index) => {
181
- const isCancelled = step.status === "cancelled";
182
- const isActive = step.status === "processing";
183
- const isCompleted = step.status === "completed";
184
- const isFailed = step.status === "failed";
185
- const isSkipped = step.status === "skipped";
186
- return /* @__PURE__ */ React.createElement(Step, { key: String(index), expanded: true }, /* @__PURE__ */ React.createElement(StepButton, { onClick: () => onUserStepChange(step.id) }, /* @__PURE__ */ React.createElement(
187
- StepLabel,
188
- {
189
- StepIconProps: {
190
- completed: isCompleted,
191
- error: isFailed || isCancelled,
192
- active: isActive
193
- },
194
- StepIconComponent: TaskStepIconComponent,
195
- className: classes.stepWrapper
196
- },
197
- /* @__PURE__ */ React.createElement("div", { className: classes.labelWrapper }, /* @__PURE__ */ React.createElement(Typography$1, { variant: "subtitle2" }, step.name), isSkipped ? /* @__PURE__ */ React.createElement(Typography$1, { variant: "caption" }, "Skipped") : /* @__PURE__ */ React.createElement(StepTimeTicker, { step }))
198
- )));
199
- })
200
- ));
201
- }
202
- );
203
- const hasLinks = ({ links = [] }) => links.length > 0;
204
- const TaskPage = (props) => {
205
- const { loadingText } = props;
206
- const classes = useStyles();
207
- const navigate = useNavigate();
208
- const rootPath = useRouteRef(rootRouteRef);
209
- const scaffolderApi = useApi(scaffolderApiRef);
210
- const templateRoute = useRouteRef(selectedTemplateRouteRef);
211
- const [userSelectedStepId, setUserSelectedStepId] = useState(void 0);
212
- const [clickedToCancel, setClickedToCancel] = useState(false);
213
- const [lastActiveStepId, setLastActiveStepId] = useState(
214
- void 0
215
- );
216
- const { taskId } = useRouteRefParams(scaffolderTaskRouteRef);
217
- const taskStream = useTaskEventStream(taskId);
218
- const completed = taskStream.completed;
219
- const taskCancelled = taskStream.cancelled;
220
- const steps = useMemo(
221
- () => {
222
- var _a, _b;
223
- return (_b = (_a = taskStream.task) == null ? void 0 : _a.spec.steps.map((step) => {
224
- var _a2;
225
- return {
226
- ...step,
227
- ...(_a2 = taskStream == null ? void 0 : taskStream.steps) == null ? void 0 : _a2[step.id]
228
- };
229
- })) != null ? _b : [];
230
- },
231
- [taskStream]
232
- );
233
- useEffect(() => {
234
- var _a;
235
- const mostRecentFailedOrActiveStep = steps.find(
236
- (step) => ["failed", "processing"].includes(step.status)
237
- );
238
- if (completed && !mostRecentFailedOrActiveStep) {
239
- setLastActiveStepId((_a = steps[steps.length - 1]) == null ? void 0 : _a.id);
240
- return;
241
- }
242
- setLastActiveStepId(mostRecentFailedOrActiveStep == null ? void 0 : mostRecentFailedOrActiveStep.id);
243
- }, [steps, completed]);
244
- const currentStepId = userSelectedStepId != null ? userSelectedStepId : lastActiveStepId;
245
- const logAsString = useMemo(() => {
246
- if (!currentStepId) {
247
- return loadingText ? loadingText : "Loading...";
248
- }
249
- const log = taskStream.stepLogs[currentStepId];
250
- if (!(log == null ? void 0 : log.length)) {
251
- return "Waiting for logs...";
252
- }
253
- return log.join("\n");
254
- }, [taskStream.stepLogs, currentStepId, loadingText]);
255
- const taskNotFound = taskStream.completed && !taskStream.loading && !taskStream.task;
256
- const { output } = taskStream;
257
- const handleStartOver = () => {
258
- var _a, _b, _c;
259
- if (!taskStream.task || !((_b = (_a = taskStream.task) == null ? void 0 : _a.spec.templateInfo) == null ? void 0 : _b.entityRef)) {
260
- navigate(rootPath());
261
- return;
262
- }
263
- const formData = taskStream.task.spec.parameters;
264
- const { name, namespace } = parseEntityRef(
265
- (_c = taskStream.task.spec.templateInfo) == null ? void 0 : _c.entityRef
266
- );
267
- navigate(
268
- `${templateRoute({ templateName: name, namespace })}?${qs.stringify({
269
- formData: JSON.stringify(formData)
270
- })}`
271
- );
272
- };
273
- const handleCancel = async () => {
274
- setClickedToCancel(true);
275
- await scaffolderApi.cancelTask(taskId);
276
- };
277
- return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(
278
- Header,
279
- {
280
- pageTitleOverride: `Task ${taskId}`,
281
- title: "Task Activity",
282
- subtitle: `Activity for task: ${taskId}`
283
- }
284
- ), /* @__PURE__ */ React.createElement(Content, null, taskNotFound ? /* @__PURE__ */ React.createElement(
285
- ErrorPage,
286
- {
287
- status: "404",
288
- statusMessage: "Task not found",
289
- additionalInfo: "No task found with this ID"
290
- }
291
- ) : /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Grid$1, { container: true }, /* @__PURE__ */ React.createElement(Grid$1, { item: true, xs: 3 }, /* @__PURE__ */ React.createElement(Paper, null, /* @__PURE__ */ React.createElement(
292
- TaskStatusStepper,
293
- {
294
- steps,
295
- currentStepId,
296
- onUserStepChange: setUserSelectedStepId
297
- }
298
- ), output && hasLinks(output) && /* @__PURE__ */ React.createElement(TaskPageLinks, { output }), /* @__PURE__ */ React.createElement(
299
- Button,
300
- {
301
- className: classes.button,
302
- onClick: handleStartOver,
303
- disabled: !completed,
304
- variant: "contained",
305
- color: "primary"
306
- },
307
- "Start Over"
308
- ), /* @__PURE__ */ React.createElement(
309
- Button,
310
- {
311
- className: classes.button,
312
- onClick: handleCancel,
313
- disabled: completed || taskCancelled || clickedToCancel,
314
- variant: "outlined",
315
- color: "secondary"
316
- },
317
- (taskCancelled || clickedToCancel) && !completed ? "Cancelling..." : "Cancel"
318
- ))), /* @__PURE__ */ React.createElement(Grid$1, { item: true, xs: 9 }, !currentStepId && /* @__PURE__ */ React.createElement(Progress, null), /* @__PURE__ */ React.createElement("div", { style: { height: "80vh" } }, /* @__PURE__ */ React.createElement(TaskErrors, { error: taskStream.error }), /* @__PURE__ */ React.createElement(LogViewer, { text: logAsString })))))));
319
- };
320
-
321
- export { TaskPage as T, TaskStatusStepper as a, TaskPageLinks as b };
322
- //# sourceMappingURL=TaskPage-d1a669e0.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TaskPage-d1a669e0.esm.js","sources":["../../src/components/TaskPage/TaskErrors.tsx","../../src/components/TaskPage/IconLink.tsx","../../src/components/TaskPage/TaskPageLinks.tsx","../../src/components/TaskPage/TaskPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 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 { Box } from '@material-ui/core';\nimport React, { useEffect, useRef } from 'react';\nimport { DismissableBanner } from '@backstage/core-components';\n\ntype TaskErrorsProps = {\n error?: Error;\n};\n\nexport const TaskErrors = ({ error }: TaskErrorsProps) => {\n const id = useRef('');\n\n useEffect(() => {\n id.current = String(Math.random());\n }, [error]);\n return error ? (\n <Box>\n <DismissableBanner\n id={id.current}\n variant=\"warning\"\n message={error.message}\n />\n </Box>\n ) : null;\n};\n","/*\n * Copyright 2020 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 React from 'react';\nimport { Grid, LinkProps, makeStyles, Typography } from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\n\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles({\n svgIcon: {\n display: 'inline-block',\n '& svg': {\n display: 'inline-block',\n fontSize: 'inherit',\n verticalAlign: 'baseline',\n },\n },\n});\n\nexport const IconLink = (\n props: {\n href: string;\n text?: string;\n Icon?: IconComponent;\n } & LinkProps,\n) => {\n const { href, text, Icon, ...linkProps } = props;\n\n const classes = useStyles();\n\n return (\n <Grid container direction=\"row\" spacing={1}>\n <Grid item>\n <Typography component=\"div\" className={classes.svgIcon}>\n {Icon ? <Icon /> : <LanguageIcon />}\n </Typography>\n </Grid>\n <Grid item>\n <Link to={href} {...linkProps}>\n {text || href}\n </Link>\n </Grid>\n </Grid>\n );\n};\n","/*\n * Copyright 2021 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 { parseEntityRef } from '@backstage/catalog-model';\nimport { entityRouteRef } from '@backstage/plugin-catalog-react';\nimport { Box } from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react';\nimport { IconLink } from './IconLink';\nimport { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api';\n\ntype TaskPageLinksProps = {\n output: ScaffolderTaskOutput;\n};\n\nexport const TaskPageLinks = ({ output }: TaskPageLinksProps) => {\n const { links = [] } = output;\n const app = useApp();\n const entityRoute = useRouteRef(entityRouteRef);\n\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n return (\n <Box px={3} pb={3}>\n {links\n .filter(({ url, entityRef }) => url || entityRef)\n .map(({ url, entityRef, title, icon }) => {\n if (entityRef) {\n const entityName = parseEntityRef(entityRef, {\n defaultKind: '<unknown>',\n defaultNamespace: '<unknown>',\n });\n const target = entityRoute(entityName);\n return { title, icon, url: target };\n }\n return { title, icon, url: url! };\n })\n .map(({ url, title, icon }, i) => (\n <IconLink\n key={`output-link-${i}`}\n href={url}\n text={title ?? url}\n Icon={iconResolver(icon)}\n target=\"_blank\"\n />\n ))}\n </Box>\n );\n};\n","/*\n * Copyright 2021 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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n Content,\n ErrorPage,\n Header,\n LogViewer,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport {\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Button,\n CircularProgress,\n Paper,\n StepButton,\n StepIconProps,\n} from '@material-ui/core';\nimport Grid from '@material-ui/core/Grid';\nimport Step from '@material-ui/core/Step';\nimport StepLabel from '@material-ui/core/StepLabel';\nimport Stepper from '@material-ui/core/Stepper';\nimport { createStyles, makeStyles, Theme } from '@material-ui/core/styles';\nimport Typography from '@material-ui/core/Typography';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Check from '@material-ui/icons/Check';\nimport FiberManualRecordIcon from '@material-ui/icons/FiberManualRecord';\nimport classNames from 'classnames';\nimport { DateTime, Interval } from 'luxon';\nimport qs from 'qs';\nimport React, { memo, useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useInterval from 'react-use/lib/useInterval';\nimport {\n ScaffolderTaskStatus,\n ScaffolderTaskOutput,\n useTaskEventStream,\n} from '@backstage/plugin-scaffolder-react';\nimport { TaskErrors } from './TaskErrors';\nimport { TaskPageLinks } from './TaskPageLinks';\nimport {\n rootRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n} from '../../routes';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\n\n// typings are wrong for this library, so fallback to not parsing types.\nconst humanizeDuration = require('humanize-duration');\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n width: '100%',\n },\n button: {\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(2),\n },\n actionsContainer: {\n marginBottom: theme.spacing(2),\n },\n resetContainer: {\n padding: theme.spacing(3),\n },\n labelWrapper: {\n display: 'flex',\n flex: 1,\n flexDirection: 'row',\n justifyContent: 'space-between',\n },\n stepWrapper: {\n width: '100%',\n },\n }),\n);\n\ntype TaskStep = {\n id: string;\n name: string;\n status: ScaffolderTaskStatus;\n startedAt?: string;\n endedAt?: string;\n};\n\nconst StepTimeTicker = ({ step }: { step: TaskStep }) => {\n const [time, setTime] = useState('');\n\n useInterval(() => {\n if (!step.startedAt) {\n setTime('');\n return;\n }\n\n const end = step.endedAt\n ? DateTime.fromISO(step.endedAt)\n : DateTime.local();\n\n const startedAt = DateTime.fromISO(step.startedAt);\n const formatted = Interval.fromDateTimes(startedAt, end)\n .toDuration()\n .valueOf();\n\n setTime(humanizeDuration(formatted, { round: true }));\n }, 1000);\n\n return <Typography variant=\"caption\">{time}</Typography>;\n};\n\nconst useStepIconStyles = makeStyles((theme: BackstageTheme) =>\n createStyles({\n root: {\n color: theme.palette.text.disabled,\n display: 'flex',\n height: 22,\n alignItems: 'center',\n },\n completed: {\n color: theme.palette.status.ok,\n },\n error: {\n color: theme.palette.status.error,\n },\n }),\n);\n\nfunction TaskStepIconComponent(props: StepIconProps) {\n const classes = useStepIconStyles();\n const { active, completed, error } = props;\n\n const getMiddle = () => {\n if (active) {\n return <CircularProgress size=\"24px\" />;\n }\n if (completed) {\n return <Check />;\n }\n if (error) {\n return <Cancel />;\n }\n return <FiberManualRecordIcon />;\n };\n\n return (\n <div\n className={classNames(classes.root, {\n [classes.completed]: completed,\n [classes.error]: error,\n })}\n >\n {getMiddle()}\n </div>\n );\n}\n\nexport const TaskStatusStepper = memo(\n (props: {\n steps: TaskStep[];\n currentStepId: string | undefined;\n onUserStepChange: (id: string) => void;\n classes?: {\n root?: string;\n };\n }) => {\n const { steps, currentStepId, onUserStepChange } = props;\n const classes = useStyles(props);\n\n return (\n <div className={classes.root}>\n <Stepper\n activeStep={steps.findIndex(s => s.id === currentStepId)}\n orientation=\"vertical\"\n nonLinear\n >\n {steps.map((step, index) => {\n const isCancelled = step.status === 'cancelled';\n const isActive = step.status === 'processing';\n const isCompleted = step.status === 'completed';\n const isFailed = step.status === 'failed';\n const isSkipped = step.status === 'skipped';\n\n return (\n <Step key={String(index)} expanded>\n <StepButton onClick={() => onUserStepChange(step.id)}>\n <StepLabel\n StepIconProps={{\n completed: isCompleted,\n error: isFailed || isCancelled,\n active: isActive,\n }}\n StepIconComponent={TaskStepIconComponent}\n className={classes.stepWrapper}\n >\n <div className={classes.labelWrapper}>\n <Typography variant=\"subtitle2\">{step.name}</Typography>\n {isSkipped ? (\n <Typography variant=\"caption\">Skipped</Typography>\n ) : (\n <StepTimeTicker step={step} />\n )}\n </div>\n </StepLabel>\n </StepButton>\n </Step>\n );\n })}\n </Stepper>\n </div>\n );\n },\n);\n\nconst hasLinks = ({ links = [] }: ScaffolderTaskOutput): boolean =>\n links.length > 0;\n\n/**\n * TaskPageProps for constructing a TaskPage\n * @param loadingText - Optional loading text shown before a task begins executing.\n *\n * @public\n */\nexport type TaskPageProps = {\n loadingText?: string;\n};\n\n/**\n * TaskPage for showing the status of the taskId provided as a param\n *\n * @public\n */\nexport const TaskPage = (props: TaskPageProps) => {\n const { loadingText } = props;\n const classes = useStyles();\n const navigate = useNavigate();\n const rootPath = useRouteRef(rootRouteRef);\n const scaffolderApi = useApi(scaffolderApiRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const [userSelectedStepId, setUserSelectedStepId] = useState<\n string | undefined\n >(undefined);\n const [clickedToCancel, setClickedToCancel] = useState<boolean>(false);\n const [lastActiveStepId, setLastActiveStepId] = useState<string | undefined>(\n undefined,\n );\n const { taskId } = useRouteRefParams(scaffolderTaskRouteRef);\n const taskStream = useTaskEventStream(taskId);\n const completed = taskStream.completed;\n const taskCancelled = taskStream.cancelled;\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n\n useEffect(() => {\n const mostRecentFailedOrActiveStep = steps.find(step =>\n ['failed', 'processing'].includes(step.status),\n );\n if (completed && !mostRecentFailedOrActiveStep) {\n setLastActiveStepId(steps[steps.length - 1]?.id);\n return;\n }\n\n setLastActiveStepId(mostRecentFailedOrActiveStep?.id);\n }, [steps, completed]);\n\n const currentStepId = userSelectedStepId ?? lastActiveStepId;\n\n const logAsString = useMemo(() => {\n if (!currentStepId) {\n return loadingText ? loadingText : 'Loading...';\n }\n const log = taskStream.stepLogs[currentStepId];\n\n if (!log?.length) {\n return 'Waiting for logs...';\n }\n return log.join('\\n');\n }, [taskStream.stepLogs, currentStepId, loadingText]);\n\n const taskNotFound =\n taskStream.completed && !taskStream.loading && !taskStream.task;\n\n const { output } = taskStream;\n\n const handleStartOver = () => {\n if (!taskStream.task || !taskStream.task?.spec.templateInfo?.entityRef) {\n navigate(rootPath());\n return;\n }\n\n const formData = taskStream.task!.spec.parameters;\n\n const { name, namespace } = parseEntityRef(\n taskStream.task!.spec.templateInfo?.entityRef,\n );\n\n navigate(\n `${templateRoute({ templateName: name, namespace })}?${qs.stringify({\n formData: JSON.stringify(formData),\n })}`,\n );\n };\n\n const handleCancel = async () => {\n setClickedToCancel(true);\n await scaffolderApi.cancelTask(taskId);\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={`Task ${taskId}`}\n title=\"Task Activity\"\n subtitle={`Activity for task: ${taskId}`}\n />\n <Content>\n {taskNotFound ? (\n <ErrorPage\n status=\"404\"\n statusMessage=\"Task not found\"\n additionalInfo=\"No task found with this ID\"\n />\n ) : (\n <div>\n <Grid container>\n <Grid item xs={3}>\n <Paper>\n <TaskStatusStepper\n steps={steps}\n currentStepId={currentStepId}\n onUserStepChange={setUserSelectedStepId}\n />\n {output && hasLinks(output) && (\n <TaskPageLinks output={output} />\n )}\n <Button\n className={classes.button}\n onClick={handleStartOver}\n disabled={!completed}\n variant=\"contained\"\n color=\"primary\"\n >\n Start Over\n </Button>\n <Button\n className={classes.button}\n onClick={handleCancel}\n disabled={completed || taskCancelled || clickedToCancel}\n variant=\"outlined\"\n color=\"secondary\"\n >\n {(taskCancelled || clickedToCancel) && !completed\n ? 'Cancelling...'\n : 'Cancel'}\n </Button>\n </Paper>\n </Grid>\n <Grid item xs={9}>\n {!currentStepId && <Progress />}\n\n <div style={{ height: '80vh' }}>\n <TaskErrors error={taskStream.error} />\n <LogViewer text={logAsString} />\n </div>\n </Grid>\n </Grid>\n </div>\n )}\n </Content>\n </Page>\n );\n};\n"],"names":["useStyles","makeStyles","Typography","_a","Grid"],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- import React from 'react';
2
- import capitalize from 'lodash/capitalize';
3
- import { Progress } from '@backstage/core-components';
4
- import { Box, Typography, FormControlLabel, Checkbox, TextField } from '@material-ui/core';
5
- import CheckBoxIcon from '@material-ui/icons/CheckBox';
6
- import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
7
- import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
8
- import { Autocomplete } from '@material-ui/lab';
9
- import { useEntityTypeFilter } from '@backstage/plugin-catalog-react';
10
- import { useApi, alertApiRef } from '@backstage/core-plugin-api';
11
-
12
- const icon = /* @__PURE__ */ React.createElement(CheckBoxOutlineBlankIcon, { fontSize: "small" });
13
- const checkedIcon = /* @__PURE__ */ React.createElement(CheckBoxIcon, { fontSize: "small" });
14
- const TemplateTypePicker = () => {
15
- const alertApi = useApi(alertApiRef);
16
- const { error, loading, availableTypes, selectedTypes, setSelectedTypes } = useEntityTypeFilter();
17
- if (loading)
18
- return /* @__PURE__ */ React.createElement(Progress, null);
19
- if (!availableTypes)
20
- return null;
21
- if (error) {
22
- alertApi.post({
23
- message: `Failed to load entity types`,
24
- severity: "error"
25
- });
26
- return null;
27
- }
28
- return /* @__PURE__ */ React.createElement(Box, { pb: 1, pt: 1 }, /* @__PURE__ */ React.createElement(
29
- Typography,
30
- {
31
- variant: "button",
32
- component: "label",
33
- htmlFor: "categories-picker"
34
- },
35
- "Categories"
36
- ), /* @__PURE__ */ React.createElement(
37
- Autocomplete,
38
- {
39
- id: "categories-picker",
40
- multiple: true,
41
- options: availableTypes,
42
- value: selectedTypes,
43
- onChange: (_, value) => setSelectedTypes(value),
44
- renderOption: (option, { selected }) => /* @__PURE__ */ React.createElement(
45
- FormControlLabel,
46
- {
47
- control: /* @__PURE__ */ React.createElement(
48
- Checkbox,
49
- {
50
- icon,
51
- checkedIcon,
52
- checked: selected
53
- }
54
- ),
55
- label: capitalize(option)
56
- }
57
- ),
58
- size: "small",
59
- popupIcon: /* @__PURE__ */ React.createElement(ExpandMoreIcon, { "data-testid": "categories-picker-expand" }),
60
- renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, { ...params, variant: "outlined" })
61
- }
62
- ));
63
- };
64
-
65
- export { TemplateTypePicker as T };
66
- //# sourceMappingURL=TemplateTypePicker-efec8c34.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TemplateTypePicker-efec8c34.esm.js","sources":["../../src/components/TemplateTypePicker/TemplateTypePicker.tsx"],"sourcesContent":["/*\n * Copyright 2021 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 React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport {\n Box,\n Checkbox,\n FormControlLabel,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { Autocomplete } from '@material-ui/lab';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The component to select the `type` of `Template` that you will see in the table.\n *\n * @public\n */\nexport const TemplateTypePicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n if (loading) return <Progress />;\n\n if (!availableTypes) return null;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types`,\n severity: 'error',\n });\n return null;\n }\n\n return (\n <Box pb={1} pt={1}>\n <Typography\n variant=\"button\"\n component=\"label\"\n htmlFor=\"categories-picker\"\n >\n Categories\n </Typography>\n <Autocomplete\n id=\"categories-picker\"\n multiple\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon data-testid=\"categories-picker-expand\" />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAiCA,MAAM,IAAO,mBAAA,KAAA,CAAA,aAAA,CAAC,wBAAyB,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AACxD,MAAM,WAAc,mBAAA,KAAA,CAAA,aAAA,CAAC,YAAa,EAAA,EAAA,QAAA,EAAS,OAAQ,EAAA,CAAA,CAAA;AAO5C,MAAM,qBAAqB,MAAM;AACtC,EAAM,MAAA,QAAA,GAAW,OAAO,WAAW,CAAA,CAAA;AACnC,EAAA,MAAM,EAAE,KAAO,EAAA,OAAA,EAAS,gBAAgB,aAAe,EAAA,gBAAA,KACrD,mBAAoB,EAAA,CAAA;AAEtB,EAAI,IAAA,OAAA;AAAS,IAAA,2CAAQ,QAAS,EAAA,IAAA,CAAA,CAAA;AAE9B,EAAA,IAAI,CAAC,cAAA;AAAgB,IAAO,OAAA,IAAA,CAAA;AAE5B,EAAA,IAAI,KAAO,EAAA;AACT,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACZ,OAAS,EAAA,CAAA,2BAAA,CAAA;AAAA,MACT,QAAU,EAAA,OAAA;AAAA,KACX,CAAA,CAAA;AACD,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,GAAA,EAAA,EAAI,EAAI,EAAA,CAAA,EAAG,IAAI,CACd,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,QAAA;AAAA,MACR,SAAU,EAAA,OAAA;AAAA,MACV,OAAQ,EAAA,mBAAA;AAAA,KAAA;AAAA,IACT,YAAA;AAAA,GAGD,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,mBAAA;AAAA,MACH,QAAQ,EAAA,IAAA;AAAA,MACR,OAAS,EAAA,cAAA;AAAA,MACT,KAAO,EAAA,aAAA;AAAA,MACP,QAAU,EAAA,CAAC,CAAW,EAAA,KAAA,KAAoB,iBAAiB,KAAK,CAAA;AAAA,MAChE,YAAc,EAAA,CAAC,MAAQ,EAAA,EAAE,UACvB,qBAAA,KAAA,CAAA,aAAA;AAAA,QAAC,gBAAA;AAAA,QAAA;AAAA,UACC,OACE,kBAAA,KAAA,CAAA,aAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,IAAA;AAAA,cACA,WAAA;AAAA,cACA,OAAS,EAAA,QAAA;AAAA,aAAA;AAAA,WACX;AAAA,UAEF,KAAA,EAAO,WAAW,MAAM,CAAA;AAAA,SAAA;AAAA,OAC1B;AAAA,MAEF,IAAK,EAAA,OAAA;AAAA,MACL,SAAW,kBAAA,KAAA,CAAA,aAAA,CAAC,cAAe,EAAA,EAAA,aAAA,EAAY,0BAA2B,EAAA,CAAA;AAAA,MAClE,aAAa,CAAU,MAAA,qBAAA,KAAA,CAAA,aAAA,CAAC,aAAW,GAAG,MAAA,EAAQ,SAAQ,UAAW,EAAA,CAAA;AAAA,KAAA;AAAA,GAErE,CAAA,CAAA;AAEJ;;;;"}