From 300256392c9d9397f3664a4ecd8370e39e18c7af Mon Sep 17 00:00:00 2001 From: Andrew Kundrock Date: Fri, 2 Dec 2022 15:34:11 -0700 Subject: [PATCH] Add field selection rendering of allowedProjects for BitbucketRepoPicker Signed-off-by: Andrew Kundrock --- .../bitbucket-demo/template.yaml | 10 ++++- .../BitbucketRepoPicker.test.tsx | 16 ++++++++ .../RepoUrlPicker/BitbucketRepoPicker.tsx | 41 +++++++++++++++---- .../fields/RepoUrlPicker/RepoUrlPicker.tsx | 16 +++++++- .../components/fields/RepoUrlPicker/schema.ts | 4 ++ 5 files changed, 77 insertions(+), 10 deletions(-) diff --git a/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml b/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml index ee1bc634b4..95854eaf84 100644 --- a/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml +++ b/plugins/scaffolder-backend/sample-templates/bitbucket-demo/template.yaml @@ -20,7 +20,15 @@ spec: ui:options: allowedHosts: - bitbucket.org - - server.bitbucket.com + allowedOwners: + - WORKSPACE1 + - WORKSPACE2 + allowedProjects: + - PROJECT1 + - PROJECT2 + allowedRepos: + - REPO1 + - REPO2 - title: Fill in some steps required: - name diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.test.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.test.tsx index fc643e7360..6fe93ce512 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.test.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.test.tsx @@ -56,6 +56,22 @@ describe('BitbucketRepoPicker', () => { expect(getAllByRole('textbox')).toHaveLength(1); }); + + it('renders a select if there is a list of allowed projects', async () => { + const allowedProjects = ['project1', 'project2']; + const { findByText } = render( + , + ); + + expect(await findByText('project1')).toBeInTheDocument(); + expect(await findByText('project2')).toBeInTheDocument(); + }); + describe('workspace field', () => { it('calls onChange when the workspace changes', () => { const onChange = jest.fn(); diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx index 5bc1380553..75922a3efb 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/BitbucketRepoPicker.tsx @@ -23,15 +23,25 @@ import { RepoUrlPickerState } from './types'; export const BitbucketRepoPicker = (props: { allowedOwners?: string[]; + allowedProjects?: string[]; onChange: (state: RepoUrlPickerState) => void; state: RepoUrlPickerState; rawErrors: string[]; }) => { - const { allowedOwners = [], onChange, rawErrors, state } = props; + const { + allowedOwners = [], + allowedProjects = [], + onChange, + rawErrors, + state, + } = props; const { host, workspace, project } = state; const ownerItems: SelectItem[] = allowedOwners ? allowedOwners?.map(i => ({ label: i, value: i })) : []; + const projectItems: SelectItem[] = allowedProjects + ? allowedProjects?.map(i => ({ label: i, value: i })) + : []; useEffect(() => { if (host === 'bitbucket.org' && allowedOwners.length) { @@ -69,7 +79,7 @@ export const BitbucketRepoPicker = (props: { )} - The Organization that this repo will belong to + The Workspace that this repo will belong to )} @@ -78,12 +88,27 @@ export const BitbucketRepoPicker = (props: { required error={rawErrors?.length > 0 && !project} > - Project - onChange({ project: e.target.value })} - value={project} - /> + {allowedProjects?.length ? ( + onChange({ project: e.target.value })} + value={project} + /> + + )} The Project that this repo will belong to diff --git a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx index 827eff6ea2..79b7f23da6 100644 --- a/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx +++ b/plugins/scaffolder/src/components/fields/RepoUrlPicker/RepoUrlPicker.tsx @@ -60,12 +60,16 @@ export const RepoUrlPicker = (props: RepoUrlPickerProps) => { () => uiSchema?.['ui:options']?.allowedOwners ?? [], [uiSchema], ); + const allowedProjects = useMemo( + () => uiSchema?.['ui:options']?.allowedProjects ?? [], + [uiSchema], + ); const allowedRepos = useMemo( () => uiSchema?.['ui:options']?.allowedRepos ?? [], [uiSchema], ); - const { owner, organization, repoName } = state; + const { owner, organization, project, repoName } = state; useEffect(() => { onChange(serializeRepoPickerUrl(state)); @@ -90,6 +94,15 @@ export const RepoUrlPicker = (props: RepoUrlPickerProps) => { } }, [setState, allowedOwners, owner]); + useEffect(() => { + if (allowedProjects.length > 0 && !project) { + setState(prevState => ({ + ...prevState, + project: allowedProjects[0], + })); + } + }, [setState, allowedProjects, project]); + useEffect(() => { if (allowedRepos.length > 0 && !repoName) { setState(prevState => ({ ...prevState, repoName: allowedRepos[0] })); @@ -169,6 +182,7 @@ export const RepoUrlPicker = (props: RepoUrlPickerProps) => { {hostType === 'bitbucket' && (