@backstage/plugin-scaffolder 1.32.0-next.2 → 1.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +31 -0
- package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js +2 -1
- package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
- package/dist/components/OngoingTask/ContextMenu.esm.js +4 -19
- package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
- package/dist/components/OngoingTask/OngoingTask.esm.js +29 -7
- package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
- package/dist/plugins/scaffolder/package.json.esm.js +1 -1
- package/package.json +22 -22
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,36 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder
|
|
2
2
|
|
|
3
|
+
## 1.32.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 6c972fe: Added information about the `entityRef` and `taskId` to the analytics events whenever is possible.
|
|
8
|
+
- 3c59ece: **New Frontend System Only:**
|
|
9
|
+
The `Scaffolder` plugin is now responsible for providing an entity icon link extension to launch templates from the catalog entity page.
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- d781b33: render details for composite property schemas
|
|
14
|
+
- 18c64e9: Added the `info.packageJson` option to the plugin instance for the new frontend system.
|
|
15
|
+
- b00c160: Remove React import form notification and scaffolder plugin
|
|
16
|
+
- 95a1d72: Added appropriate message when global templating function metadata is absent.
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
- @backstage/core-components@0.17.3
|
|
19
|
+
- @backstage/catalog-client@1.10.1
|
|
20
|
+
- @backstage/plugin-scaffolder-react@1.17.0
|
|
21
|
+
- @backstage/core-plugin-api@1.10.8
|
|
22
|
+
- @backstage/frontend-plugin-api@0.10.3
|
|
23
|
+
- @backstage/plugin-catalog-react@1.19.0
|
|
24
|
+
- @backstage/integration-react@1.2.8
|
|
25
|
+
- @backstage/catalog-model@1.7.4
|
|
26
|
+
- @backstage/core-compat-api@0.4.3
|
|
27
|
+
- @backstage/errors@1.2.7
|
|
28
|
+
- @backstage/integration@1.17.0
|
|
29
|
+
- @backstage/types@1.2.1
|
|
30
|
+
- @backstage/plugin-catalog-common@1.1.4
|
|
31
|
+
- @backstage/plugin-permission-react@0.4.35
|
|
32
|
+
- @backstage/plugin-scaffolder-common@1.5.11
|
|
33
|
+
|
|
3
34
|
## 1.32.0-next.2
|
|
4
35
|
|
|
5
36
|
### Minor Changes
|
|
@@ -11,6 +11,7 @@ import MoreVert from '@material-ui/icons/MoreVert';
|
|
|
11
11
|
import { useState } from 'react';
|
|
12
12
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
13
13
|
import { scaffolderTranslationRef } from '../../../translation.esm.js';
|
|
14
|
+
import { Link } from '@backstage/core-components';
|
|
14
15
|
|
|
15
16
|
const useStyles = makeStyles((theme) => ({
|
|
16
17
|
button: {
|
|
@@ -57,7 +58,7 @@ function TemplateWizardPageContextMenu(props) {
|
|
|
57
58
|
anchorEl,
|
|
58
59
|
anchorOrigin: { vertical: "bottom", horizontal: "right" },
|
|
59
60
|
transformOrigin: { vertical: "top", horizontal: "right" },
|
|
60
|
-
children: /* @__PURE__ */ jsx(MenuList, { children: /* @__PURE__ */ jsxs(MenuItem, {
|
|
61
|
+
children: /* @__PURE__ */ jsx(MenuList, { children: /* @__PURE__ */ jsxs(MenuItem, { component: Link, to: editUrl, children: [
|
|
61
62
|
/* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(Edit, { fontSize: "small" }) }),
|
|
62
63
|
/* @__PURE__ */ jsx(
|
|
63
64
|
ListItemText,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateWizardPageContextMenu.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.tsx"],"sourcesContent":["/*\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 IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Edit from '@material-ui/icons/Edit';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nconst useStyles = makeStyles(theme => ({\n button: {\n color: theme.page.fontColor,\n },\n}));\n\nexport type TemplateWizardPageContextMenuProps = {\n editUrl?: string;\n};\n\nexport function TemplateWizardPageContextMenu(\n props: TemplateWizardPageContextMenuProps,\n) {\n const { editUrl } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!editUrl) {\n return null;\n }\n\n const onOpen = (event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n return (\n <>\n <IconButton\n id=\"long-menu\"\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-expanded={!!anchorEl}\n aria-haspopup=\"true\"\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n color=\"inherit\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n aria-labelledby=\"long-menu\"\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem
|
|
1
|
+
{"version":3,"file":"TemplateWizardPageContextMenu.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.tsx"],"sourcesContent":["/*\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 IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Edit from '@material-ui/icons/Edit';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles(theme => ({\n button: {\n color: theme.page.fontColor,\n },\n}));\n\nexport type TemplateWizardPageContextMenuProps = {\n editUrl?: string;\n};\n\nexport function TemplateWizardPageContextMenu(\n props: TemplateWizardPageContextMenuProps,\n) {\n const { editUrl } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!editUrl) {\n return null;\n }\n\n const onOpen = (event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n return (\n <>\n <IconButton\n id=\"long-menu\"\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-expanded={!!anchorEl}\n aria-haspopup=\"true\"\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n color=\"inherit\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n aria-labelledby=\"long-menu\"\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem component={Link} to={editUrl}>\n <ListItemIcon>\n <Edit fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={t(\n 'templateWizardPage.pageContextMenu.editConfigurationTitle',\n )}\n />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,MAAQ,EAAA;AAAA,IACN,KAAA,EAAO,MAAM,IAAK,CAAA;AAAA;AAEtB,CAAE,CAAA,CAAA;AAMK,SAAS,8BACd,KACA,EAAA;AACA,EAAM,MAAA,EAAE,SAAY,GAAA,KAAA;AACpB,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAA4B,EAAA;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,MAAA,GAAS,CAAC,KAA6C,KAAA;AAC3D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,GACjC;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,KAAS,CAAA,CAAA;AAAA,GACvB;AAEA,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,WAAA;AAAA,QACH,YAAW,EAAA,MAAA;AAAA,QACX,eAAc,EAAA,WAAA;AAAA,QACd,eAAA,EAAe,CAAC,CAAC,QAAA;AAAA,QACjB,eAAc,EAAA,MAAA;AAAA,QACd,IAAK,EAAA,QAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAY,EAAA,aAAA;AAAA,QACZ,KAAM,EAAA,SAAA;AAAA,QACN,WAAW,OAAQ,CAAA,MAAA;AAAA,QAEnB,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,iBAAgB,EAAA,WAAA;AAAA,QAChB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAc,EAAA,EAAE,QAAU,EAAA,QAAA,EAAU,YAAY,OAAQ,EAAA;AAAA,QACxD,eAAiB,EAAA,EAAE,QAAU,EAAA,KAAA,EAAO,YAAY,OAAQ,EAAA;AAAA,QAExD,8BAAC,QACC,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,YAAS,SAAW,EAAA,IAAA,EAAM,IAAI,OAC7B,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,QAAA,EAAS,SAAQ,CACzB,EAAA,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,CAAA;AAAA,gBACP;AAAA;AACF;AAAA;AACF,SAAA,EACF,CACF,EAAA;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -6,7 +6,6 @@ import MenuItem from '@material-ui/core/MenuItem';
|
|
|
6
6
|
import MenuList from '@material-ui/core/MenuList';
|
|
7
7
|
import Popover from '@material-ui/core/Popover';
|
|
8
8
|
import { makeStyles, useTheme } from '@material-ui/core/styles';
|
|
9
|
-
import { useAsync } from '@react-hookz/web';
|
|
10
9
|
import Cancel from '@material-ui/icons/Cancel';
|
|
11
10
|
import Repeat from '@material-ui/icons/Repeat';
|
|
12
11
|
import Replay from '@material-ui/icons/Replay';
|
|
@@ -14,10 +13,8 @@ import Toc from '@material-ui/icons/Toc';
|
|
|
14
13
|
import ControlPointIcon from '@material-ui/icons/ControlPoint';
|
|
15
14
|
import MoreVert from '@material-ui/icons/MoreVert';
|
|
16
15
|
import { useState } from 'react';
|
|
17
|
-
import { useApi, useAnalytics } from '@backstage/core-plugin-api';
|
|
18
|
-
import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
|
|
19
16
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
20
|
-
import {
|
|
17
|
+
import { taskReadPermission, taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';
|
|
21
18
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
22
19
|
import { scaffolderTranslationRef } from '../../translation.esm.js';
|
|
23
20
|
|
|
@@ -36,25 +33,13 @@ const ContextMenu = (props) => {
|
|
|
36
33
|
onRetry,
|
|
37
34
|
onStartOver,
|
|
38
35
|
onToggleLogs,
|
|
39
|
-
onToggleButtonBar
|
|
40
|
-
taskId
|
|
36
|
+
onToggleButtonBar
|
|
41
37
|
} = props;
|
|
42
38
|
const { getPageTheme } = useTheme();
|
|
43
39
|
const pageTheme = getPageTheme({ themeId: "website" });
|
|
44
40
|
const classes = useStyles({ fontColor: pageTheme.fontColor });
|
|
45
|
-
const scaffolderApi = useApi(scaffolderApiRef);
|
|
46
|
-
const analytics = useAnalytics();
|
|
47
41
|
const [anchorEl, setAnchorEl] = useState();
|
|
48
42
|
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
49
|
-
const [{ status: cancelStatus }, { execute: cancel }] = useAsync(async () => {
|
|
50
|
-
if (taskId) {
|
|
51
|
-
analytics.captureEvent("cancelled", "Template has been cancelled");
|
|
52
|
-
await scaffolderApi.cancelTask(taskId);
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
const { allowed: canCancelTask } = usePermission({
|
|
56
|
-
permission: taskCancelPermission
|
|
57
|
-
});
|
|
58
43
|
const { allowed: canReadTask } = usePermission({
|
|
59
44
|
permission: taskReadPermission
|
|
60
45
|
});
|
|
@@ -131,8 +116,8 @@ const ContextMenu = (props) => {
|
|
|
131
116
|
/* @__PURE__ */ jsxs(
|
|
132
117
|
MenuItem,
|
|
133
118
|
{
|
|
134
|
-
onClick:
|
|
135
|
-
disabled:
|
|
119
|
+
onClick: props.onCancel,
|
|
120
|
+
disabled: props.isCancelButtonDisabled,
|
|
136
121
|
"data-testid": "cancel-task",
|
|
137
122
|
children: [
|
|
138
123
|
/* @__PURE__ */ jsx(ListItemIcon, { children: /* @__PURE__ */ jsx(Cancel, { fontSize: "small" }) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContextMenu.esm.js","sources":["../../../src/components/OngoingTask/ContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles, Theme, useTheme } from '@material-ui/core/styles';\nimport { useAsync } from '@react-hookz/web';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Repeat from '@material-ui/icons/Repeat';\nimport Replay from '@material-ui/icons/Replay';\nimport Toc from '@material-ui/icons/Toc';\nimport ControlPointIcon from '@material-ui/icons/ControlPoint';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskCancelPermission,\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype ContextMenuProps = {\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n taskId?: string;\n};\n\nconst useStyles = makeStyles<Theme, { fontColor: string }>(() => ({\n button: {\n color: ({ fontColor }) => fontColor,\n },\n}));\n\nexport const ContextMenu = (props: ContextMenuProps) => {\n const {\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n taskId,\n } = props;\n const { getPageTheme } = useTheme();\n const pageTheme = getPageTheme({ themeId: 'website' });\n const classes = useStyles({ fontColor: pageTheme.fontColor });\n const scaffolderApi = useApi(scaffolderApiRef);\n const analytics = useAnalytics();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [{ status: cancelStatus }, { execute: cancel }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n });\n\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={(event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }}\n data-testid=\"menu-button\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(undefined)}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem onClick={() => onToggleLogs?.(!logsVisible)}>\n <ListItemIcon>\n <Toc fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')\n }\n />\n </MenuItem>\n <MenuItem onClick={() => onToggleButtonBar?.(!buttonBarVisible)}>\n <ListItemIcon>\n <ControlPointIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')\n }\n />\n </MenuItem>\n <MenuItem\n onClick={onStartOver}\n disabled={cancelEnabled || !canStartOver}\n data-testid=\"start-over-task\"\n >\n <ListItemIcon>\n <Repeat fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.startOver')} />\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onClick={onRetry}\n disabled={cancelEnabled || !canRetry}\n data-testid=\"retry-task\"\n >\n <ListItemIcon>\n <Replay fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.retry')} />\n </MenuItem>\n )}\n <MenuItem\n onClick={cancel}\n disabled={\n !cancelEnabled ||\n cancelStatus !== 'not-executed' ||\n !canCancelTask\n }\n data-testid=\"cancel-task\"\n >\n <ListItemIcon>\n <Cancel fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.cancel')} />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuDA,MAAM,SAAA,GAAY,WAAyC,OAAO;AAAA,EAChE,MAAQ,EAAA;AAAA,IACN,KAAO,EAAA,CAAC,EAAE,SAAA,EAAgB,KAAA;AAAA;AAE9B,CAAE,CAAA,CAAA;AAEW,MAAA,WAAA,GAAc,CAAC,KAA4B,KAAA;AACtD,EAAM,MAAA;AAAA,IACJ,aAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACE,GAAA,KAAA;AACJ,EAAM,MAAA,EAAE,YAAa,EAAA,GAAI,QAAS,EAAA;AAClC,EAAA,MAAM,SAAY,GAAA,YAAA,CAAa,EAAE,OAAA,EAAS,WAAW,CAAA;AACrD,EAAA,MAAM,UAAU,SAAU,CAAA,EAAE,SAAW,EAAA,SAAA,CAAU,WAAW,CAAA;AAC5D,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,YAAY,YAAa,EAAA;AAC/B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAA4B,EAAA;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAM,MAAA,CAAC,EAAE,MAAA,EAAQ,YAAa,EAAA,EAAG,EAAE,OAAA,EAAS,MAAO,EAAC,CAAI,GAAA,QAAA,CAAS,YAAY;AAC3E,IAAA,IAAI,MAAQ,EAAA;AACV,MAAU,SAAA,CAAA,YAAA,CAAa,aAAa,6BAA6B,CAAA;AACjE,MAAM,MAAA,aAAA,CAAc,WAAW,MAAM,CAAA;AAAA;AACvC,GACD,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,aAAc,EAAA,GAAI,aAAc,CAAA;AAAA,IAC/C,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,WAAY,EAAA,GAAI,aAAc,CAAA;AAAA,IAC7C,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,aAAc,EAAA,GAAI,aAAc,CAAA;AAAA,IAC/C,UAAY,EAAA;AAAA,GACb,CAAA;AAGD,EAAA,MAAM,eAAe,WAAe,IAAA,aAAA;AAEpC,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAW,EAAA,MAAA;AAAA,QACX,eAAc,EAAA,WAAA;AAAA,QACd,eAAc,EAAA,MAAA;AAAA,QACd,OAAA,EAAS,CAAC,KAA6C,KAAA;AACrD,UAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,SACjC;AAAA,QACA,aAAY,EAAA,aAAA;AAAA,QACZ,WAAW,OAAQ,CAAA,MAAA;AAAA,QAEnB,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA,EAAS,MAAM,WAAA,CAAY,KAAS,CAAA,CAAA;AAAA,QACpC,QAAA;AAAA,QACA,YAAc,EAAA,EAAE,QAAU,EAAA,QAAA,EAAU,YAAY,OAAQ,EAAA;AAAA,QACxD,eAAiB,EAAA,EAAE,QAAU,EAAA,KAAA,EAAO,YAAY,OAAQ,EAAA;AAAA,QAExD,+BAAC,QACC,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,YAAS,OAAS,EAAA,MAAM,YAAe,GAAA,CAAC,WAAW,CAClD,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,GAAI,EAAA,EAAA,QAAA,EAAS,SAAQ,CACxB,EAAA,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,SACE,WACI,GAAA,CAAA,CAAE,kCAAkC,CAAA,GACpC,EAAE,kCAAkC;AAAA;AAAA;AAE5C,WACF,EAAA,CAAA;AAAA,+BACC,QAAS,EAAA,EAAA,OAAA,EAAS,MAAM,iBAAoB,GAAA,CAAC,gBAAgB,CAC5D,EAAA,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,gBAAiB,EAAA,EAAA,QAAA,EAAS,SAAQ,CACrC,EAAA,CAAA;AAAA,4BACA,GAAA;AAAA,cAAC,YAAA;AAAA,cAAA;AAAA,gBACC,SACE,gBACI,GAAA,CAAA,CAAE,uCAAuC,CAAA,GACzC,EAAE,uCAAuC;AAAA;AAAA;AAEjD,WACF,EAAA,CAAA;AAAA,0BACA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,WAAA;AAAA,cACT,QAAA,EAAU,iBAAiB,CAAC,YAAA;AAAA,cAC5B,aAAY,EAAA,iBAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,QAAA,EAAS,SAAQ,CAC3B,EAAA,CAAA;AAAA,gCACC,GAAA,CAAA,YAAA,EAAA,EAAa,OAAS,EAAA,CAAA,CAAE,mCAAmC,CAAG,EAAA;AAAA;AAAA;AAAA,WACjE;AAAA,UACC,eACC,oBAAA,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,OAAA;AAAA,cACT,QAAA,EAAU,iBAAiB,CAAC,QAAA;AAAA,cAC5B,aAAY,EAAA,YAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,QAAA,EAAS,SAAQ,CAC3B,EAAA,CAAA;AAAA,gCACC,GAAA,CAAA,YAAA,EAAA,EAAa,OAAS,EAAA,CAAA,CAAE,+BAA+B,CAAG,EAAA;AAAA;AAAA;AAAA,WAC7D;AAAA,0BAEF,IAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,MAAA;AAAA,cACT,QACE,EAAA,CAAC,aACD,IAAA,YAAA,KAAiB,kBACjB,CAAC,aAAA;AAAA,cAEH,aAAY,EAAA,aAAA;AAAA,cAEZ,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,MAAO,EAAA,EAAA,QAAA,EAAS,SAAQ,CAC3B,EAAA,CAAA;AAAA,gCACC,GAAA,CAAA,YAAA,EAAA,EAAa,OAAS,EAAA,CAAA,CAAE,gCAAgC,CAAG,EAAA;AAAA;AAAA;AAAA;AAC9D,SACF,EAAA;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"ContextMenu.esm.js","sources":["../../../src/components/OngoingTask/ContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles, Theme, useTheme } from '@material-ui/core/styles';\nimport Cancel from '@material-ui/icons/Cancel';\nimport Repeat from '@material-ui/icons/Repeat';\nimport Replay from '@material-ui/icons/Replay';\nimport Toc from '@material-ui/icons/Toc';\nimport ControlPointIcon from '@material-ui/icons/ControlPoint';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n taskCreatePermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\ntype ContextMenuProps = {\n cancelEnabled?: boolean;\n canRetry: boolean;\n isRetryableTask: boolean;\n logsVisible?: boolean;\n buttonBarVisible?: boolean;\n onRetry?: () => void;\n onStartOver?: () => void;\n onToggleLogs?: (state: boolean) => void;\n onToggleButtonBar?: (state: boolean) => void;\n isCancelButtonDisabled: boolean;\n onCancel: () => void;\n};\n\nconst useStyles = makeStyles<Theme, { fontColor: string }>(() => ({\n button: {\n color: ({ fontColor }) => fontColor,\n },\n}));\n\nexport const ContextMenu = (props: ContextMenuProps) => {\n const {\n cancelEnabled,\n canRetry,\n isRetryableTask,\n logsVisible,\n buttonBarVisible,\n onRetry,\n onStartOver,\n onToggleLogs,\n onToggleButtonBar,\n } = props;\n const { getPageTheme } = useTheme();\n const pageTheme = getPageTheme({ themeId: 'website' });\n const classes = useStyles({ fontColor: pageTheme.fontColor });\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n return (\n <>\n <IconButton\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-haspopup=\"true\"\n onClick={(event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n }}\n data-testid=\"menu-button\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n open={Boolean(anchorEl)}\n onClose={() => setAnchorEl(undefined)}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem onClick={() => onToggleLogs?.(!logsVisible)}>\n <ListItemIcon>\n <Toc fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n logsVisible\n ? t('ongoingTask.contextMenu.hideLogs')\n : t('ongoingTask.contextMenu.showLogs')\n }\n />\n </MenuItem>\n <MenuItem onClick={() => onToggleButtonBar?.(!buttonBarVisible)}>\n <ListItemIcon>\n <ControlPointIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={\n buttonBarVisible\n ? t('ongoingTask.contextMenu.hideButtonBar')\n : t('ongoingTask.contextMenu.showButtonBar')\n }\n />\n </MenuItem>\n <MenuItem\n onClick={onStartOver}\n disabled={cancelEnabled || !canStartOver}\n data-testid=\"start-over-task\"\n >\n <ListItemIcon>\n <Repeat fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.startOver')} />\n </MenuItem>\n {isRetryableTask && (\n <MenuItem\n onClick={onRetry}\n disabled={cancelEnabled || !canRetry}\n data-testid=\"retry-task\"\n >\n <ListItemIcon>\n <Replay fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.retry')} />\n </MenuItem>\n )}\n <MenuItem\n onClick={props.onCancel}\n disabled={props.isCancelButtonDisabled}\n data-testid=\"cancel-task\"\n >\n <ListItemIcon>\n <Cancel fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText primary={t('ongoingTask.contextMenu.cancel')} />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsxs,
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useMemo, useState, useEffect, useCallback } from 'react';
|
|
3
3
|
import { Page, Header, Content, ErrorPanel } from '@backstage/core-components';
|
|
4
4
|
import { useParams, useNavigate } from 'react-router-dom';
|
|
@@ -6,9 +6,9 @@ import Box from '@material-ui/core/Box';
|
|
|
6
6
|
import Button from '@material-ui/core/Button';
|
|
7
7
|
import Paper from '@material-ui/core/Paper';
|
|
8
8
|
import { makeStyles } from '@material-ui/core/styles';
|
|
9
|
-
import {
|
|
9
|
+
import { useTaskEventStream, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
|
|
10
10
|
import { selectedTemplateRouteRef } from '../../routes.esm.js';
|
|
11
|
-
import { useRouteRef, useAnalytics, useApi } from '@backstage/core-plugin-api';
|
|
11
|
+
import { AnalyticsContext, useRouteRef, useAnalytics, useApi } from '@backstage/core-plugin-api';
|
|
12
12
|
import qs from 'qs';
|
|
13
13
|
import { ContextMenu } from './ContextMenu.esm.js';
|
|
14
14
|
import { DefaultTemplateOutputs, TaskSteps, TaskLogStream } from '@backstage/plugin-scaffolder-react/alpha';
|
|
@@ -19,6 +19,7 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
|
19
19
|
import { scaffolderTranslationRef } from '../../translation.esm.js';
|
|
20
20
|
import { entityPresentationApiRef } from '@backstage/plugin-catalog-react';
|
|
21
21
|
import useAsync from 'react-use/esm/useAsync';
|
|
22
|
+
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
22
23
|
|
|
23
24
|
const useStyles = makeStyles((theme) => ({
|
|
24
25
|
contentWrapper: {
|
|
@@ -41,6 +42,25 @@ const useStyles = makeStyles((theme) => ({
|
|
|
41
42
|
}
|
|
42
43
|
}));
|
|
43
44
|
const OngoingTask = (props) => {
|
|
45
|
+
const { taskId } = useParams();
|
|
46
|
+
const taskStream = useTaskEventStream(taskId);
|
|
47
|
+
const { namespace, name } = taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
AnalyticsContext,
|
|
50
|
+
{
|
|
51
|
+
attributes: {
|
|
52
|
+
entityRef: name && stringifyEntityRef({
|
|
53
|
+
kind: "template",
|
|
54
|
+
namespace,
|
|
55
|
+
name
|
|
56
|
+
}),
|
|
57
|
+
taskId
|
|
58
|
+
},
|
|
59
|
+
children: /* @__PURE__ */ jsx(Page, { themeId: "website", children: /* @__PURE__ */ jsx(OngoingTaskContent, { ...props }) })
|
|
60
|
+
}
|
|
61
|
+
);
|
|
62
|
+
};
|
|
63
|
+
function OngoingTaskContent(props) {
|
|
44
64
|
const { taskId } = useParams();
|
|
45
65
|
const templateRouteRef = useRouteRef(selectedTemplateRouteRef);
|
|
46
66
|
const navigate = useNavigate();
|
|
@@ -118,7 +138,7 @@ const OngoingTask = (props) => {
|
|
|
118
138
|
taskStream.task?.spec.templateInfo?.entity?.metadata,
|
|
119
139
|
templateRouteRef
|
|
120
140
|
]);
|
|
121
|
-
const [
|
|
141
|
+
const [, { execute: triggerRetry }] = useAsync$1(async () => {
|
|
122
142
|
if (taskId) {
|
|
123
143
|
analytics.captureEvent("retried", "Template has been retried");
|
|
124
144
|
await scaffolderApi.retry?.(taskId);
|
|
@@ -134,7 +154,8 @@ const OngoingTask = (props) => {
|
|
|
134
154
|
);
|
|
135
155
|
const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs;
|
|
136
156
|
const cancelEnabled = !(taskStream.cancelled || taskStream.completed);
|
|
137
|
-
|
|
157
|
+
const isCancelButtonDisabled = !cancelEnabled || cancelStatus !== "not-executed" || !canCancelTask;
|
|
158
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
138
159
|
/* @__PURE__ */ jsx(
|
|
139
160
|
Header,
|
|
140
161
|
{
|
|
@@ -159,7 +180,8 @@ const OngoingTask = (props) => {
|
|
|
159
180
|
onRetry: triggerRetry,
|
|
160
181
|
onToggleLogs: setLogVisibleState,
|
|
161
182
|
onToggleButtonBar: setButtonBarVisibleState,
|
|
162
|
-
|
|
183
|
+
onCancel: triggerCancel,
|
|
184
|
+
isCancelButtonDisabled
|
|
163
185
|
}
|
|
164
186
|
)
|
|
165
187
|
}
|
|
@@ -229,7 +251,7 @@ const OngoingTask = (props) => {
|
|
|
229
251
|
logsVisible ? /* @__PURE__ */ jsx(Paper, { style: { height: "100%" }, children: /* @__PURE__ */ jsx(Box, { padding: 2, height: "100%", children: /* @__PURE__ */ jsx(TaskLogStream, { logs: taskStream.stepLogs }) }) }) : null
|
|
230
252
|
] })
|
|
231
253
|
] });
|
|
232
|
-
}
|
|
254
|
+
}
|
|
233
255
|
|
|
234
256
|
export { OngoingTask };
|
|
235
257
|
//# sourceMappingURL=OngoingTask.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OngoingTask.esm.js","sources":["../../../src/components/OngoingTask/OngoingTask.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 ComponentType,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Content, ErrorPanel, Header, Page } from '@backstage/core-components';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Paper from '@material-ui/core/Paper';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n scaffolderApiRef,\n ScaffolderTaskOutput,\n useTaskEventStream,\n} from '@backstage/plugin-scaffolder-react';\nimport { selectedTemplateRouteRef } from '../../routes';\nimport { useAnalytics, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport qs from 'qs';\nimport { ContextMenu } from './ContextMenu';\nimport {\n DefaultTemplateOutputs,\n TaskLogStream,\n TaskSteps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useAsync } from '@react-hookz/web';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { entityPresentationApiRef } from '@backstage/plugin-catalog-react';\nimport { default as reactUseAsync } from 'react-use/esm/useAsync';\n\nconst useStyles = makeStyles(theme => ({\n contentWrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n buttonBar: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n cancelButton: {\n marginRight: theme.spacing(1),\n },\n retryButton: {\n marginRight: theme.spacing(1),\n },\n logsVisibilityButton: {\n marginRight: theme.spacing(1),\n },\n}));\n\n/**\n * @public\n */\nexport const OngoingTask = (props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) => {\n // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful.\n const { taskId } = useParams();\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const taskStream = useTaskEventStream(taskId!);\n const classes = useStyles();\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n // Used dummy string value for `resourceRef` since `allowed` field will always return `false` if `resourceRef` is `undefined`\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n useEffect(() => {\n if (taskStream.error) {\n setLogVisibleState(true);\n }\n }, [taskStream.error]);\n\n useEffect(() => {\n if (taskStream.completed && !taskStream.error) {\n setLogVisibleState(true);\n setButtonBarVisibleState(false);\n }\n }, [taskStream.error, taskStream.completed]);\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const activeStep = useMemo(() => {\n for (let i = steps.length - 1; i >= 0; i--) {\n if (steps[i].status !== 'open') {\n return i;\n }\n }\n\n return 0;\n }, [steps]);\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [{ status: _ }, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n\n return (\n <Page themeId=\"website\">\n <Header\n pageTitleOverride={\n presentation\n ? t('ongoingTask.pageTitle.hasTemplateName', {\n templateName: presentation.primaryTitle,\n })\n : t('ongoingTask.pageTitle.noTemplateName')\n }\n title={\n <div>\n {t('ongoingTask.title')}{' '}\n <code>{presentation ? presentation.primaryTitle : ''}</code>\n </div>\n }\n subtitle={t('ongoingTask.subtitle', { taskId: taskId as string })}\n >\n <ContextMenu\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n taskId={taskId}\n />\n </Header>\n <Content className={classes.contentWrapper}>\n {taskStream.error ? (\n <Box paddingBottom={2}>\n <ErrorPanel\n error={taskStream.error}\n titleFormat=\"markdown\"\n title={taskStream.error.message}\n />\n </Box>\n ) : null}\n\n <Box paddingBottom={2}>\n <TaskSteps\n steps={steps}\n activeStep={activeStep}\n isComplete={taskStream.completed}\n isError={Boolean(taskStream.error)}\n />\n </Box>\n\n <Outputs output={taskStream.output} />\n\n {buttonBarVisible ? (\n <Box paddingBottom={2}>\n <Paper>\n <Box padding={2}>\n <div className={classes.buttonBar}>\n <Button\n className={classes.cancelButton}\n disabled={\n !cancelEnabled ||\n (cancelStatus !== 'not-executed' && !isRetryableTask) ||\n !canCancelTask\n }\n onClick={triggerCancel}\n data-testid=\"cancel-button\"\n >\n {t('ongoingTask.cancelButtonTitle')}\n </Button>\n {isRetryableTask && (\n <Button\n className={classes.retryButton}\n disabled={cancelEnabled || !canRetry}\n onClick={triggerRetry}\n data-testid=\"retry-button\"\n >\n {t('ongoingTask.retryButtonTitle')}\n </Button>\n )}\n <Button\n className={classes.logsVisibilityButton}\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => setLogVisibleState(!logsVisible)}\n >\n {logsVisible\n ? t('ongoingTask.hideLogsButtonTitle')\n : t('ongoingTask.showLogsButtonTitle')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={cancelEnabled || !canStartOver}\n onClick={startOver}\n data-testid=\"start-over-button\"\n >\n {t('ongoingTask.startOverButtonTitle')}\n </Button>\n </div>\n </Box>\n </Paper>\n </Box>\n ) : null}\n\n {logsVisible ? (\n <Paper style={{ height: '100%' }}>\n <Box padding={2} height=\"100%\">\n <TaskLogStream logs={taskStream.stepLogs} />\n </Box>\n </Paper>\n ) : null}\n </Content>\n </Page>\n );\n};\n"],"names":["reactUseAsync","useAsync"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OngoingTask.esm.js","sources":["../../../src/components/OngoingTask/OngoingTask.tsx"],"sourcesContent":["/*\n * Copyright 2023 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 ComponentType,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { Content, ErrorPanel, Header, Page } from '@backstage/core-components';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport Box from '@material-ui/core/Box';\nimport Button from '@material-ui/core/Button';\nimport Paper from '@material-ui/core/Paper';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n scaffolderApiRef,\n ScaffolderTaskOutput,\n useTaskEventStream,\n} from '@backstage/plugin-scaffolder-react';\nimport { selectedTemplateRouteRef } from '../../routes';\nimport {\n AnalyticsContext,\n useAnalytics,\n useApi,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport qs from 'qs';\nimport { ContextMenu } from './ContextMenu';\nimport {\n DefaultTemplateOutputs,\n TaskLogStream,\n TaskSteps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { useAsync } from '@react-hookz/web';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport {\n taskCancelPermission,\n taskCreatePermission,\n taskReadPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { entityPresentationApiRef } from '@backstage/plugin-catalog-react';\nimport { default as reactUseAsync } from 'react-use/esm/useAsync';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nconst useStyles = makeStyles(theme => ({\n contentWrapper: {\n display: 'flex',\n flexDirection: 'column',\n },\n buttonBar: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n cancelButton: {\n marginRight: theme.spacing(1),\n },\n retryButton: {\n marginRight: theme.spacing(1),\n },\n logsVisibilityButton: {\n marginRight: theme.spacing(1),\n },\n}));\n\n/**\n * @public\n */\nexport const OngoingTask = (props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) => {\n // todo(blam): check that task Id actually exists, and that it's valid. otherwise redirect to something more useful.\n const { taskId } = useParams();\n const taskStream = useTaskEventStream(taskId!);\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n return (\n <AnalyticsContext\n attributes={{\n entityRef:\n name &&\n stringifyEntityRef({\n kind: 'template',\n namespace,\n name,\n }),\n taskId,\n }}\n >\n <Page themeId=\"website\">\n <OngoingTaskContent {...props} />\n </Page>\n </AnalyticsContext>\n );\n};\n\nfunction OngoingTaskContent(props: {\n TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n}) {\n const { taskId } = useParams();\n const templateRouteRef = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const analytics = useAnalytics();\n const scaffolderApi = useApi(scaffolderApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const taskStream = useTaskEventStream(taskId!);\n const classes = useStyles();\n const steps = useMemo(\n () =>\n taskStream.task?.spec.steps.map(step => ({\n ...step,\n ...taskStream?.steps?.[step.id],\n })) ?? [],\n [taskStream],\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const [logsVisible, setLogVisibleState] = useState(false);\n const [buttonBarVisible, setButtonBarVisibleState] = useState(true);\n\n // Used dummy string value for `resourceRef` since `allowed` field will always return `false` if `resourceRef` is `undefined`\n const { allowed: canCancelTask } = usePermission({\n permission: taskCancelPermission,\n });\n\n const { allowed: canReadTask } = usePermission({\n permission: taskReadPermission,\n });\n\n const { allowed: canCreateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n // Start Over endpoint requires user to have both read (to grab parameters) and create (to create new task) permissions\n const canStartOver = canReadTask && canCreateTask;\n\n useEffect(() => {\n if (taskStream.error) {\n setLogVisibleState(true);\n }\n }, [taskStream.error]);\n\n useEffect(() => {\n if (taskStream.completed && !taskStream.error) {\n setLogVisibleState(true);\n setButtonBarVisibleState(false);\n }\n }, [taskStream.error, taskStream.completed]);\n\n const { value: presentation } = reactUseAsync(async () => {\n const templateEntityRef = taskStream.task?.spec.templateInfo?.entityRef;\n if (!templateEntityRef) {\n return undefined;\n }\n return entityPresentationApi.forEntity(templateEntityRef).promise;\n }, [entityPresentationApi, taskStream.task?.spec.templateInfo?.entityRef]);\n\n const activeStep = useMemo(() => {\n for (let i = steps.length - 1; i >= 0; i--) {\n if (steps[i].status !== 'open') {\n return i;\n }\n }\n\n return 0;\n }, [steps]);\n\n const isRetryableTask =\n taskStream.task?.spec.EXPERIMENTAL_recovery?.EXPERIMENTAL_strategy ===\n 'startOver';\n\n const canRetry = canReadTask && canCreateTask && isRetryableTask;\n\n const startOver = useCallback(() => {\n const { namespace, name } =\n taskStream.task?.spec.templateInfo?.entity?.metadata ?? {};\n\n const formData = taskStream.task?.spec.parameters ?? {};\n\n if (!namespace || !name) {\n return;\n }\n\n analytics.captureEvent('click', `Task has been started over`);\n\n navigate({\n pathname: templateRouteRef({\n namespace,\n templateName: name,\n }),\n search: `?${qs.stringify({ formData: JSON.stringify(formData) })}`,\n });\n }, [\n analytics,\n navigate,\n taskStream.task?.spec.parameters,\n taskStream.task?.spec.templateInfo?.entity?.metadata,\n templateRouteRef,\n ]);\n\n const [, { execute: triggerRetry }] = useAsync(async () => {\n if (taskId) {\n analytics.captureEvent('retried', 'Template has been retried');\n await scaffolderApi.retry?.(taskId);\n }\n });\n\n const [{ status: cancelStatus }, { execute: triggerCancel }] = useAsync(\n async () => {\n if (taskId) {\n analytics.captureEvent('cancelled', 'Template has been cancelled');\n await scaffolderApi.cancelTask(taskId);\n }\n },\n );\n\n const Outputs = props.TemplateOutputsComponent ?? DefaultTemplateOutputs;\n\n const cancelEnabled = !(taskStream.cancelled || taskStream.completed);\n const isCancelButtonDisabled =\n !cancelEnabled || cancelStatus !== 'not-executed' || !canCancelTask;\n\n return (\n <>\n <Header\n pageTitleOverride={\n presentation\n ? t('ongoingTask.pageTitle.hasTemplateName', {\n templateName: presentation.primaryTitle,\n })\n : t('ongoingTask.pageTitle.noTemplateName')\n }\n title={\n <div>\n {t('ongoingTask.title')}{' '}\n <code>{presentation ? presentation.primaryTitle : ''}</code>\n </div>\n }\n subtitle={t('ongoingTask.subtitle', { taskId: taskId as string })}\n >\n <ContextMenu\n cancelEnabled={cancelEnabled}\n canRetry={canRetry}\n isRetryableTask={isRetryableTask}\n logsVisible={logsVisible}\n buttonBarVisible={buttonBarVisible}\n onStartOver={startOver}\n onRetry={triggerRetry}\n onToggleLogs={setLogVisibleState}\n onToggleButtonBar={setButtonBarVisibleState}\n onCancel={triggerCancel}\n isCancelButtonDisabled={isCancelButtonDisabled}\n />\n </Header>\n <Content className={classes.contentWrapper}>\n {taskStream.error ? (\n <Box paddingBottom={2}>\n <ErrorPanel\n error={taskStream.error}\n titleFormat=\"markdown\"\n title={taskStream.error.message}\n />\n </Box>\n ) : null}\n\n <Box paddingBottom={2}>\n <TaskSteps\n steps={steps}\n activeStep={activeStep}\n isComplete={taskStream.completed}\n isError={Boolean(taskStream.error)}\n />\n </Box>\n\n <Outputs output={taskStream.output} />\n\n {buttonBarVisible ? (\n <Box paddingBottom={2}>\n <Paper>\n <Box padding={2}>\n <div className={classes.buttonBar}>\n <Button\n className={classes.cancelButton}\n disabled={\n !cancelEnabled ||\n (cancelStatus !== 'not-executed' && !isRetryableTask) ||\n !canCancelTask\n }\n onClick={triggerCancel}\n data-testid=\"cancel-button\"\n >\n {t('ongoingTask.cancelButtonTitle')}\n </Button>\n {isRetryableTask && (\n <Button\n className={classes.retryButton}\n disabled={cancelEnabled || !canRetry}\n onClick={triggerRetry}\n data-testid=\"retry-button\"\n >\n {t('ongoingTask.retryButtonTitle')}\n </Button>\n )}\n <Button\n className={classes.logsVisibilityButton}\n color=\"primary\"\n variant=\"outlined\"\n onClick={() => setLogVisibleState(!logsVisible)}\n >\n {logsVisible\n ? t('ongoingTask.hideLogsButtonTitle')\n : t('ongoingTask.showLogsButtonTitle')}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n disabled={cancelEnabled || !canStartOver}\n onClick={startOver}\n data-testid=\"start-over-button\"\n >\n {t('ongoingTask.startOverButtonTitle')}\n </Button>\n </div>\n </Box>\n </Paper>\n </Box>\n ) : null}\n\n {logsVisible ? (\n <Paper style={{ height: '100%' }}>\n <Box padding={2} height=\"100%\">\n <TaskLogStream logs={taskStream.stepLogs} />\n </Box>\n </Paper>\n ) : null}\n </Content>\n </>\n );\n}\n"],"names":["reactUseAsync","useAsync"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder",
|
|
3
|
-
"version": "1.32.0
|
|
3
|
+
"version": "1.32.0",
|
|
4
4
|
"description": "The Backstage plugin that helps you create new things",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -70,21 +70,21 @@
|
|
|
70
70
|
"test": "backstage-cli package test"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@backstage/catalog-client": "1.10.1
|
|
74
|
-
"@backstage/catalog-model": "1.7.4",
|
|
75
|
-
"@backstage/core-compat-api": "0.4.3
|
|
76
|
-
"@backstage/core-components": "0.17.3
|
|
77
|
-
"@backstage/core-plugin-api": "1.10.
|
|
78
|
-
"@backstage/errors": "1.2.7",
|
|
79
|
-
"@backstage/frontend-plugin-api": "0.10.3
|
|
80
|
-
"@backstage/integration": "1.17.0",
|
|
81
|
-
"@backstage/integration-react": "1.2.
|
|
82
|
-
"@backstage/plugin-catalog-common": "1.1.4",
|
|
83
|
-
"@backstage/plugin-catalog-react": "1.19.0
|
|
84
|
-
"@backstage/plugin-permission-react": "0.4.
|
|
85
|
-
"@backstage/plugin-scaffolder-common": "1.5.11",
|
|
86
|
-
"@backstage/plugin-scaffolder-react": "1.
|
|
87
|
-
"@backstage/types": "1.2.1",
|
|
73
|
+
"@backstage/catalog-client": "^1.10.1",
|
|
74
|
+
"@backstage/catalog-model": "^1.7.4",
|
|
75
|
+
"@backstage/core-compat-api": "^0.4.3",
|
|
76
|
+
"@backstage/core-components": "^0.17.3",
|
|
77
|
+
"@backstage/core-plugin-api": "^1.10.8",
|
|
78
|
+
"@backstage/errors": "^1.2.7",
|
|
79
|
+
"@backstage/frontend-plugin-api": "^0.10.3",
|
|
80
|
+
"@backstage/integration": "^1.17.0",
|
|
81
|
+
"@backstage/integration-react": "^1.2.8",
|
|
82
|
+
"@backstage/plugin-catalog-common": "^1.1.4",
|
|
83
|
+
"@backstage/plugin-catalog-react": "^1.19.0",
|
|
84
|
+
"@backstage/plugin-permission-react": "^0.4.35",
|
|
85
|
+
"@backstage/plugin-scaffolder-common": "^1.5.11",
|
|
86
|
+
"@backstage/plugin-scaffolder-react": "^1.17.0",
|
|
87
|
+
"@backstage/types": "^1.2.1",
|
|
88
88
|
"@codemirror/language": "^6.0.0",
|
|
89
89
|
"@codemirror/legacy-modes": "^6.1.0",
|
|
90
90
|
"@codemirror/view": "^6.0.0",
|
|
@@ -117,12 +117,12 @@
|
|
|
117
117
|
"zod-to-json-schema": "^3.20.4"
|
|
118
118
|
},
|
|
119
119
|
"devDependencies": {
|
|
120
|
-
"@backstage/cli": "0.33.0
|
|
121
|
-
"@backstage/core-app-api": "1.17.
|
|
122
|
-
"@backstage/dev-utils": "1.1.11
|
|
123
|
-
"@backstage/plugin-catalog": "1.31.0
|
|
124
|
-
"@backstage/plugin-permission-common": "0.9.0",
|
|
125
|
-
"@backstage/test-utils": "1.7.
|
|
120
|
+
"@backstage/cli": "^0.33.0",
|
|
121
|
+
"@backstage/core-app-api": "^1.17.1",
|
|
122
|
+
"@backstage/dev-utils": "^1.1.11",
|
|
123
|
+
"@backstage/plugin-catalog": "^1.31.0",
|
|
124
|
+
"@backstage/plugin-permission-common": "^0.9.0",
|
|
125
|
+
"@backstage/test-utils": "^1.7.9",
|
|
126
126
|
"@testing-library/dom": "^10.0.0",
|
|
127
127
|
"@testing-library/jest-dom": "^6.0.0",
|
|
128
128
|
"@testing-library/react": "^16.0.0",
|