@backstage/plugin-scaffolder 1.19.4-next.1 → 1.20.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 +42 -0
- package/README.md +1 -2
- package/alpha/package.json +1 -1
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +33 -36
- package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
- package/dist/index.d.ts +21 -21
- package/package.json +17 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,47 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder
|
|
2
2
|
|
|
3
|
+
## 1.20.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 4268696: `MultiEntityPicker` uses `EntityDisplayName` instead of `humanizeEntityRef` to display entity.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- 9156654: Capturing more event clicks for scaffolder
|
|
12
|
+
- 131e5cb: Fix broken links in README.
|
|
13
|
+
- 0040ec2: Updated dependency `@rjsf/utils` to `5.18.2`.
|
|
14
|
+
Updated dependency `@rjsf/core` to `5.18.2`.
|
|
15
|
+
Updated dependency `@rjsf/material-ui` to `5.18.2`.
|
|
16
|
+
Updated dependency `@rjsf/validator-ajv8` to `5.18.2`.
|
|
17
|
+
- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
|
|
18
|
+
- Updated dependencies
|
|
19
|
+
- @backstage/plugin-scaffolder-common@1.5.2
|
|
20
|
+
- @backstage/plugin-scaffolder-react@1.8.5
|
|
21
|
+
- @backstage/core-compat-api@0.2.5
|
|
22
|
+
- @backstage/core-components@0.14.7
|
|
23
|
+
- @backstage/catalog-model@1.5.0
|
|
24
|
+
- @backstage/plugin-catalog-react@1.12.0
|
|
25
|
+
- @backstage/integration@1.11.0
|
|
26
|
+
- @backstage/catalog-client@1.6.5
|
|
27
|
+
- @backstage/frontend-plugin-api@0.6.5
|
|
28
|
+
- @backstage/integration-react@1.1.27
|
|
29
|
+
- @backstage/plugin-catalog-common@1.0.23
|
|
30
|
+
|
|
31
|
+
## 1.19.4-next.2
|
|
32
|
+
|
|
33
|
+
### Patch Changes
|
|
34
|
+
|
|
35
|
+
- 762141c: Fixed a bug where the `MultiEntityPicker` was not able to be set as required
|
|
36
|
+
- Updated dependencies
|
|
37
|
+
- @backstage/plugin-catalog-react@1.12.0-next.2
|
|
38
|
+
- @backstage/core-components@0.14.7-next.2
|
|
39
|
+
- @backstage/integration@1.11.0-next.0
|
|
40
|
+
- @backstage/core-compat-api@0.2.5-next.1
|
|
41
|
+
- @backstage/frontend-plugin-api@0.6.5-next.1
|
|
42
|
+
- @backstage/plugin-scaffolder-react@1.8.5-next.2
|
|
43
|
+
- @backstage/integration-react@1.1.27-next.0
|
|
44
|
+
|
|
3
45
|
## 1.19.4-next.1
|
|
4
46
|
|
|
5
47
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# Scaffolder Frontend
|
|
2
2
|
|
|
3
|
-
This is the React frontend for the default Backstage [software
|
|
4
|
-
templates](https://backstage.io/docs/features/software-templates/).
|
|
3
|
+
This is the React frontend for the default Backstage [software templates](https://backstage.io/docs/features/software-templates/).
|
|
5
4
|
This package supplies interfaces related to showing available templates in the
|
|
6
5
|
Backstage catalog and the workflow to create software using those templates.
|
|
7
6
|
|
package/alpha/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CATALOG_FILTER_EXISTS } from '@backstage/catalog-client';
|
|
2
|
-
import {
|
|
2
|
+
import { stringifyEntityRef, parseEntityRef } from '@backstage/catalog-model';
|
|
3
3
|
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
-
import { catalogApiRef,
|
|
4
|
+
import { catalogApiRef, entityPresentationApiRef, EntityDisplayName } from '@backstage/plugin-catalog-react';
|
|
5
5
|
import TextField from '@material-ui/core/TextField';
|
|
6
6
|
import FormControl from '@material-ui/core/FormControl';
|
|
7
7
|
import Autocomplete from '@material-ui/lab/Autocomplete';
|
|
@@ -24,29 +24,22 @@ const MultiEntityPicker = (props) => {
|
|
|
24
24
|
const defaultKind = (_a = uiSchema["ui:options"]) == null ? void 0 : _a.defaultKind;
|
|
25
25
|
const defaultNamespace = ((_b = uiSchema["ui:options"]) == null ? void 0 : _b.defaultNamespace) || void 0;
|
|
26
26
|
const catalogApi = useApi(catalogApiRef);
|
|
27
|
+
const entityPresentationApi = useApi(entityPresentationApiRef);
|
|
27
28
|
const { value: entities, loading } = useAsync(async () => {
|
|
28
29
|
const { items } = await catalogApi.getEntities(
|
|
29
30
|
catalogFilter ? { filter: catalogFilter } : void 0
|
|
30
31
|
);
|
|
31
|
-
|
|
32
|
+
const entityRefToPresentation = new Map(
|
|
33
|
+
await Promise.all(
|
|
34
|
+
items.map(async (item) => {
|
|
35
|
+
const presentation = await entityPresentationApi.forEntity(item).promise;
|
|
36
|
+
return [stringifyEntityRef(item), presentation];
|
|
37
|
+
})
|
|
38
|
+
)
|
|
39
|
+
);
|
|
40
|
+
return { entities: items, entityRefToPresentation };
|
|
32
41
|
});
|
|
33
42
|
const allowArbitraryValues = (_d = (_c = uiSchema["ui:options"]) == null ? void 0 : _c.allowArbitraryValues) != null ? _d : true;
|
|
34
|
-
const getLabel = useCallback(
|
|
35
|
-
(ref) => {
|
|
36
|
-
try {
|
|
37
|
-
return humanizeEntityRef(
|
|
38
|
-
parseEntityRef(ref, { defaultKind, defaultNamespace }),
|
|
39
|
-
{
|
|
40
|
-
defaultKind,
|
|
41
|
-
defaultNamespace
|
|
42
|
-
}
|
|
43
|
-
);
|
|
44
|
-
} catch (err) {
|
|
45
|
-
return ref;
|
|
46
|
-
}
|
|
47
|
-
},
|
|
48
|
-
[defaultKind, defaultNamespace]
|
|
49
|
-
);
|
|
50
43
|
const onSelect = useCallback(
|
|
51
44
|
(_, refs, reason) => {
|
|
52
45
|
const values = refs.map((ref) => {
|
|
@@ -75,8 +68,9 @@ const MultiEntityPicker = (props) => {
|
|
|
75
68
|
[onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues]
|
|
76
69
|
);
|
|
77
70
|
useEffect(() => {
|
|
78
|
-
|
|
79
|
-
|
|
71
|
+
var _a2;
|
|
72
|
+
if (((_a2 = entities == null ? void 0 : entities.entities) == null ? void 0 : _a2.length) === 1) {
|
|
73
|
+
onChange([stringifyEntityRef(entities == null ? void 0 : entities.entities[0])]);
|
|
80
74
|
}
|
|
81
75
|
}, [entities, onChange]);
|
|
82
76
|
return /* @__PURE__ */ React.createElement(
|
|
@@ -91,22 +85,19 @@ const MultiEntityPicker = (props) => {
|
|
|
91
85
|
{
|
|
92
86
|
multiple: true,
|
|
93
87
|
filterSelectedOptions: true,
|
|
94
|
-
disabled: (entities == null ? void 0 : entities.length) === 1,
|
|
88
|
+
disabled: ((_e = entities == null ? void 0 : entities.entities) == null ? void 0 : _e.length) === 1,
|
|
95
89
|
id: idSchema == null ? void 0 : idSchema.$id,
|
|
96
|
-
value: (
|
|
97
|
-
// Since free solo can be enabled, attempt to parse as a full entity ref first, then fall
|
|
98
|
-
// back to the given value.
|
|
99
|
-
(_e = entities == null ? void 0 : entities.filter(
|
|
100
|
-
(e) => formData && formData.includes(stringifyEntityRef(e))
|
|
101
|
-
)) != null ? _e : allowArbitraryValues && formData ? formData.map(getLabel) : []
|
|
102
|
-
),
|
|
103
90
|
loading,
|
|
104
91
|
onChange: onSelect,
|
|
105
|
-
options: entities || [],
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
92
|
+
options: (entities == null ? void 0 : entities.entities) || [],
|
|
93
|
+
renderOption: (option) => /* @__PURE__ */ React.createElement(EntityDisplayName, { entityRef: option }),
|
|
94
|
+
getOptionLabel: (option) => {
|
|
95
|
+
var _a2;
|
|
96
|
+
return (
|
|
97
|
+
// option can be a string due to freeSolo.
|
|
98
|
+
typeof option === "string" ? option : (_a2 = entities == null ? void 0 : entities.entityRefToPresentation.get(stringifyEntityRef(option))) == null ? void 0 : _a2.entityRef
|
|
99
|
+
);
|
|
100
|
+
},
|
|
110
101
|
autoSelect: true,
|
|
111
102
|
freeSolo: allowArbitraryValues,
|
|
112
103
|
renderInput: (params) => /* @__PURE__ */ React.createElement(
|
|
@@ -116,10 +107,16 @@ const MultiEntityPicker = (props) => {
|
|
|
116
107
|
label: title,
|
|
117
108
|
margin: "dense",
|
|
118
109
|
helperText: description,
|
|
119
|
-
FormHelperTextProps: {
|
|
110
|
+
FormHelperTextProps: {
|
|
111
|
+
margin: "dense",
|
|
112
|
+
style: { marginLeft: 0 }
|
|
113
|
+
},
|
|
120
114
|
variant: "outlined",
|
|
121
115
|
required,
|
|
122
|
-
InputProps:
|
|
116
|
+
InputProps: {
|
|
117
|
+
...params.InputProps,
|
|
118
|
+
required: formData.length === 0 && required
|
|
119
|
+
}
|
|
123
120
|
}
|
|
124
121
|
)
|
|
125
122
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiEntityPicker.esm.js","sources":["../../../../src/components/fields/MultiEntityPicker/MultiEntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { FieldValidation } from '@rjsf/utils';\nimport {\n MultiEntityPickerFilterQueryValue,\n MultiEntityPickerProps,\n MultiEntityPickerUiOptions,\n MultiEntityPickerFilterQuery,\n} from './schema';\n\nexport { MultiEntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `MultiEntityPicker`\n * field extension.\n */\nexport const MultiEntityPicker = (props: MultiEntityPickerProps) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const { items } = await catalogApi.getEntities(\n catalogFilter ? { filter: catalogFilter } : undefined,\n );\n return items;\n });\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (ref: string) => {\n try {\n return humanizeEntityRef(\n parseEntityRef(ref, { defaultKind, defaultNamespace }),\n {\n defaultKind,\n defaultNamespace,\n },\n );\n } catch (err) {\n return ref;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, refs: (string | Entity)[], reason: AutocompleteChangeReason) => {\n const values = refs\n .map(ref => {\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n return ref ? stringifyEntityRef(ref as Entity) : undefined;\n }\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n\n // We need to check against formData here as that's the previous value for this field.\n if (formData.includes(ref) || allowArbitraryValues) {\n return entityRef;\n }\n }\n\n return undefined;\n })\n .filter(ref => ref !== undefined) as string[];\n\n onChange(values);\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n useEffect(() => {\n if (entities?.length === 1) {\n onChange([stringifyEntityRef(entities[0])]);\n }\n }, [entities, onChange]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n multiple\n filterSelectedOptions\n disabled={entities?.length === 1}\n id={idSchema?.$id}\n value={\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n entities?.filter(\n e => formData && formData.includes(stringifyEntityRef(e)),\n ) ?? (allowArbitraryValues && formData ? formData.map(getLabel) : [])\n }\n loading={loading}\n onChange={onSelect}\n options={entities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : humanizeEntityRef(option, { defaultKind, defaultNamespace })!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{ margin: 'dense', style: { marginLeft: 0 } }}\n variant=\"outlined\"\n required={required}\n InputProps={params.InputProps}\n />\n )}\n />\n </FormControl>\n );\n};\n\nexport const validateMultiEntityPickerValidation = (\n values: string[],\n validation: FieldValidation,\n) => {\n values.forEach(value => {\n try {\n parseEntityRef(value);\n } catch {\n validation.addError(`${value} is not a valid entity ref`);\n }\n });\n};\n\n/**\n * Converts a special `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<MultiEntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: MultiEntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: MultiEntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const catalogFilter: MultiEntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter;\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiEntityPicker.esm.js","sources":["../../../../src/components/fields/MultiEntityPicker/MultiEntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n entityPresentationApiRef,\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport FormControl from '@material-ui/core/FormControl';\nimport Autocomplete, {\n AutocompleteChangeReason,\n} from '@material-ui/lab/Autocomplete';\nimport React, { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { FieldValidation } from '@rjsf/utils';\nimport {\n MultiEntityPickerFilterQueryValue,\n MultiEntityPickerProps,\n MultiEntityPickerUiOptions,\n MultiEntityPickerFilterQuery,\n} from './schema';\n\nexport { MultiEntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `MultiEntityPicker`\n * field extension.\n */\nexport const MultiEntityPicker = (props: MultiEntityPickerProps) => {\n const {\n onChange,\n schema: { title = 'Entity', description = 'An entity from the catalog' },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n const { value: entities, loading } = useAsync(async () => {\n const { items } = await catalogApi.getEntities(\n catalogFilter ? { filter: catalogFilter } : undefined,\n );\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n return { entities: items, entityRefToPresentation };\n });\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const onSelect = useCallback(\n (_: any, refs: (string | Entity)[], reason: AutocompleteChangeReason) => {\n const values = refs\n .map(ref => {\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n return ref ? stringifyEntityRef(ref as Entity) : undefined;\n }\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n\n // We need to check against formData here as that's the previous value for this field.\n if (formData.includes(ref) || allowArbitraryValues) {\n return entityRef;\n }\n }\n\n return undefined;\n })\n .filter(ref => ref !== undefined) as string[];\n\n onChange(values);\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n useEffect(() => {\n if (entities?.entities?.length === 1) {\n onChange([stringifyEntityRef(entities?.entities[0])]);\n }\n }, [entities, onChange]);\n\n return (\n <FormControl\n margin=\"normal\"\n required={required}\n error={rawErrors?.length > 0 && !formData}\n >\n <Autocomplete\n multiple\n filterSelectedOptions\n disabled={entities?.entities?.length === 1}\n id={idSchema?.$id}\n loading={loading}\n onChange={onSelect}\n options={entities?.entities || []}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.entityRef!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n helperText={description}\n FormHelperTextProps={{\n margin: 'dense',\n style: { marginLeft: 0 },\n }}\n variant=\"outlined\"\n required={required}\n InputProps={{\n ...params.InputProps,\n required: formData.length === 0 && required,\n }}\n />\n )}\n />\n </FormControl>\n );\n};\n\nexport const validateMultiEntityPickerValidation = (\n values: string[],\n validation: FieldValidation,\n) => {\n values.forEach(value => {\n try {\n parseEntityRef(value);\n } catch {\n validation.addError(`${value} is not a valid entity ref`);\n }\n });\n};\n\n/**\n * Converts a special `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<MultiEntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: MultiEntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: MultiEntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const catalogFilter: MultiEntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter;\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":["_a"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -110,10 +110,10 @@ declare const scaffolderPlugin: _backstage_core_plugin_api.BackstagePlugin<{
|
|
|
110
110
|
* @public
|
|
111
111
|
*/
|
|
112
112
|
declare const EntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
|
|
113
|
-
allowedKinds?: string[] | undefined;
|
|
114
113
|
defaultKind?: string | undefined;
|
|
115
|
-
allowArbitraryValues?: boolean | undefined;
|
|
116
114
|
defaultNamespace?: string | false | undefined;
|
|
115
|
+
allowedKinds?: string[] | undefined;
|
|
116
|
+
allowArbitraryValues?: boolean | undefined;
|
|
117
117
|
catalogFilter?: Record<string, string | string[] | {
|
|
118
118
|
exists?: boolean | undefined;
|
|
119
119
|
}> | Record<string, string | string[] | {
|
|
@@ -133,8 +133,8 @@ declare const EntityNamePickerFieldExtension: _backstage_plugin_scaffolder_react
|
|
|
133
133
|
*/
|
|
134
134
|
declare const MultiEntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string[], {
|
|
135
135
|
defaultKind?: string | undefined;
|
|
136
|
-
allowArbitraryValues?: boolean | undefined;
|
|
137
136
|
defaultNamespace?: string | false | undefined;
|
|
137
|
+
allowArbitraryValues?: boolean | undefined;
|
|
138
138
|
catalogFilter?: Record<string, string | string[] | {
|
|
139
139
|
exists?: boolean | undefined;
|
|
140
140
|
}> | Record<string, string | string[] | {
|
|
@@ -156,12 +156,12 @@ declare const RepoUrlPickerFieldExtension: _backstage_plugin_scaffolder_react.Fi
|
|
|
156
156
|
requestUserCredentials?: {
|
|
157
157
|
secretsKey: string;
|
|
158
158
|
additionalScopes?: {
|
|
159
|
-
|
|
160
|
-
gerrit?: string[] | undefined;
|
|
159
|
+
azure?: string[] | undefined;
|
|
161
160
|
github?: string[] | undefined;
|
|
162
161
|
gitlab?: string[] | undefined;
|
|
163
162
|
bitbucket?: string[] | undefined;
|
|
164
|
-
|
|
163
|
+
gerrit?: string[] | undefined;
|
|
164
|
+
gitea?: string[] | undefined;
|
|
165
165
|
} | undefined;
|
|
166
166
|
} | undefined;
|
|
167
167
|
}>;
|
|
@@ -171,9 +171,9 @@ declare const RepoUrlPickerFieldExtension: _backstage_plugin_scaffolder_react.Fi
|
|
|
171
171
|
* @public
|
|
172
172
|
*/
|
|
173
173
|
declare const OwnerPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
|
|
174
|
+
defaultNamespace?: string | false | undefined;
|
|
174
175
|
allowedKinds?: string[] | undefined;
|
|
175
176
|
allowArbitraryValues?: boolean | undefined;
|
|
176
|
-
defaultNamespace?: string | false | undefined;
|
|
177
177
|
catalogFilter?: Record<string, string | string[] | {
|
|
178
178
|
exists?: boolean | undefined;
|
|
179
179
|
}> | Record<string, string | string[] | {
|
|
@@ -201,10 +201,10 @@ declare const ScaffolderPage: (props: React.PropsWithChildren<RouterProps>) => R
|
|
|
201
201
|
* @public
|
|
202
202
|
*/
|
|
203
203
|
declare const OwnedEntityPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string, {
|
|
204
|
-
allowedKinds?: string[] | undefined;
|
|
205
204
|
defaultKind?: string | undefined;
|
|
206
|
-
allowArbitraryValues?: boolean | undefined;
|
|
207
205
|
defaultNamespace?: string | false | undefined;
|
|
206
|
+
allowedKinds?: string[] | undefined;
|
|
207
|
+
allowArbitraryValues?: boolean | undefined;
|
|
208
208
|
catalogFilter?: Record<string, string | string[] | {
|
|
209
209
|
exists?: boolean | undefined;
|
|
210
210
|
}> | Record<string, string | string[] | {
|
|
@@ -216,9 +216,9 @@ declare const OwnedEntityPickerFieldExtension: _backstage_plugin_scaffolder_reac
|
|
|
216
216
|
* @public
|
|
217
217
|
*/
|
|
218
218
|
declare const EntityTagsPickerFieldExtension: _backstage_plugin_scaffolder_react.FieldExtensionComponent<string[], {
|
|
219
|
-
kinds?: string[] | undefined;
|
|
220
|
-
showCounts?: boolean | undefined;
|
|
221
219
|
helperText?: string | undefined;
|
|
220
|
+
showCounts?: boolean | undefined;
|
|
221
|
+
kinds?: string[] | undefined;
|
|
222
222
|
}>;
|
|
223
223
|
|
|
224
224
|
/**
|
|
@@ -242,10 +242,10 @@ declare function makeFieldSchemaFromZod<TReturnSchema extends z.ZodType, TUiOpti
|
|
|
242
242
|
* @public
|
|
243
243
|
*/
|
|
244
244
|
declare const EntityPickerFieldSchema: FieldSchema<string, {
|
|
245
|
-
allowedKinds?: string[] | undefined;
|
|
246
245
|
defaultKind?: string | undefined;
|
|
247
|
-
allowArbitraryValues?: boolean | undefined;
|
|
248
246
|
defaultNamespace?: string | false | undefined;
|
|
247
|
+
allowedKinds?: string[] | undefined;
|
|
248
|
+
allowArbitraryValues?: boolean | undefined;
|
|
249
249
|
catalogFilter?: Record<string, string | string[] | {
|
|
250
250
|
exists?: boolean | undefined;
|
|
251
251
|
}> | Record<string, string | string[] | {
|
|
@@ -264,9 +264,9 @@ type EntityPickerUiOptions = typeof EntityPickerFieldSchema.uiOptionsType;
|
|
|
264
264
|
* @public
|
|
265
265
|
*/
|
|
266
266
|
declare const OwnerPickerFieldSchema: FieldSchema<string, {
|
|
267
|
+
defaultNamespace?: string | false | undefined;
|
|
267
268
|
allowedKinds?: string[] | undefined;
|
|
268
269
|
allowArbitraryValues?: boolean | undefined;
|
|
269
|
-
defaultNamespace?: string | false | undefined;
|
|
270
270
|
catalogFilter?: Record<string, string | string[] | {
|
|
271
271
|
exists?: boolean | undefined;
|
|
272
272
|
}> | Record<string, string | string[] | {
|
|
@@ -293,12 +293,12 @@ declare const RepoUrlPickerFieldSchema: FieldSchema<string, {
|
|
|
293
293
|
requestUserCredentials?: {
|
|
294
294
|
secretsKey: string;
|
|
295
295
|
additionalScopes?: {
|
|
296
|
-
|
|
297
|
-
gerrit?: string[] | undefined;
|
|
296
|
+
azure?: string[] | undefined;
|
|
298
297
|
github?: string[] | undefined;
|
|
299
298
|
gitlab?: string[] | undefined;
|
|
300
299
|
bitbucket?: string[] | undefined;
|
|
301
|
-
|
|
300
|
+
gerrit?: string[] | undefined;
|
|
301
|
+
gitea?: string[] | undefined;
|
|
302
302
|
} | undefined;
|
|
303
303
|
} | undefined;
|
|
304
304
|
}>;
|
|
@@ -325,10 +325,10 @@ declare const repoPickerValidation: (value: string, validation: FieldValidation,
|
|
|
325
325
|
* @public
|
|
326
326
|
*/
|
|
327
327
|
declare const OwnedEntityPickerFieldSchema: FieldSchema<string, {
|
|
328
|
-
allowedKinds?: string[] | undefined;
|
|
329
328
|
defaultKind?: string | undefined;
|
|
330
|
-
allowArbitraryValues?: boolean | undefined;
|
|
331
329
|
defaultNamespace?: string | false | undefined;
|
|
330
|
+
allowedKinds?: string[] | undefined;
|
|
331
|
+
allowArbitraryValues?: boolean | undefined;
|
|
332
332
|
catalogFilter?: Record<string, string | string[] | {
|
|
333
333
|
exists?: boolean | undefined;
|
|
334
334
|
}> | Record<string, string | string[] | {
|
|
@@ -347,9 +347,9 @@ type OwnedEntityPickerUiOptions = typeof OwnedEntityPickerFieldSchema.uiOptionsT
|
|
|
347
347
|
* @public
|
|
348
348
|
*/
|
|
349
349
|
declare const EntityTagsPickerFieldSchema: FieldSchema<string[], {
|
|
350
|
-
kinds?: string[] | undefined;
|
|
351
|
-
showCounts?: boolean | undefined;
|
|
352
350
|
helperText?: string | undefined;
|
|
351
|
+
showCounts?: boolean | undefined;
|
|
352
|
+
kinds?: string[] | undefined;
|
|
353
353
|
}>;
|
|
354
354
|
/**
|
|
355
355
|
* The input props that can be specified under `ui:options` for the
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.20.0",
|
|
4
4
|
"description": "The Backstage plugin that helps you create new things",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin"
|
|
@@ -48,20 +48,20 @@
|
|
|
48
48
|
"test": "backstage-cli package test"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@backstage/catalog-client": "^1.6.5
|
|
52
|
-
"@backstage/catalog-model": "^1.5.0
|
|
53
|
-
"@backstage/core-compat-api": "^0.2.5
|
|
54
|
-
"@backstage/core-components": "^0.14.
|
|
51
|
+
"@backstage/catalog-client": "^1.6.5",
|
|
52
|
+
"@backstage/catalog-model": "^1.5.0",
|
|
53
|
+
"@backstage/core-compat-api": "^0.2.5",
|
|
54
|
+
"@backstage/core-components": "^0.14.7",
|
|
55
55
|
"@backstage/core-plugin-api": "^1.9.2",
|
|
56
56
|
"@backstage/errors": "^1.2.4",
|
|
57
|
-
"@backstage/frontend-plugin-api": "^0.6.5
|
|
58
|
-
"@backstage/integration": "^1.
|
|
59
|
-
"@backstage/integration-react": "^1.1.
|
|
60
|
-
"@backstage/plugin-catalog-common": "^1.0.23
|
|
61
|
-
"@backstage/plugin-catalog-react": "^1.
|
|
57
|
+
"@backstage/frontend-plugin-api": "^0.6.5",
|
|
58
|
+
"@backstage/integration": "^1.11.0",
|
|
59
|
+
"@backstage/integration-react": "^1.1.27",
|
|
60
|
+
"@backstage/plugin-catalog-common": "^1.0.23",
|
|
61
|
+
"@backstage/plugin-catalog-react": "^1.12.0",
|
|
62
62
|
"@backstage/plugin-permission-react": "^0.4.22",
|
|
63
|
-
"@backstage/plugin-scaffolder-common": "^1.5.2
|
|
64
|
-
"@backstage/plugin-scaffolder-react": "^1.8.5
|
|
63
|
+
"@backstage/plugin-scaffolder-common": "^1.5.2",
|
|
64
|
+
"@backstage/plugin-scaffolder-react": "^1.8.5",
|
|
65
65
|
"@backstage/types": "^1.1.1",
|
|
66
66
|
"@codemirror/language": "^6.0.0",
|
|
67
67
|
"@codemirror/legacy-modes": "^6.1.0",
|
|
@@ -93,11 +93,11 @@
|
|
|
93
93
|
"zod-to-json-schema": "^3.20.4"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@backstage/cli": "^0.26.5
|
|
97
|
-
"@backstage/core-app-api": "^1.12.
|
|
98
|
-
"@backstage/dev-utils": "^1.0.32
|
|
99
|
-
"@backstage/plugin-catalog": "^1.
|
|
100
|
-
"@backstage/test-utils": "^1.5.5
|
|
96
|
+
"@backstage/cli": "^0.26.5",
|
|
97
|
+
"@backstage/core-app-api": "^1.12.5",
|
|
98
|
+
"@backstage/dev-utils": "^1.0.32",
|
|
99
|
+
"@backstage/plugin-catalog": "^1.20.0",
|
|
100
|
+
"@backstage/test-utils": "^1.5.5",
|
|
101
101
|
"@testing-library/dom": "^10.0.0",
|
|
102
102
|
"@testing-library/jest-dom": "^6.0.0",
|
|
103
103
|
"@testing-library/react": "^15.0.0",
|