feat(scaffolder): add missing form fields for the nfs

Signed-off-by: Hellgren Heikki <heikki.hellgren@op.fi>
This commit is contained in:
Hellgren Heikki
2025-09-24 10:23:35 +03:00
parent 9e76ddb8f9
commit 075e0648b8
18 changed files with 496 additions and 12 deletions
+64 -3
View File
@@ -19,13 +19,13 @@ import {
convertLegacyRouteRef,
} from '@backstage/core-compat-api';
import {
NavItemBlueprint,
PageBlueprint,
ApiBlueprint,
createExtensionInput,
discoveryApiRef,
fetchApiRef,
identityApiRef,
createExtensionInput,
NavItemBlueprint,
PageBlueprint,
} from '@backstage/frontend-plugin-api';
import { rootRouteRef } from '../routes';
import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
@@ -72,6 +72,67 @@ export const repoUrlPickerFormField = FormFieldBlueprint.make({
},
});
export const entityNamePickerFormField = FormFieldBlueprint.make({
name: 'entity-name-picker',
params: {
field: () =>
import('./fields/EntityNamePicker').then(m => m.EntityNamePicker),
},
});
export const entityPickerFormField = FormFieldBlueprint.make({
name: 'entity-picker',
params: {
field: () => import('./fields/EntityPicker').then(m => m.EntityPicker),
},
});
export const ownerPickerFormField = FormFieldBlueprint.make({
name: 'owner-picker',
params: {
field: () => import('./fields/OwnerPicker').then(m => m.OwnerPicker),
},
});
export const entityTagsPickerFormField = FormFieldBlueprint.make({
name: 'entity-tags-picker',
params: {
field: () =>
import('./fields/EntityTagsPicker').then(m => m.EntityTagsPicker),
},
});
export const multiEntityPickerFormField = FormFieldBlueprint.make({
name: 'multi-entity-picker',
params: {
field: () =>
import('./fields/MultiEntityPicker').then(m => m.MultiEntityPicker),
},
});
export const myGroupsPickerFormField = FormFieldBlueprint.make({
name: 'my-groups-picker',
params: {
field: () => import('./fields/MyGroupsPicker').then(m => m.MyGroupsPicker),
},
});
export const ownedEntityPickerFormField = FormFieldBlueprint.make({
name: 'owned-entity-picker',
params: {
field: () =>
import('./fields/OwnedEntityPicker').then(m => m.OwnedEntityPicker),
},
});
export const repoBranchPickerFormField = FormFieldBlueprint.make({
name: 'repo-branch-picker',
params: {
field: () =>
import('./fields/RepoBranchPicker').then(m => m.RepoBranchPicker),
},
});
export const scaffolderApi = ApiBlueprint.make({
params: defineParams =>
defineParams({
@@ -0,0 +1,28 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { EntityNamePicker as Component } from '../../components/fields/EntityNamePicker/EntityNamePicker';
import {
EntityNamePickerFieldSchema,
entityNamePickerValidation,
} from '../../components';
export const EntityNamePicker = createFormField({
component: Component,
name: 'EntityNamePicker',
validation: entityNamePickerValidation,
schema: EntityNamePickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { EntityPicker as Component } from '../../components/fields/EntityPicker/EntityPicker';
import { EntityPickerFieldSchema } from '../../components';
export const EntityPicker = createFormField({
component: Component,
name: 'EntityPicker',
schema: EntityPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { EntityTagsPicker as Component } from '../../components/fields/EntityTagsPicker/EntityTagsPicker';
import { EntityTagsPickerFieldSchema } from '../../components';
export const EntityTagsPicker = createFormField({
component: Component,
name: 'EntityTagsPicker',
schema: EntityTagsPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { MultiEntityPicker as Component } from '../../components/fields/MultiEntityPicker/MultiEntityPicker';
import { MultiEntityPickerFieldSchema } from '../../components';
export const MultiEntityPicker = createFormField({
component: Component,
name: 'MultiEntityPicker',
schema: MultiEntityPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { MyGroupsPicker as Component } from '../../components/fields/MyGroupsPicker/MyGroupsPicker';
import { MyGroupsPickerFieldSchema } from '../../components';
export const MyGroupsPicker = createFormField({
component: Component,
name: 'MyGroupsPicker',
schema: MyGroupsPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { OwnedEntityPicker as Component } from '../../components/fields/OwnedEntityPicker/OwnedEntityPicker';
import { OwnedEntityPickerFieldSchema } from '../../components';
export const OwnedEntityPicker = createFormField({
component: Component,
name: 'OwnedEntityPicker',
schema: OwnedEntityPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { OwnerPicker as Component } from '../../components/fields/OwnerPicker/OwnerPicker';
import { OwnerPickerFieldSchema } from '../../components';
export const OwnerPicker = createFormField({
component: Component,
name: 'OwnerPicker',
schema: OwnerPickerFieldSchema,
});
@@ -0,0 +1,24 @@
/*
* Copyright 2024 The Backstage Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
import { RepoBranchPicker as Component } from '../../components/fields/RepoBranchPicker/RepoBranchPicker';
import { RepoBranchPickerFieldSchema } from '../../components';
export const RepoBranchPicker = createFormField({
component: Component,
name: 'RepoBranchPicker',
schema: RepoBranchPickerFieldSchema,
});
+18 -2
View File
@@ -17,10 +17,10 @@
import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
import {
rootRouteRef,
actionsRouteRef,
editRouteRef,
registerComponentRouteRef,
rootRouteRef,
scaffolderListTaskRouteRef,
scaffolderTaskRouteRef,
selectedTemplateRouteRef,
@@ -28,10 +28,18 @@ import {
viewTechDocRouteRef,
} from '../routes';
import {
entityNamePickerFormField,
entityPickerFormField,
entityTagsPickerFormField,
multiEntityPickerFormField,
myGroupsPickerFormField,
ownedEntityPickerFormField,
ownerPickerFormField,
repoBranchPickerFormField,
repoUrlPickerFormField,
scaffolderApi,
scaffolderNavItem,
scaffolderPage,
scaffolderApi,
} from './extensions';
import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';
@@ -73,5 +81,13 @@ export default createFrontendPlugin({
formDecoratorsApi,
formFieldsApi,
repoUrlPickerFormField,
entityNamePickerFormField,
entityPickerFormField,
ownerPickerFormField,
entityTagsPickerFormField,
multiEntityPickerFormField,
myGroupsPickerFormField,
ownedEntityPickerFormField,
repoBranchPickerFormField,
],
});
@@ -14,3 +14,4 @@
* limitations under the License.
*/
export { entityNamePickerValidation } from './validation';
export { EntityNamePickerFieldSchema } from './schema';
@@ -15,7 +15,10 @@
*/
import { makeFieldSchema } from '@backstage/plugin-scaffolder-react';
const EntityNamePickerFieldSchema = makeFieldSchema({
/**
* @public
*/
export const EntityNamePickerFieldSchema = makeFieldSchema({
output: z => z.string(),
});
@@ -17,6 +17,9 @@
import { FieldValidation } from '@rjsf/utils';
import { KubernetesValidatorFunctions } from '@backstage/catalog-model';
/**
* @public
*/
export const entityNamePickerValidation = (
value: string,
validation: FieldValidation,
@@ -16,6 +16,9 @@
import { z as zod } from 'zod';
import { makeFieldSchema } from '@backstage/plugin-scaffolder-react';
/**
* @public
*/
export const entityQueryFilterExpressionSchema = zod.record(
zod
.string()
@@ -23,6 +26,9 @@ export const entityQueryFilterExpressionSchema = zod.record(
.or(zod.array(zod.string())),
);
/**
* @public
*/
export const MultiEntityPickerFieldSchema = makeFieldSchema({
output: z => z.array(z.string()),
uiOptions: z =>
@@ -54,6 +60,7 @@ export const MultiEntityPickerFieldSchema = makeFieldSchema({
/**
* The input props that can be specified under `ui:options` for the
* `EntityPicker` field extension.
* @public
*/
export type MultiEntityPickerUiOptions = NonNullable<
(typeof MultiEntityPickerFieldSchema.TProps.uiSchema)['ui:options']
@@ -14,10 +14,13 @@
* limitations under the License.
*/
export * from './EntityPicker';
export * from './EntityNamePicker';
export * from './OwnerPicker';
export * from './RepoUrlPicker';
export * from './OwnedEntityPicker';
export * from './EntityTagsPicker';
export * from './RepoBranchPicker';
export * from './MultiEntityPicker';
export * from './MyGroupsPicker';
export { type FieldSchema, makeFieldSchemaFromZod } from './utils';