Browse Source

SONAR-14932 Allow admin to configure ALM directly form the projects page

tags/9.0.0.45539
Philippe Perrin 3 years ago
parent
commit
afac7cec97
22 changed files with 171 additions and 110 deletions
  1. 2
    2
      server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx
  2. 2
    2
      server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx
  3. 2
    3
      server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx
  4. 0
    1
      server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreateRenderer.tsx
  5. 19
    8
      server/sonar-web/src/main/js/apps/create/project/CreateProjectModeSelection.tsx
  6. 50
    6
      server/sonar-web/src/main/js/apps/create/project/CreateProjectPage.tsx
  7. 2
    2
      server/sonar-web/src/main/js/apps/create/project/GitHubProjectCreate.tsx
  8. 2
    2
      server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx
  9. 2
    2
      server/sonar-web/src/main/js/apps/create/project/ManualProjectCreate.tsx
  10. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/AzureProjectCreate-test.tsx
  11. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketCloudProjectCreate-test.tsx
  12. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectCreate-test.tsx
  13. 0
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectCreateRenderer-test.tsx
  14. 52
    5
      server/sonar-web/src/main/js/apps/create/project/__tests__/CreateProjectModeSelection-test.tsx
  15. 21
    0
      server/sonar-web/src/main/js/apps/create/project/__tests__/CreateProjectPage-test.tsx
  16. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/GitHubProjectCreate-test.tsx
  17. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/GitlabProjectCreate-test.tsx
  18. 1
    1
      server/sonar-web/src/main/js/apps/create/project/__tests__/ManualProjectCreate-test.tsx
  19. 0
    3
      server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectCreate-test.tsx.snap
  20. 10
    60
      server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectModeSelection-test.tsx.snap
  21. 1
    0
      server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPage-test.tsx.snap
  22. 0
    7
      server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionForm.tsx

+ 2
- 2
server/sonar-web/src/main/js/apps/create/project/AzureProjectCreate.tsx View File

@@ -35,7 +35,7 @@ import AzureCreateProjectRenderer from './AzureProjectCreateRenderer';
interface Props extends Pick<WithRouterProps, 'location' | 'router'> {
canAdmin: boolean;
loadingBindings: boolean;
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
settings: AlmSettingsInstance[];
}

@@ -224,7 +224,7 @@ export default class AzureProjectCreate extends React.PureComponent<Props, State
if (this.mounted) {
this.setState({ importing: false });
if (createdProject) {
this.props.onProjectCreate([createdProject.key]);
this.props.onProjectCreate(createdProject.key);
}
}
};

+ 2
- 2
server/sonar-web/src/main/js/apps/create/project/BitbucketCloudProjectCreate.tsx View File

@@ -31,7 +31,7 @@ interface Props extends Pick<WithRouterProps, 'location' | 'router'> {
canAdmin: boolean;
settings: AlmSettingsInstance[];
loadingBindings: boolean;
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
}

interface State {
@@ -187,7 +187,7 @@ export default class BitbucketCloudProjectCreate extends React.PureComponent<Pro
this.setState({ importingSlug: undefined });

if (result) {
this.props.onProjectCreate([result.project.key]);
this.props.onProjectCreate(result.project.key);
}
}
};

+ 2
- 3
server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreate.tsx View File

@@ -38,7 +38,7 @@ interface Props extends Pick<WithRouterProps, 'location' | 'router'> {
canAdmin: boolean;
bitbucketSettings: AlmSettingsInstance[];
loadingBindings: boolean;
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
}

interface State {
@@ -196,7 +196,7 @@ export default class BitbucketProjectCreate extends React.PureComponent<Props, S
.then(({ project: { key } }) => {
if (this.mounted) {
this.setState({ importing: false });
this.props.onProjectCreate([key]);
this.props.onProjectCreate(key);
}
})
.catch(() => {
@@ -258,7 +258,6 @@ export default class BitbucketProjectCreate extends React.PureComponent<Props, S
loading={loading || loadingBindings}
onImportRepository={this.handleImportRepository}
onPersonalAccessTokenCreated={this.handlePersonalAccessTokenCreated}
onProjectCreate={this.props.onProjectCreate}
onSearch={this.handleSearch}
onSelectRepository={this.handleSelectRepository}
projectRepositories={projectRepositories}

+ 0
- 1
server/sonar-web/src/main/js/apps/create/project/BitbucketProjectCreateRenderer.tsx View File

@@ -42,7 +42,6 @@ export interface BitbucketProjectCreateRendererProps {
onSearch: (query: string) => void;
onSelectRepository: (repo: BitbucketRepository) => void;
onPersonalAccessTokenCreated: () => void;
onProjectCreate: (projectKeys: string[]) => void;
projects?: BitbucketProject[];
projectRepositories?: BitbucketProjectRepositories;
resetPat: boolean;

+ 19
- 8
server/sonar-web/src/main/js/apps/create/project/CreateProjectModeSelection.tsx View File

@@ -34,6 +34,7 @@ export interface CreateProjectModeSelectionProps {
appState: Pick<T.AppState, 'canAdmin'>;
loadingBindings: boolean;
onSelectMode: (mode: CreateProjectModes) => void;
onConfigMode: (mode: AlmKeys) => void;
}

const DEFAULT_ICON_SIZE = 80;
@@ -50,16 +51,30 @@ function renderAlmOption(
loadingBindings
} = props;

const hasBitbucketCloud = almCounts[AlmKeys.BitbucketCloud] > 0;
const isBitbucket = alm === AlmKeys.BitbucketServer;
const hasBitbucketCloudConf = almCounts[AlmKeys.BitbucketCloud] > 0;
const isBitbucketOption = alm === AlmKeys.BitbucketServer;

const count = isBitbucket
const count = isBitbucketOption
? almCounts[AlmKeys.BitbucketServer] + almCounts[AlmKeys.BitbucketCloud]
: almCounts[alm];
const hasConfig = count > 0;
const hasTooManyConfig = count > 1;
const disabled = loadingBindings || hasTooManyConfig || (!hasConfig && !canAdmin);

const onClick = () => {
if (hasTooManyConfig || (!hasConfig && !canAdmin)) {
return null;
}

if (!hasConfig && canAdmin) {
return props.onConfigMode(alm);
}

return props.onSelectMode(
isBitbucketOption && hasBitbucketCloudConf ? CreateProjectModes.BitbucketCloud : mode
);
};

return (
<div className="display-flex-column">
<button
@@ -68,11 +83,7 @@ function renderAlmOption(
{ disabled, 'big-spacer-right': !last }
)}
disabled={disabled}
onClick={() =>
props.onSelectMode(
isBitbucket && hasBitbucketCloud ? CreateProjectModes.BitbucketCloud : mode
)
}
onClick={onClick}
type="button">
<img
alt="" // Should be ignored by screen readers

+ 50
- 6
server/sonar-web/src/main/js/apps/create/project/CreateProjectPage.tsx View File

@@ -27,6 +27,7 @@ import { whenLoggedIn } from '../../../components/hoc/whenLoggedIn';
import { withAppState } from '../../../components/hoc/withAppState';
import { getProjectUrl } from '../../../helpers/urls';
import { AlmKeys, AlmSettingsInstance } from '../../../types/alm-settings';
import AlmBindingDefinitionForm from '../../settings/components/almIntegration/AlmBindingDefinitionForm';
import AzureProjectCreate from './AzureProjectCreate';
import BitbucketCloudProjectCreate from './BitbucketCloudProjectCreate';
import BitbucketProjectCreate from './BitbucketProjectCreate';
@@ -49,8 +50,17 @@ interface State {
githubSettings: AlmSettingsInstance[];
gitlabSettings: AlmSettingsInstance[];
loading: boolean;
creatingAlmDefinition?: AlmKeys;
}

const PROJECT_MODE_FOR_ALM_KEY = {
[AlmKeys.Azure]: CreateProjectModes.AzureDevOps,
[AlmKeys.BitbucketCloud]: CreateProjectModes.BitbucketCloud,
[AlmKeys.BitbucketServer]: CreateProjectModes.BitbucketServer,
[AlmKeys.GitHub]: CreateProjectModes.GitHub,
[AlmKeys.GitLab]: CreateProjectModes.GitLab
};

export class CreateProjectPage extends React.PureComponent<Props, State> {
mounted = false;
state: State = {
@@ -73,7 +83,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {

fetchAlmBindings = () => {
this.setState({ loading: true });
getAlmSettings()
return getAlmSettings()
.then(almSettings => {
if (this.mounted) {
this.setState({
@@ -101,13 +111,37 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
});
};

handleProjectCreate = (projectKeys: string[]) => {
if (projectKeys.length === 1) {
this.props.router.push(getProjectUrl(projectKeys[0]));
handleModeConfig = (alm: AlmKeys) => {
this.setState({ creatingAlmDefinition: alm });
};

handleProjectCreate = (projectKey: string) => {
this.props.router.push(getProjectUrl(projectKey));
};

handleOnCancelCreation = () => {
this.setState({ creatingAlmDefinition: undefined });
};

handleAfterSubmit = async () => {
let { creatingAlmDefinition: createdAlmDefinition } = this.state;

this.setState({ creatingAlmDefinition: undefined });

await this.fetchAlmBindings();

if (this.mounted && createdAlmDefinition) {
const { bitbucketCloudSettings } = this.state;

if (createdAlmDefinition === AlmKeys.BitbucketServer && bitbucketCloudSettings.length > 0) {
createdAlmDefinition = AlmKeys.BitbucketCloud;
}

this.handleModeSelect(PROJECT_MODE_FOR_ALM_KEY[createdAlmDefinition]);
}
};

renderForm(mode?: CreateProjectModes) {
renderProjectCreation(mode?: CreateProjectModes) {
const {
appState: { canAdmin },
location,
@@ -199,6 +233,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
almCounts={almCounts}
loadingBindings={loading}
onSelectMode={this.handleModeSelect}
onConfigMode={this.handleModeConfig}
/>
);
}
@@ -207,6 +242,7 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {

render() {
const { location } = this.props;
const { creatingAlmDefinition } = this.state;
const mode: CreateProjectModes | undefined = location.query?.mode;

return (
@@ -214,7 +250,15 @@ export class CreateProjectPage extends React.PureComponent<Props, State> {
<Helmet title={translate('onboarding.create_project.select_method')} titleTemplate="%s" />
<A11ySkipTarget anchor="create_project_main" />
<div className="page page-limited huge-spacer-bottom position-relative" id="create-project">
{this.renderForm(mode)}
{this.renderProjectCreation(mode)}
{creatingAlmDefinition && (
<AlmBindingDefinitionForm
alm={creatingAlmDefinition}
alreadyHaveInstanceConfigured={false}
onCancel={this.handleOnCancelCreation}
afterSubmit={this.handleAfterSubmit}
/>
)}
</div>
</>
);

+ 2
- 2
server/sonar-web/src/main/js/apps/create/project/GitHubProjectCreate.tsx View File

@@ -34,7 +34,7 @@ import GitHubProjectCreateRenderer from './GitHubProjectCreateRenderer';
interface Props extends Pick<WithRouterProps, 'location' | 'router'> {
canAdmin: boolean;
loadingBindings: boolean;
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
settings: AlmSettingsInstance[];
}

@@ -252,7 +252,7 @@ export default class GitHubProjectCreate extends React.Component<Props, State> {
selectedRepository.key
);

this.props.onProjectCreate([project.key]);
this.props.onProjectCreate(project.key);
} finally {
if (this.mounted) {
this.setState({ importing: false });

+ 2
- 2
server/sonar-web/src/main/js/apps/create/project/GitlabProjectCreate.tsx View File

@@ -27,7 +27,7 @@ import GitlabProjectCreateRenderer from './GitlabProjectCreateRenderer';
interface Props extends Pick<WithRouterProps, 'location' | 'router'> {
canAdmin: boolean;
loadingBindings: boolean;
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
settings: AlmSettingsInstance[];
}

@@ -155,7 +155,7 @@ export default class GitlabProjectCreate extends React.PureComponent<Props, Stat
this.setState({ importingGitlabProjectId: undefined });

if (result) {
this.props.onProjectCreate([result.project.key]);
this.props.onProjectCreate(result.project.key);
}
}
};

+ 2
- 2
server/sonar-web/src/main/js/apps/create/project/ManualProjectCreate.tsx View File

@@ -34,7 +34,7 @@ import CreateProjectPageHeader from './CreateProjectPageHeader';
import './ManualProjectCreate.css';

interface Props {
onProjectCreate: (projectKeys: string[]) => void;
onProjectCreate: (projectKey: string) => void;
}

interface State {
@@ -115,7 +115,7 @@ export default class ManualProjectCreate extends React.PureComponent<Props, Stat
project: state.projectKey,
name: (state.projectName || state.projectKey).trim()
}).then(
({ project }) => this.props.onProjectCreate([project.key]),
({ project }) => this.props.onProjectCreate(project.key),
() => {
if (this.mounted) {
this.setState({ submitting: false });

+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/AzureProjectCreate-test.tsx View File

@@ -188,7 +188,7 @@ it('should select and import a repository', async () => {
expect(importAzureRepository).toBeCalledWith('foo', repository.projectName, repository.name);
await waitAndUpdate(wrapper);

expect(onProjectCreate).toBeCalledWith(['baz']);
expect(onProjectCreate).toBeCalledWith('baz');
expect(wrapper.state().importing).toBe(false);
});


+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketCloudProjectCreate-test.tsx View File

@@ -148,7 +148,7 @@ it('Should import repository', async () => {
});
await wrapper.instance().handleImport('slug-test');
expect(importBitbucketCloudRepository).toHaveBeenCalledWith('key', 'slug-test');
expect(onProjectCreate).toHaveBeenCalledWith(['project-key']);
expect(onProjectCreate).toHaveBeenCalledWith('project-key');
});

it('Should behave correctly when import fail', async () => {

+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectCreate-test.tsx View File

@@ -108,7 +108,7 @@ it('should correctly import a repo', async () => {
instance.handleImportRepository();
expect(importBitbucketServerProject).toBeCalledWith('foo', repo.projectKey, repo.slug);
await waitAndUpdate(wrapper);
expect(onProjectCreate).toBeCalledWith(['baz']);
expect(onProjectCreate).toBeCalledWith('baz');
});

it('should correctly handle search', async () => {

+ 0
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/BitbucketProjectCreateRenderer-test.tsx View File

@@ -53,7 +53,6 @@ function shallowRender(props: Partial<BitbucketProjectCreateRendererProps> = {})
loading={false}
onImportRepository={jest.fn()}
onPersonalAccessTokenCreated={jest.fn()}
onProjectCreate={jest.fn()}
onSearch={jest.fn()}
onSelectRepository={jest.fn()}
projectRepositories={{ foo: { allShown: true, repositories: [mockBitbucketRepository()] } }}

+ 52
- 5
server/sonar-web/src/main/js/apps/create/project/__tests__/CreateProjectModeSelection-test.tsx View File

@@ -46,7 +46,16 @@ it('should render correctly', () => {
)
).toMatchSnapshot('invalid configs, admin');
expect(
shallowRender({ appState: { canAdmin: true } }, { [AlmKeys.BitbucketServer]: 0 })
shallowRender(
{ appState: { canAdmin: true } },
{
[AlmKeys.Azure]: 0,
[AlmKeys.BitbucketCloud]: 0,
[AlmKeys.BitbucketServer]: 0,
[AlmKeys.GitHub]: 0,
[AlmKeys.GitLab]: 0
}
)
).toMatchSnapshot('no alm conf yet, admin');
});

@@ -76,23 +85,60 @@ it('should correctly pass the selected mode up', () => {
expect(onSelectMode).toBeCalledWith(CreateProjectModes.GitLab);
onSelectMode.mockClear();

wrapper = shallowRender({ onSelectMode }, { [AlmKeys.BitbucketCloud]: 1 });
wrapper = shallowRender(
{ onSelectMode },
{ [AlmKeys.BitbucketCloud]: 1, [AlmKeys.BitbucketServer]: 0 }
);

click(wrapper.find(almButton).at(1));
expect(onSelectMode).toBeCalledWith(CreateProjectModes.BitbucketCloud);
onSelectMode.mockClear();
});

it('should call the proper click handler', () => {
const almButton = 'button.create-project-mode-type-alm';

const onSelectMode = jest.fn();
const onConfigMode = jest.fn();

let wrapper = shallowRender({ onSelectMode, onConfigMode }, { [AlmKeys.Azure]: 2 });

click(wrapper.find(almButton).at(0));
expect(onConfigMode).not.toHaveBeenCalled();
expect(onSelectMode).not.toHaveBeenCalled();
onConfigMode.mockClear();
onSelectMode.mockClear();

wrapper = shallowRender({ onSelectMode, onConfigMode });

click(wrapper.find(almButton).at(0));
expect(onConfigMode).not.toHaveBeenCalled();
expect(onSelectMode).toHaveBeenCalledWith(CreateProjectModes.AzureDevOps);
onConfigMode.mockClear();
onSelectMode.mockClear();

wrapper = shallowRender(
{ onSelectMode, onConfigMode, appState: { canAdmin: true } },
{ [AlmKeys.Azure]: 0 }
);

click(wrapper.find(almButton).at(0));
expect(onConfigMode).toHaveBeenCalledWith(CreateProjectModes.AzureDevOps);
expect(onSelectMode).not.toHaveBeenCalled();
onConfigMode.mockClear();
onSelectMode.mockClear();
});

function shallowRender(
props: Partial<CreateProjectModeSelectionProps> = {},
almCountOverrides = {}
) {
const almCounts = {
[AlmKeys.Azure]: 0,
[AlmKeys.Azure]: 1,
[AlmKeys.BitbucketCloud]: 0,
[AlmKeys.BitbucketServer]: 1,
[AlmKeys.GitHub]: 0,
[AlmKeys.GitLab]: 0,
[AlmKeys.GitHub]: 1,
[AlmKeys.GitLab]: 1,
...almCountOverrides
};
return shallow<CreateProjectModeSelectionProps>(
@@ -101,6 +147,7 @@ function shallowRender(
appState={{ canAdmin: false }}
loadingBindings={false}
onSelectMode={jest.fn()}
onConfigMode={jest.fn()}
{...props}
/>
);

+ 21
- 0
server/sonar-web/src/main/js/apps/create/project/__tests__/CreateProjectPage-test.tsx View File

@@ -74,6 +74,27 @@ it('should render correctly if the GitLab method is selected', () => {
expect(wrapper).toMatchSnapshot();
});

it('should submit alm configuration creation properly for BBC', async () => {
const push = jest.fn();
const wrapper = shallowRender({ router: mockRouter({ push }) });

wrapper
.find(CreateProjectModeSelection)
.props()
.onConfigMode(AlmKeys.BitbucketServer);
expect(wrapper.state().creatingAlmDefinition).toBe(AlmKeys.BitbucketServer);

(getAlmSettings as jest.Mock).mockResolvedValueOnce([{ alm: AlmKeys.BitbucketCloud }]);
wrapper
.find(AlmBindingDefinitionForm)
.props()
.afterSubmit({ key: 'test-key' });
await waitAndUpdate(wrapper);
expect(wrapper.state().creatingAlmDefinition).toBeUndefined();
expect(getAlmSettings).toHaveBeenCalled();
expect(push).toHaveBeenCalledWith({ pathname: '/path', query: { mode: AlmKeys.BitbucketCloud } });
});

function shallowRender(props: Partial<CreateProjectPage['props']> = {}) {
return shallow<CreateProjectPage>(
<CreateProjectPage

+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/GitHubProjectCreate-test.tsx View File

@@ -228,7 +228,7 @@ it('should handle importing', async () => {
selectedOrganization.key,
selectedRepository.key
);
expect(onProjectCreate).toBeCalledWith([project.key]);
expect(onProjectCreate).toBeCalledWith(project.key);
});

function shallowRender(props: Partial<GitHubProjectCreate['props']> = {}) {

+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/GitlabProjectCreate-test.tsx View File

@@ -150,7 +150,7 @@ it('should import', async () => {
await waitAndUpdate(wrapper);

expect(wrapper.state().importingGitlabProjectId).toBeUndefined();
expect(onProjectCreate).toBeCalledWith([createdProjectkey]);
expect(onProjectCreate).toBeCalledWith(createdProjectkey);
});

it('should do nothing with missing settings', async () => {

+ 1
- 1
server/sonar-web/src/main/js/apps/create/project/__tests__/ManualProjectCreate-test.tsx View File

@@ -71,7 +71,7 @@ it('should correctly create a project', async () => {
});

await waitAndUpdate(wrapper);
expect(onProjectCreate).toBeCalledWith(['bar']);
expect(onProjectCreate).toBeCalledWith('bar');
});

it('should not display any status when the name is not defined', () => {

+ 0
- 3
server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/BitbucketProjectCreate-test.tsx.snap View File

@@ -13,7 +13,6 @@ exports[`should render correctly 1`] = `
loading={false}
onImportRepository={[Function]}
onPersonalAccessTokenCreated={[Function]}
onProjectCreate={[MockFunction]}
onSearch={[Function]}
onSelectRepository={[Function]}
resetPat={false}
@@ -35,7 +34,6 @@ exports[`should render correctly: No repository 1`] = `
loading={false}
onImportRepository={[Function]}
onPersonalAccessTokenCreated={[Function]}
onProjectCreate={[MockFunction]}
onSearch={[Function]}
onSelectRepository={[Function]}
projects={
@@ -65,7 +63,6 @@ exports[`should render correctly: No setting 1`] = `
loading={false}
onImportRepository={[Function]}
onPersonalAccessTokenCreated={[Function]}
onProjectCreate={[MockFunction]}
onSearch={[Function]}
onSelectRepository={[Function]}
resetPat={false}

+ 10
- 60
server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectModeSelection-test.tsx.snap View File

@@ -52,8 +52,8 @@ exports[`should render correctly: default 1`] = `
className="display-flex-column"
>
<button
className="button button-huge display-flex-column create-project-mode-type-alm disabled big-spacer-right"
disabled={true}
className="button button-huge display-flex-column create-project-mode-type-alm big-spacer-right"
disabled={false}
onClick={[Function]}
type="button"
>
@@ -67,16 +67,6 @@ exports[`should render correctly: default 1`] = `
>
onboarding.create_project.select_method.azure
</div>
<p
className="text-muted small spacer-top"
style={
Object {
"lineHeight": 1.5,
}
}
>
onboarding.create_project.alm_not_configured
</p>
</button>
</div>
<div
@@ -104,8 +94,8 @@ exports[`should render correctly: default 1`] = `
className="display-flex-column"
>
<button
className="button button-huge display-flex-column create-project-mode-type-alm disabled big-spacer-right"
disabled={true}
className="button button-huge display-flex-column create-project-mode-type-alm big-spacer-right"
disabled={false}
onClick={[Function]}
type="button"
>
@@ -119,24 +109,14 @@ exports[`should render correctly: default 1`] = `
>
onboarding.create_project.select_method.github
</div>
<p
className="text-muted small spacer-top"
style={
Object {
"lineHeight": 1.5,
}
}
>
onboarding.create_project.alm_not_configured
</p>
</button>
</div>
<div
className="display-flex-column"
>
<button
className="button button-huge display-flex-column create-project-mode-type-alm disabled"
disabled={true}
className="button button-huge display-flex-column create-project-mode-type-alm"
disabled={false}
onClick={[Function]}
type="button"
>
@@ -150,16 +130,6 @@ exports[`should render correctly: default 1`] = `
>
onboarding.create_project.select_method.gitlab
</div>
<p
className="text-muted small spacer-top"
style={
Object {
"lineHeight": 1.5,
}
}
>
onboarding.create_project.alm_not_configured
</p>
</button>
</div>
</div>
@@ -516,8 +486,8 @@ exports[`should render correctly: invalid configs, not admin 1`] = `
className="display-flex-column"
>
<button
className="button button-huge display-flex-column create-project-mode-type-alm disabled big-spacer-right"
disabled={true}
className="button button-huge display-flex-column create-project-mode-type-alm big-spacer-right"
disabled={false}
onClick={[Function]}
type="button"
>
@@ -531,16 +501,6 @@ exports[`should render correctly: invalid configs, not admin 1`] = `
>
onboarding.create_project.select_method.azure
</div>
<p
className="text-muted small spacer-top"
style={
Object {
"lineHeight": 1.5,
}
}
>
onboarding.create_project.alm_not_configured
</p>
</button>
</div>
<div
@@ -609,8 +569,8 @@ exports[`should render correctly: invalid configs, not admin 1`] = `
className="display-flex-column"
>
<button
className="button button-huge display-flex-column create-project-mode-type-alm disabled"
disabled={true}
className="button button-huge display-flex-column create-project-mode-type-alm"
disabled={false}
onClick={[Function]}
type="button"
>
@@ -624,16 +584,6 @@ exports[`should render correctly: invalid configs, not admin 1`] = `
>
onboarding.create_project.select_method.gitlab
</div>
<p
className="text-muted small spacer-top"
style={
Object {
"lineHeight": 1.5,
}
}
>
onboarding.create_project.alm_not_configured
</p>
</button>
</div>
</div>

+ 1
- 0
server/sonar-web/src/main/js/apps/create/project/__tests__/__snapshots__/CreateProjectPage-test.tsx.snap View File

@@ -26,6 +26,7 @@ exports[`should render correctly 1`] = `
}
}
loadingBindings={true}
onConfigMode={[Function]}
onSelectMode={[Function]}
/>
</div>

+ 0
- 7
server/sonar-web/src/main/js/apps/settings/components/almIntegration/AlmBindingDefinitionForm.tsx View File

@@ -43,17 +43,10 @@ import {
} from '../../../../types/alm-settings';
import AlmBindingDefinitionFormRenderer from './AlmBindingDefinitionFormRenderer';

export interface AlmBindingDefinitionFormChildrenProps {
formData: AlmBindingDefinition;
onFieldChange: (fieldId: string, value: string) => void;
}

interface Props {
alm: AlmKeys;
bindingDefinition?: AlmBindingDefinition;
alreadyHaveInstanceConfigured: boolean;
onDelete?: (definitionKey: string) => void;
onEdit?: (definitionKey: string) => void;
onCancel?: () => void;
afterSubmit?: (data: AlmBindingDefinitionBase) => void;
}

Loading…
Cancel
Save