@backstage/plugin-scaffolder 1.30.1 → 1.31.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +46 -4
- package/dist/alpha/components/TemplateEditorPage/{CustomFieldPlaygroud.esm.js → CustomFieldPlayground.esm.js} +3 -3
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -0
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js +24 -2
- package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js +1 -1
- package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
- package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js +4 -2
- package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
- package/dist/alpha/plugin.esm.js +4 -3
- package/dist/alpha/plugin.esm.js.map +1 -1
- package/dist/alpha.d.ts +23 -0
- package/dist/api.esm.js +1 -1
- package/dist/api.esm.js.map +1 -1
- package/dist/components/ActionsPage/ActionsPage.esm.js +4 -2
- package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
- package/dist/components/FileBrowser/FileBrowser.esm.js +3 -3
- package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
- package/dist/components/ListTasksPage/ListTasksPage.esm.js +4 -2
- package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
- package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
- package/dist/components/Router/Router.esm.js +9 -1
- package/dist/components/Router/Router.esm.js.map +1 -1
- package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js +132 -0
- package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -0
- package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js +168 -0
- package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -0
- package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js +250 -0
- package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -0
- package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js +19 -0
- package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -0
- package/dist/components/TemplatingExtensionsPage/navigation.esm.js +24 -0
- package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -0
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js +4 -1
- package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/plugin.esm.js +3 -2
- package/dist/plugin.esm.js.map +1 -1
- package/dist/routes.esm.js +6 -1
- package/dist/routes.esm.js.map +1 -1
- package/dist/translation.esm.js +37 -0
- package/dist/translation.esm.js.map +1 -1
- package/package.json +22 -22
- package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js.map +0 -1
|
@@ -18,7 +18,7 @@ import { useRouteRef, useApi } from '@backstage/core-plugin-api';
|
|
|
18
18
|
import { Page, Header, Content, Progress, ErrorPanel, EmptyState, Link, MarkdownContent } from '@backstage/core-components';
|
|
19
19
|
import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
|
|
20
20
|
import { useNavigate } from 'react-router-dom';
|
|
21
|
-
import { editRouteRef, scaffolderListTaskRouteRef, rootRouteRef } from '../../routes.esm.js';
|
|
21
|
+
import { editRouteRef, scaffolderListTaskRouteRef, rootRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
|
|
22
22
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
23
23
|
import { scaffolderTranslationRef } from '../../translation.esm.js';
|
|
24
24
|
import { RenderSchema } from '../RenderSchema/RenderSchema.esm.js';
|
|
@@ -181,12 +181,14 @@ const ActionsPage = (props) => {
|
|
|
181
181
|
const editorLink = useRouteRef(editRouteRef);
|
|
182
182
|
const tasksLink = useRouteRef(scaffolderListTaskRouteRef);
|
|
183
183
|
const createLink = useRouteRef(rootRouteRef);
|
|
184
|
+
const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);
|
|
184
185
|
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
185
186
|
const scaffolderPageContextMenuProps = {
|
|
186
187
|
onEditorClicked: props?.contextMenu?.editor !== false ? () => navigate(editorLink()) : void 0,
|
|
187
188
|
onActionsClicked: void 0,
|
|
188
189
|
onTasksClicked: props?.contextMenu?.tasks !== false ? () => navigate(tasksLink()) : void 0,
|
|
189
|
-
onCreateClicked: props?.contextMenu?.create !== false ? () => navigate(createLink()) : void 0
|
|
190
|
+
onCreateClicked: props?.contextMenu?.create !== false ? () => navigate(createLink()) : void 0,
|
|
191
|
+
onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink())
|
|
190
192
|
};
|
|
191
193
|
return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
|
|
192
194
|
/* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } 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 Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const expanded = useState<Expanded>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n const partialSchemaRenderContext: Omit<\n SchemaRenderContext,\n 'parentId'\n > = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } 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 Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const expanded = useState<Expanded>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n const partialSchemaRenderContext: Omit<\n SchemaRenderContext,\n 'parentId'\n > = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()),\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -13,7 +13,7 @@ const useStyles = makeStyles((theme) => ({
|
|
|
13
13
|
padding: theme.spacing(1)
|
|
14
14
|
}
|
|
15
15
|
}));
|
|
16
|
-
function
|
|
16
|
+
function parseFileEntries(paths) {
|
|
17
17
|
const root = {
|
|
18
18
|
type: "directory",
|
|
19
19
|
name: "",
|
|
@@ -68,7 +68,7 @@ function FileTreeItem({ entry }) {
|
|
|
68
68
|
function FileBrowser(props) {
|
|
69
69
|
const classes = useStyles();
|
|
70
70
|
const fileTree = useMemo(
|
|
71
|
-
() =>
|
|
71
|
+
() => parseFileEntries(props.filePaths),
|
|
72
72
|
[props.filePaths]
|
|
73
73
|
);
|
|
74
74
|
return /* @__PURE__ */ jsx(
|
|
@@ -88,5 +88,5 @@ function FileBrowser(props) {
|
|
|
88
88
|
);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
export { FileBrowser,
|
|
91
|
+
export { FileBrowser, parseFileEntries };
|
|
92
92
|
//# sourceMappingURL=FileBrowser.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function
|
|
1
|
+
{"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function parseFileEntries(paths: string[]): FileEntry[] {\n const root: FileEntry = {\n type: 'directory',\n name: '',\n path: '',\n children: [],\n };\n\n for (const path of paths.slice().sort()) {\n const parts = path.split('/');\n\n let current = root;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '') {\n throw new Error(`Invalid path part: ''`);\n }\n\n const entryPath = parts.slice(0, i + 1).join('/');\n\n const existing = current.children.find(child => child.name === part);\n if (existing?.type === 'file') {\n throw new Error(`Duplicate filename at '${entryPath}'`);\n } else if (existing) {\n current = existing;\n } else {\n if (i < parts.length - 1) {\n const newEntry: FileEntry = {\n type: 'directory',\n name: part,\n path: entryPath,\n children: [],\n };\n const firstFileIndex = current.children.findIndex(\n child => child.type === 'file',\n );\n current.children.splice(firstFileIndex, 0, newEntry);\n current = newEntry;\n } else {\n current.children.push({\n type: 'file',\n name: part,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return root.children;\n}\n\nfunction FileTreeItem({ entry }: { entry: FileEntry }) {\n if (entry.type === 'file') {\n return <TreeItem nodeId={entry.path} label={entry.name} />;\n }\n\n return (\n <TreeItem nodeId={entry.path} label={entry.name}>\n {entry.children.map(child => (\n <FileTreeItem key={child.path} entry={child} />\n ))}\n </TreeItem>\n );\n}\n\ninterface FileBrowserProps {\n /** A list of all filepaths to show, directories are separated with a `/` */\n filePaths: string[];\n /** The currently selected file */\n selected?: string;\n /** Callback for when a file is selected */\n onSelect?(filePath: string): void;\n}\n\n/** A simple file browser that allows you to select individual files */\nexport function FileBrowser(props: FileBrowserProps) {\n const classes = useStyles();\n\n const fileTree = useMemo(\n () => parseFileEntries(props.filePaths),\n [props.filePaths],\n );\n\n return (\n <TreeView\n selected={props.selected}\n className={classes.root}\n defaultCollapseIcon={<ExpandMoreIcon />}\n defaultExpandIcon={<ChevronRightIcon />}\n onNodeSelect={(_e: unknown, nodeId: string) => {\n if (props.onSelect && props.filePaths.includes(nodeId)) {\n props.onSelect(nodeId);\n }\n }}\n >\n {fileTree.map(entry => (\n <FileTreeItem key={entry.path} entry={entry} />\n ))}\n </TreeView>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { CreatedAtColumn } from './columns/CreatedAtColumn.esm.js';
|
|
|
10
10
|
import { OwnerEntityColumn } from './columns/OwnerEntityColumn.esm.js';
|
|
11
11
|
import { TaskStatusColumn } from './columns/TaskStatusColumn.esm.js';
|
|
12
12
|
import { TemplateTitleColumn } from './columns/TemplateTitleColumn.esm.js';
|
|
13
|
-
import { editRouteRef, actionsRouteRef, rootRouteRef } from '../../routes.esm.js';
|
|
13
|
+
import { editRouteRef, actionsRouteRef, rootRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
|
|
14
14
|
import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
|
|
15
15
|
import { useNavigate } from 'react-router-dom';
|
|
16
16
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
@@ -116,11 +116,13 @@ const ListTasksPage = (props) => {
|
|
|
116
116
|
const actionsLink = useRouteRef(actionsRouteRef);
|
|
117
117
|
const createLink = useRouteRef(rootRouteRef);
|
|
118
118
|
const { t } = useTranslationRef(scaffolderTranslationRef);
|
|
119
|
+
const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);
|
|
119
120
|
const scaffolderPageContextMenuProps = {
|
|
120
121
|
onEditorClicked: props?.contextMenu?.editor !== false ? () => navigate(editorLink()) : void 0,
|
|
121
122
|
onActionsClicked: props?.contextMenu?.actions !== false ? () => navigate(actionsLink()) : void 0,
|
|
122
123
|
onTasksClicked: void 0,
|
|
123
|
-
onCreateClicked: props?.contextMenu?.create !== false ? () => navigate(createLink()) : void 0
|
|
124
|
+
onCreateClicked: props?.contextMenu?.create !== false ? () => navigate(createLink()) : void 0,
|
|
125
|
+
onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink())
|
|
124
126
|
};
|
|
125
127
|
return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
|
|
126
128
|
/* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useState } from 'react';\nimport {\n scaffolderApiRef,\n ScaffolderTask,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport { actionsRouteRef, editRouteRef, rootRouteRef } from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n create?: boolean;\n };\n}\n\nconst ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [limit, setLimit] = useState(5);\n const [page, setPage] = useState(0);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({\n filterByOwnership: ownerFilter,\n limit,\n offset: page * limit,\n });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [], totalTasks: 0 });\n }, [scaffolderApi, ownerFilter, limit, page]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n onRowsPerPageChange={pageSize => {\n setPage(0);\n setLimit(pageSize);\n }}\n onPageChange={newPage => setPage(newPage)}\n options={{ pageSize: limit, emptyRowsWhenPaging: false }}\n data={value?.tasks ?? []}\n page={page}\n totalCount={value?.totalTasks ?? 0}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked: undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListTasksPage.esm.js","sources":["../../../src/components/ListTasksPage/ListTasksPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n Table,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport { CatalogFilterLayout } from '@backstage/plugin-catalog-react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useState } from 'react';\nimport {\n scaffolderApiRef,\n ScaffolderTask,\n} from '@backstage/plugin-scaffolder-react';\nimport { OwnerListPicker } from './OwnerListPicker';\nimport {\n CreatedAtColumn,\n OwnerEntityColumn,\n TaskStatusColumn,\n TemplateTitleColumn,\n} from './columns';\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nexport interface MyTaskPageProps {\n initiallySelectedFilter?: 'owned' | 'all';\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n create?: boolean;\n };\n}\n\nconst ListTaskPageContent = (props: MyTaskPageProps) => {\n const { initiallySelectedFilter = 'owned' } = props;\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const [limit, setLimit] = useState(5);\n const [page, setPage] = useState(0);\n\n const scaffolderApi = useApi(scaffolderApiRef);\n const rootLink = useRouteRef(rootRouteRef);\n\n const [ownerFilter, setOwnerFilter] = useState(initiallySelectedFilter);\n const { value, loading, error } = useAsync(() => {\n if (scaffolderApi.listTasks) {\n return scaffolderApi.listTasks?.({\n filterByOwnership: ownerFilter,\n limit,\n offset: page * limit,\n });\n }\n\n // eslint-disable-next-line no-console\n console.warn(\n 'listTasks is not implemented in the scaffolderApi, please make sure to implement this method.',\n );\n\n return Promise.resolve({ tasks: [], totalTasks: 0 });\n }, [scaffolderApi, ownerFilter, limit, page]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('listTaskPage.content.emptyState.title')}\n description={t('listTaskPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <OwnerListPicker\n filter={ownerFilter}\n onSelectOwner={id => setOwnerFilter(id)}\n />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <Table<ScaffolderTask>\n onRowsPerPageChange={pageSize => {\n setPage(0);\n setLimit(pageSize);\n }}\n onPageChange={newPage => setPage(newPage)}\n options={{ pageSize: limit, emptyRowsWhenPaging: false }}\n data={value?.tasks ?? []}\n page={page}\n totalCount={value?.totalTasks ?? 0}\n title={t('listTaskPage.content.tableTitle')}\n columns={[\n {\n title: t('listTaskPage.content.tableCell.taskID'),\n field: 'id',\n render: row => (\n <Link to={`${rootLink()}/tasks/${row.id}`}>{row.id}</Link>\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.template'),\n field: 'spec.templateInfo.entity.metadata.title',\n render: row => (\n <TemplateTitleColumn\n entityRef={row.spec.templateInfo?.entityRef}\n />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.created'),\n field: 'createdAt',\n render: row => <CreatedAtColumn createdAt={row.createdAt} />,\n },\n {\n title: t('listTaskPage.content.tableCell.owner'),\n field: 'createdBy',\n render: row => (\n <OwnerEntityColumn entityRef={row.spec?.user?.ref} />\n ),\n },\n {\n title: t('listTaskPage.content.tableCell.status'),\n field: 'status',\n render: row => <TaskStatusColumn status={row.status} />,\n },\n ]}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n );\n};\n\nexport const ListTasksPage = (props: MyTaskPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked: undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()),\n };\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('listTaskPage.pageTitle')}\n title={t('listTaskPage.title')}\n subtitle={t('listTaskPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ListTaskPageContent {...props} />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenderSchema.esm.js","sources":["../../../src/components/RenderSchema/RenderSchema.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 { MarkdownContent } from '@backstage/core-components';\nimport {\n TranslationFunction,\n TranslationRef,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport Box from '@material-ui/core/Box';\nimport Chip from '@material-ui/core/Chip';\nimport Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport WrapText from '@material-ui/icons/WrapText';\nimport classNames from 'classnames';\nimport {\n JSONSchema7,\n JSONSchema7Definition,\n JSONSchema7Type,\n} from 'json-schema';\nimport { FC, JSX, cloneElement, Fragment } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { SchemaRenderContext, SchemaRenderStrategy } from './types';\n\nconst getTypes = (properties: JSONSchema7) => {\n if (!properties.type) {\n return ['unknown'];\n }\n if (properties.type !== 'array') {\n return [properties.type].flat();\n }\n return [\n `${properties.type}(${\n (properties.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n};\n\nconst getSubschemas = (\n schema: JSONSchema7Definition,\n): Record<string, JSONSchema7Definition[]> => {\n if (typeof schema === 'boolean') {\n return {};\n }\n const base: Omit<JSONSchema7, keyof subSchemasType> = {};\n\n const compositeSchemaProperties = ['allOf', 'anyOf', 'not', 'oneOf'] as const;\n type subSchemasType = {\n [K in (typeof compositeSchemaProperties)[number]]?: JSONSchema7Definition[];\n };\n const subschemas: subSchemasType = {};\n\n for (const [key, value] of Object.entries(schema) as [\n keyof JSONSchema7,\n any,\n ][]) {\n if (compositeSchemaProperties.includes(key as keyof subSchemasType)) {\n let v;\n if (Array.isArray(value)) {\n if (!value.length) {\n continue;\n }\n v = value;\n } else if (value) {\n v = [value];\n } else {\n continue;\n }\n subschemas[key as keyof subSchemasType] = v as any;\n } else {\n base[key as Exclude<keyof JSONSchema7, keyof subSchemasType>] = value;\n }\n }\n return Object.fromEntries(\n Object.entries(subschemas).map(([key, sub]) => {\n const mergedSubschema = sub.map(alt => {\n if (typeof alt !== 'boolean' && alt.required) {\n const properties: JSONSchema7['properties'] = {};\n if (schema.properties) {\n for (const k of alt.required) {\n if (k in schema.properties) {\n properties[k] = schema.properties[k];\n }\n }\n }\n Object.assign(properties, alt.properties);\n return {\n ...base,\n ...alt,\n properties,\n };\n }\n return alt;\n });\n return [key, mergedSubschema];\n }),\n );\n};\n\nconst useColumnStyles = makeStyles({\n description: {\n width: '40%',\n whiteSpace: 'normal',\n wordWrap: 'break-word',\n '&.MuiTableCell-root': {\n whiteSpace: 'normal',\n },\n },\n standard: {\n whiteSpace: 'normal',\n },\n});\n\ntype SchemaRenderElement = {\n schema: JSONSchema7Definition;\n key?: string;\n required?: boolean;\n};\n\ntype RenderColumn = (\n element: SchemaRenderElement,\n context: SchemaRenderContext,\n) => JSX.Element;\n\ntype Xlate<R> = R extends TranslationRef<any, infer M>\n ? TranslationFunction<M>\n : never;\n\ntype Column = {\n key: string;\n title: (t: Xlate<typeof scaffolderTranslationRef>) => string;\n render: RenderColumn;\n className?: keyof ReturnType<typeof useColumnStyles>;\n};\n\nconst generateId = (\n element: SchemaRenderElement,\n context: SchemaRenderContext,\n) => {\n return element.key ? `${context.parentId}.${element.key}` : context.parentId;\n};\n\nconst nameColumn = {\n key: 'name',\n title: t => t('renderSchema.tableCell.name'),\n render: (element: SchemaRenderElement, context: SchemaRenderContext) => {\n return (\n <div\n className={classNames(context.classes.code, {\n [context.classes.codeRequired]: element.required,\n })}\n >\n {element.key}\n </div>\n );\n },\n} as Column;\n\nconst titleColumn = {\n key: 'title',\n title: t => t('renderSchema.tableCell.title'),\n render: (element: SchemaRenderElement) => (\n <MarkdownContent content={(element.schema as JSONSchema7).title ?? ''} />\n ),\n} as Column;\n\nconst descriptionColumn = {\n key: 'description',\n title: t => t('renderSchema.tableCell.description'),\n render: (element: SchemaRenderElement) => (\n <MarkdownContent\n content={(element.schema as JSONSchema7).description ?? ''}\n />\n ),\n className: 'description',\n} as Column;\n\nconst enumFrom = (schema: JSONSchema7) => {\n if (schema.type === 'array') {\n if (schema.items && typeof schema.items !== 'boolean') {\n if (Array.isArray(schema.items)) {\n const itemsWithEnum = schema.items\n .filter(e => typeof e === 'object' && 'enum' in e)\n .map(e => e as JSONSchema7);\n if (itemsWithEnum.length) {\n return itemsWithEnum[0].enum;\n }\n } else {\n return schema.items?.enum;\n }\n }\n return undefined;\n }\n return schema.enum;\n};\n\nconst inspectSchema = (\n schema: JSONSchema7Definition,\n): {\n canSubschema: boolean;\n hasEnum: boolean;\n} => {\n if (typeof schema === 'boolean') {\n return { canSubschema: false, hasEnum: false };\n }\n return {\n canSubschema: getTypes(schema).some(t => t.includes('object')),\n hasEnum: !!enumFrom(schema),\n };\n};\n\nconst typeColumn = {\n key: 'type',\n title: t => t('renderSchema.tableCell.type'),\n render: (element: SchemaRenderElement, context: SchemaRenderContext) => {\n if (typeof element.schema === 'boolean') {\n return <Typography>{element.schema ? 'any' : 'none'}</Typography>;\n }\n const types = getTypes(element.schema);\n const [isExpanded, setIsExpanded] = context.expanded;\n const id = generateId(element, context);\n const info = inspectSchema(element.schema);\n return (\n <>\n {types.map((type, index) =>\n type.includes('object') || (info.hasEnum && index === 0) ? (\n <Chip\n data-testid={`expand_${id}`}\n label={type}\n key={type}\n icon={isExpanded[id] ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n variant=\"outlined\"\n onClick={() =>\n setIsExpanded(prevState => {\n return {\n ...prevState,\n [id]: !!!prevState[id],\n };\n })\n }\n />\n ) : (\n <Chip label={type} key={type} variant=\"outlined\" />\n ),\n )}\n </>\n );\n },\n} as Column;\n\nexport const RenderEnum: FC<{\n e: JSONSchema7Type[];\n classes: ClassNameMap;\n [key: string]: any;\n}> = ({\n e,\n classes,\n ...props\n}: {\n e: JSONSchema7Type[];\n classes: ClassNameMap;\n}) => {\n return (\n <List {...props}>\n {e.map((v, i) => {\n let inner: JSX.Element = (\n <Typography\n data-testid={`enum_el${i}`}\n className={classNames(classes.code)}\n >\n {JSON.stringify(v)}\n </Typography>\n );\n if (v !== null && ['object', 'array'].includes(typeof v)) {\n inner = (\n <>\n {inner}\n <Tooltip\n title={\n <Typography\n data-testid={`pretty_${i}`}\n className={classNames(classes.code)}\n style={{ whiteSpace: 'pre-wrap' }}\n >\n {JSON.stringify(v, undefined, 2)}\n </Typography>\n }\n >\n <IconButton data-testid={`wrap-text_${i}`}>\n <WrapText />\n </IconButton>\n </Tooltip>\n </>\n );\n }\n return <ListItem key={i}>{inner}</ListItem>;\n })}\n </List>\n );\n};\n\nconst useTableStyles = makeStyles({\n schema: {\n width: '100%',\n overflowX: 'hidden',\n '& table': {\n width: '100%',\n tableLayout: 'fixed',\n },\n },\n});\n\nexport const RenderSchema = ({\n strategy,\n context,\n schema,\n}: {\n strategy: SchemaRenderStrategy;\n context: SchemaRenderContext;\n schema?: JSONSchema7Definition;\n}) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const tableStyles = useTableStyles();\n const columnStyles = useColumnStyles();\n const result = (() => {\n if (typeof schema === 'object') {\n const subschemas =\n strategy === 'root' || !context.parent ? getSubschemas(schema) : {};\n let columns: Column[] | undefined;\n let elements: SchemaRenderElement[] | undefined;\n if (strategy === 'root') {\n elements = [{ schema }];\n columns = [typeColumn];\n if (schema.description) {\n columns.unshift(descriptionColumn);\n }\n if (schema.title) {\n columns.unshift(titleColumn);\n }\n } else if (schema.properties) {\n columns = [nameColumn, titleColumn, descriptionColumn, typeColumn];\n elements = Object.entries(schema.properties!).map(([key, v]) => ({\n schema: v,\n key,\n required: schema.required?.includes(key),\n }));\n } else if (!Object.keys(subschemas).length) {\n return undefined;\n }\n const [isExpanded] = context.expanded;\n\n return (\n <>\n {columns && elements && (\n <TableContainer component={Paper} className={tableStyles.schema}>\n <Table\n data-testid={`${strategy}_${context.parentId}`}\n size=\"small\"\n >\n <TableHead>\n <TableRow>\n {columns.map((col, index) => (\n <TableCell\n key={index}\n className={columnStyles[col.className ?? 'standard']}\n >\n {col.title(t)}\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {elements.map(el => {\n const id = generateId(el, context);\n const info = inspectSchema(el.schema);\n return (\n <Fragment key={id}>\n <TableRow data-testid={`${strategy}-row_${id}`}>\n {columns!.map(col => (\n <TableCell\n key={col.key}\n className={\n columnStyles[col.className ?? 'standard']\n }\n >\n {col.render(el, context)}\n </TableCell>\n ))}\n </TableRow>\n {typeof el.schema !== 'boolean' &&\n (info.canSubschema || info.hasEnum) && (\n <TableRow>\n <TableCell\n style={{ paddingBottom: 0, paddingTop: 0 }}\n colSpan={columns!.length}\n >\n <Collapse\n in={isExpanded[id]}\n timeout=\"auto\"\n unmountOnExit\n >\n <Box\n data-testid={`expansion_${id}`}\n sx={{ margin: 1 }}\n >\n {info.canSubschema && (\n <RenderSchema\n strategy=\"properties\"\n context={{\n ...context,\n parentId: id,\n parent: context,\n }}\n schema={\n el.schema.type === 'array'\n ? (el.schema.items as\n | JSONSchema7\n | undefined)\n : el.schema\n }\n />\n )}\n {info.hasEnum && (\n <>\n {cloneElement(\n context.headings[0],\n {},\n 'Valid values:',\n )}\n <RenderEnum\n data-testid={`enum_${id}`}\n e={enumFrom(el.schema)!}\n classes={context.classes}\n />\n </>\n )}\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n );\n })}\n </TableBody>\n </Table>\n </TableContainer>\n )}\n {Object.keys(subschemas).map(sk => (\n <Fragment key={sk}>\n {cloneElement(context.headings[0], {}, sk)}\n {subschemas[sk].map((sub, index) => (\n <RenderSchema\n key={index}\n {...{\n strategy,\n context: {\n ...context,\n parentId: `${context.parentId}_sub${index}`,\n },\n schema: sub,\n }}\n />\n ))}\n </Fragment>\n ))}\n </>\n );\n }\n return undefined;\n })();\n return result ?? <Typography>No schema defined</Typography>;\n};\n"],"names":["Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RenderSchema.esm.js","sources":["../../../src/components/RenderSchema/RenderSchema.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 { MarkdownContent } from '@backstage/core-components';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport Box from '@material-ui/core/Box';\nimport Chip from '@material-ui/core/Chip';\nimport Collapse from '@material-ui/core/Collapse';\nimport IconButton from '@material-ui/core/IconButton';\nimport List from '@material-ui/core/List';\nimport ListItem from '@material-ui/core/ListItem';\nimport Paper from '@material-ui/core/Paper';\nimport Table from '@material-ui/core/Table';\nimport TableBody from '@material-ui/core/TableBody';\nimport TableCell from '@material-ui/core/TableCell';\nimport TableContainer from '@material-ui/core/TableContainer';\nimport TableHead from '@material-ui/core/TableHead';\nimport TableRow from '@material-ui/core/TableRow';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport ExpandLessIcon from '@material-ui/icons/ExpandLess';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport WrapText from '@material-ui/icons/WrapText';\nimport classNames from 'classnames';\nimport {\n JSONSchema7,\n JSONSchema7Definition,\n JSONSchema7Type,\n} from 'json-schema';\nimport { FC, JSX, cloneElement, Fragment } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { SchemaRenderContext, SchemaRenderStrategy } from './types';\nimport { TranslationMessages } from '../TemplatingExtensionsPage/types';\n\nconst getTypes = (properties: JSONSchema7) => {\n if (!properties.type) {\n return ['unknown'];\n }\n if (properties.type !== 'array') {\n return [properties.type].flat();\n }\n return [\n `${properties.type}(${\n (properties.items as JSONSchema7 | undefined)?.type ?? 'unknown'\n })`,\n ];\n};\n\nconst getSubschemas = (\n schema: JSONSchema7Definition,\n): Record<string, JSONSchema7Definition[]> => {\n if (typeof schema === 'boolean') {\n return {};\n }\n const base: Omit<JSONSchema7, keyof subSchemasType> = {};\n\n const compositeSchemaProperties = ['allOf', 'anyOf', 'not', 'oneOf'] as const;\n type subSchemasType = {\n [K in (typeof compositeSchemaProperties)[number]]?: JSONSchema7Definition[];\n };\n const subschemas: subSchemasType = {};\n\n for (const [key, value] of Object.entries(schema) as [\n keyof JSONSchema7,\n any,\n ][]) {\n if (compositeSchemaProperties.includes(key as keyof subSchemasType)) {\n let v;\n if (Array.isArray(value)) {\n if (!value.length) {\n continue;\n }\n v = value;\n } else if (value) {\n v = [value];\n } else {\n continue;\n }\n subschemas[key as keyof subSchemasType] = v as any;\n } else {\n base[key as Exclude<keyof JSONSchema7, keyof subSchemasType>] = value;\n }\n }\n return Object.fromEntries(\n Object.entries(subschemas).map(([key, sub]) => {\n const mergedSubschema = sub.map(alt => {\n if (typeof alt !== 'boolean' && alt.required) {\n const properties: JSONSchema7['properties'] = {};\n if (schema.properties) {\n for (const k of alt.required) {\n if (k in schema.properties) {\n properties[k] = schema.properties[k];\n }\n }\n }\n Object.assign(properties, alt.properties);\n return {\n ...base,\n ...alt,\n properties,\n };\n }\n return alt;\n });\n return [key, mergedSubschema];\n }),\n );\n};\n\nconst useColumnStyles = makeStyles({\n description: {\n width: '40%',\n whiteSpace: 'normal',\n wordWrap: 'break-word',\n '&.MuiTableCell-root': {\n whiteSpace: 'normal',\n },\n },\n standard: {\n whiteSpace: 'normal',\n },\n});\n\ntype SchemaRenderElement = {\n schema: JSONSchema7Definition;\n key?: string;\n required?: boolean;\n};\n\ntype RenderColumn = (\n element: SchemaRenderElement,\n context: SchemaRenderContext,\n) => JSX.Element;\n\ntype Column = {\n key: string;\n title: (t: TranslationMessages<typeof scaffolderTranslationRef>) => string;\n render: RenderColumn;\n className?: keyof ReturnType<typeof useColumnStyles>;\n};\n\nconst generateId = (\n element: SchemaRenderElement,\n context: SchemaRenderContext,\n) => {\n return element.key ? `${context.parentId}.${element.key}` : context.parentId;\n};\n\nconst nameColumn = {\n key: 'name',\n title: t => t('renderSchema.tableCell.name'),\n render: (element: SchemaRenderElement, context: SchemaRenderContext) => {\n return (\n <div\n className={classNames(context.classes.code, {\n [context.classes.codeRequired]: element.required,\n })}\n >\n {element.key}\n </div>\n );\n },\n} as Column;\n\nconst titleColumn = {\n key: 'title',\n title: t => t('renderSchema.tableCell.title'),\n render: (element: SchemaRenderElement) => (\n <MarkdownContent content={(element.schema as JSONSchema7).title ?? ''} />\n ),\n} as Column;\n\nconst descriptionColumn = {\n key: 'description',\n title: t => t('renderSchema.tableCell.description'),\n render: (element: SchemaRenderElement) => (\n <MarkdownContent\n content={(element.schema as JSONSchema7).description ?? ''}\n />\n ),\n className: 'description',\n} as Column;\n\nconst enumFrom = (schema: JSONSchema7) => {\n if (schema.type === 'array') {\n if (schema.items && typeof schema.items !== 'boolean') {\n if (Array.isArray(schema.items)) {\n const itemsWithEnum = schema.items\n .filter(e => typeof e === 'object' && 'enum' in e)\n .map(e => e as JSONSchema7);\n if (itemsWithEnum.length) {\n return itemsWithEnum[0].enum;\n }\n } else {\n return schema.items?.enum;\n }\n }\n return undefined;\n }\n return schema.enum;\n};\n\nconst inspectSchema = (\n schema: JSONSchema7Definition,\n): {\n canSubschema: boolean;\n hasEnum: boolean;\n} => {\n if (typeof schema === 'boolean') {\n return { canSubschema: false, hasEnum: false };\n }\n return {\n canSubschema: getTypes(schema).some(t => t.includes('object')),\n hasEnum: !!enumFrom(schema),\n };\n};\n\nconst typeColumn = {\n key: 'type',\n title: t => t('renderSchema.tableCell.type'),\n render: (element: SchemaRenderElement, context: SchemaRenderContext) => {\n if (typeof element.schema === 'boolean') {\n return <Typography>{element.schema ? 'any' : 'none'}</Typography>;\n }\n const types = getTypes(element.schema);\n const [isExpanded, setIsExpanded] = context.expanded;\n const id = generateId(element, context);\n const info = inspectSchema(element.schema);\n return (\n <>\n {types.map((type, index) =>\n type.includes('object') || (info.hasEnum && index === 0) ? (\n <Chip\n data-testid={`expand_${id}`}\n label={type}\n key={type}\n icon={isExpanded[id] ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n variant=\"outlined\"\n onClick={() =>\n setIsExpanded(prevState => {\n return {\n ...prevState,\n [id]: !!!prevState[id],\n };\n })\n }\n />\n ) : (\n <Chip label={type} key={type} variant=\"outlined\" />\n ),\n )}\n </>\n );\n },\n} as Column;\n\nexport const RenderEnum: FC<{\n e: JSONSchema7Type[];\n classes: ClassNameMap;\n [key: string]: any;\n}> = ({\n e,\n classes,\n ...props\n}: {\n e: JSONSchema7Type[];\n classes: ClassNameMap;\n}) => {\n return (\n <List {...props}>\n {e.map((v, i) => {\n let inner: JSX.Element = (\n <Typography\n data-testid={`enum_el${i}`}\n className={classNames(classes.code)}\n >\n {JSON.stringify(v)}\n </Typography>\n );\n if (v !== null && ['object', 'array'].includes(typeof v)) {\n inner = (\n <>\n {inner}\n <Tooltip\n title={\n <Typography\n data-testid={`pretty_${i}`}\n className={classNames(classes.code)}\n style={{ whiteSpace: 'pre-wrap' }}\n >\n {JSON.stringify(v, undefined, 2)}\n </Typography>\n }\n >\n <IconButton data-testid={`wrap-text_${i}`}>\n <WrapText />\n </IconButton>\n </Tooltip>\n </>\n );\n }\n return <ListItem key={i}>{inner}</ListItem>;\n })}\n </List>\n );\n};\n\nconst useTableStyles = makeStyles({\n schema: {\n width: '100%',\n overflowX: 'hidden',\n '& table': {\n width: '100%',\n tableLayout: 'fixed',\n },\n },\n});\n\nexport const RenderSchema = ({\n strategy,\n context,\n schema,\n}: {\n strategy: SchemaRenderStrategy;\n context: SchemaRenderContext;\n schema?: JSONSchema7Definition;\n}) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const tableStyles = useTableStyles();\n const columnStyles = useColumnStyles();\n const result = (() => {\n if (typeof schema === 'object') {\n const subschemas =\n strategy === 'root' || !context.parent ? getSubschemas(schema) : {};\n let columns: Column[] | undefined;\n let elements: SchemaRenderElement[] | undefined;\n if (strategy === 'root') {\n elements = [{ schema }];\n columns = [typeColumn];\n if (schema.description) {\n columns.unshift(descriptionColumn);\n }\n if (schema.title) {\n columns.unshift(titleColumn);\n }\n } else if (schema.properties) {\n columns = [nameColumn, titleColumn, descriptionColumn, typeColumn];\n elements = Object.entries(schema.properties!).map(([key, v]) => ({\n schema: v,\n key,\n required: schema.required?.includes(key),\n }));\n } else if (!Object.keys(subschemas).length) {\n return undefined;\n }\n const [isExpanded] = context.expanded;\n\n return (\n <>\n {columns && elements && (\n <TableContainer component={Paper} className={tableStyles.schema}>\n <Table\n data-testid={`${strategy}_${context.parentId}`}\n size=\"small\"\n >\n <TableHead>\n <TableRow>\n {columns.map((col, index) => (\n <TableCell\n key={index}\n className={columnStyles[col.className ?? 'standard']}\n >\n {col.title(t)}\n </TableCell>\n ))}\n </TableRow>\n </TableHead>\n <TableBody>\n {elements.map(el => {\n const id = generateId(el, context);\n const info = inspectSchema(el.schema);\n return (\n <Fragment key={id}>\n <TableRow data-testid={`${strategy}-row_${id}`}>\n {columns!.map(col => (\n <TableCell\n key={col.key}\n className={\n columnStyles[col.className ?? 'standard']\n }\n >\n {col.render(el, context)}\n </TableCell>\n ))}\n </TableRow>\n {typeof el.schema !== 'boolean' &&\n (info.canSubschema || info.hasEnum) && (\n <TableRow>\n <TableCell\n style={{ paddingBottom: 0, paddingTop: 0 }}\n colSpan={columns!.length}\n >\n <Collapse\n in={isExpanded[id]}\n timeout=\"auto\"\n unmountOnExit\n >\n <Box\n data-testid={`expansion_${id}`}\n sx={{ margin: 1 }}\n >\n {info.canSubschema && (\n <RenderSchema\n strategy=\"properties\"\n context={{\n ...context,\n parentId: id,\n parent: context,\n }}\n schema={\n el.schema.type === 'array'\n ? (el.schema.items as\n | JSONSchema7\n | undefined)\n : el.schema\n }\n />\n )}\n {info.hasEnum && (\n <>\n {cloneElement(\n context.headings[0],\n {},\n 'Valid values:',\n )}\n <RenderEnum\n data-testid={`enum_${id}`}\n e={enumFrom(el.schema)!}\n classes={context.classes}\n />\n </>\n )}\n </Box>\n </Collapse>\n </TableCell>\n </TableRow>\n )}\n </Fragment>\n );\n })}\n </TableBody>\n </Table>\n </TableContainer>\n )}\n {Object.keys(subschemas).map(sk => (\n <Fragment key={sk}>\n {cloneElement(context.headings[0], {}, sk)}\n {subschemas[sk].map((sub, index) => (\n <RenderSchema\n key={index}\n {...{\n strategy,\n context: {\n ...context,\n parentId: `${context.parentId}_sub${index}`,\n },\n schema: sub,\n }}\n />\n ))}\n </Fragment>\n ))}\n </>\n );\n }\n return undefined;\n })();\n return result ?? <Typography>No schema defined</Typography>;\n};\n"],"names":["Fragment"],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { useOutlet, Routes, Route } from 'react-router-dom';
|
|
3
3
|
import { useCustomFieldExtensions, useCustomLayouts, SecretsContextProvider } from '@backstage/plugin-scaffolder-react';
|
|
4
4
|
import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default.esm.js';
|
|
5
|
-
import { selectedTemplateRouteRef, scaffolderTaskRouteRef, editRouteRef, customFieldsRouteRef, templateFormRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editorRouteRef } from '../../routes.esm.js';
|
|
5
|
+
import { selectedTemplateRouteRef, scaffolderTaskRouteRef, editRouteRef, customFieldsRouteRef, templateFormRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editorRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
|
|
6
6
|
import { ActionsPage } from '../ActionsPage/ActionsPage.esm.js';
|
|
7
7
|
import { ListTasksPage } from '../ListTasksPage/ListTasksPage.esm.js';
|
|
8
8
|
import { TemplateListPage } from '../../alpha/components/TemplateListPage/TemplateListPage.esm.js';
|
|
@@ -16,6 +16,7 @@ import { RequirePermission } from '@backstage/plugin-permission-react';
|
|
|
16
16
|
import { taskReadPermission, templateManagementPermission } from '@backstage/plugin-scaffolder-common/alpha';
|
|
17
17
|
import { useApp } from '@backstage/core-plugin-api';
|
|
18
18
|
import { useAsync, useMountEffect } from '@react-hookz/web';
|
|
19
|
+
import { TemplatingExtensionsPage } from '../TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js';
|
|
19
20
|
import { OpaqueFormField } from '../../packages/scaffolder-internal/src/wiring/InternalFormField.esm.js';
|
|
20
21
|
import '../../packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js';
|
|
21
22
|
|
|
@@ -146,6 +147,13 @@ const InternalRouter = (props) => {
|
|
|
146
147
|
) }) })
|
|
147
148
|
}
|
|
148
149
|
),
|
|
150
|
+
/* @__PURE__ */ jsx(
|
|
151
|
+
Route,
|
|
152
|
+
{
|
|
153
|
+
path: templatingExtensionsRouteRef.path,
|
|
154
|
+
element: /* @__PURE__ */ jsx(TemplatingExtensionsPage, {})
|
|
155
|
+
}
|
|
156
|
+
),
|
|
149
157
|
/* @__PURE__ */ jsx(Route, { path: "*", element: /* @__PURE__ */ jsx(NotFoundErrorPage, {}) })
|
|
150
158
|
] });
|
|
151
159
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Router.esm.js","sources":["../../../src/components/Router/Router.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentType, PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router-dom';\n\nimport {\n FieldExtensionOptions,\n FormProps,\n ReviewStepProps,\n TemplateGroupFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderTaskOutput,\n SecretsContextProvider,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\n\nimport {\n actionsRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n editRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templateFormRouteRef,\n} from '../../routes';\n\nimport { ActionsPage } from '../../components/ActionsPage';\nimport { ListTasksPage } from '../../components/ListTasksPage';\n\nimport {\n TemplateListPageProps,\n TemplateWizardPageProps,\n} from '@backstage/plugin-scaffolder/alpha';\nimport { TemplateListPage, TemplateWizardPage } from '../../alpha/components';\nimport { OngoingTask } from '../OngoingTask';\nimport {\n TemplateFormPage,\n TemplateIntroPage,\n TemplateEditorPage,\n CustomFieldsPage,\n} from '../../alpha/components/TemplateEditorPage';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n templateManagementPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useApp } from '@backstage/core-plugin-api';\nimport { FormField, OpaqueFormField } from '@internal/scaffolder';\nimport { useAsync, useMountEffect } from '@react-hookz/web';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: ComponentType<TemplateWizardPageProps>;\n };\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n defaultPreviewTemplate?: string;\n formProps?: FormProps;\n contextMenu?: {\n /** Whether to show a link to the template editor */\n editor?: boolean;\n /** Whether to show a link to the actions documentation */\n actions?: boolean;\n /** Whether to show a link to the tasks page */\n tasks?: boolean;\n /** Whether to show a link to the create page (on /create subroutes) */\n create?: boolean;\n };\n};\n\n/**\n * Internal router with additional props that aren't available in the public API\n * for the old frontend system.\n *\n * @internal\n */\nexport const InternalRouter = (\n props: PropsWithChildren<\n RouterProps & { formFieldLoaders?: Array<() => Promise<FormField>> }\n >,\n) => {\n const {\n components: {\n TemplateCardComponent,\n TaskPageComponent = OngoingTask,\n ReviewStepComponent,\n EXPERIMENTAL_TemplateOutputsComponent: TemplateOutputsComponent,\n EXPERIMENTAL_TemplateListPageComponent:\n TemplateListPageComponent = TemplateListPage,\n EXPERIMENTAL_TemplateWizardPageComponent:\n TemplateWizardPageComponent = TemplateWizardPage,\n } = {},\n } = props;\n const outlet = useOutlet() || props.children;\n const customFieldExtensions = useCustomFieldExtensions(outlet);\n const loadedFieldExtensions = useFormFieldLoaders(props.formFieldLoaders);\n\n const app = useApp();\n const { NotFoundErrorPage } = app.getComponents();\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...loadedFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n const customLayouts = useCustomLayouts(outlet);\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPageComponent\n TemplateCardComponent={TemplateCardComponent}\n contextMenu={props.contextMenu}\n groups={props.groups}\n templateFilter={props.templateFilter}\n headerOptions={props.headerOptions}\n />\n }\n />\n <Route\n path={selectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPageComponent\n headerOptions={props.headerOptions}\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n components={{ ReviewStepComponent }}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path={scaffolderTaskRouteRef.path}\n element={\n <RequirePermission permission={taskReadPermission}>\n <TaskPageComponent\n TemplateOutputsComponent={TemplateOutputsComponent}\n />\n </RequirePermission>\n }\n />\n <Route\n path={editRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateIntroPage />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n\n <Route\n path={actionsRouteRef.path}\n element={<ActionsPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={\n <RequirePermission permission={taskReadPermission}>\n <ListTasksPage contextMenu={props.contextMenu} />\n </RequirePermission>\n }\n />\n <Route\n path={editorRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateEditorPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route path=\"*\" element={<NotFoundErrorPage />} />\n </Routes>\n );\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n return <InternalRouter {...props} />;\n};\n\nfunction useFormFieldLoaders(\n formFieldLoaders?: Array<() => Promise<FormField>>,\n) {\n const [{ result: loadedFieldExtensions }, { execute }] =\n useAsync(async () => {\n const loaded = await Promise.all(\n (formFieldLoaders ?? []).map(loader => loader()),\n );\n return loaded.map(f => OpaqueFormField.toInternal(f));\n }, []);\n useMountEffect(execute);\n return loadedFieldExtensions;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Router.esm.js","sources":["../../../src/components/Router/Router.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentType, PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router-dom';\n\nimport {\n FieldExtensionOptions,\n FormProps,\n ReviewStepProps,\n TemplateGroupFilter,\n} from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderTaskOutput,\n SecretsContextProvider,\n useCustomFieldExtensions,\n useCustomLayouts,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';\n\nimport {\n actionsRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n editRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templateFormRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\n\nimport { ActionsPage } from '../../components/ActionsPage';\nimport { ListTasksPage } from '../../components/ListTasksPage';\n\nimport {\n TemplateListPageProps,\n TemplateWizardPageProps,\n} from '@backstage/plugin-scaffolder/alpha';\nimport { TemplateListPage, TemplateWizardPage } from '../../alpha/components';\nimport { OngoingTask } from '../OngoingTask';\nimport {\n TemplateFormPage,\n TemplateIntroPage,\n TemplateEditorPage,\n CustomFieldsPage,\n} from '../../alpha/components/TemplateEditorPage';\nimport { RequirePermission } from '@backstage/plugin-permission-react';\nimport {\n taskReadPermission,\n templateManagementPermission,\n} from '@backstage/plugin-scaffolder-common/alpha';\nimport { useApp } from '@backstage/core-plugin-api';\nimport { FormField, OpaqueFormField } from '@internal/scaffolder';\nimport { useAsync, useMountEffect } from '@react-hookz/web';\nimport { TemplatingExtensionsPage } from '../TemplatingExtensionsPage';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @public\n */\nexport type RouterProps = {\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: ComponentType<PropsWithChildren<{}>>;\n EXPERIMENTAL_TemplateOutputsComponent?: ComponentType<{\n output?: ScaffolderTaskOutput;\n }>;\n EXPERIMENTAL_TemplateListPageComponent?: ComponentType<TemplateListPageProps>;\n EXPERIMENTAL_TemplateWizardPageComponent?: ComponentType<TemplateWizardPageProps>;\n };\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n defaultPreviewTemplate?: string;\n formProps?: FormProps;\n contextMenu?: {\n /** Whether to show a link to the template editor */\n editor?: boolean;\n /** Whether to show a link to the actions documentation */\n actions?: boolean;\n /** Whether to show a link to the tasks page */\n tasks?: boolean;\n /** Whether to show a link to the create page (on /create subroutes) */\n create?: boolean;\n };\n};\n\n/**\n * Internal router with additional props that aren't available in the public API\n * for the old frontend system.\n *\n * @internal\n */\nexport const InternalRouter = (\n props: PropsWithChildren<\n RouterProps & { formFieldLoaders?: Array<() => Promise<FormField>> }\n >,\n) => {\n const {\n components: {\n TemplateCardComponent,\n TaskPageComponent = OngoingTask,\n ReviewStepComponent,\n EXPERIMENTAL_TemplateOutputsComponent: TemplateOutputsComponent,\n EXPERIMENTAL_TemplateListPageComponent:\n TemplateListPageComponent = TemplateListPage,\n EXPERIMENTAL_TemplateWizardPageComponent:\n TemplateWizardPageComponent = TemplateWizardPage,\n } = {},\n } = props;\n const outlet = useOutlet() || props.children;\n const customFieldExtensions = useCustomFieldExtensions(outlet);\n const loadedFieldExtensions = useFormFieldLoaders(props.formFieldLoaders);\n\n const app = useApp();\n const { NotFoundErrorPage } = app.getComponents();\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...loadedFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ] as FieldExtensionOptions[];\n\n const customLayouts = useCustomLayouts(outlet);\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPageComponent\n TemplateCardComponent={TemplateCardComponent}\n contextMenu={props.contextMenu}\n groups={props.groups}\n templateFilter={props.templateFilter}\n headerOptions={props.headerOptions}\n />\n }\n />\n <Route\n path={selectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPageComponent\n headerOptions={props.headerOptions}\n customFieldExtensions={fieldExtensions}\n layouts={customLayouts}\n components={{ ReviewStepComponent }}\n formProps={props.formProps}\n />\n </SecretsContextProvider>\n }\n />\n <Route\n path={scaffolderTaskRouteRef.path}\n element={\n <RequirePermission permission={taskReadPermission}>\n <TaskPageComponent\n TemplateOutputsComponent={TemplateOutputsComponent}\n />\n </RequirePermission>\n }\n />\n <Route\n path={editRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateIntroPage />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={customFieldsRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <CustomFieldsPage fieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templateFormRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateFormPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n\n <Route\n path={actionsRouteRef.path}\n element={<ActionsPage contextMenu={props.contextMenu} />}\n />\n <Route\n path={scaffolderListTaskRouteRef.path}\n element={\n <RequirePermission permission={taskReadPermission}>\n <ListTasksPage contextMenu={props.contextMenu} />\n </RequirePermission>\n }\n />\n <Route\n path={editorRouteRef.path}\n element={\n <RequirePermission permission={templateManagementPermission}>\n <SecretsContextProvider>\n <TemplateEditorPage\n layouts={customLayouts}\n formProps={props.formProps}\n fieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n </RequirePermission>\n }\n />\n <Route\n path={templatingExtensionsRouteRef.path}\n element={<TemplatingExtensionsPage />}\n />\n <Route path=\"*\" element={<NotFoundErrorPage />} />\n </Routes>\n );\n};\n\n/**\n * The Scaffolder Router\n *\n * @public\n */\nexport const Router = (props: PropsWithChildren<RouterProps>) => {\n return <InternalRouter {...props} />;\n};\n\nfunction useFormFieldLoaders(\n formFieldLoaders?: Array<() => Promise<FormField>>,\n) {\n const [{ result: loadedFieldExtensions }, { execute }] =\n useAsync(async () => {\n const loaded = await Promise.all(\n (formFieldLoaders ?? []).map(loader => loader()),\n );\n return loaded.map(f => OpaqueFormField.toInternal(f));\n }, []);\n useMountEffect(execute);\n return loadedFieldExtensions;\n}\n"],"names":[],"mappings":"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"}
|