@backstage/plugin-scaffolder 1.38.1-next.0 → 1.38.1-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/alpha/components/EditorSubPage.esm.js +22 -3
- package/dist/alpha/components/EditorSubPage.esm.js.map +1 -1
- package/dist/alpha/components/TasksSubPage.esm.js +10 -2
- package/dist/alpha/components/TasksSubPage.esm.js.map +1 -1
- package/dist/alpha/components/TemplatesSubPage.esm.js +16 -4
- package/dist/alpha/components/TemplatesSubPage.esm.js.map +1 -1
- package/dist/plugins/scaffolder/package.json.esm.js +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder
|
|
2
2
|
|
|
3
|
+
## 1.38.1-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a5b2811: Adds `useBreadcrumbEntries` hook, `BreadcrumbEntry` component, and `BreadcrumbsRegistryProvider` for managing breadcrumb trails across the component tree for plugins using new frontend system. Completes wiring so that new frontend system plugin `Pages` and `SubPages` get automatic-population of `PluginHeader` breadcrumbs.
|
|
8
|
+
|
|
9
|
+
- The app plugin's `PageLayout` registers a root breadcrumb for each plugin page and passes the breadcrumb trail to `PluginHeader`
|
|
10
|
+
- `PageBlueprint` automatically wraps each sub-page route element with `BreadcrumbEntry`, so sub-pages contribute to the PluginHeader breadcrumb trail without extra wiring.
|
|
11
|
+
- Plugin authors who need breadcrumbs for internal routes within a sub-page can wrap their route content with `BreadcrumbEntry` manually.
|
|
12
|
+
- `plugin-scaffolder` internal routes have been wrapped as an example
|
|
13
|
+
|
|
14
|
+
- Updated dependencies
|
|
15
|
+
- @backstage/frontend-plugin-api@0.17.3-next.1
|
|
16
|
+
- @backstage/ui@0.17.0-next.1
|
|
17
|
+
|
|
3
18
|
## 1.38.1-next.0
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
|
@@ -3,6 +3,7 @@ import { useAsync, useMountEffect } from '@react-hookz/web';
|
|
|
3
3
|
import { useMemo, useCallback } from 'react';
|
|
4
4
|
import { Routes, Route, useNavigate } from 'react-router-dom';
|
|
5
5
|
import { Content } from '@backstage/core-components';
|
|
6
|
+
import { BreadcrumbEntry } from '@backstage/frontend-plugin-api';
|
|
6
7
|
import { useApi } from '@backstage/core-plugin-api';
|
|
7
8
|
import { makeStyles } from '@material-ui/core/styles';
|
|
8
9
|
import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
@@ -105,21 +106,39 @@ function EditorSubPage() {
|
|
|
105
106
|
Route,
|
|
106
107
|
{
|
|
107
108
|
path: "template",
|
|
108
|
-
element: /* @__PURE__ */ jsx(
|
|
109
|
+
element: /* @__PURE__ */ jsx(
|
|
110
|
+
BreadcrumbEntry,
|
|
111
|
+
{
|
|
112
|
+
entry: { label: "Edit Template", href: "template" },
|
|
113
|
+
children: /* @__PURE__ */ jsx(EditorContent, { fieldExtensions })
|
|
114
|
+
}
|
|
115
|
+
)
|
|
109
116
|
}
|
|
110
117
|
),
|
|
111
118
|
/* @__PURE__ */ jsx(
|
|
112
119
|
Route,
|
|
113
120
|
{
|
|
114
121
|
path: "template-form",
|
|
115
|
-
element: /* @__PURE__ */ jsx(
|
|
122
|
+
element: /* @__PURE__ */ jsx(
|
|
123
|
+
BreadcrumbEntry,
|
|
124
|
+
{
|
|
125
|
+
entry: { label: "Template Form", href: "template-form" },
|
|
126
|
+
children: /* @__PURE__ */ jsx(FormPreviewContent, { fieldExtensions })
|
|
127
|
+
}
|
|
128
|
+
)
|
|
116
129
|
}
|
|
117
130
|
),
|
|
118
131
|
/* @__PURE__ */ jsx(
|
|
119
132
|
Route,
|
|
120
133
|
{
|
|
121
134
|
path: "custom-fields",
|
|
122
|
-
element: /* @__PURE__ */ jsx(
|
|
135
|
+
element: /* @__PURE__ */ jsx(
|
|
136
|
+
BreadcrumbEntry,
|
|
137
|
+
{
|
|
138
|
+
entry: { label: "Custom Fields", href: "custom-fields" },
|
|
139
|
+
children: /* @__PURE__ */ jsx(CustomFieldsContent, { fieldExtensions })
|
|
140
|
+
}
|
|
141
|
+
)
|
|
123
142
|
}
|
|
124
143
|
)
|
|
125
144
|
] }) }) });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorSubPage.esm.js","sources":["../../../src/alpha/components/EditorSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useAsync, useMountEffect } from '@react-hookz/web';\nimport { useCallback, useMemo } from 'react';\nimport { Routes, Route, useNavigate } from 'react-router-dom';\nimport { Content } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n type FieldExtensionOptions,\n SecretsContextProvider,\n} from '@backstage/plugin-scaffolder-react';\nimport type { FormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\nimport { formFieldsApiRef } from '../formFieldsApi';\nimport { TemplateEditorIntro } from './TemplateEditorPage/TemplateEditorIntro';\nimport { TemplateEditor } from './TemplateEditorPage/TemplateEditor';\nimport { TemplateFormPreviewer } from './TemplateEditorPage/TemplateFormPreviewer';\nimport { CustomFieldExplorer } from './TemplateEditorPage/CustomFieldExplorer';\nimport { useTemplateDirectory } from './TemplateEditorPage/useTemplateDirectory';\n\nconst useEditorStyles = makeStyles({\n editorContent: {\n padding: 0,\n height: 'calc(100dvh - var(--bui-header-height, 0px))',\n },\n formContent: {\n padding: 0,\n height: 'calc(100dvh - var(--bui-header-height, 0px))',\n },\n});\n\nfunction EditorIntroContent() {\n const navigate = useNavigate();\n const { openDirectory, createDirectory } = useTemplateDirectory();\n\n const handleSelect = useCallback(\n (option: 'create-template' | 'local' | 'form' | 'field-explorer') => {\n if (option === 'local') {\n openDirectory()\n .then(() => navigate('template'))\n .catch(() => {});\n } else if (option === 'create-template') {\n createDirectory()\n .then(() => navigate('template'))\n .catch(() => {});\n } else if (option === 'form') {\n navigate('template-form');\n } else if (option === 'field-explorer') {\n navigate('custom-fields');\n }\n },\n [openDirectory, createDirectory, navigate],\n );\n\n return (\n <Content>\n <TemplateEditorIntro onSelect={handleSelect} />\n </Content>\n );\n}\n\nexport function buildEditorFieldExtensions(\n formFields: FieldExtensionOptions[] = [],\n): FieldExtensionOptions[] {\n return [\n ...formFields,\n ...(DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) => !formFields.some(formField => formField.name === name),\n ) as FieldExtensionOptions[]),\n ];\n}\n\nexport function toFieldExtensionOptions(\n formField: FormField,\n): FieldExtensionOptions {\n const internal = OpaqueFormField.toInternal(formField);\n\n return {\n ...internal,\n schema: internal.schema?.schema ?? internal.schema,\n } as FieldExtensionOptions;\n}\n\nfunction EditorContent(props: { fieldExtensions: FieldExtensionOptions[] }) {\n const classes = useEditorStyles();\n return (\n <Content className={classes.editorContent}>\n <TemplateEditor fieldExtensions={props.fieldExtensions} />\n </Content>\n );\n}\n\nfunction FormPreviewContent(props: {\n fieldExtensions: FieldExtensionOptions[];\n}) {\n const classes = useEditorStyles();\n const navigate = useNavigate();\n\n const handleClose = useCallback(() => {\n navigate('..');\n }, [navigate]);\n\n return (\n <Content className={classes.formContent}>\n <TemplateFormPreviewer\n customFieldExtensions={props.fieldExtensions}\n onClose={handleClose}\n />\n </Content>\n );\n}\n\nfunction CustomFieldsContent(props: {\n fieldExtensions: FieldExtensionOptions[];\n}) {\n return (\n <Content>\n <CustomFieldExplorer customFieldExtensions={props.fieldExtensions} />\n </Content>\n );\n}\n\n/**\n * Sub-page for the template editor tab. Renders the editor intro at the index,\n * with sub-routes for the full editor, form previewer, and custom fields explorer.\n *\n * @internal\n */\nexport function EditorSubPage() {\n const formFieldsApi = useApi(formFieldsApiRef);\n const [{ result: customFieldExtensions = [] }, { execute }] = useAsync(\n async () => {\n const formFields = await formFieldsApi.loadFormFields();\n return formFields.map(toFieldExtensionOptions);\n },\n );\n\n useMountEffect(execute);\n\n const fieldExtensions = useMemo(\n () => buildEditorFieldExtensions(customFieldExtensions),\n [customFieldExtensions],\n );\n\n return (\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <Routes>\n <Route index element={<EditorIntroContent />} />\n <Route\n path=\"template\"\n element={<EditorContent fieldExtensions={fieldExtensions} />}\n />\n <Route\n path=\"template-form\"\n element={<FormPreviewContent fieldExtensions={fieldExtensions} />}\n />\n <Route\n path=\"custom-fields\"\n element={<CustomFieldsContent fieldExtensions={fieldExtensions} />}\n />\n </Routes>\n </SecretsContextProvider>\n </RequirePermission>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditorSubPage.esm.js","sources":["../../../src/alpha/components/EditorSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useAsync, useMountEffect } from '@react-hookz/web';\nimport { useCallback, useMemo } from 'react';\nimport { Routes, Route, useNavigate } from 'react-router-dom';\nimport { Content } from '@backstage/core-components';\nimport { BreadcrumbEntry } from '@backstage/frontend-plugin-api';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport { templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport {\n type FieldExtensionOptions,\n SecretsContextProvider,\n} from '@backstage/plugin-scaffolder-react';\nimport type { FormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\nimport { formFieldsApiRef } from '../formFieldsApi';\nimport { TemplateEditorIntro } from './TemplateEditorPage/TemplateEditorIntro';\nimport { TemplateEditor } from './TemplateEditorPage/TemplateEditor';\nimport { TemplateFormPreviewer } from './TemplateEditorPage/TemplateFormPreviewer';\nimport { CustomFieldExplorer } from './TemplateEditorPage/CustomFieldExplorer';\nimport { useTemplateDirectory } from './TemplateEditorPage/useTemplateDirectory';\n\nconst useEditorStyles = makeStyles({\n editorContent: {\n padding: 0,\n height: 'calc(100dvh - var(--bui-header-height, 0px))',\n },\n formContent: {\n padding: 0,\n height: 'calc(100dvh - var(--bui-header-height, 0px))',\n },\n});\n\nfunction EditorIntroContent() {\n const navigate = useNavigate();\n const { openDirectory, createDirectory } = useTemplateDirectory();\n\n const handleSelect = useCallback(\n (option: 'create-template' | 'local' | 'form' | 'field-explorer') => {\n if (option === 'local') {\n openDirectory()\n .then(() => navigate('template'))\n .catch(() => {});\n } else if (option === 'create-template') {\n createDirectory()\n .then(() => navigate('template'))\n .catch(() => {});\n } else if (option === 'form') {\n navigate('template-form');\n } else if (option === 'field-explorer') {\n navigate('custom-fields');\n }\n },\n [openDirectory, createDirectory, navigate],\n );\n\n return (\n <Content>\n <TemplateEditorIntro onSelect={handleSelect} />\n </Content>\n );\n}\n\nexport function buildEditorFieldExtensions(\n formFields: FieldExtensionOptions[] = [],\n): FieldExtensionOptions[] {\n return [\n ...formFields,\n ...(DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) => !formFields.some(formField => formField.name === name),\n ) as FieldExtensionOptions[]),\n ];\n}\n\nexport function toFieldExtensionOptions(\n formField: FormField,\n): FieldExtensionOptions {\n const internal = OpaqueFormField.toInternal(formField);\n\n return {\n ...internal,\n schema: internal.schema?.schema ?? internal.schema,\n } as FieldExtensionOptions;\n}\n\nfunction EditorContent(props: { fieldExtensions: FieldExtensionOptions[] }) {\n const classes = useEditorStyles();\n return (\n <Content className={classes.editorContent}>\n <TemplateEditor fieldExtensions={props.fieldExtensions} />\n </Content>\n );\n}\n\nfunction FormPreviewContent(props: {\n fieldExtensions: FieldExtensionOptions[];\n}) {\n const classes = useEditorStyles();\n const navigate = useNavigate();\n\n const handleClose = useCallback(() => {\n navigate('..');\n }, [navigate]);\n\n return (\n <Content className={classes.formContent}>\n <TemplateFormPreviewer\n customFieldExtensions={props.fieldExtensions}\n onClose={handleClose}\n />\n </Content>\n );\n}\n\nfunction CustomFieldsContent(props: {\n fieldExtensions: FieldExtensionOptions[];\n}) {\n return (\n <Content>\n <CustomFieldExplorer customFieldExtensions={props.fieldExtensions} />\n </Content>\n );\n}\n\n/**\n * Sub-page for the template editor tab. Renders the editor intro at the index,\n * with sub-routes for the full editor, form previewer, and custom fields explorer.\n *\n * @internal\n */\nexport function EditorSubPage() {\n const formFieldsApi = useApi(formFieldsApiRef);\n const [{ result: customFieldExtensions = [] }, { execute }] = useAsync(\n async () => {\n const formFields = await formFieldsApi.loadFormFields();\n return formFields.map(toFieldExtensionOptions);\n },\n );\n\n useMountEffect(execute);\n\n const fieldExtensions = useMemo(\n () => buildEditorFieldExtensions(customFieldExtensions),\n [customFieldExtensions],\n );\n\n return (\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <Routes>\n <Route index element={<EditorIntroContent />} />\n <Route\n path=\"template\"\n element={\n <BreadcrumbEntry\n entry={{ label: 'Edit Template', href: 'template' }}\n >\n <EditorContent fieldExtensions={fieldExtensions} />\n </BreadcrumbEntry>\n }\n />\n <Route\n path=\"template-form\"\n element={\n <BreadcrumbEntry\n entry={{ label: 'Template Form', href: 'template-form' }}\n >\n <FormPreviewContent fieldExtensions={fieldExtensions} />\n </BreadcrumbEntry>\n }\n />\n <Route\n path=\"custom-fields\"\n element={\n <BreadcrumbEntry\n entry={{ label: 'Custom Fields', href: 'custom-fields' }}\n >\n <CustomFieldsContent fieldExtensions={fieldExtensions} />\n </BreadcrumbEntry>\n }\n />\n </Routes>\n </SecretsContextProvider>\n </RequirePermission>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Routes, Route } from 'react-router-dom';
|
|
2
|
+
import { Routes, Route, useParams } from 'react-router-dom';
|
|
3
3
|
import { Content } from '@backstage/core-components';
|
|
4
|
+
import { BreadcrumbEntry } from '@backstage/frontend-plugin-api';
|
|
4
5
|
import { OngoingTaskBody } from '../../components/OngoingTask/OngoingTask.esm.js';
|
|
5
6
|
import { ListTaskPageContent } from '../../components/ListTasksPage/ListTasksPage.esm.js';
|
|
6
7
|
|
|
8
|
+
function TaskDetailWithBreadcrumb() {
|
|
9
|
+
const { taskId } = useParams();
|
|
10
|
+
if (!taskId) {
|
|
11
|
+
return /* @__PURE__ */ jsx(OngoingTaskBody, {});
|
|
12
|
+
}
|
|
13
|
+
return /* @__PURE__ */ jsx(BreadcrumbEntry, { entry: { label: taskId, href: taskId }, children: /* @__PURE__ */ jsx(OngoingTaskBody, {}) });
|
|
14
|
+
}
|
|
7
15
|
function TasksSubPage() {
|
|
8
16
|
return /* @__PURE__ */ jsxs(Routes, { children: [
|
|
9
17
|
/* @__PURE__ */ jsx(
|
|
@@ -13,7 +21,7 @@ function TasksSubPage() {
|
|
|
13
21
|
element: /* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(ListTaskPageContent, {}) })
|
|
14
22
|
}
|
|
15
23
|
),
|
|
16
|
-
/* @__PURE__ */ jsx(Route, { path: ":taskId", element: /* @__PURE__ */ jsx(
|
|
24
|
+
/* @__PURE__ */ jsx(Route, { path: ":taskId", element: /* @__PURE__ */ jsx(TaskDetailWithBreadcrumb, {}) })
|
|
17
25
|
] });
|
|
18
26
|
}
|
|
19
27
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TasksSubPage.esm.js","sources":["../../../src/alpha/components/TasksSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Routes, Route } from 'react-router-dom';\nimport { Content } from '@backstage/core-components';\nimport { OngoingTaskBody } from '../../components/OngoingTask';\nimport { ListTaskPageContent } from '../../components/ListTasksPage';\n\n/**\n * Sub-page for the tasks tab. Renders the task list at the index route\n * and the ongoing task detail at the parameterized route.\n *\n * @internal\n */\nexport function TasksSubPage() {\n return (\n <Routes>\n <Route\n index\n element={\n <Content>\n <ListTaskPageContent />\n </Content>\n }\n />\n <Route path=\":taskId\" element={<
|
|
1
|
+
{"version":3,"file":"TasksSubPage.esm.js","sources":["../../../src/alpha/components/TasksSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { Routes, Route, useParams } from 'react-router-dom';\nimport { Content } from '@backstage/core-components';\nimport { BreadcrumbEntry } from '@backstage/frontend-plugin-api';\nimport { OngoingTaskBody } from '../../components/OngoingTask';\nimport { ListTaskPageContent } from '../../components/ListTasksPage';\n\nfunction TaskDetailWithBreadcrumb() {\n const { taskId } = useParams<{ taskId: string }>();\n if (!taskId) {\n return <OngoingTaskBody />;\n }\n return (\n <BreadcrumbEntry entry={{ label: taskId, href: taskId }}>\n <OngoingTaskBody />\n </BreadcrumbEntry>\n );\n}\n\n/**\n * Sub-page for the tasks tab. Renders the task list at the index route\n * and the ongoing task detail at the parameterized route.\n *\n * @internal\n */\nexport function TasksSubPage() {\n return (\n <Routes>\n <Route\n index\n element={\n <Content>\n <ListTaskPageContent />\n </Content>\n }\n />\n <Route path=\":taskId\" element={<TaskDetailWithBreadcrumb />} />\n </Routes>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAsBA,SAAS,wBAAA,GAA2B;AAClC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAA8B;AACjD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,2BAAQ,eAAA,EAAA,EAAgB,CAAA;AAAA,EAC1B;AACA,EAAA,uBACE,GAAA,CAAC,eAAA,EAAA,EAAgB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,MAAA,EAAO,EACpD,QAAA,kBAAA,GAAA,CAAC,eAAA,EAAA,EAAgB,CAAA,EACnB,CAAA;AAEJ;AAQO,SAAS,YAAA,GAAe;AAC7B,EAAA,4BACG,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAK,IAAA;AAAA,QACL,OAAA,kBACE,GAAA,CAAC,OAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,uBAAoB,CAAA,EACvB;AAAA;AAAA,KAEJ;AAAA,wBACC,KAAA,EAAA,EAAM,IAAA,EAAK,WAAU,OAAA,kBAAS,GAAA,CAAC,4BAAyB,CAAA,EAAI;AAAA,GAAA,EAC/D,CAAA;AAEJ;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useMemo, useCallback } from 'react';
|
|
3
|
-
import { Routes, Route, useNavigate } from 'react-router-dom';
|
|
3
|
+
import { Routes, Route, useNavigate, useParams } from 'react-router-dom';
|
|
4
4
|
import { DocsIcon, Content, ContentHeader, SupportButton } from '@backstage/core-components';
|
|
5
5
|
import { useRouteRef, useApp } from '@backstage/core-plugin-api';
|
|
6
6
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
@@ -15,6 +15,7 @@ import { registerComponentRouteRef, viewTechDocRouteRef, selectedTemplateRouteRe
|
|
|
15
15
|
import { scaffolderTranslationRef } from '../../translation.esm.js';
|
|
16
16
|
import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default.esm.js';
|
|
17
17
|
import { buildTechDocsURL } from '@backstage/plugin-techdocs-react';
|
|
18
|
+
import { BreadcrumbEntry } from '@backstage/frontend-plugin-api';
|
|
18
19
|
import { TECHDOCS_ANNOTATION, TECHDOCS_EXTERNAL_ANNOTATION } from '@backstage/plugin-techdocs-common';
|
|
19
20
|
import { OpaqueFormField } from '../../packages/scaffolder-internal/src/wiring/InternalFormField.esm.js';
|
|
20
21
|
import '../../packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js';
|
|
@@ -104,6 +105,17 @@ function TemplateListContent({
|
|
|
104
105
|
] })
|
|
105
106
|
] }) });
|
|
106
107
|
}
|
|
108
|
+
function TemplateWizardWithBreadcrumb(props) {
|
|
109
|
+
const { templateName } = useParams();
|
|
110
|
+
return /* @__PURE__ */ jsx(BreadcrumbEntry, { entry: { label: templateName ?? "Template", href: "." }, children: /* @__PURE__ */ jsx(SecretsContextProvider, { children: /* @__PURE__ */ jsx(
|
|
111
|
+
TemplateWizardPageContent,
|
|
112
|
+
{
|
|
113
|
+
customFieldExtensions: props.customFieldExtensions,
|
|
114
|
+
layouts: props.layouts,
|
|
115
|
+
formProps: props.formProps
|
|
116
|
+
}
|
|
117
|
+
) }) });
|
|
118
|
+
}
|
|
107
119
|
function TemplatesSubPage(props) {
|
|
108
120
|
const customFieldExtensions = useCustomFieldExtensions(void 0);
|
|
109
121
|
const customLayouts = useCustomLayouts(void 0);
|
|
@@ -122,14 +134,14 @@ function TemplatesSubPage(props) {
|
|
|
122
134
|
Route,
|
|
123
135
|
{
|
|
124
136
|
path: ":namespace/:templateName",
|
|
125
|
-
element: /* @__PURE__ */ jsx(
|
|
126
|
-
|
|
137
|
+
element: /* @__PURE__ */ jsx(
|
|
138
|
+
TemplateWizardWithBreadcrumb,
|
|
127
139
|
{
|
|
128
140
|
customFieldExtensions: fieldExtensions,
|
|
129
141
|
layouts: customLayouts,
|
|
130
142
|
formProps: props.formProps
|
|
131
143
|
}
|
|
132
|
-
)
|
|
144
|
+
)
|
|
133
145
|
}
|
|
134
146
|
)
|
|
135
147
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplatesSubPage.esm.js","sources":["../../../src/alpha/components/TemplatesSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useMemo } from 'react';\nimport { Routes, Route, useNavigate } from 'react-router-dom';\nimport {\n Content,\n ContentHeader,\n DocsIcon,\n SupportButton,\n} from '@backstage/core-components';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n EntityOwnerPicker,\n} from '@backstage/plugin-catalog-react';\nimport {\n TemplateCategoryPicker,\n TemplateGroups,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { createGroupsWithOther } from '../lib/createGroupsWithOther';\nimport {\n FieldExtensionOptions,\n FormProps,\n SecretsContextProvider,\n TemplateGroupFilter,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { FormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { RegisterExistingButton } from './TemplateListPage/RegisterExistingButton';\nimport { TemplateWizardPageContent } from './TemplateWizardPage';\nimport {\n registerComponentRouteRef,\n selectedTemplateRouteRef,\n viewTechDocRouteRef,\n} from '../../routes';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\nimport { buildTechDocsURL } from '@backstage/plugin-techdocs-react';\nimport {\n TECHDOCS_ANNOTATION,\n TECHDOCS_EXTERNAL_ANNOTATION,\n} from '@backstage/plugin-techdocs-common';\n\nfunction TemplateListContent({\n groups: configuredGroups,\n}: {\n groups?: TemplateGroupFilter[];\n}) {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const viewTechDocsLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const app = useApp();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const groups = useMemo(\n () =>\n configuredGroups?.length\n ? createGroupsWithOther(\n configuredGroups,\n t('templateListPage.templateGroups.otherTitle'),\n )\n : [\n {\n title: t('templateListPage.templateGroups.defaultTitle'),\n filter: () => true,\n },\n ],\n [configuredGroups, t],\n );\n\n const additionalLinksForEntity = useCallback(\n (template: TemplateEntityV1beta3) => {\n if (\n !(\n template.metadata.annotations?.[TECHDOCS_ANNOTATION] ||\n template.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]\n ) ||\n !viewTechDocsLink\n ) {\n return [];\n }\n\n const url = buildTechDocsURL(template, viewTechDocsLink);\n return url\n ? [\n {\n icon: app.getSystemIcon('docs') ?? DocsIcon,\n text: t(\n 'templateListPage.additionalLinksForEntity.viewTechDocsTitle',\n ),\n url,\n },\n ]\n : [];\n },\n [app, viewTechDocsLink, t],\n );\n\n const onTemplateSelected = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { namespace, name } = parseEntityRef(stringifyEntityRef(template));\n navigate(templateRoute({ namespace, templateName: name }));\n },\n [navigate, templateRoute],\n );\n\n return (\n <EntityListProvider>\n <Content>\n <ContentHeader>\n <RegisterExistingButton\n title={t(\n 'templateListPage.contentHeader.registerExistingButtonTitle',\n )}\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n {t('templateListPage.contentHeader.supportButtonTitle')}\n </SupportButton>\n </ContentHeader>\n\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <EntitySearchBar />\n <EntityKindPicker initialFilter=\"template\" hidden />\n <UserListPicker\n initialFilter=\"all\"\n availableFilters={['all', 'starred']}\n />\n <TemplateCategoryPicker />\n <EntityTagPicker />\n <EntityOwnerPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={groups}\n onTemplateSelected={onTemplateSelected}\n additionalLinksForEntity={additionalLinksForEntity}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </EntityListProvider>\n );\n}\n\n/**\n * Sub-page for the templates tab. Renders the template list at the index route\n * and the template wizard at the parameterized route.\n *\n * @internal\n */\nexport function TemplatesSubPage(props: {\n formFields?: Array<FormField>;\n formProps?: FormProps;\n groups?: TemplateGroupFilter[];\n}) {\n const customFieldExtensions = useCustomFieldExtensions(undefined);\n const customLayouts = useCustomLayouts(undefined);\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...(props.formFields?.map(OpaqueFormField.toInternal) ?? []),\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n (customFieldExtension: FieldExtensionOptions) =>\n customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n return (\n <Routes>\n <Route index element={<TemplateListContent groups={props.groups} />} />\n <Route\n path=\":namespace/:templateName\"\n element={\n <SecretsContextProvider>\n <TemplateWizardPageContent\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n }\n />\n </Routes>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplatesSubPage.esm.js","sources":["../../../src/alpha/components/TemplatesSubPage.tsx"],"sourcesContent":["/*\n * Copyright 2026 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 { useCallback, useMemo } from 'react';\nimport { Routes, Route, useNavigate, useParams } from 'react-router-dom';\nimport {\n Content,\n ContentHeader,\n DocsIcon,\n SupportButton,\n} from '@backstage/core-components';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n EntityOwnerPicker,\n} from '@backstage/plugin-catalog-react';\nimport {\n TemplateCategoryPicker,\n TemplateGroups,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { createGroupsWithOther } from '../lib/createGroupsWithOther';\nimport {\n FieldExtensionOptions,\n FormProps,\n type LayoutOptions,\n SecretsContextProvider,\n TemplateGroupFilter,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { FormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormField } from '@internal/scaffolder';\nimport { RegisterExistingButton } from './TemplateListPage/RegisterExistingButton';\nimport { TemplateWizardPageContent } from './TemplateWizardPage';\nimport {\n registerComponentRouteRef,\n selectedTemplateRouteRef,\n viewTechDocRouteRef,\n} from '../../routes';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\nimport { buildTechDocsURL } from '@backstage/plugin-techdocs-react';\nimport { BreadcrumbEntry } from '@backstage/frontend-plugin-api';\nimport {\n TECHDOCS_ANNOTATION,\n TECHDOCS_EXTERNAL_ANNOTATION,\n} from '@backstage/plugin-techdocs-common';\n\nfunction TemplateListContent({\n groups: configuredGroups,\n}: {\n groups?: TemplateGroupFilter[];\n}) {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const viewTechDocsLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const navigate = useNavigate();\n const app = useApp();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const groups = useMemo(\n () =>\n configuredGroups?.length\n ? createGroupsWithOther(\n configuredGroups,\n t('templateListPage.templateGroups.otherTitle'),\n )\n : [\n {\n title: t('templateListPage.templateGroups.defaultTitle'),\n filter: () => true,\n },\n ],\n [configuredGroups, t],\n );\n\n const additionalLinksForEntity = useCallback(\n (template: TemplateEntityV1beta3) => {\n if (\n !(\n template.metadata.annotations?.[TECHDOCS_ANNOTATION] ||\n template.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]\n ) ||\n !viewTechDocsLink\n ) {\n return [];\n }\n\n const url = buildTechDocsURL(template, viewTechDocsLink);\n return url\n ? [\n {\n icon: app.getSystemIcon('docs') ?? DocsIcon,\n text: t(\n 'templateListPage.additionalLinksForEntity.viewTechDocsTitle',\n ),\n url,\n },\n ]\n : [];\n },\n [app, viewTechDocsLink, t],\n );\n\n const onTemplateSelected = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { namespace, name } = parseEntityRef(stringifyEntityRef(template));\n navigate(templateRoute({ namespace, templateName: name }));\n },\n [navigate, templateRoute],\n );\n\n return (\n <EntityListProvider>\n <Content>\n <ContentHeader>\n <RegisterExistingButton\n title={t(\n 'templateListPage.contentHeader.registerExistingButtonTitle',\n )}\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n {t('templateListPage.contentHeader.supportButtonTitle')}\n </SupportButton>\n </ContentHeader>\n\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <EntitySearchBar />\n <EntityKindPicker initialFilter=\"template\" hidden />\n <UserListPicker\n initialFilter=\"all\"\n availableFilters={['all', 'starred']}\n />\n <TemplateCategoryPicker />\n <EntityTagPicker />\n <EntityOwnerPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={groups}\n onTemplateSelected={onTemplateSelected}\n additionalLinksForEntity={additionalLinksForEntity}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </EntityListProvider>\n );\n}\n\nfunction TemplateWizardWithBreadcrumb(props: {\n customFieldExtensions: FieldExtensionOptions[];\n layouts: LayoutOptions[];\n formProps?: FormProps;\n}) {\n const { templateName } = useParams<{ templateName: string }>();\n return (\n <BreadcrumbEntry entry={{ label: templateName ?? 'Template', href: '.' }}>\n <SecretsContextProvider>\n <TemplateWizardPageContent\n customFieldExtensions={props.customFieldExtensions}\n layouts={props.layouts}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n </BreadcrumbEntry>\n );\n}\n\n/**\n * Sub-page for the templates tab. Renders the template list at the index route\n * and the template wizard at the parameterized route.\n *\n * @internal\n */\nexport function TemplatesSubPage(props: {\n formFields?: Array<FormField>;\n formProps?: FormProps;\n groups?: TemplateGroupFilter[];\n}) {\n const customFieldExtensions = useCustomFieldExtensions(undefined);\n const customLayouts = useCustomLayouts(undefined);\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...(props.formFields?.map(OpaqueFormField.toInternal) ?? []),\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n (customFieldExtension: FieldExtensionOptions) =>\n customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n return (\n <Routes>\n <Route index element={<TemplateListContent groups={props.groups} />} />\n <Route\n path=\":namespace/:templateName\"\n element={\n <TemplateWizardWithBreadcrumb\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n formProps={props.formProps}\n />\n }\n />\n </Routes>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder",
|
|
3
|
-
"version": "1.38.1-next.
|
|
3
|
+
"version": "1.38.1-next.1",
|
|
4
4
|
"description": "The Backstage plugin that helps you create new things",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"@backstage/core-plugin-api": "1.12.8-next.0",
|
|
77
77
|
"@backstage/errors": "1.3.1",
|
|
78
78
|
"@backstage/filter-predicates": "0.1.4-next.0",
|
|
79
|
-
"@backstage/frontend-plugin-api": "0.17.3-next.
|
|
79
|
+
"@backstage/frontend-plugin-api": "0.17.3-next.1",
|
|
80
80
|
"@backstage/integration": "2.0.3",
|
|
81
81
|
"@backstage/integration-react": "1.2.20-next.0",
|
|
82
82
|
"@backstage/plugin-catalog-common": "1.1.10",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
"@backstage/plugin-techdocs-common": "0.1.1",
|
|
88
88
|
"@backstage/plugin-techdocs-react": "1.3.13-next.0",
|
|
89
89
|
"@backstage/types": "1.2.2",
|
|
90
|
-
"@backstage/ui": "0.17.0-next.
|
|
90
|
+
"@backstage/ui": "0.17.0-next.1",
|
|
91
91
|
"@codemirror/language": "^6.0.0",
|
|
92
92
|
"@codemirror/legacy-modes": "^6.1.0",
|
|
93
93
|
"@codemirror/view": "^6.0.0",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"zod-to-json-schema": "^3.25.1"
|
|
121
121
|
},
|
|
122
122
|
"devDependencies": {
|
|
123
|
-
"@backstage/cli": "0.36.4-next.
|
|
123
|
+
"@backstage/cli": "0.36.4-next.1",
|
|
124
124
|
"@backstage/core-app-api": "1.20.3-next.0",
|
|
125
125
|
"@backstage/dev-utils": "1.1.25-next.0",
|
|
126
126
|
"@backstage/frontend-test-utils": "0.6.2-next.0",
|