@backstage/plugin-scaffolder 1.6.0 → 1.7.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/alpha/package.json +1 -1
- package/dist/esm/{Router-ad1d6fa2.esm.js → Router-7e8b8be7.esm.js} +64 -16
- package/dist/esm/Router-7e8b8be7.esm.js.map +1 -0
- package/dist/esm/{default-e3b0d980.esm.js → default-21c262f6.esm.js} +2 -2
- package/dist/esm/{default-e3b0d980.esm.js.map → default-21c262f6.esm.js.map} +1 -1
- package/dist/esm/{index-771633ac.esm.js → index-5cc08bb9.esm.js} +97 -24
- package/dist/esm/index-5cc08bb9.esm.js.map +1 -0
- package/dist/esm/{index-59f10b07.esm.js → index-f96a52f0.esm.js} +69 -20
- package/dist/esm/index-f96a52f0.esm.js.map +1 -0
- package/dist/index.alpha.d.ts +9 -0
- package/dist/index.beta.d.ts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.esm.js +1 -1
- package/package.json +20 -21
- package/LICENSE +0 -201
- package/dist/esm/Router-ad1d6fa2.esm.js.map +0 -1
- package/dist/esm/index-59f10b07.esm.js.map +0 -1
- package/dist/esm/index-771633ac.esm.js.map +0 -1
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import React, { useState, useMemo, useEffect } from 'react';
|
|
2
2
|
import { Navigate, useOutlet, Routes, Route } from 'react-router';
|
|
3
|
-
import { Progress, ItemCardHeader, MarkdownContent, UserIcon, Button as Button$1, Content, Link as Link$
|
|
3
|
+
import { Progress, ItemCardHeader, MarkdownContent, UserIcon, Button as Button$1, Content, Link as Link$2, ItemCardGrid, ContentHeader, Page, Header, SupportButton, StructuredMetadataTable, InfoCard } from '@backstage/core-components';
|
|
4
4
|
import { useEntityTypeFilter, FavoriteEntity, getEntityRelations, EntityRefLinks, useEntityList, EntityListProvider, CatalogFilterLayout, EntitySearchBar, EntityKindPicker, UserListPicker, EntityTagPicker } from '@backstage/plugin-catalog-react';
|
|
5
5
|
import capitalize from 'lodash/capitalize';
|
|
6
|
-
import { Box, Typography, FormControlLabel, Checkbox, TextField, makeStyles, useTheme, Card, CardContent, Divider, Chip, CardActions, Stepper as Stepper$1, Step, StepLabel, Button as Button$2 } from '@material-ui/core';
|
|
6
|
+
import { Box, Typography, FormControlLabel, Checkbox, TextField, makeStyles, useTheme, Link as Link$1, Card, CardContent, Grid, Divider, Chip, CardActions, Stepper as Stepper$1, Step, StepLabel, Button as Button$2 } from '@material-ui/core';
|
|
7
7
|
import CheckBoxIcon from '@material-ui/icons/CheckBox';
|
|
8
8
|
import CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';
|
|
9
9
|
import ExpandMoreIcon from '@material-ui/icons/ExpandMore';
|
|
10
10
|
import { Autocomplete } from '@material-ui/lab';
|
|
11
|
-
import { useApi, alertApiRef, useRouteRef, errorApiRef, featureFlagsApiRef, useApiHolder, useRouteRefParams, useElementFilter } from '@backstage/core-plugin-api';
|
|
11
|
+
import { useApi, alertApiRef, useRouteRef, useApp, errorApiRef, featureFlagsApiRef, useApiHolder, useRouteRefParams, useElementFilter } from '@backstage/core-plugin-api';
|
|
12
12
|
import Button from '@material-ui/core/Button';
|
|
13
13
|
import IconButton from '@material-ui/core/IconButton';
|
|
14
14
|
import useMediaQuery from '@material-ui/core/useMediaQuery';
|
|
@@ -16,13 +16,14 @@ import { Link } from 'react-router-dom';
|
|
|
16
16
|
import AddCircleOutline from '@material-ui/icons/AddCircleOutline';
|
|
17
17
|
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
|
|
18
18
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
19
|
-
import { u as nextSelectedTemplateRouteRef, r as registerComponentRouteRef,
|
|
20
|
-
import { RELATION_OWNED_BY, parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';
|
|
19
|
+
import { u as nextSelectedTemplateRouteRef, v as viewTechDocRouteRef, r as registerComponentRouteRef, w as nextRouteRef, s as selectedTemplateRouteRef, c as scaffolderApiRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, k as SecretsContextProvider } from './index-f96a52f0.esm.js';
|
|
20
|
+
import { RELATION_OWNED_BY, parseEntityRef, stringifyEntityRef, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
|
|
21
|
+
import LanguageIcon from '@material-ui/icons/Language';
|
|
21
22
|
import useAsync from 'react-use/lib/useAsync';
|
|
22
23
|
import { withTheme } from '@rjsf/core';
|
|
23
24
|
import { Theme } from '@rjsf/material-ui';
|
|
24
25
|
import { Draft07 } from 'json-schema-library';
|
|
25
|
-
import { D as DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default-
|
|
26
|
+
import { D as DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './default-21c262f6.esm.js';
|
|
26
27
|
import '@backstage/errors';
|
|
27
28
|
import 'qs';
|
|
28
29
|
import 'zen-observable';
|
|
@@ -47,7 +48,6 @@ import 'classnames';
|
|
|
47
48
|
import 'luxon';
|
|
48
49
|
import 'react-use/lib/useInterval';
|
|
49
50
|
import 'use-immer';
|
|
50
|
-
import '@material-ui/icons/Language';
|
|
51
51
|
|
|
52
52
|
const icon = /* @__PURE__ */ React.createElement(CheckBoxOutlineBlankIcon, {
|
|
53
53
|
fontSize: "small"
|
|
@@ -122,7 +122,7 @@ const RegisterExistingButton = (props) => {
|
|
|
122
122
|
}, title);
|
|
123
123
|
};
|
|
124
124
|
|
|
125
|
-
const useStyles$
|
|
125
|
+
const useStyles$4 = makeStyles(
|
|
126
126
|
() => ({
|
|
127
127
|
header: {
|
|
128
128
|
backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage
|
|
@@ -142,7 +142,7 @@ const CardHeader = (props) => {
|
|
|
142
142
|
} = props;
|
|
143
143
|
const { getPageTheme } = useTheme();
|
|
144
144
|
const themeForType = getPageTheme({ themeId: type });
|
|
145
|
-
const styles = useStyles$
|
|
145
|
+
const styles = useStyles$4({
|
|
146
146
|
cardBackgroundImage: themeForType.backgroundImage
|
|
147
147
|
});
|
|
148
148
|
const SubtitleComponent = /* @__PURE__ */ React.createElement("div", {
|
|
@@ -158,6 +158,24 @@ const CardHeader = (props) => {
|
|
|
158
158
|
});
|
|
159
159
|
};
|
|
160
160
|
|
|
161
|
+
const useStyles$3 = makeStyles(() => ({
|
|
162
|
+
linkText: {
|
|
163
|
+
display: "inline-flex",
|
|
164
|
+
alignItems: "center"
|
|
165
|
+
}
|
|
166
|
+
}));
|
|
167
|
+
const CardLink = ({ icon: Icon, text, url }) => {
|
|
168
|
+
const styles = useStyles$3();
|
|
169
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
170
|
+
className: styles.linkText
|
|
171
|
+
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
172
|
+
fontSize: "small"
|
|
173
|
+
}), /* @__PURE__ */ React.createElement(Link$1, {
|
|
174
|
+
style: { marginLeft: "8px" },
|
|
175
|
+
href: url
|
|
176
|
+
}, text || url));
|
|
177
|
+
};
|
|
178
|
+
|
|
161
179
|
const useStyles$2 = makeStyles((theme) => ({
|
|
162
180
|
box: {
|
|
163
181
|
overflow: "hidden",
|
|
@@ -168,7 +186,7 @@ const useStyles$2 = makeStyles((theme) => ({
|
|
|
168
186
|
},
|
|
169
187
|
markdown: {
|
|
170
188
|
"& :first-child": {
|
|
171
|
-
|
|
189
|
+
margin: 0
|
|
172
190
|
}
|
|
173
191
|
},
|
|
174
192
|
label: {
|
|
@@ -179,9 +197,6 @@ const useStyles$2 = makeStyles((theme) => ({
|
|
|
179
197
|
lineHeight: 1,
|
|
180
198
|
fontSize: "0.75rem"
|
|
181
199
|
},
|
|
182
|
-
margin: {
|
|
183
|
-
marginBottom: theme.spacing(2)
|
|
184
|
-
},
|
|
185
200
|
footer: {
|
|
186
201
|
display: "flex",
|
|
187
202
|
justifyContent: "space-between",
|
|
@@ -196,7 +211,7 @@ const useStyles$2 = makeStyles((theme) => ({
|
|
|
196
211
|
}
|
|
197
212
|
}));
|
|
198
213
|
const TemplateCard = (props) => {
|
|
199
|
-
var _a, _b, _c, _d;
|
|
214
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
200
215
|
const { template } = props;
|
|
201
216
|
const styles = useStyles$2();
|
|
202
217
|
const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);
|
|
@@ -208,24 +223,82 @@ const TemplateCard = (props) => {
|
|
|
208
223
|
templateName: name,
|
|
209
224
|
namespace
|
|
210
225
|
});
|
|
226
|
+
const app = useApp();
|
|
227
|
+
const iconResolver = (key) => {
|
|
228
|
+
var _a2;
|
|
229
|
+
return key ? (_a2 = app.getSystemIcon(key)) != null ? _a2 : LanguageIcon : LanguageIcon;
|
|
230
|
+
};
|
|
231
|
+
const viewTechDoc = useRouteRef(viewTechDocRouteRef);
|
|
232
|
+
const viewTechDocsAnnotation = (_a = template.metadata.annotations) == null ? void 0 : _a["backstage.io/techdocs-ref"];
|
|
233
|
+
const viewTechDocsLink = !!viewTechDocsAnnotation && !!viewTechDoc && viewTechDoc({
|
|
234
|
+
namespace: template.metadata.namespace || DEFAULT_NAMESPACE,
|
|
235
|
+
kind: template.kind,
|
|
236
|
+
name: template.metadata.name
|
|
237
|
+
});
|
|
211
238
|
return /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, {
|
|
212
239
|
template
|
|
213
|
-
}), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
240
|
+
}), /* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Grid, {
|
|
241
|
+
container: true,
|
|
242
|
+
spacing: 2
|
|
243
|
+
}, /* @__PURE__ */ React.createElement(Grid, {
|
|
244
|
+
item: true,
|
|
245
|
+
xs: 12
|
|
246
|
+
}, /* @__PURE__ */ React.createElement(Box, {
|
|
214
247
|
className: styles.box
|
|
215
248
|
}, /* @__PURE__ */ React.createElement(MarkdownContent, {
|
|
216
249
|
className: styles.markdown,
|
|
217
|
-
content: (
|
|
218
|
-
})), ((
|
|
219
|
-
|
|
220
|
-
|
|
250
|
+
content: (_b = template.metadata.description) != null ? _b : "No description"
|
|
251
|
+
}))), ((_d = (_c = template.metadata.tags) == null ? void 0 : _c.length) != null ? _d : 0) > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid, {
|
|
252
|
+
item: true,
|
|
253
|
+
xs: 12
|
|
254
|
+
}, /* @__PURE__ */ React.createElement(Divider, null)), /* @__PURE__ */ React.createElement(Grid, {
|
|
255
|
+
item: true,
|
|
256
|
+
xs: 12
|
|
257
|
+
}, /* @__PURE__ */ React.createElement(Grid, {
|
|
258
|
+
container: true,
|
|
259
|
+
spacing: 2
|
|
260
|
+
}, (_e = template.metadata.tags) == null ? void 0 : _e.map((tag) => /* @__PURE__ */ React.createElement(Grid, {
|
|
261
|
+
item: true
|
|
262
|
+
}, /* @__PURE__ */ React.createElement(Chip, {
|
|
263
|
+
style: { margin: 0 },
|
|
221
264
|
size: "small",
|
|
222
265
|
label: tag,
|
|
223
266
|
key: tag
|
|
224
|
-
}))))), /* @__PURE__ */ React.createElement(
|
|
267
|
+
})))))), (!!viewTechDocsLink || ((_f = template.metadata.links) == null ? void 0 : _f.length)) && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Grid, {
|
|
268
|
+
item: true,
|
|
269
|
+
xs: 12
|
|
270
|
+
}, /* @__PURE__ */ React.createElement(Divider, null)), /* @__PURE__ */ React.createElement(Grid, {
|
|
271
|
+
item: true,
|
|
272
|
+
xs: 12
|
|
273
|
+
}, /* @__PURE__ */ React.createElement(Grid, {
|
|
274
|
+
container: true,
|
|
275
|
+
spacing: 2
|
|
276
|
+
}, viewTechDocsLink && /* @__PURE__ */ React.createElement(Grid, {
|
|
277
|
+
className: styles.linkText,
|
|
278
|
+
item: true,
|
|
279
|
+
xs: 6
|
|
280
|
+
}, /* @__PURE__ */ React.createElement(CardLink, {
|
|
281
|
+
icon: iconResolver("docs"),
|
|
282
|
+
text: "View TechDocs",
|
|
283
|
+
url: viewTechDocsLink
|
|
284
|
+
})), (_g = template.metadata.links) == null ? void 0 : _g.map(({ url, icon, title }) => /* @__PURE__ */ React.createElement(Grid, {
|
|
285
|
+
className: styles.linkText,
|
|
286
|
+
item: true,
|
|
287
|
+
xs: 6
|
|
288
|
+
}, /* @__PURE__ */ React.createElement(CardLink, {
|
|
289
|
+
icon: iconResolver(icon),
|
|
290
|
+
text: title || url,
|
|
291
|
+
url
|
|
292
|
+
})))))))), /* @__PURE__ */ React.createElement(CardActions, {
|
|
293
|
+
style: { padding: "16px" }
|
|
294
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
225
295
|
className: styles.footer
|
|
226
296
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
227
297
|
className: styles.ownedBy
|
|
228
|
-
}, ownedByRelations.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(UserIcon,
|
|
298
|
+
}, ownedByRelations.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(UserIcon, {
|
|
299
|
+
fontSize: "small"
|
|
300
|
+
}), /* @__PURE__ */ React.createElement(EntityRefLinks, {
|
|
301
|
+
style: { marginLeft: "8px" },
|
|
229
302
|
entityRefs: ownedByRelations,
|
|
230
303
|
defaultKind: "Group"
|
|
231
304
|
}))), /* @__PURE__ */ React.createElement(Button$1, {
|
|
@@ -244,7 +317,7 @@ const TemplateGroup = (props) => {
|
|
|
244
317
|
if (templates.length === 0) {
|
|
245
318
|
return /* @__PURE__ */ React.createElement(Content, null, titleComponent, /* @__PURE__ */ React.createElement(Typography, {
|
|
246
319
|
variant: "body2"
|
|
247
|
-
}, "No templates found that match your filter. Learn more about", " ", /* @__PURE__ */ React.createElement(Link$
|
|
320
|
+
}, "No templates found that match your filter. Learn more about", " ", /* @__PURE__ */ React.createElement(Link$2, {
|
|
248
321
|
to: "https://backstage.io/docs/features/software-templates/adding-templates"
|
|
249
322
|
}, "adding templates"), "."));
|
|
250
323
|
}
|
|
@@ -269,7 +342,7 @@ const TemplateGroups = (props) => {
|
|
|
269
342
|
if (!entities || !entities.length) {
|
|
270
343
|
return /* @__PURE__ */ React.createElement(Typography, {
|
|
271
344
|
variant: "body2"
|
|
272
|
-
}, "No templates found that match your filter. Learn more about", " ", /* @__PURE__ */ React.createElement(Link$
|
|
345
|
+
}, "No templates found that match your filter. Learn more about", " ", /* @__PURE__ */ React.createElement(Link$2, {
|
|
273
346
|
to: "https://backstage.io/docs/features/software-templates/adding-templates"
|
|
274
347
|
}, "adding templates"), ".");
|
|
275
348
|
}
|
|
@@ -688,4 +761,4 @@ const Router = (props) => {
|
|
|
688
761
|
};
|
|
689
762
|
|
|
690
763
|
export { Router };
|
|
691
|
-
//# sourceMappingURL=index-
|
|
764
|
+
//# sourceMappingURL=index-5cc08bb9.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-5cc08bb9.esm.js","sources":["../../src/next/TemplateListPage/CategoryPicker.tsx","../../src/next/TemplateListPage/RegisterExistingButton.tsx","../../src/next/TemplateListPage/TemplateCard/CardHeader.tsx","../../src/next/TemplateListPage/TemplateCard/CardLink.tsx","../../src/next/TemplateListPage/TemplateCard/TemplateCard.tsx","../../src/next/TemplateListPage/TemplateGroup.tsx","../../src/next/TemplateListPage/TemplateGroups.tsx","../../src/next/TemplateListPage/TemplateListPage.tsx","../../src/next/TemplateWizardPage/Stepper/schema.ts","../../src/next/TemplateWizardPage/Stepper/createAsyncValidators.ts","../../src/next/TemplateWizardPage/Stepper/useTemplateSchema.ts","../../src/next/TemplateWizardPage/Stepper/ReviewState.tsx","../../src/next/TemplateWizardPage/Stepper/Stepper.tsx","../../src/next/TemplateWizardPage/TemplateWizardPage.tsx","../../src/next/Router/Router.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport {\n Box,\n Checkbox,\n FormControlLabel,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { Autocomplete } from '@material-ui/lab';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The Category Picker that is rendered on the left side for picking\n * categories and filtering the template list.\n */\nexport const CategoryPicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n if (loading) return <Progress />;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types with error: ${error}`,\n severity: 'error',\n });\n return null;\n }\n\n if (!availableTypes) return null;\n\n return (\n <Box pb={1} pt={1}>\n <Typography variant=\"button\">Categories</Typography>\n <Autocomplete\n multiple\n aria-label=\"Categories\"\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BackstageTheme } from '@backstage/theme';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport React from 'react';\nimport { Link as RouterLink, LinkProps } from 'react-router-dom';\nimport AddCircleOutline from '@material-ui/icons/AddCircleOutline';\nimport { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\n/**\n * Properties for {@link RegisterExistingButton}\n *\n * @alpha\n */\nexport type RegisterExistingButtonProps = {\n title: string;\n} & Partial<Pick<LinkProps, 'to'>>;\n\n/**\n * A button that helps users to register an existing component.\n * @alpha\n */\nexport const RegisterExistingButton = (props: RegisterExistingButtonProps) => {\n const { title, to } = props;\n const { allowed } = usePermission({\n permission: catalogEntityCreatePermission,\n });\n const isXSScreen = useMediaQuery<BackstageTheme>(theme =>\n theme.breakpoints.down('xs'),\n );\n\n if (!to || !allowed) {\n return null;\n }\n\n return isXSScreen ? (\n <IconButton\n component={RouterLink}\n color=\"primary\"\n title={title}\n size=\"small\"\n to={to}\n >\n <AddCircleOutline />\n </IconButton>\n ) : (\n <Button component={RouterLink} variant=\"contained\" color=\"primary\" to={to}>\n {title}\n </Button>\n );\n};\n","/*\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 React from 'react';\nimport { makeStyles, useTheme } from '@material-ui/core';\nimport { ItemCardHeader } from '@backstage/core-components';\nimport { BackstageTheme } from '@backstage/theme';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { FavoriteEntity } from '@backstage/plugin-catalog-react';\n\nconst useStyles = makeStyles<BackstageTheme, { cardBackgroundImage: string }>(\n () => ({\n header: {\n backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage,\n },\n subtitleWrapper: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n }),\n);\n\n/**\n * Props for the CardHeader component\n */\nexport interface CardHeaderProps {\n template: TemplateEntityV1beta3;\n}\n\n/**\n * The Card Header with the background for the TemplateCard.\n */\nexport const CardHeader = (props: CardHeaderProps) => {\n const {\n template: {\n metadata: { title, name },\n spec: { type },\n },\n } = props;\n const { getPageTheme } = useTheme<BackstageTheme>();\n const themeForType = getPageTheme({ themeId: type });\n\n const styles = useStyles({\n cardBackgroundImage: themeForType.backgroundImage,\n });\n\n const SubtitleComponent = (\n <div className={styles.subtitleWrapper}>\n <div>{type}</div>\n <div>\n <FavoriteEntity entity={props.template} style={{ padding: 0 }} />\n </div>\n </div>\n );\n\n return (\n <ItemCardHeader\n title={title ?? name}\n subtitle={SubtitleComponent}\n classes={{ root: styles.header }}\n />\n );\n};\n","/*\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 { IconComponent } from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link, makeStyles } from '@material-ui/core';\nimport React from 'react';\n\ninterface CardLinkProps {\n icon: IconComponent;\n text: string;\n url: string;\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n linkText: {\n display: 'inline-flex',\n alignItems: 'center',\n },\n}));\n\nexport const CardLink = ({ icon: Icon, text, url }: CardLinkProps) => {\n const styles = useStyles();\n\n return (\n <div className={styles.linkText}>\n <Icon fontSize=\"small\" />\n <Link style={{ marginLeft: '8px' }} href={url}>\n {text || url}\n </Link>\n </div>\n );\n};\n","/*\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 DEFAULT_NAMESPACE,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Button, MarkdownContent, UserIcon } from '@backstage/core-components';\nimport { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n Card,\n CardActions,\n CardContent,\n Chip,\n Divider,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport {\n nextSelectedTemplateRouteRef,\n viewTechDocRouteRef,\n} from '../../../routes';\nimport { CardHeader } from './CardHeader';\nimport { CardLink } from './CardLink';\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n box: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n '-webkit-line-clamp': 10,\n '-webkit-box-orient': 'vertical',\n },\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n margin: 0,\n },\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n lineHeight: 1,\n fontSize: '0.75rem',\n },\n footer: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: 1,\n alignItems: 'center',\n },\n ownedBy: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n color: theme.palette.link,\n },\n}));\n\n/**\n * The Props for the Template Card component\n * @alpha\n */\nexport interface TemplateCardProps {\n template: TemplateEntityV1beta3;\n deprecated?: boolean;\n}\n\n/**\n * The Template Card component that is rendered in a list for each template\n * @alpha\n */\nexport const TemplateCard = (props: TemplateCardProps) => {\n const { template } = props;\n const styles = useStyles();\n const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);\n const templateRoute = useRouteRef(nextSelectedTemplateRouteRef);\n const { name, namespace } = parseEntityRef(\n stringifyEntityRef(props.template),\n );\n const href = templateRoute({\n templateName: name,\n namespace: namespace,\n });\n\n const app = useApp();\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n // TechDocs Link\n const viewTechDoc = useRouteRef(viewTechDocRouteRef);\n const viewTechDocsAnnotation =\n template.metadata.annotations?.['backstage.io/techdocs-ref'];\n const viewTechDocsLink =\n !!viewTechDocsAnnotation &&\n !!viewTechDoc &&\n viewTechDoc({\n namespace: template.metadata.namespace || DEFAULT_NAMESPACE,\n kind: template.kind,\n name: template.metadata.name,\n });\n\n return (\n <Card>\n <CardHeader template={template} />\n <CardContent>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={styles.box}>\n <MarkdownContent\n className={styles.markdown}\n content={template.metadata.description ?? 'No description'}\n />\n </Box>\n </Grid>\n {(template.metadata.tags?.length ?? 0) > 0 && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {template.metadata.tags?.map(tag => (\n <Grid item>\n <Chip\n style={{ margin: 0 }}\n size=\"small\"\n label={tag}\n key={tag}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n {(!!viewTechDocsLink || template.metadata.links?.length) && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {viewTechDocsLink && (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver('docs')}\n text=\"View TechDocs\"\n url={viewTechDocsLink}\n />\n </Grid>\n )}\n {template.metadata.links?.map(({ url, icon, title }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver(icon)}\n text={title || url}\n url={url}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </CardContent>\n <CardActions style={{ padding: '16px' }}>\n <div className={styles.footer}>\n <div className={styles.ownedBy}>\n {ownedByRelations.length > 0 && (\n <>\n <UserIcon fontSize=\"small\" />\n <EntityRefLinks\n style={{ marginLeft: '8px' }}\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n />\n </>\n )}\n </div>\n <Button size=\"small\" variant=\"outlined\" color=\"primary\" to={href}>\n Choose\n </Button>\n </div>\n </CardActions>\n </Card>\n );\n};\n","/*\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 { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport React from 'react';\nimport {\n Content,\n ContentHeader,\n ItemCardGrid,\n Link,\n} from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { TemplateCard, TemplateCardProps } from './TemplateCard';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nexport interface TemplateGroupProps {\n templates: TemplateEntityV1beta3[];\n title: React.ReactNode;\n components?: {\n CardComponent?: React.ComponentType<TemplateCardProps>;\n };\n}\n\nexport const TemplateGroup = (props: TemplateGroupProps) => {\n const { templates, title, components: { CardComponent } = {} } = props;\n const titleComponent =\n typeof title === 'string' ? <ContentHeader title={title} /> : title;\n\n if (templates.length === 0) {\n return (\n <Content>\n {titleComponent}\n <Typography variant=\"body2\">\n No templates found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/software-templates/adding-templates\">\n adding templates\n </Link>\n .\n </Typography>\n </Content>\n );\n }\n\n const Card = CardComponent || TemplateCard;\n\n return (\n <Content>\n {titleComponent}\n <ItemCardGrid>\n {templates.map(template => (\n <Card key={stringifyEntityRef(template)} template={template} />\n ))}\n </ItemCardGrid>\n </Content>\n );\n};\n","/*\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 React from 'react';\nimport { TemplateGroup } from './TemplateGroup';\nimport { Entity } from '@backstage/catalog-model';\nimport { useEntityList } from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { Progress, Link } from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { errorApiRef, useApi } from '@backstage/core-plugin-api';\n\n/**\n * @alpha\n */\nexport type TemplateGroupFilter = {\n title?: React.ReactNode;\n filter: (entity: Entity) => boolean;\n};\n\nexport interface TemplateGroupsProps {\n groups: TemplateGroupFilter[];\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n}\n\nexport const TemplateGroups = (props: TemplateGroupsProps) => {\n const { loading, error, entities } = useEntityList();\n const { groups, TemplateCardComponent } = props;\n const errorApi = useApi(errorApiRef);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n errorApi.post(error);\n return null;\n }\n\n if (!entities || !entities.length) {\n return (\n <Typography variant=\"body2\">\n No templates found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/software-templates/adding-templates\">\n adding templates\n </Link>\n .\n </Typography>\n );\n }\n\n return (\n <>\n {groups.map(({ title, filter }, index) => (\n <TemplateGroup\n key={index}\n templates={entities.filter((e): e is TemplateEntityV1beta3 =>\n filter(e),\n )}\n title={title}\n components={{ CardComponent: TemplateCardComponent }}\n />\n ))}\n </>\n );\n};\n","/*\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 React from 'react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\n\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n SupportButton,\n} from '@backstage/core-components';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { CategoryPicker } from './CategoryPicker';\nimport { RegisterExistingButton } from './RegisterExistingButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { registerComponentRouteRef } from '../../routes';\nimport { TemplateGroupFilter, TemplateGroups } from './TemplateGroups';\n\nexport type TemplateListPageProps = {\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n groups?: TemplateGroupFilter[];\n};\n\nconst defaultGroup: TemplateGroupFilter = {\n title: 'All Templates',\n filter: () => true,\n};\n\nexport const TemplateListPage = (props: TemplateListPageProps) => {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const { TemplateCardComponent, groups = [] } = props;\n\n return (\n <EntityListProvider>\n <Page themeId=\"website\">\n <Header\n pageTitleOverride=\"Create a new component\"\n title=\"Create a new component\"\n subtitle=\"Create new software components using standard templates in your organization\"\n />\n <Content>\n <ContentHeader title=\"Available Templates\">\n <RegisterExistingButton\n title=\"Register Existing Component\"\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n Create new software components using standard templates. Different\n templates create different kinds of components (services,\n websites, documentation, ...).\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 <CategoryPicker />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={[...groups, defaultGroup]}\n TemplateCardComponent={TemplateCardComponent}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </Page>\n </EntityListProvider>\n );\n};\n","/*\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 { JsonObject } from '@backstage/types';\nimport { FieldValidation, UiSchema } from '@rjsf/core';\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUiSchema(schema: JsonObject, uiSchema: JsonObject) {\n if (!isObject(schema)) {\n return;\n }\n\n const { properties, items, anyOf, oneOf, allOf, dependencies } = schema;\n\n for (const propName in schema) {\n if (!schema.hasOwnProperty(propName)) {\n continue;\n }\n\n if (propName.startsWith('ui:')) {\n uiSchema[propName] = schema[propName];\n delete schema[propName];\n }\n }\n\n if (isObject(properties)) {\n for (const propName in properties) {\n if (!properties.hasOwnProperty(propName)) {\n continue;\n }\n\n const schemaNode = properties[propName];\n if (!isObject(schemaNode)) {\n continue;\n }\n const innerUiSchema = {};\n uiSchema[propName] = innerUiSchema;\n extractUiSchema(schemaNode, innerUiSchema);\n }\n }\n\n if (isObject(items)) {\n const innerUiSchema = {};\n uiSchema.items = innerUiSchema;\n extractUiSchema(items, innerUiSchema);\n }\n\n if (Array.isArray(anyOf)) {\n for (const schemaNode of anyOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(oneOf)) {\n for (const schemaNode of oneOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(allOf)) {\n for (const schemaNode of allOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (isObject(dependencies)) {\n for (const depName of Object.keys(dependencies)) {\n const schemaNode = dependencies[depName];\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n}\n\n/**\n * @alpha\n * Takes a step from a Backstage Template Manifest and converts it to a JSON Schema and UI Schema for rjsf\n */\nexport const extractSchemaFromStep = (\n inputStep: JsonObject,\n): { uiSchema: UiSchema; schema: JsonObject } => {\n const uiSchema: UiSchema = {};\n const returnSchema: JsonObject = JSON.parse(JSON.stringify(inputStep));\n extractUiSchema(returnSchema, uiSchema);\n return { uiSchema, schema: returnSchema };\n};\n\n/**\n * @alpha\n * Creates a field validation object for use in react jsonschema form\n */\nexport const createFieldValidation = (): FieldValidation => {\n const fieldValidation: FieldValidation = {\n __errors: [] as string[],\n addError: (message: string) => {\n fieldValidation.__errors.push(message);\n },\n };\n\n return fieldValidation;\n};\n","/*\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 { FieldValidation } from '@rjsf/core';\nimport { JsonObject } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport { CustomFieldValidator } from '../../../extensions';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { createFieldValidation } from './schema';\n\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<string, undefined | CustomFieldValidator<unknown>>,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(formData: JsonObject, pathPrefix: string = '#') {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: Record<string, FieldValidation> = {};\n for (const [key, value] of Object.entries(formData)) {\n const definitionInSchema = parsedSchema.getSchema(\n `${pathPrefix}/${key}`,\n formData,\n );\n\n if (definitionInSchema && 'ui:field' in definitionInSchema) {\n const validator = validators[definitionInSchema['ui:field']];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, context);\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\n };\n};\n","/*\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 { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { UiSchema } from '@rjsf/core';\nimport { TemplateParameterSchema } from '../../../types';\nimport { extractSchemaFromStep } from './schema';\n\nexport interface ParsedTemplateSchema {\n uiSchema: UiSchema;\n mergedSchema: JsonObject;\n schema: JsonObject;\n title: string;\n description?: string;\n}\nexport const useTemplateSchema = (\n manifest: TemplateParameterSchema,\n): { steps: ParsedTemplateSchema[] } => {\n const featureFlags = useApi(featureFlagsApiRef);\n const steps = manifest.steps.map(({ title, description, schema }) => ({\n title,\n description,\n mergedSchema: schema,\n ...extractSchemaFromStep(schema),\n }));\n\n const returningSteps = steps\n // Filter out steps that are not enabled with the feature flags\n .filter(step => {\n const stepFeatureFlag = step.uiSchema['ui:backstage']?.featureFlag;\n return stepFeatureFlag ? featureFlags.isActive(stepFeatureFlag) : true;\n })\n // Then filter out the properties that are not enabled with feature flag\n .map(step => ({\n ...step,\n schema: {\n ...step.schema,\n // Title is rendered at the top of the page, so let's ignore this from jsonschemaform\n title: undefined,\n properties: Object.fromEntries(\n Object.entries(step.schema.properties as JsonObject).filter(\n ([key]) => {\n const stepFeatureFlag =\n step.uiSchema[key]?.['ui:backstage']?.featureFlag;\n return stepFeatureFlag\n ? featureFlags.isActive(stepFeatureFlag)\n : true;\n },\n ),\n ),\n },\n }));\n\n return {\n steps: returningSteps,\n };\n};\n","/*\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 React from 'react';\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { JsonObject } from '@backstage/types';\nimport { ParsedTemplateSchema } from './useTemplateSchema';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\n\ninterface ReviewStateProps {\n schemas: ParsedTemplateSchema[];\n formState: JsonObject;\n}\n\nexport const ReviewState = (props: ReviewStateProps) => {\n const reviewData = Object.fromEntries(\n Object.entries(props.formState).map(([key, value]) => {\n for (const step of props.schemas) {\n const parsedSchema = new JSONSchema(step.mergedSchema);\n const definitionInSchema = parsedSchema.getSchema(\n `#/${key}`,\n props.formState,\n );\n if (definitionInSchema) {\n const backstageReviewOptions =\n definitionInSchema['ui:backstage']?.review;\n\n if (backstageReviewOptions) {\n if (backstageReviewOptions.mask) {\n return [key, backstageReviewOptions.mask];\n }\n if (backstageReviewOptions.show === false) {\n return [];\n }\n }\n\n if (definitionInSchema['ui:widget'] === 'password') {\n return [key, '******'];\n }\n }\n }\n return [key, value];\n }),\n );\n return <StructuredMetadataTable metadata={reviewData} />;\n};\n","/*\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 { useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Button,\n makeStyles,\n} from '@material-ui/core';\nimport { FieldValidation, withTheme } from '@rjsf/core';\nimport { Theme as MuiTheme } from '@rjsf/material-ui';\nimport React, { useMemo, useState } from 'react';\nimport { FieldExtensionOptions } from '../../../extensions';\nimport { TemplateParameterSchema } from '../../../types';\nimport { createAsyncValidators } from './createAsyncValidators';\nimport { useTemplateSchema } from './useTemplateSchema';\nimport { ReviewState } from './ReviewState';\n\nconst useStyles = makeStyles(theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n}));\n\nexport interface StepperProps {\n manifest: TemplateParameterSchema;\n extensions: FieldExtensionOptions<any, any>[];\n}\n\nconst Form = withTheme(MuiTheme);\n\nexport const Stepper = (props: StepperProps) => {\n const { steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [formState, setFormState] = useState({});\n const [errors, setErrors] = useState<\n undefined | Record<string, FieldValidation>\n >();\n const styles = useStyles();\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n };\n\n const handleNext = async ({ formData }: { formData: JsonObject }) => {\n // TODO(blam): What do we do about loading states, does each field extension get a chance\n // to display it's own loading? Or should we grey out the entire form.\n setErrors(undefined);\n\n const returnedValidation = await validation(formData);\n\n const hasErrors = Object.values(returnedValidation).some(i => {\n return i.__errors.length > 0;\n });\n\n if (hasErrors) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => prevActiveStep + 1);\n }\n setFormState(current => ({ ...current, ...formData }));\n };\n\n const handleCreate = () => {\n // TODO(blam): Create the template in a modal with the ability to view the logs etc.\n };\n\n return (\n <>\n <MuiStepper activeStep={activeStep} alternativeLabel variant=\"elevation\">\n {steps.map((step, index) => (\n <MuiStep key={index}>\n <MuiStepLabel>{step.title}</MuiStepLabel>\n </MuiStep>\n ))}\n <MuiStep>\n <MuiStepLabel>Review</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {activeStep < steps.length ? (\n <Form\n extraErrors={errors}\n formData={formState}\n schema={steps[activeStep].schema}\n uiSchema={steps[activeStep].uiSchema}\n onSubmit={handleNext}\n fields={extensions}\n showErrorList={false}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n {activeStep === steps.length - 1 ? 'Review' : 'Next'}\n </Button>\n </div>\n </Form>\n ) : (\n <>\n <ReviewState formState={formState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button variant=\"contained\" onClick={handleCreate}>\n Create\n </Button>\n </div>\n </>\n )}\n </div>\n </>\n );\n};\n","/*\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 React, { useEffect } from 'react';\nimport {\n Page,\n Header,\n Content,\n Progress,\n InfoCard,\n MarkdownContent,\n} from '@backstage/core-components';\nimport { FieldExtensionOptions } from '../../extensions';\nimport { Navigate } from 'react-router';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n errorApiRef,\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '../../api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { makeStyles } from '@material-ui/core';\nimport { Stepper } from './Stepper';\nimport { BackstageTheme } from '@backstage/theme';\nimport { nextRouteRef, selectedTemplateRouteRef } from '../../routes';\n\nexport interface TemplateWizardPageProps {\n customFieldExtensions: FieldExtensionOptions<any, any>[];\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n marginTop: 0,\n },\n '& :last-child': {\n marginBottom: 0,\n },\n },\n}));\n\nconst useTemplateParameterSchema = (templateRef: string) => {\n const scaffolderApi = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolderApi.getTemplateParameterSchema(templateRef),\n [scaffolderApi, templateRef],\n );\n\n return { manifest: value, loading, error };\n};\n\nexport const TemplateWizardPage = (props: TemplateWizardPageProps) => {\n const styles = useStyles();\n const rootRef = useRouteRef(nextRouteRef);\n const { templateName, namespace } = useRouteRefParams(\n selectedTemplateRouteRef,\n );\n const errorApi = useApi(errorApiRef);\n const { loading, manifest, error } = useTemplateParameterSchema(\n stringifyEntityRef({\n kind: 'Template',\n namespace,\n name: templateName,\n }),\n );\n\n useEffect(() => {\n if (error) {\n errorApi.post(new Error(`Failed to load template, ${error}`));\n }\n }, [error, errorApi]);\n\n if (error) {\n return <Navigate to={rootRef()} />;\n }\n\n return (\n <Page themeId=\"website\">\n <Header\n pageTitleOverride=\"Create a new component\"\n title=\"Create a new component\"\n subtitle=\"Create new software components using standard templates in your organization\"\n />\n <Content>\n {loading && <Progress />}\n {manifest && (\n <InfoCard\n title={manifest.title}\n subheader={\n <MarkdownContent\n className={styles.markdown}\n content={manifest.description ?? 'No description'}\n />\n }\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <Stepper\n manifest={manifest}\n extensions={props.customFieldExtensions}\n />\n </InfoCard>\n )}\n </Content>\n </Page>\n );\n};\n","/*\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 React, { PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router';\nimport { TemplateListPage } from '../TemplateListPage';\nimport { TemplateWizardPage } from '../TemplateWizardPage';\nimport {\n FieldExtensionOptions,\n FIELD_EXTENSION_WRAPPER_KEY,\n FIELD_EXTENSION_KEY,\n DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS,\n} from '../../extensions';\n\nimport { useElementFilter } from '@backstage/core-plugin-api';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups';\nimport { nextSelectedTemplateRouteRef } from '../../routes';\nimport { SecretsContextProvider } from '../../components/secrets/SecretsContext';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @alpha\n */\nexport type NextRouterProps = {\n components?: {\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: React.ComponentType<{}>;\n };\n groups?: TemplateGroupFilter[];\n};\n\n/**\n * The Scaffolder Router\n *\n * @alpha\n */\nexport const Router = (props: PropsWithChildren<NextRouterProps>) => {\n const { components: { TemplateCardComponent } = {} } = props;\n\n const outlet = useOutlet() || props.children;\n\n const customFieldExtensions = useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: FIELD_EXTENSION_WRAPPER_KEY,\n })\n .findComponentData<FieldExtensionOptions>({\n key: FIELD_EXTENSION_KEY,\n }),\n );\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ];\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPage\n TemplateCardComponent={TemplateCardComponent}\n groups={props.groups}\n />\n }\n />\n\n <Route\n path={nextSelectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPage customFieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n }\n />\n </Routes>\n );\n};\n"],"names":["RouterLink","useStyles","Link","_a","Button","JSONSchema","MuiTheme","validation","MuiStepper","MuiStep","MuiStepLabel"],"mappings":"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"}
|
|
@@ -237,7 +237,7 @@ class ScaffolderClient {
|
|
|
237
237
|
}
|
|
238
238
|
|
|
239
239
|
const EntityPicker = (props) => {
|
|
240
|
-
var _a, _b, _c, _d;
|
|
240
|
+
var _a, _b, _c, _d, _e;
|
|
241
241
|
const {
|
|
242
242
|
onChange,
|
|
243
243
|
schema: { title = "Entity", description = "An entity from the catalog" },
|
|
@@ -249,6 +249,7 @@ const EntityPicker = (props) => {
|
|
|
249
249
|
} = props;
|
|
250
250
|
const allowedKinds = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.allowedKinds;
|
|
251
251
|
const defaultKind = (_b = uiSchema["ui:options"]) == null ? void 0 : _b.defaultKind;
|
|
252
|
+
const defaultNamespace = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.defaultNamespace;
|
|
252
253
|
const catalogApi = useApi(catalogApiRef);
|
|
253
254
|
const { value: entities, loading } = useAsync(
|
|
254
255
|
() => catalogApi.getEntities(
|
|
@@ -256,7 +257,7 @@ const EntityPicker = (props) => {
|
|
|
256
257
|
)
|
|
257
258
|
);
|
|
258
259
|
const entityRefs = entities == null ? void 0 : entities.items.map(
|
|
259
|
-
(e) => humanizeEntityRef(e, { defaultKind })
|
|
260
|
+
(e) => humanizeEntityRef(e, { defaultKind, defaultNamespace })
|
|
260
261
|
);
|
|
261
262
|
const onSelect = useCallback(
|
|
262
263
|
(_, value) => {
|
|
@@ -281,7 +282,7 @@ const EntityPicker = (props) => {
|
|
|
281
282
|
onChange: onSelect,
|
|
282
283
|
options: entityRefs || [],
|
|
283
284
|
autoSelect: true,
|
|
284
|
-
freeSolo: (
|
|
285
|
+
freeSolo: (_e = (_d = uiSchema["ui:options"]) == null ? void 0 : _d.allowArbitraryValues) != null ? _e : true,
|
|
285
286
|
renderInput: (params) => /* @__PURE__ */ React.createElement(TextField, {
|
|
286
287
|
...params,
|
|
287
288
|
label: title,
|
|
@@ -396,21 +397,23 @@ const EntityTagsPicker = (props) => {
|
|
|
396
397
|
};
|
|
397
398
|
|
|
398
399
|
const OwnerPicker = (props) => {
|
|
399
|
-
var _a, _b, _c;
|
|
400
|
+
var _a, _b, _c, _d;
|
|
400
401
|
const {
|
|
401
402
|
schema: { title = "Owner", description = "The owner of the component" },
|
|
402
403
|
uiSchema,
|
|
403
404
|
...restProps
|
|
404
405
|
} = props;
|
|
406
|
+
const defaultNamespace = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.defaultNamespace;
|
|
405
407
|
const ownerUiSchema = {
|
|
406
408
|
...uiSchema,
|
|
407
409
|
"ui:options": {
|
|
408
|
-
allowedKinds: ((
|
|
410
|
+
allowedKinds: ((_b = uiSchema["ui:options"]) == null ? void 0 : _b.allowedKinds) || [
|
|
409
411
|
"Group",
|
|
410
412
|
"User"
|
|
411
413
|
],
|
|
412
414
|
defaultKind: "Group",
|
|
413
|
-
allowArbitraryValues: (
|
|
415
|
+
allowArbitraryValues: (_d = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.allowArbitraryValues) != null ? _d : true,
|
|
416
|
+
...defaultNamespace !== void 0 ? { defaultNamespace } : {}
|
|
414
417
|
}
|
|
415
418
|
};
|
|
416
419
|
return /* @__PURE__ */ React.createElement(EntityPicker, {
|
|
@@ -471,29 +474,51 @@ const GitlabRepoPicker = (props) => {
|
|
|
471
474
|
};
|
|
472
475
|
|
|
473
476
|
const AzureRepoPicker = (props) => {
|
|
474
|
-
const {
|
|
477
|
+
const {
|
|
478
|
+
allowedOrganizations = [],
|
|
479
|
+
allowedOwners = [],
|
|
480
|
+
rawErrors,
|
|
481
|
+
state,
|
|
482
|
+
onChange
|
|
483
|
+
} = props;
|
|
484
|
+
const organizationItems = allowedOrganizations ? allowedOrganizations.map((i) => ({ label: i, value: i })) : [{ label: "Loading...", value: "loading" }];
|
|
485
|
+
const ownerItems = allowedOwners ? allowedOwners.map((i) => ({ label: i, value: i })) : [{ label: "Loading...", value: "loading" }];
|
|
475
486
|
const { organization, owner } = state;
|
|
476
487
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(FormControl, {
|
|
477
488
|
margin: "normal",
|
|
478
489
|
required: true,
|
|
479
490
|
error: (rawErrors == null ? void 0 : rawErrors.length) > 0 && !organization
|
|
480
|
-
}, /* @__PURE__ */ React.createElement(
|
|
491
|
+
}, (allowedOrganizations == null ? void 0 : allowedOrganizations.length) ? /* @__PURE__ */ React.createElement(Select, {
|
|
492
|
+
native: true,
|
|
493
|
+
label: "Organization",
|
|
494
|
+
onChange: (s) => onChange({ organization: String(Array.isArray(s) ? s[0] : s) }),
|
|
495
|
+
disabled: allowedOrganizations.length === 1,
|
|
496
|
+
selected: organization,
|
|
497
|
+
items: organizationItems
|
|
498
|
+
}) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InputLabel, {
|
|
481
499
|
htmlFor: "orgInput"
|
|
482
500
|
}, "Organization"), /* @__PURE__ */ React.createElement(Input, {
|
|
483
501
|
id: "orgInput",
|
|
484
502
|
onChange: (e) => onChange({ organization: e.target.value }),
|
|
485
503
|
value: organization
|
|
486
|
-
}), /* @__PURE__ */ React.createElement(FormHelperText, null, "The
|
|
504
|
+
})), /* @__PURE__ */ React.createElement(FormHelperText, null, "The Organization that this repo will belong to")), /* @__PURE__ */ React.createElement(FormControl, {
|
|
487
505
|
margin: "normal",
|
|
488
506
|
required: true,
|
|
489
507
|
error: (rawErrors == null ? void 0 : rawErrors.length) > 0 && !owner
|
|
490
|
-
}, /* @__PURE__ */ React.createElement(
|
|
508
|
+
}, (allowedOwners == null ? void 0 : allowedOwners.length) ? /* @__PURE__ */ React.createElement(Select, {
|
|
509
|
+
native: true,
|
|
510
|
+
label: "Owner",
|
|
511
|
+
onChange: (s) => onChange({ owner: String(Array.isArray(s) ? s[0] : s) }),
|
|
512
|
+
disabled: allowedOwners.length === 1,
|
|
513
|
+
selected: owner,
|
|
514
|
+
items: ownerItems
|
|
515
|
+
}) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(InputLabel, {
|
|
491
516
|
htmlFor: "ownerInput"
|
|
492
|
-
}, "
|
|
517
|
+
}, "Project"), /* @__PURE__ */ React.createElement(Input, {
|
|
493
518
|
id: "ownerInput",
|
|
494
519
|
onChange: (e) => onChange({ owner: e.target.value }),
|
|
495
520
|
value: owner
|
|
496
|
-
}), /* @__PURE__ */ React.createElement(FormHelperText, null, "The
|
|
521
|
+
})), /* @__PURE__ */ React.createElement(FormHelperText, null, "The Project that this repo will belong to")));
|
|
497
522
|
};
|
|
498
523
|
|
|
499
524
|
const BitbucketRepoPicker = (props) => {
|
|
@@ -714,6 +739,13 @@ const RepoUrlPicker = (props) => {
|
|
|
714
739
|
},
|
|
715
740
|
[uiSchema]
|
|
716
741
|
);
|
|
742
|
+
const allowedOrganizations = useMemo(
|
|
743
|
+
() => {
|
|
744
|
+
var _a2, _b2;
|
|
745
|
+
return (_b2 = (_a2 = uiSchema == null ? void 0 : uiSchema["ui:options"]) == null ? void 0 : _a2.allowedOrganizations) != null ? _b2 : [];
|
|
746
|
+
},
|
|
747
|
+
[uiSchema]
|
|
748
|
+
);
|
|
717
749
|
const allowedOwners = useMemo(
|
|
718
750
|
() => {
|
|
719
751
|
var _a2, _b2;
|
|
@@ -731,6 +763,14 @@ const RepoUrlPicker = (props) => {
|
|
|
731
763
|
useEffect(() => {
|
|
732
764
|
onChange(serializeRepoPickerUrl(state));
|
|
733
765
|
}, [state, onChange]);
|
|
766
|
+
useEffect(() => {
|
|
767
|
+
if (allowedOrganizations.length > 0) {
|
|
768
|
+
setState((prevState) => ({
|
|
769
|
+
...prevState,
|
|
770
|
+
organization: allowedOrganizations[0]
|
|
771
|
+
}));
|
|
772
|
+
}
|
|
773
|
+
}, [setState, allowedOrganizations]);
|
|
734
774
|
useEffect(() => {
|
|
735
775
|
if (allowedOwners.length > 0) {
|
|
736
776
|
setState((prevState) => ({
|
|
@@ -796,6 +836,8 @@ const RepoUrlPicker = (props) => {
|
|
|
796
836
|
state,
|
|
797
837
|
onChange: updateLocalState
|
|
798
838
|
}), hostType === "azure" && /* @__PURE__ */ React.createElement(AzureRepoPicker, {
|
|
839
|
+
allowedOrganizations,
|
|
840
|
+
allowedOwners,
|
|
799
841
|
rawErrors,
|
|
800
842
|
state,
|
|
801
843
|
onChange: updateLocalState
|
|
@@ -851,7 +893,7 @@ const repoPickerValidation = (value, validation, context) => {
|
|
|
851
893
|
};
|
|
852
894
|
|
|
853
895
|
const OwnedEntityPicker = (props) => {
|
|
854
|
-
var _a, _b, _c, _d;
|
|
896
|
+
var _a, _b, _c, _d, _e;
|
|
855
897
|
const {
|
|
856
898
|
onChange,
|
|
857
899
|
schema: { title = "Entity", description = "An entity from the catalog" },
|
|
@@ -863,9 +905,10 @@ const OwnedEntityPicker = (props) => {
|
|
|
863
905
|
} = props;
|
|
864
906
|
const allowedKinds = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.allowedKinds;
|
|
865
907
|
const defaultKind = (_b = uiSchema["ui:options"]) == null ? void 0 : _b.defaultKind;
|
|
866
|
-
const
|
|
908
|
+
const defaultNamespace = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.defaultNamespace;
|
|
909
|
+
const allowArbitraryValues = (_e = (_d = uiSchema["ui:options"]) == null ? void 0 : _d.allowArbitraryValues) != null ? _e : true;
|
|
867
910
|
const { ownedEntities, loading } = useOwnedEntities(allowedKinds);
|
|
868
|
-
const entityRefs = ownedEntities == null ? void 0 : ownedEntities.items.map((e) => humanizeEntityRef(e, { defaultKind })).filter((n) => n);
|
|
911
|
+
const entityRefs = ownedEntities == null ? void 0 : ownedEntities.items.map((e) => humanizeEntityRef(e, { defaultKind, defaultNamespace })).filter((n) => n);
|
|
869
912
|
const onSelect = (_, value) => {
|
|
870
913
|
onChange(value || "");
|
|
871
914
|
};
|
|
@@ -958,6 +1001,11 @@ const registerComponentRouteRef = createExternalRouteRef({
|
|
|
958
1001
|
id: "register-component",
|
|
959
1002
|
optional: true
|
|
960
1003
|
});
|
|
1004
|
+
const viewTechDocRouteRef = createExternalRouteRef({
|
|
1005
|
+
id: "view-techdoc",
|
|
1006
|
+
optional: true,
|
|
1007
|
+
params: ["namespace", "kind", "name"]
|
|
1008
|
+
});
|
|
961
1009
|
const rootRouteRef = createRouteRef({
|
|
962
1010
|
id: "scaffolder"
|
|
963
1011
|
});
|
|
@@ -1023,7 +1071,8 @@ const scaffolderPlugin = createPlugin({
|
|
|
1023
1071
|
root: rootRouteRef
|
|
1024
1072
|
},
|
|
1025
1073
|
externalRoutes: {
|
|
1026
|
-
registerComponent: registerComponentRouteRef
|
|
1074
|
+
registerComponent: registerComponentRouteRef,
|
|
1075
|
+
viewTechDoc: viewTechDocRouteRef
|
|
1027
1076
|
}
|
|
1028
1077
|
});
|
|
1029
1078
|
const EntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
@@ -1055,7 +1104,7 @@ const OwnerPickerFieldExtension = scaffolderPlugin.provide(
|
|
|
1055
1104
|
const ScaffolderPage = scaffolderPlugin.provide(
|
|
1056
1105
|
createRoutableExtension({
|
|
1057
1106
|
name: "ScaffolderPage",
|
|
1058
|
-
component: () => import('./Router-
|
|
1107
|
+
component: () => import('./Router-7e8b8be7.esm.js').then((m) => m.Router),
|
|
1059
1108
|
mountPoint: rootRouteRef
|
|
1060
1109
|
})
|
|
1061
1110
|
);
|
|
@@ -1074,7 +1123,7 @@ const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(
|
|
|
1074
1123
|
const NextScaffolderPage = scaffolderPlugin.provide(
|
|
1075
1124
|
createRoutableExtension({
|
|
1076
1125
|
name: "NextScaffolderPage",
|
|
1077
|
-
component: () => import('./index-
|
|
1126
|
+
component: () => import('./index-5cc08bb9.esm.js').then((m) => m.Router),
|
|
1078
1127
|
mountPoint: nextRouteRef
|
|
1079
1128
|
})
|
|
1080
1129
|
);
|
|
@@ -1555,5 +1604,5 @@ const TaskPage = ({ loadingText }) => {
|
|
|
1555
1604
|
})))))));
|
|
1556
1605
|
};
|
|
1557
1606
|
|
|
1558
|
-
export {
|
|
1559
|
-
//# sourceMappingURL=index-
|
|
1607
|
+
export { createScaffolderLayout as A, ScaffolderLayouts as B, EntityPickerFieldExtension as C, EntityNamePickerFieldExtension as D, EntityPicker as E, FIELD_EXTENSION_WRAPPER_KEY as F, EntityTagsPickerFieldExtension as G, OwnerPickerFieldExtension as H, OwnedEntityPickerFieldExtension as I, RepoUrlPickerFieldExtension as J, ScaffolderPage as K, LAYOUTS_WRAPPER_KEY as L, scaffolderPlugin as M, NextScaffolderPage as N, OwnerPicker as O, useTemplateSecrets as P, RepoUrlPicker as R, SecretsContext as S, TemplateTypePicker as T, actionsRouteRef as a, scaffolderListTaskRouteRef as b, scaffolderApiRef as c, scaffolderTaskRouteRef as d, editRouteRef as e, rootRouteRef as f, TaskStatusStepper as g, TaskPageLinks as h, FIELD_EXTENSION_KEY as i, LAYOUTS_KEY as j, SecretsContextProvider as k, legacySelectedTemplateRouteRef as l, TaskPage as m, EntityNamePicker as n, entityNamePickerValidation as o, EntityTagsPicker as p, repoPickerValidation as q, registerComponentRouteRef as r, selectedTemplateRouteRef as s, OwnedEntityPicker as t, nextSelectedTemplateRouteRef as u, viewTechDocRouteRef as v, nextRouteRef as w, ScaffolderClient as x, createScaffolderFieldExtension as y, ScaffolderFieldExtensions as z };
|
|
1608
|
+
//# sourceMappingURL=index-f96a52f0.esm.js.map
|