@backstage/plugin-scaffolder 1.31.1-next.1 → 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 CHANGED
@@ -1,5 +1,64 @@
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
+
34
+ ## 1.32.0-next.2
35
+
36
+ ### Minor Changes
37
+
38
+ - 3c59ece: **New Frontend System Only:**
39
+ The `Scaffolder` plugin is now responsible for providing an entity icon link extension to launch templates from the catalog entity page.
40
+
41
+ ### Patch Changes
42
+
43
+ - b00c160: Remove React import form notification and scaffolder plugin
44
+ - 95a1d72: Added appropriate message when global templating function metadata is absent.
45
+ - Updated dependencies
46
+ - @backstage/core-components@0.17.3-next.0
47
+ - @backstage/plugin-catalog-react@1.19.0-next.2
48
+ - @backstage/frontend-plugin-api@0.10.3-next.1
49
+ - @backstage/integration-react@1.2.7
50
+ - @backstage/plugin-scaffolder-react@1.16.1-next.2
51
+ - @backstage/catalog-client@1.10.1-next.0
52
+ - @backstage/catalog-model@1.7.4
53
+ - @backstage/core-compat-api@0.4.3-next.2
54
+ - @backstage/core-plugin-api@1.10.7
55
+ - @backstage/errors@1.2.7
56
+ - @backstage/integration@1.17.0
57
+ - @backstage/types@1.2.1
58
+ - @backstage/plugin-catalog-common@1.1.4
59
+ - @backstage/plugin-permission-react@0.4.34
60
+ - @backstage/plugin-scaffolder-common@1.5.11
61
+
3
62
  ## 1.31.1-next.1
4
63
 
5
64
  ### Patch 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, { onClick: () => window.open(editUrl, "_blank"), children: [
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 onClick={() => window.open(editUrl, '_blank')}>\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":";;;;;;;;;;;;;;AA6BA,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,QAAA,kBAAA,GAAA,CAAC,QACC,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,QAAS,EAAA,EAAA,OAAA,EAAS,MAAM,MAAO,CAAA,IAAA,CAAK,OAAS,EAAA,QAAQ,CACpD,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;;;;"}
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;;;;"}
@@ -0,0 +1,33 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { DEFAULT_NAMESPACE } from '@backstage/catalog-model';
3
+ import { useApp, useRouteRef } from '@backstage/core-plugin-api';
4
+ import { useEntity } from '@backstage/plugin-catalog-react';
5
+ import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
6
+ import { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';
7
+ import { usePermission } from '@backstage/plugin-permission-react';
8
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
9
+ import { scaffolderTranslationRef } from '../../translation.esm.js';
10
+ import { selectedTemplateRouteRef } from '../../routes.esm.js';
11
+
12
+ function useScaffolderTemplateIconLinkProps() {
13
+ const app = useApp();
14
+ const { entity } = useEntity();
15
+ const templateRoute = useRouteRef(selectedTemplateRouteRef);
16
+ const { t } = useTranslationRef(scaffolderTranslationRef);
17
+ const Icon = app.getSystemIcon("scaffolder") ?? CreateComponentIcon;
18
+ const { allowed: canCreateTemplateTask } = usePermission({
19
+ permission: taskCreatePermission
20
+ });
21
+ return {
22
+ label: t("aboutCard.launchTemplate"),
23
+ icon: /* @__PURE__ */ jsx(Icon, {}),
24
+ disabled: !templateRoute || !canCreateTemplateTask,
25
+ href: templateRoute && templateRoute({
26
+ templateName: entity.metadata.name,
27
+ namespace: entity.metadata.namespace || DEFAULT_NAMESPACE
28
+ })
29
+ };
30
+ }
31
+
32
+ export { useScaffolderTemplateIconLinkProps };
33
+ //# sourceMappingURL=useScaffolderTemplateIconLinkProps.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useScaffolderTemplateIconLinkProps.esm.js","sources":["../../../src/alpha/hooks/useScaffolderTemplateIconLinkProps.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 { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nimport { scaffolderTranslationRef } from '../../translation';\nimport { selectedTemplateRouteRef } from '../../routes';\n\n// Note: If you update this hook, please also update the \"useScaffolderTemplateIconLinkProps\" hook\n// in the \"plugins/catalog/src/components/AboutCard/AboutCard.tsx\" file\n/** @alpha */\nexport function useScaffolderTemplateIconLinkProps() {\n const app = useApp();\n const { entity } = useEntity();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n return {\n label: t('aboutCard.launchTemplate'),\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,kCAAqC,GAAA;AACnD,EAAA,MAAM,MAAM,MAAO,EAAA;AACnB,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,aAAA,GAAgB,YAAY,wBAAwB,CAAA;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,IAAO,GAAA,GAAA,CAAI,aAAc,CAAA,YAAY,CAAK,IAAA,mBAAA;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,qBAAsB,EAAA,GAAI,aAAc,CAAA;AAAA,IACvD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,IACnC,IAAA,sBAAO,IAAK,EAAA,EAAA,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,aAAA,IAAiB,CAAC,qBAAA;AAAA,IAC7B,IAAA,EACE,iBACA,aAAc,CAAA;AAAA,MACZ,YAAA,EAAc,OAAO,QAAS,CAAA,IAAA;AAAA,MAC9B,SAAA,EAAW,MAAO,CAAA,QAAA,CAAS,SAAa,IAAA;AAAA,KACzC;AAAA,GACL;AACF;;;;"}
@@ -2,10 +2,20 @@ import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
2
2
  import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
3
  import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, templatingExtensionsRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from '../routes.esm.js';
4
4
  import { scaffolderApi, scaffolderPage, scaffolderNavItem, repoUrlPickerFormField } from './extensions.esm.js';
5
+ import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
5
6
  import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';
6
7
  import './api/ref.esm.js';
7
8
  import { formDecoratorsApi } from './api/FormDecoratorsApi.esm.js';
9
+ import { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';
10
+ import { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps.esm.js';
8
11
 
12
+ const scaffolderEntityIconLink = EntityIconLinkBlueprint.make({
13
+ name: "launch-template",
14
+ params: {
15
+ filter: isTemplateEntityV1beta3,
16
+ useProps: useScaffolderTemplateIconLinkProps
17
+ }
18
+ });
9
19
  var plugin = createFrontendPlugin({
10
20
  pluginId: "scaffolder",
11
21
  info: { packageJson: () => import('../plugins/scaffolder/package.json.esm.js') },
@@ -26,6 +36,7 @@ var plugin = createFrontendPlugin({
26
36
  scaffolderApi,
27
37
  scaffolderPage,
28
38
  scaffolderNavItem,
39
+ scaffolderEntityIconLink,
29
40
  formDecoratorsApi,
30
41
  formFieldsApi,
31
42
  repoUrlPickerFormField
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.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 */\n\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport {\n rootRouteRef,\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n repoUrlPickerFormField,\n scaffolderNavItem,\n scaffolderPage,\n scaffolderApi,\n} from './extensions';\nimport { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';\nimport { formDecoratorsApi } from './api';\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n info: { packageJson: () => import('../../package.json') },\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderNavItem,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;AAuCA,aAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,YAAA;AAAA,EACV,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAE,EAAA;AAAA,EACxD,QAAQ,sBAAuB,CAAA;AAAA,IAC7B,IAAM,EAAA,YAAA;AAAA,IACN,gBAAkB,EAAA,wBAAA;AAAA,IAClB,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA,eAAA;AAAA,IACT,SAAW,EAAA,0BAAA;AAAA,IACX,IAAM,EAAA,YAAA;AAAA,IACN,oBAAsB,EAAA;AAAA,GACvB,CAAA;AAAA,EACD,gBAAgB,sBAAuB,CAAA;AAAA,IACrC,iBAAmB,EAAA,yBAAA;AAAA,IACnB,WAAa,EAAA;AAAA,GACd,CAAA;AAAA,EACD,UAAY,EAAA;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.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 */\n\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport {\n rootRouteRef,\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n repoUrlPickerFormField,\n scaffolderNavItem,\n scaffolderPage,\n scaffolderApi,\n} from './extensions';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';\nimport { formDecoratorsApi } from './api';\nimport { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps';\n\n/** @alpha */\nconst scaffolderEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'launch-template',\n params: {\n filter: isTemplateEntityV1beta3,\n useProps: useScaffolderTemplateIconLinkProps,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n info: { packageJson: () => import('../../package.json') },\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderNavItem,\n scaffolderEntityIconLink,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;;AA0CA,MAAM,wBAAA,GAA2B,wBAAwB,IAAK,CAAA;AAAA,EAC5D,IAAM,EAAA,iBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,uBAAA;AAAA,IACR,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAGD,aAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,YAAA;AAAA,EACV,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAE,EAAA;AAAA,EACxD,QAAQ,sBAAuB,CAAA;AAAA,IAC7B,IAAM,EAAA,YAAA;AAAA,IACN,gBAAkB,EAAA,wBAAA;AAAA,IAClB,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA,eAAA;AAAA,IACT,SAAW,EAAA,0BAAA;AAAA,IACX,IAAM,EAAA,YAAA;AAAA,IACN,oBAAsB,EAAA;AAAA,GACvB,CAAA;AAAA,EACD,gBAAgB,sBAAuB,CAAA;AAAA,IACrC,iBAAmB,EAAA,yBAAA;AAAA,IACnB,WAAa,EAAA;AAAA,GACd,CAAA;AAAA,EACD,UAAY,EAAA;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -8,6 +8,9 @@ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api'
8
8
  import * as _backstage_plugin_scaffolder_react_alpha from '@backstage/plugin-scaffolder-react/alpha';
9
9
  import { ScaffolderFormDecorator } from '@backstage/plugin-scaffolder-react/alpha';
10
10
  export { ScaffolderFormFieldsApi, formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha';
11
+ import * as _backstage_core_components from '@backstage/core-components';
12
+ import * as _backstage_catalog_model from '@backstage/catalog-model';
13
+ import * as _backstage_plugin_catalog_react_alpha from '@backstage/plugin-catalog-react/alpha';
11
14
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
12
15
 
13
16
  /** @public */
@@ -116,6 +119,7 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
116
119
  readonly "fields.repoUrlPicker.repository.title": "Repositories Available";
117
120
  readonly "fields.repoUrlPicker.repository.description": "The name of the repository";
118
121
  readonly "fields.repoUrlPicker.repository.inputTitle": "Repository";
122
+ readonly "aboutCard.launchTemplate": "Launch Template";
119
123
  readonly "actionsPage.content.emptyState.title": "No information to display";
120
124
  readonly "actionsPage.content.emptyState.description": "There are no actions installed or there was an issue communicating with backend.";
121
125
  readonly "actionsPage.content.searchFieldPlaceholder": "Search for an action";
@@ -178,6 +182,7 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
178
182
  readonly "templatingExtensions.content.functions.schema.arguments": "Arguments";
179
183
  readonly "templatingExtensions.content.functions.examples": "Examples";
180
184
  readonly "templatingExtensions.content.functions.notAvailable": "There are no global template functions defined.";
185
+ readonly "templatingExtensions.content.functions.metadataAbsent": "Function metadata unavailable";
181
186
  readonly "templatingExtensions.title": "Templating Extensions";
182
187
  readonly "templatingExtensions.subtitle": "This is the collection of available templating extensions";
183
188
  readonly "templatingExtensions.pageTitle": "Templating Extensions";
@@ -368,6 +373,30 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
368
373
  factory: _backstage_frontend_plugin_api.AnyApiFactory;
369
374
  };
370
375
  }>;
376
+ "entity-icon-link:scaffolder/launch-template": _backstage_frontend_plugin_api.ExtensionDefinition<{
377
+ kind: "entity-icon-link";
378
+ name: "launch-template";
379
+ config: {
380
+ label: string | undefined;
381
+ title: string | undefined;
382
+ filter: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
383
+ };
384
+ configInput: {
385
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | undefined;
386
+ label?: string | undefined;
387
+ title?: string | undefined;
388
+ };
389
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<(entity: _backstage_catalog_model.Entity) => boolean, "catalog.entity-filter-function", {
390
+ optional: true;
391
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "catalog.entity-filter-expression", {
392
+ optional: true;
393
+ }> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<() => _backstage_core_components.IconLinkVerticalProps, "entity-icon-link-props", {}>;
394
+ inputs: {};
395
+ params: {
396
+ useProps: () => Omit<_backstage_core_components.IconLinkVerticalProps, "color">;
397
+ filter?: _backstage_plugin_catalog_react_alpha.EntityPredicate | ((entity: _backstage_catalog_model.Entity) => boolean);
398
+ };
399
+ }>;
371
400
  "nav-item:scaffolder": _backstage_frontend_plugin_api.ExtensionDefinition<{
372
401
  kind: "nav-item";
373
402
  name: undefined;
@@ -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 { taskCancelPermission, taskReadPermission, taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';
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: cancel,
135
- disabled: !cancelEnabled || cancelStatus !== "not-executed" || !canCancelTask,
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":"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"}
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, jsx } from 'react/jsx-runtime';
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 { scaffolderApiRef, useTaskEventStream } from '@backstage/plugin-scaffolder-react';
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 [{ status: _ }, { execute: triggerRetry }] = useAsync$1(async () => {
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
- return /* @__PURE__ */ jsxs(Page, { themeId: "website", children: [
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
- taskId
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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"}
@@ -7,7 +7,7 @@ import Box from '@material-ui/core/Box';
7
7
  import Typography from '@material-ui/core/Typography';
8
8
  import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
9
9
  import classNames from 'classnames';
10
- import React, { useState } from 'react';
10
+ import { cloneElement, useState, Fragment as Fragment$1 } from 'react';
11
11
  import { RenderSchema } from '../RenderSchema/RenderSchema.esm.js';
12
12
  import { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js';
13
13
  import { inspectFunctionArgSchema } from './functionArgs.esm.js';
@@ -29,7 +29,7 @@ const FilterDetailContent = ({
29
29
  expanded,
30
30
  headings: [/* @__PURE__ */ jsx(Typography, { variant: "h6", component: "h4" })]
31
31
  };
32
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
32
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
33
33
  filter.description && /* @__PURE__ */ jsx(MarkdownContent, { content: filter.description }),
34
34
  /* @__PURE__ */ jsxs(Box, { pb: 2, children: [
35
35
  /* @__PURE__ */ jsx(Typography, { variant: "h5", component: "h3", children: t("templatingExtensions.content.filters.schema.input") }),
@@ -49,7 +49,7 @@ const FilterDetailContent = ({
49
49
  /* @__PURE__ */ jsx(Typography, { variant: "h5", component: "h3", children: t("templatingExtensions.content.filters.schema.arguments") }),
50
50
  schema.arguments.map((arg, i) => {
51
51
  const [argSchema, required] = inspectFunctionArgSchema(arg);
52
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
52
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
53
53
  /* @__PURE__ */ jsx(
54
54
  "div",
55
55
  {
@@ -120,7 +120,7 @@ const TemplateFilters = ({
120
120
  children: name
121
121
  }
122
122
  ),
123
- React.cloneElement(baseLink, {
123
+ cloneElement(baseLink, {
124
124
  to: `${baseLink.props.to}#${fragment}`
125
125
  }),
126
126
  /* @__PURE__ */ jsx(FilterDetailContent, { ...{ t, classes, name, filter } })
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateFilters.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateFilters.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 */\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport React, { ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { StyleClasses, TranslationMessages } from './types';\n\nconst FilterDetailContent = ({\n t,\n classes,\n name,\n filter,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: ClassNameMap;\n name: string;\n filter: TemplateFilter;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(filter).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.filters.metadataAbsent')}\n </Typography>\n );\n }\n const schema = filter.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <React.Fragment key={`${name}.detail`}>\n {filter.description && <MarkdownContent content={filter.description} />}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.input')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.input ?? {}}\n />\n </Box>\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <React.Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography variant=\"h6\" component=\"h4\">\n {`[${i}]`}\n </Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n headings: [<Typography variant=\"h6\" component=\"h5\" />],\n }}\n schema={argSchema}\n />\n </React.Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {filter.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={filter.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </React.Fragment>\n );\n};\n\nexport const TemplateFilters = ({\n t,\n classes,\n filters,\n baseLink,\n selectedItem,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: StyleClasses;\n filters: ListTemplatingExtensionsResponse['filters'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'filter') {\n return <></>;\n }\n if (!Object.keys(filters).length) {\n return (\n <div data-testid=\"no-filters\">\n {t('templatingExtensions.content.filters.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"filters\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: filters[selectedItem.name] }\n : filters,\n ).map(([name, filter]) => {\n const fragment = renderFragment({ kind: 'filter', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {React.cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FilterDetailContent {...{ t, classes, name, filter }} />\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateFilters.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateFilters.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 */\nimport { Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { StyleClasses, TranslationMessages } from './types';\n\nconst FilterDetailContent = ({\n t,\n classes,\n name,\n filter,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: ClassNameMap;\n name: string;\n filter: TemplateFilter;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(filter).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.filters.metadataAbsent')}\n </Typography>\n );\n }\n const schema = filter.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Fragment key={`${name}.detail`}>\n {filter.description && <MarkdownContent content={filter.description} />}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.input')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.input ?? {}}\n />\n </Box>\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography variant=\"h6\" component=\"h4\">\n {`[${i}]`}\n </Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n headings: [<Typography variant=\"h6\" component=\"h5\" />],\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {filter.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.filters.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={filter.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateFilters = ({\n t,\n classes,\n filters,\n baseLink,\n selectedItem,\n}: {\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n classes: StyleClasses;\n filters: ListTemplatingExtensionsResponse['filters'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'filter') {\n return <></>;\n }\n if (!Object.keys(filters).length) {\n return (\n <div data-testid=\"no-filters\">\n {t('templatingExtensions.content.filters.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"filters\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: filters[selectedItem.name] }\n : filters,\n ).map(([name, filter]) => {\n const fragment = renderFragment({ kind: 'filter', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FilterDetailContent {...{ t, classes, name, filter }} />\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
@@ -7,7 +7,7 @@ import Box from '@material-ui/core/Box';
7
7
  import Typography from '@material-ui/core/Typography';
8
8
  import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
9
9
  import classNames from 'classnames';
10
- import React, { useState } from 'react';
10
+ import { cloneElement, useState, Fragment as Fragment$1 } from 'react';
11
11
  import { RenderSchema } from '../RenderSchema/RenderSchema.esm.js';
12
12
  import { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js';
13
13
  import { inspectFunctionArgSchema } from './functionArgs.esm.js';
@@ -21,7 +21,14 @@ const FunctionDetailContent = ({
21
21
  }) => {
22
22
  const expanded = useState({});
23
23
  if (!Object.keys(fn).length) {
24
- return /* @__PURE__ */ jsx(Typography, { style: { fontStyle: "italic" }, children: t("templatingExtensions.content.functions.notAvailable") });
24
+ return /* @__PURE__ */ jsx(
25
+ Typography,
26
+ {
27
+ style: { fontStyle: "italic" },
28
+ "data-testid": `${name}.metadataAbsent`,
29
+ children: t("templatingExtensions.content.functions.metadataAbsent")
30
+ }
31
+ );
25
32
  }
26
33
  const schema = fn.schema;
27
34
  const partialSchemaRenderContext = {
@@ -29,13 +36,13 @@ const FunctionDetailContent = ({
29
36
  expanded,
30
37
  headings: [/* @__PURE__ */ jsx(Typography, { variant: "h6", component: "h4" })]
31
38
  };
32
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
39
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
33
40
  fn.description && /* @__PURE__ */ jsx(MarkdownContent, { content: fn.description }),
34
41
  schema?.arguments?.length && /* @__PURE__ */ jsxs(Box, { pb: 2, children: [
35
42
  /* @__PURE__ */ jsx(Typography, { variant: "h5", component: "h3", children: t("templatingExtensions.content.functions.schema.arguments") }),
36
43
  schema.arguments.map((arg, i) => {
37
44
  const [argSchema, required] = inspectFunctionArgSchema(arg);
38
- return /* @__PURE__ */ jsxs(React.Fragment, { children: [
45
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
39
46
  /* @__PURE__ */ jsx(
40
47
  "div",
41
48
  {
@@ -113,7 +120,7 @@ const TemplateGlobalFunctions = ({
113
120
  children: name
114
121
  }
115
122
  ),
116
- React.cloneElement(baseLink, {
123
+ cloneElement(baseLink, {
117
124
  to: `${baseLink.props.to}#${fragment}`
118
125
  }),
119
126
  /* @__PURE__ */ jsx(FunctionDetailContent, { ...{ classes, name, fn, t } })
@@ -148,7 +155,7 @@ const TemplateGlobalValues = ({
148
155
  children: name
149
156
  }
150
157
  ),
151
- React.cloneElement(baseLink, {
158
+ cloneElement(baseLink, {
152
159
  to: `${baseLink.props.to}#${fragment}`
153
160
  }),
154
161
  gv.description && /* @__PURE__ */ jsx(MarkdownContent, { content: gv.description }),
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateGlobals.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateGlobals.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 */\nimport { CodeSnippet, Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateGlobalFunction,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport React, { ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { TranslationMessages } from './types';\n\nconst FunctionDetailContent = ({\n classes,\n name,\n fn,\n t,\n}: {\n classes: ClassNameMap;\n name: string;\n fn: TemplateGlobalFunction;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(fn).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.functions.notAvailable')}\n </Typography>\n );\n }\n const schema = fn.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <React.Fragment key={`${name}.detail`}>\n {fn.description && <MarkdownContent content={fn.description} />}\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <React.Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography\n variant=\"h6\"\n component=\"h4\"\n >{`[${i}]`}</Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n headings: [<Typography variant=\"h6\" component=\"h5\" />],\n }}\n schema={argSchema}\n />\n </React.Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {fn.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={fn.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </React.Fragment>\n );\n};\n\nexport const TemplateGlobalFunctions = ({\n classes,\n functions,\n t,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n functions: ListTemplatingExtensionsResponse['globals']['functions'];\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'function') {\n return <></>;\n }\n if (!Object.keys(functions).length) {\n return (\n <div data-testid=\"no-functions\">\n {t('templatingExtensions.content.functions.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"functions\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: functions[selectedItem.name] }\n : functions,\n ).map(([name, fn]) => {\n const fragment = renderFragment({ kind: 'function', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {React.cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FunctionDetailContent {...{ classes, name, fn, t }} />\n </Box>\n );\n })}\n </div>\n );\n};\n\nexport const TemplateGlobalValues = ({\n classes,\n t,\n values,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n values: ListTemplatingExtensionsResponse['globals']['values'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'value') {\n return <></>;\n }\n if (!Object.keys(values).length) {\n return (\n <div data-testid=\"no-values\">\n {t('templatingExtensions.content.values.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"values\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: values[selectedItem.name] }\n : values,\n ).map(([name, gv]) => {\n const fragment = renderFragment({ kind: 'value', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {React.cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n {gv.description && <MarkdownContent content={gv.description} />}\n <Box padding={1} data-testid={`${name}.value`}>\n <CodeSnippet\n text={JSON.stringify(gv.value, null, 2)}\n showCopyCodeButton\n language=\"json\"\n />\n </Box>\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateGlobals.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateGlobals.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 */\nimport { CodeSnippet, Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateGlobalFunction,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport { cloneElement, Fragment, ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { TranslationMessages } from './types';\n\nconst FunctionDetailContent = ({\n classes,\n name,\n fn,\n t,\n}: {\n classes: ClassNameMap;\n name: string;\n fn: TemplateGlobalFunction;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(fn).length) {\n return (\n <Typography\n style={{ fontStyle: 'italic' }}\n data-testid={`${name}.metadataAbsent`}\n >\n {t('templatingExtensions.content.functions.metadataAbsent')}\n </Typography>\n );\n }\n const schema = fn.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Fragment key={`${name}.detail`}>\n {fn.description && <MarkdownContent content={fn.description} />}\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography\n variant=\"h6\"\n component=\"h4\"\n >{`[${i}]`}</Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n headings: [<Typography variant=\"h6\" component=\"h5\" />],\n }}\n schema={argSchema}\n />\n </Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {fn.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={fn.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Fragment>\n );\n};\n\nexport const TemplateGlobalFunctions = ({\n classes,\n functions,\n t,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n functions: ListTemplatingExtensionsResponse['globals']['functions'];\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'function') {\n return <></>;\n }\n if (!Object.keys(functions).length) {\n return (\n <div data-testid=\"no-functions\">\n {t('templatingExtensions.content.functions.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"functions\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: functions[selectedItem.name] }\n : functions,\n ).map(([name, fn]) => {\n const fragment = renderFragment({ kind: 'function', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FunctionDetailContent {...{ classes, name, fn, t }} />\n </Box>\n );\n })}\n </div>\n );\n};\n\nexport const TemplateGlobalValues = ({\n classes,\n t,\n values,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n values: ListTemplatingExtensionsResponse['globals']['values'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'value') {\n return <></>;\n }\n if (!Object.keys(values).length) {\n return (\n <div data-testid=\"no-values\">\n {t('templatingExtensions.content.values.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"values\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: values[selectedItem.name] }\n : values,\n ).map(([name, gv]) => {\n const fragment = renderFragment({ kind: 'value', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n {gv.description && <MarkdownContent content={gv.description} />}\n <Box padding={1} data-testid={`${name}.value`}>\n <CodeSnippet\n text={JSON.stringify(gv.value, null, 2)}\n showCopyCodeButton\n language=\"json\"\n />\n </Box>\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":["Fragment"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  var name = "@backstage/plugin-scaffolder";
2
- var version = "1.31.1-next.1";
2
+ var version = "1.32.0";
3
3
  var description = "The Backstage plugin that helps you create new things";
4
4
  var backstage = {
5
5
  role: "frontend-plugin",
@@ -3,6 +3,9 @@ import { createTranslationRef } from '@backstage/core-plugin-api/alpha';
3
3
  const scaffolderTranslationRef = createTranslationRef({
4
4
  id: "scaffolder",
5
5
  messages: {
6
+ aboutCard: {
7
+ launchTemplate: "Launch Template"
8
+ },
6
9
  actionsPage: {
7
10
  title: "Installed actions",
8
11
  pageTitle: "Create a New Component",
@@ -200,6 +203,7 @@ const scaffolderTranslationRef = createTranslationRef({
200
203
  functions: {
201
204
  title: "Functions",
202
205
  notAvailable: "There are no global template functions defined.",
206
+ metadataAbsent: "Function metadata unavailable",
203
207
  schema: {
204
208
  arguments: "Arguments",
205
209
  output: "Output"
@@ -1 +1 @@
1
- {"version":3,"file":"translation.esm.js","sources":["../src/translation.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 { createTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @alpha */\nexport const scaffolderTranslationRef = createTranslationRef({\n id: 'scaffolder',\n messages: {\n actionsPage: {\n title: 'Installed actions',\n pageTitle: 'Create a New Component',\n subtitle: 'This is the collection of all installed actions',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no actions installed or there was an issue communicating with backend.',\n },\n searchFieldPlaceholder: 'Search for an action',\n },\n action: {\n input: 'Input',\n output: 'Output',\n examples: 'Examples',\n },\n },\n fields: {\n entityNamePicker: {\n title: 'Name',\n description: 'Unique name of the component',\n },\n entityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n entityTagsPicker: {\n title: 'Tags',\n description:\n \"Add any relevant tags, hit 'Enter' to add new tags. Valid format: [a-z0-9+#] separated by [-], at most 63 characters\",\n },\n multiEntityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n myGroupsPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n ownedEntityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n ownerPicker: {\n title: 'Owner',\n description: 'The owner of the component',\n },\n azureRepoPicker: {\n organization: {\n title: 'Organization',\n description: 'The Organization that this repo will belong to',\n },\n project: {\n title: 'Project',\n description: 'The Project that this repo will belong to',\n },\n },\n bitbucketRepoPicker: {\n workspaces: {\n title: 'Allowed Workspaces',\n inputTitle: 'Workspaces',\n description: 'The Workspace that this repo will belong to',\n },\n project: {\n title: 'Allowed Projects',\n inputTitle: 'Projects',\n description: 'The Project that this repo will belong to',\n },\n },\n gerritRepoPicker: {\n owner: {\n title: 'Owner',\n description: 'The owner of the project (optional)',\n },\n parent: {\n title: 'Parent',\n description: 'The project parent that the repo will belong to',\n },\n },\n giteaRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'Gitea namespace where this repository will belong to. It can be the name of organization, group, subgroup, user, or the project.',\n },\n },\n githubRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'The organization, user or project that this repo will belong to',\n },\n },\n gitlabRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'GitLab namespace where this repository will belong to. It can be the name of organization, group, subgroup, user, or the project.',\n },\n },\n repoUrlPicker: {\n host: {\n title: 'Host',\n description: 'The host where the repository will be created',\n },\n repository: {\n title: 'Repositories Available',\n inputTitle: 'Repository',\n description: 'The name of the repository',\n },\n },\n },\n listTaskPage: {\n title: 'List template tasks',\n pageTitle: 'Templates Tasks',\n subtitle: 'All tasks that have been started',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no tasks or there was an issue communicating with backend.',\n },\n tableTitle: 'Tasks',\n tableCell: {\n taskID: 'Task ID',\n template: 'Template',\n created: 'Created',\n owner: 'Owner',\n status: 'Status',\n },\n },\n },\n ownerListPicker: {\n title: 'Task Owner',\n options: {\n owned: 'Owned',\n all: 'All',\n },\n },\n ongoingTask: {\n title: 'Run of',\n pageTitle: {\n hasTemplateName: 'Run of {{templateName}}',\n noTemplateName: 'Scaffolder Run',\n },\n subtitle: 'Task {{taskId}}',\n cancelButtonTitle: 'Cancel',\n retryButtonTitle: 'Retry',\n startOverButtonTitle: 'Start Over',\n hideLogsButtonTitle: 'Hide Logs',\n showLogsButtonTitle: 'Show Logs',\n contextMenu: {\n hideLogs: 'Hide Logs',\n showLogs: 'Show Logs',\n hideButtonBar: 'Hide Button Bar',\n retry: 'Retry',\n showButtonBar: 'Show Button Bar',\n startOver: 'Start Over',\n cancel: 'Cancel',\n },\n },\n templateEditorForm: {\n stepper: {\n emptyText: 'There are no spec parameters in the template to preview.',\n },\n },\n renderSchema: {\n tableCell: {\n name: 'Name',\n title: 'Title',\n description: 'Description',\n type: 'Type',\n },\n undefined: 'No schema defined',\n },\n templatingExtensions: {\n title: 'Templating Extensions',\n pageTitle: 'Templating Extensions',\n subtitle: 'This is the collection of available templating extensions',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no templating extensions available or there was an issue communicating with the backend.',\n },\n searchFieldPlaceholder: 'Search for an extension',\n filters: {\n title: 'Filters',\n notAvailable: 'There are no template filters defined.',\n metadataAbsent: 'Filter metadata unavailable',\n schema: {\n input: 'Input',\n arguments: 'Arguments',\n output: 'Output',\n },\n examples: 'Examples',\n },\n functions: {\n title: 'Functions',\n notAvailable: 'There are no global template functions defined.',\n schema: {\n arguments: 'Arguments',\n output: 'Output',\n },\n examples: 'Examples',\n },\n values: {\n title: 'Values',\n notAvailable: 'There are no global template values defined.',\n },\n },\n },\n templateTypePicker: {\n title: 'Categories',\n },\n templateIntroPage: {\n title: 'Manage Templates',\n subtitle:\n 'Edit, preview, and try out templates, forms, and custom fields',\n },\n templateFormPage: {\n title: 'Template Editor',\n subtitle: 'Edit, preview, and try out templates forms',\n },\n templateCustomFieldPage: {\n title: 'Custom Field Explorer',\n subtitle: 'Edit, preview, and try out custom fields',\n },\n templateEditorPage: {\n title: 'Template Editor',\n subtitle: 'Edit, preview, and try out templates and template forms',\n dryRunResults: {\n title: 'Dry-run results',\n },\n dryRunResultsList: {\n title: 'Result {{resultId}}',\n downloadButtonTitle: 'Download as .zip',\n deleteButtonTitle: 'Delete result',\n },\n dryRunResultsView: {\n tab: {\n files: 'Files',\n log: 'Log',\n output: 'Output',\n },\n },\n taskStatusStepper: {\n skippedStepTitle: 'Skipped',\n },\n customFieldExplorer: {\n selectFieldLabel: 'Choose Custom Field Extension',\n fieldForm: {\n title: 'Field Options',\n applyButtonTitle: 'Apply',\n },\n fieldPreview: {\n title: 'Field Preview',\n },\n preview: {\n title: 'Template Spec',\n },\n },\n templateEditorBrowser: {\n closeConfirmMessage: 'Are you sure? Unsaved changes will be lost',\n saveIconTooltip: 'Save all files',\n reloadIconTooltip: 'Reload directory',\n closeIconTooltip: 'Close directory',\n },\n templateEditorIntro: {\n title: 'Get started by choosing one of the options below',\n loadLocal: {\n title: 'Load Template Directory',\n description:\n 'Load a local template directory, allowing you to both edit and try executing your own template.',\n unsupportedTooltip:\n 'Only supported in some Chromium-based browsers with the page loaded over HTTPS',\n },\n createLocal: {\n title: 'Create New Template',\n description:\n 'Create a local template directory, allowing you to both edit and try executing your own template.',\n unsupportedTooltip:\n 'Only supported in some Chromium-based browsers with the page loaded over HTTPS',\n },\n formEditor: {\n title: 'Template Form Playground',\n description:\n 'Preview and edit a template form, either using a sample template or by loading a template from the catalog.',\n },\n fieldExplorer: {\n title: 'Custom Field Explorer',\n description:\n 'View and play around with available installed custom field extensions.',\n },\n },\n templateEditorTextArea: {\n saveIconTooltip: 'Save file',\n refreshIconTooltip: 'Reload file',\n emptyStateParagraph: 'Please select an action on the file menu.',\n },\n templateFormPreviewer: {\n title: 'Load Existing Template',\n },\n },\n templateListPage: {\n title: 'Create a new component',\n subtitle:\n 'Create new software components using standard templates in your organization',\n pageTitle: 'Create a new component',\n templateGroups: {\n defaultTitle: 'Templates',\n otherTitle: 'Other Templates',\n },\n contentHeader: {\n registerExistingButtonTitle: 'Register Existing Component',\n supportButtonTitle:\n 'Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).',\n },\n additionalLinksForEntity: {\n viewTechDocsTitle: 'View TechDocs',\n },\n },\n templateWizardPage: {\n title: 'Create a new component',\n subtitle:\n 'Create new software components using standard templates in your organization',\n pageTitle: 'Create a new component',\n pageContextMenu: {\n editConfigurationTitle: 'Edit Configuration',\n },\n },\n templateEditorToolbar: {\n customFieldExplorerTooltip: 'Custom Fields Explorer',\n installedActionsDocumentationTooltip: 'Installed Actions Documentation',\n templatingExtensionsDocumentationTooltip:\n 'Templating Extensions Documentation',\n addToCatalogButton: 'Publish',\n addToCatalogDialogTitle: 'Publish changes',\n addToCatalogDialogContent: {\n stepsIntroduction:\n 'Follow the instructions below to create or update a template:',\n stepsListItems:\n 'Save the template files in a local directory\\nCreate a pull request to a new or existing git repository\\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog',\n },\n addToCatalogDialogActions: {\n documentationButton: 'Go to the documentation',\n documentationUrl:\n 'https://backstage.io/docs/features/software-templates/adding-templates/',\n },\n },\n templateEditorToolbarFileMenu: {\n button: 'File',\n options: {\n openDirectory: 'Open template directory',\n createDirectory: 'Create template directory',\n closeEditor: 'Close template editor',\n },\n },\n templateEditorToolbarTemplatesMenu: {\n button: 'Templates',\n },\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"translation.esm.js","sources":["../src/translation.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 { createTranslationRef } from '@backstage/core-plugin-api/alpha';\n\n/** @alpha */\nexport const scaffolderTranslationRef = createTranslationRef({\n id: 'scaffolder',\n messages: {\n aboutCard: {\n launchTemplate: 'Launch Template',\n },\n actionsPage: {\n title: 'Installed actions',\n pageTitle: 'Create a New Component',\n subtitle: 'This is the collection of all installed actions',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no actions installed or there was an issue communicating with backend.',\n },\n searchFieldPlaceholder: 'Search for an action',\n },\n action: {\n input: 'Input',\n output: 'Output',\n examples: 'Examples',\n },\n },\n fields: {\n entityNamePicker: {\n title: 'Name',\n description: 'Unique name of the component',\n },\n entityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n entityTagsPicker: {\n title: 'Tags',\n description:\n \"Add any relevant tags, hit 'Enter' to add new tags. Valid format: [a-z0-9+#] separated by [-], at most 63 characters\",\n },\n multiEntityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n myGroupsPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n ownedEntityPicker: {\n title: 'Entity',\n description: 'An entity from the catalog',\n },\n ownerPicker: {\n title: 'Owner',\n description: 'The owner of the component',\n },\n azureRepoPicker: {\n organization: {\n title: 'Organization',\n description: 'The Organization that this repo will belong to',\n },\n project: {\n title: 'Project',\n description: 'The Project that this repo will belong to',\n },\n },\n bitbucketRepoPicker: {\n workspaces: {\n title: 'Allowed Workspaces',\n inputTitle: 'Workspaces',\n description: 'The Workspace that this repo will belong to',\n },\n project: {\n title: 'Allowed Projects',\n inputTitle: 'Projects',\n description: 'The Project that this repo will belong to',\n },\n },\n gerritRepoPicker: {\n owner: {\n title: 'Owner',\n description: 'The owner of the project (optional)',\n },\n parent: {\n title: 'Parent',\n description: 'The project parent that the repo will belong to',\n },\n },\n giteaRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'Gitea namespace where this repository will belong to. It can be the name of organization, group, subgroup, user, or the project.',\n },\n },\n githubRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'The organization, user or project that this repo will belong to',\n },\n },\n gitlabRepoPicker: {\n owner: {\n title: 'Owner Available',\n inputTitle: 'Owner',\n description:\n 'GitLab namespace where this repository will belong to. It can be the name of organization, group, subgroup, user, or the project.',\n },\n },\n repoUrlPicker: {\n host: {\n title: 'Host',\n description: 'The host where the repository will be created',\n },\n repository: {\n title: 'Repositories Available',\n inputTitle: 'Repository',\n description: 'The name of the repository',\n },\n },\n },\n listTaskPage: {\n title: 'List template tasks',\n pageTitle: 'Templates Tasks',\n subtitle: 'All tasks that have been started',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no tasks or there was an issue communicating with backend.',\n },\n tableTitle: 'Tasks',\n tableCell: {\n taskID: 'Task ID',\n template: 'Template',\n created: 'Created',\n owner: 'Owner',\n status: 'Status',\n },\n },\n },\n ownerListPicker: {\n title: 'Task Owner',\n options: {\n owned: 'Owned',\n all: 'All',\n },\n },\n ongoingTask: {\n title: 'Run of',\n pageTitle: {\n hasTemplateName: 'Run of {{templateName}}',\n noTemplateName: 'Scaffolder Run',\n },\n subtitle: 'Task {{taskId}}',\n cancelButtonTitle: 'Cancel',\n retryButtonTitle: 'Retry',\n startOverButtonTitle: 'Start Over',\n hideLogsButtonTitle: 'Hide Logs',\n showLogsButtonTitle: 'Show Logs',\n contextMenu: {\n hideLogs: 'Hide Logs',\n showLogs: 'Show Logs',\n hideButtonBar: 'Hide Button Bar',\n retry: 'Retry',\n showButtonBar: 'Show Button Bar',\n startOver: 'Start Over',\n cancel: 'Cancel',\n },\n },\n templateEditorForm: {\n stepper: {\n emptyText: 'There are no spec parameters in the template to preview.',\n },\n },\n renderSchema: {\n tableCell: {\n name: 'Name',\n title: 'Title',\n description: 'Description',\n type: 'Type',\n },\n undefined: 'No schema defined',\n },\n templatingExtensions: {\n title: 'Templating Extensions',\n pageTitle: 'Templating Extensions',\n subtitle: 'This is the collection of available templating extensions',\n content: {\n emptyState: {\n title: 'No information to display',\n description:\n 'There are no templating extensions available or there was an issue communicating with the backend.',\n },\n searchFieldPlaceholder: 'Search for an extension',\n filters: {\n title: 'Filters',\n notAvailable: 'There are no template filters defined.',\n metadataAbsent: 'Filter metadata unavailable',\n schema: {\n input: 'Input',\n arguments: 'Arguments',\n output: 'Output',\n },\n examples: 'Examples',\n },\n functions: {\n title: 'Functions',\n notAvailable: 'There are no global template functions defined.',\n metadataAbsent: 'Function metadata unavailable',\n schema: {\n arguments: 'Arguments',\n output: 'Output',\n },\n examples: 'Examples',\n },\n values: {\n title: 'Values',\n notAvailable: 'There are no global template values defined.',\n },\n },\n },\n templateTypePicker: {\n title: 'Categories',\n },\n templateIntroPage: {\n title: 'Manage Templates',\n subtitle:\n 'Edit, preview, and try out templates, forms, and custom fields',\n },\n templateFormPage: {\n title: 'Template Editor',\n subtitle: 'Edit, preview, and try out templates forms',\n },\n templateCustomFieldPage: {\n title: 'Custom Field Explorer',\n subtitle: 'Edit, preview, and try out custom fields',\n },\n templateEditorPage: {\n title: 'Template Editor',\n subtitle: 'Edit, preview, and try out templates and template forms',\n dryRunResults: {\n title: 'Dry-run results',\n },\n dryRunResultsList: {\n title: 'Result {{resultId}}',\n downloadButtonTitle: 'Download as .zip',\n deleteButtonTitle: 'Delete result',\n },\n dryRunResultsView: {\n tab: {\n files: 'Files',\n log: 'Log',\n output: 'Output',\n },\n },\n taskStatusStepper: {\n skippedStepTitle: 'Skipped',\n },\n customFieldExplorer: {\n selectFieldLabel: 'Choose Custom Field Extension',\n fieldForm: {\n title: 'Field Options',\n applyButtonTitle: 'Apply',\n },\n fieldPreview: {\n title: 'Field Preview',\n },\n preview: {\n title: 'Template Spec',\n },\n },\n templateEditorBrowser: {\n closeConfirmMessage: 'Are you sure? Unsaved changes will be lost',\n saveIconTooltip: 'Save all files',\n reloadIconTooltip: 'Reload directory',\n closeIconTooltip: 'Close directory',\n },\n templateEditorIntro: {\n title: 'Get started by choosing one of the options below',\n loadLocal: {\n title: 'Load Template Directory',\n description:\n 'Load a local template directory, allowing you to both edit and try executing your own template.',\n unsupportedTooltip:\n 'Only supported in some Chromium-based browsers with the page loaded over HTTPS',\n },\n createLocal: {\n title: 'Create New Template',\n description:\n 'Create a local template directory, allowing you to both edit and try executing your own template.',\n unsupportedTooltip:\n 'Only supported in some Chromium-based browsers with the page loaded over HTTPS',\n },\n formEditor: {\n title: 'Template Form Playground',\n description:\n 'Preview and edit a template form, either using a sample template or by loading a template from the catalog.',\n },\n fieldExplorer: {\n title: 'Custom Field Explorer',\n description:\n 'View and play around with available installed custom field extensions.',\n },\n },\n templateEditorTextArea: {\n saveIconTooltip: 'Save file',\n refreshIconTooltip: 'Reload file',\n emptyStateParagraph: 'Please select an action on the file menu.',\n },\n templateFormPreviewer: {\n title: 'Load Existing Template',\n },\n },\n templateListPage: {\n title: 'Create a new component',\n subtitle:\n 'Create new software components using standard templates in your organization',\n pageTitle: 'Create a new component',\n templateGroups: {\n defaultTitle: 'Templates',\n otherTitle: 'Other Templates',\n },\n contentHeader: {\n registerExistingButtonTitle: 'Register Existing Component',\n supportButtonTitle:\n 'Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).',\n },\n additionalLinksForEntity: {\n viewTechDocsTitle: 'View TechDocs',\n },\n },\n templateWizardPage: {\n title: 'Create a new component',\n subtitle:\n 'Create new software components using standard templates in your organization',\n pageTitle: 'Create a new component',\n pageContextMenu: {\n editConfigurationTitle: 'Edit Configuration',\n },\n },\n templateEditorToolbar: {\n customFieldExplorerTooltip: 'Custom Fields Explorer',\n installedActionsDocumentationTooltip: 'Installed Actions Documentation',\n templatingExtensionsDocumentationTooltip:\n 'Templating Extensions Documentation',\n addToCatalogButton: 'Publish',\n addToCatalogDialogTitle: 'Publish changes',\n addToCatalogDialogContent: {\n stepsIntroduction:\n 'Follow the instructions below to create or update a template:',\n stepsListItems:\n 'Save the template files in a local directory\\nCreate a pull request to a new or existing git repository\\nIf the template already exists, the changes will be reflected in the software catalog once the pull request gets merged\\nBut if you are creating a new template, follow the documentation linked below to register the new template repository in software catalog',\n },\n addToCatalogDialogActions: {\n documentationButton: 'Go to the documentation',\n documentationUrl:\n 'https://backstage.io/docs/features/software-templates/adding-templates/',\n },\n },\n templateEditorToolbarFileMenu: {\n button: 'File',\n options: {\n openDirectory: 'Open template directory',\n createDirectory: 'Create template directory',\n closeEditor: 'Close template editor',\n },\n },\n templateEditorToolbarTemplatesMenu: {\n button: 'Templates',\n },\n },\n});\n"],"names":[],"mappings":";;AAkBO,MAAM,2BAA2B,oBAAqB,CAAA;AAAA,EAC3D,EAAI,EAAA,YAAA;AAAA,EACJ,QAAU,EAAA;AAAA,IACR,SAAW,EAAA;AAAA,MACT,cAAgB,EAAA;AAAA,KAClB;AAAA,IACA,WAAa,EAAA;AAAA,MACX,KAAO,EAAA,mBAAA;AAAA,MACP,SAAW,EAAA,wBAAA;AAAA,MACX,QAAU,EAAA,iDAAA;AAAA,MACV,OAAS,EAAA;AAAA,QACP,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,2BAAA;AAAA,UACP,WACE,EAAA;AAAA,SACJ;AAAA,QACA,sBAAwB,EAAA;AAAA,OAC1B;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,QAAA;AAAA,QACR,QAAU,EAAA;AAAA;AACZ,KACF;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,gBAAkB,EAAA;AAAA,QAChB,KAAO,EAAA,MAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,YAAc,EAAA;AAAA,QACZ,KAAO,EAAA,QAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,KAAO,EAAA,MAAA;AAAA,QACP,WACE,EAAA;AAAA,OACJ;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,KAAO,EAAA,QAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,KAAO,EAAA,QAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,KAAO,EAAA,QAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,WAAa,EAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,WAAa,EAAA;AAAA,OACf;AAAA,MACA,eAAiB,EAAA;AAAA,QACf,YAAc,EAAA;AAAA,UACZ,KAAO,EAAA,cAAA;AAAA,UACP,WAAa,EAAA;AAAA,SACf;AAAA,QACA,OAAS,EAAA;AAAA,UACP,KAAO,EAAA,SAAA;AAAA,UACP,WAAa,EAAA;AAAA;AACf,OACF;AAAA,MACA,mBAAqB,EAAA;AAAA,QACnB,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,oBAAA;AAAA,UACP,UAAY,EAAA,YAAA;AAAA,UACZ,WAAa,EAAA;AAAA,SACf;AAAA,QACA,OAAS,EAAA;AAAA,UACP,KAAO,EAAA,kBAAA;AAAA,UACP,UAAY,EAAA,UAAA;AAAA,UACZ,WAAa,EAAA;AAAA;AACf,OACF;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,KAAO,EAAA;AAAA,UACL,KAAO,EAAA,OAAA;AAAA,UACP,WAAa,EAAA;AAAA,SACf;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,KAAO,EAAA,QAAA;AAAA,UACP,WAAa,EAAA;AAAA;AACf,OACF;AAAA,MACA,eAAiB,EAAA;AAAA,QACf,KAAO,EAAA;AAAA,UACL,KAAO,EAAA,iBAAA;AAAA,UACP,UAAY,EAAA,OAAA;AAAA,UACZ,WACE,EAAA;AAAA;AACJ,OACF;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,KAAO,EAAA;AAAA,UACL,KAAO,EAAA,iBAAA;AAAA,UACP,UAAY,EAAA,OAAA;AAAA,UACZ,WACE,EAAA;AAAA;AACJ,OACF;AAAA,MACA,gBAAkB,EAAA;AAAA,QAChB,KAAO,EAAA;AAAA,UACL,KAAO,EAAA,iBAAA;AAAA,UACP,UAAY,EAAA,OAAA;AAAA,UACZ,WACE,EAAA;AAAA;AACJ,OACF;AAAA,MACA,aAAe,EAAA;AAAA,QACb,IAAM,EAAA;AAAA,UACJ,KAAO,EAAA,MAAA;AAAA,UACP,WAAa,EAAA;AAAA,SACf;AAAA,QACA,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,wBAAA;AAAA,UACP,UAAY,EAAA,YAAA;AAAA,UACZ,WAAa,EAAA;AAAA;AACf;AACF,KACF;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,KAAO,EAAA,qBAAA;AAAA,MACP,SAAW,EAAA,iBAAA;AAAA,MACX,QAAU,EAAA,kCAAA;AAAA,MACV,OAAS,EAAA;AAAA,QACP,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,2BAAA;AAAA,UACP,WACE,EAAA;AAAA,SACJ;AAAA,QACA,UAAY,EAAA,OAAA;AAAA,QACZ,SAAW,EAAA;AAAA,UACT,MAAQ,EAAA,SAAA;AAAA,UACR,QAAU,EAAA,UAAA;AAAA,UACV,OAAS,EAAA,SAAA;AAAA,UACT,KAAO,EAAA,OAAA;AAAA,UACP,MAAQ,EAAA;AAAA;AACV;AACF,KACF;AAAA,IACA,eAAiB,EAAA;AAAA,MACf,KAAO,EAAA,YAAA;AAAA,MACP,OAAS,EAAA;AAAA,QACP,KAAO,EAAA,OAAA;AAAA,QACP,GAAK,EAAA;AAAA;AACP,KACF;AAAA,IACA,WAAa,EAAA;AAAA,MACX,KAAO,EAAA,QAAA;AAAA,MACP,SAAW,EAAA;AAAA,QACT,eAAiB,EAAA,yBAAA;AAAA,QACjB,cAAgB,EAAA;AAAA,OAClB;AAAA,MACA,QAAU,EAAA,iBAAA;AAAA,MACV,iBAAmB,EAAA,QAAA;AAAA,MACnB,gBAAkB,EAAA,OAAA;AAAA,MAClB,oBAAsB,EAAA,YAAA;AAAA,MACtB,mBAAqB,EAAA,WAAA;AAAA,MACrB,mBAAqB,EAAA,WAAA;AAAA,MACrB,WAAa,EAAA;AAAA,QACX,QAAU,EAAA,WAAA;AAAA,QACV,QAAU,EAAA,WAAA;AAAA,QACV,aAAe,EAAA,iBAAA;AAAA,QACf,KAAO,EAAA,OAAA;AAAA,QACP,aAAe,EAAA,iBAAA;AAAA,QACf,SAAW,EAAA,YAAA;AAAA,QACX,MAAQ,EAAA;AAAA;AACV,KACF;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,OAAS,EAAA;AAAA,QACP,SAAW,EAAA;AAAA;AACb,KACF;AAAA,IACA,YAAc,EAAA;AAAA,MACZ,SAAW,EAAA;AAAA,QACT,IAAM,EAAA,MAAA;AAAA,QACN,KAAO,EAAA,OAAA;AAAA,QACP,WAAa,EAAA,aAAA;AAAA,QACb,IAAM,EAAA;AAAA,OACR;AAAA,MACA,SAAW,EAAA;AAAA,KACb;AAAA,IACA,oBAAsB,EAAA;AAAA,MACpB,KAAO,EAAA,uBAAA;AAAA,MACP,SAAW,EAAA,uBAAA;AAAA,MACX,QAAU,EAAA,2DAAA;AAAA,MACV,OAAS,EAAA;AAAA,QACP,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,2BAAA;AAAA,UACP,WACE,EAAA;AAAA,SACJ;AAAA,QACA,sBAAwB,EAAA,yBAAA;AAAA,QACxB,OAAS,EAAA;AAAA,UACP,KAAO,EAAA,SAAA;AAAA,UACP,YAAc,EAAA,wCAAA;AAAA,UACd,cAAgB,EAAA,6BAAA;AAAA,UAChB,MAAQ,EAAA;AAAA,YACN,KAAO,EAAA,OAAA;AAAA,YACP,SAAW,EAAA,WAAA;AAAA,YACX,MAAQ,EAAA;AAAA,WACV;AAAA,UACA,QAAU,EAAA;AAAA,SACZ;AAAA,QACA,SAAW,EAAA;AAAA,UACT,KAAO,EAAA,WAAA;AAAA,UACP,YAAc,EAAA,iDAAA;AAAA,UACd,cAAgB,EAAA,+BAAA;AAAA,UAChB,MAAQ,EAAA;AAAA,YACN,SAAW,EAAA,WAAA;AAAA,YACX,MAAQ,EAAA;AAAA,WACV;AAAA,UACA,QAAU,EAAA;AAAA,SACZ;AAAA,QACA,MAAQ,EAAA;AAAA,UACN,KAAO,EAAA,QAAA;AAAA,UACP,YAAc,EAAA;AAAA;AAChB;AACF,KACF;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,KAAO,EAAA;AAAA,KACT;AAAA,IACA,iBAAmB,EAAA;AAAA,MACjB,KAAO,EAAA,kBAAA;AAAA,MACP,QACE,EAAA;AAAA,KACJ;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAO,EAAA,iBAAA;AAAA,MACP,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,uBAAyB,EAAA;AAAA,MACvB,KAAO,EAAA,uBAAA;AAAA,MACP,QAAU,EAAA;AAAA,KACZ;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,KAAO,EAAA,iBAAA;AAAA,MACP,QAAU,EAAA,yDAAA;AAAA,MACV,aAAe,EAAA;AAAA,QACb,KAAO,EAAA;AAAA,OACT;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,KAAO,EAAA,qBAAA;AAAA,QACP,mBAAqB,EAAA,kBAAA;AAAA,QACrB,iBAAmB,EAAA;AAAA,OACrB;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,GAAK,EAAA;AAAA,UACH,KAAO,EAAA,OAAA;AAAA,UACP,GAAK,EAAA,KAAA;AAAA,UACL,MAAQ,EAAA;AAAA;AACV,OACF;AAAA,MACA,iBAAmB,EAAA;AAAA,QACjB,gBAAkB,EAAA;AAAA,OACpB;AAAA,MACA,mBAAqB,EAAA;AAAA,QACnB,gBAAkB,EAAA,+BAAA;AAAA,QAClB,SAAW,EAAA;AAAA,UACT,KAAO,EAAA,eAAA;AAAA,UACP,gBAAkB,EAAA;AAAA,SACpB;AAAA,QACA,YAAc,EAAA;AAAA,UACZ,KAAO,EAAA;AAAA,SACT;AAAA,QACA,OAAS,EAAA;AAAA,UACP,KAAO,EAAA;AAAA;AACT,OACF;AAAA,MACA,qBAAuB,EAAA;AAAA,QACrB,mBAAqB,EAAA,4CAAA;AAAA,QACrB,eAAiB,EAAA,gBAAA;AAAA,QACjB,iBAAmB,EAAA,kBAAA;AAAA,QACnB,gBAAkB,EAAA;AAAA,OACpB;AAAA,MACA,mBAAqB,EAAA;AAAA,QACnB,KAAO,EAAA,kDAAA;AAAA,QACP,SAAW,EAAA;AAAA,UACT,KAAO,EAAA,yBAAA;AAAA,UACP,WACE,EAAA,iGAAA;AAAA,UACF,kBACE,EAAA;AAAA,SACJ;AAAA,QACA,WAAa,EAAA;AAAA,UACX,KAAO,EAAA,qBAAA;AAAA,UACP,WACE,EAAA,mGAAA;AAAA,UACF,kBACE,EAAA;AAAA,SACJ;AAAA,QACA,UAAY,EAAA;AAAA,UACV,KAAO,EAAA,0BAAA;AAAA,UACP,WACE,EAAA;AAAA,SACJ;AAAA,QACA,aAAe,EAAA;AAAA,UACb,KAAO,EAAA,uBAAA;AAAA,UACP,WACE,EAAA;AAAA;AACJ,OACF;AAAA,MACA,sBAAwB,EAAA;AAAA,QACtB,eAAiB,EAAA,WAAA;AAAA,QACjB,kBAAoB,EAAA,aAAA;AAAA,QACpB,mBAAqB,EAAA;AAAA,OACvB;AAAA,MACA,qBAAuB,EAAA;AAAA,QACrB,KAAO,EAAA;AAAA;AACT,KACF;AAAA,IACA,gBAAkB,EAAA;AAAA,MAChB,KAAO,EAAA,wBAAA;AAAA,MACP,QACE,EAAA,8EAAA;AAAA,MACF,SAAW,EAAA,wBAAA;AAAA,MACX,cAAgB,EAAA;AAAA,QACd,YAAc,EAAA,WAAA;AAAA,QACd,UAAY,EAAA;AAAA,OACd;AAAA,MACA,aAAe,EAAA;AAAA,QACb,2BAA6B,EAAA,6BAAA;AAAA,QAC7B,kBACE,EAAA;AAAA,OACJ;AAAA,MACA,wBAA0B,EAAA;AAAA,QACxB,iBAAmB,EAAA;AAAA;AACrB,KACF;AAAA,IACA,kBAAoB,EAAA;AAAA,MAClB,KAAO,EAAA,wBAAA;AAAA,MACP,QACE,EAAA,8EAAA;AAAA,MACF,SAAW,EAAA,wBAAA;AAAA,MACX,eAAiB,EAAA;AAAA,QACf,sBAAwB,EAAA;AAAA;AAC1B,KACF;AAAA,IACA,qBAAuB,EAAA;AAAA,MACrB,0BAA4B,EAAA,wBAAA;AAAA,MAC5B,oCAAsC,EAAA,iCAAA;AAAA,MACtC,wCACE,EAAA,qCAAA;AAAA,MACF,kBAAoB,EAAA,SAAA;AAAA,MACpB,uBAAyB,EAAA,iBAAA;AAAA,MACzB,yBAA2B,EAAA;AAAA,QACzB,iBACE,EAAA,+DAAA;AAAA,QACF,cACE,EAAA;AAAA,OACJ;AAAA,MACA,yBAA2B,EAAA;AAAA,QACzB,mBAAqB,EAAA,yBAAA;AAAA,QACrB,gBACE,EAAA;AAAA;AACJ,KACF;AAAA,IACA,6BAA+B,EAAA;AAAA,MAC7B,MAAQ,EAAA,MAAA;AAAA,MACR,OAAS,EAAA;AAAA,QACP,aAAe,EAAA,yBAAA;AAAA,QACf,eAAiB,EAAA,2BAAA;AAAA,QACjB,WAAa,EAAA;AAAA;AACf,KACF;AAAA,IACA,kCAAoC,EAAA;AAAA,MAClC,MAAQ,EAAA;AAAA;AACV;AAEJ,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder",
3
- "version": "1.31.1-next.1",
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-next.0",
74
- "@backstage/catalog-model": "1.7.4",
75
- "@backstage/core-compat-api": "0.4.3-next.1",
76
- "@backstage/core-components": "0.17.2",
77
- "@backstage/core-plugin-api": "1.10.7",
78
- "@backstage/errors": "1.2.7",
79
- "@backstage/frontend-plugin-api": "0.10.3-next.0",
80
- "@backstage/integration": "1.17.0",
81
- "@backstage/integration-react": "1.2.7",
82
- "@backstage/plugin-catalog-common": "1.1.4",
83
- "@backstage/plugin-catalog-react": "1.18.1-next.1",
84
- "@backstage/plugin-permission-react": "0.4.34",
85
- "@backstage/plugin-scaffolder-common": "1.5.11",
86
- "@backstage/plugin-scaffolder-react": "1.16.1-next.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.32.2-next.0",
121
- "@backstage/core-app-api": "1.17.0",
122
- "@backstage/dev-utils": "1.1.11-next.1",
123
- "@backstage/plugin-catalog": "1.31.0-next.1",
124
- "@backstage/plugin-permission-common": "0.9.0",
125
- "@backstage/test-utils": "1.7.8",
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",