feature(code/frontend): confirm delete and reindex a repository (#38520) (#38738)

This commit is contained in:
WangQianliang 2019-06-12 10:29:14 +08:00 committed by GitHub
parent b55dcff952
commit c26611792b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 129 additions and 17 deletions

View file

@ -14,6 +14,9 @@ import {
EuiText,
EuiTextColor,
EuiToolTip,
EuiConfirmModal,
EuiOverlayMask,
EUI_MODAL_CONFIRM_BUTTON,
} from '@elastic/eui';
import moment from 'moment';
import React from 'react';
@ -29,21 +32,57 @@ const stateColor = {
[RepoState.INDEXING]: 'primary',
};
class CodeProjectItem extends React.PureComponent<{
project: Repository;
enableManagement: boolean;
showStatus: boolean;
status?: RepoStatus;
deleteRepo?: (uri: string) => void;
indexRepo?: (uri: string) => void;
initRepoCommand?: (uri: string) => void;
openSettings?: (uri: string, url: string) => void;
}> {
class CodeProjectItem extends React.PureComponent<
{
project: Repository;
enableManagement: boolean;
showStatus: boolean;
status?: RepoStatus;
deleteRepo?: (uri: string) => void;
indexRepo?: (uri: string) => void;
initRepoCommand?: (uri: string) => void;
openSettings?: (uri: string, url: string) => void;
},
{ showReindexConfirmModal: boolean; showDeleteConfirmModal: boolean }
> {
state = {
showDeleteConfirmModal: false,
showReindexConfirmModal: false,
};
openReindexModal = () => {
this.setState({ showReindexConfirmModal: true });
};
closeReindexModal = () => {
this.setState({ showReindexConfirmModal: false });
};
openDeleteModal = () => {
this.setState({ showDeleteConfirmModal: true });
};
closeDeleteModal = () => {
this.setState({ showDeleteConfirmModal: false });
};
confirmDelete = () => {
if (this.props.deleteRepo) {
this.props.deleteRepo(this.props.project.uri);
this.closeDeleteModal();
}
};
confirmReindex = () => {
if (this.props.indexRepo) {
this.props.indexRepo(this.props.project.uri);
this.closeReindexModal();
}
};
public render() {
const { project, showStatus, status, enableManagement } = this.props;
const { name, org, uri, url } = project;
const onClickDelete = () => this.props.deleteRepo && this.props.deleteRepo(uri);
const onClickIndex = () => this.props.indexRepo && this.props.indexRepo(uri);
const onClickSettings = () => this.props.openSettings && this.props.openSettings(uri, url);
let footer = null;
let disableRepoLink = false;
@ -131,14 +170,14 @@ class CodeProjectItem extends React.PureComponent<{
className="codeButton__project"
data-test-subj="indexRepositoryButton"
tabIndex={0}
onKeyPress={onClickIndex}
onClick={onClickIndex}
onKeyPress={this.openReindexModal}
onClick={this.openReindexModal}
role="button"
style={{ visibility: indexVisibility }}
>
<EuiIcon type="indexSettings" />
<EuiText size="xs" color="subdued">
Index
Reindex
</EuiText>
</div>
</EuiFlexItem>
@ -147,8 +186,8 @@ class CodeProjectItem extends React.PureComponent<{
className="codeButton__project"
data-test-subj="deleteRepositoryButton"
tabIndex={0}
onKeyPress={onClickDelete}
onClick={onClickDelete}
onKeyPress={this.openDeleteModal}
onClick={this.openDeleteModal}
role="button"
style={{ visibility: deleteVisibility }}
>
@ -195,10 +234,43 @@ class CodeProjectItem extends React.PureComponent<{
</EuiFlexItem>
{enableManagement && projectManagement}
</EuiFlexGroup>
{this.state.showDeleteConfirmModal && this.renderDeleteConfirmModal()}
{this.state.showReindexConfirmModal && this.renderReindexConfirmModal()}
</EuiPanel>
);
}
renderReindexConfirmModal = () => {
return (
<EuiOverlayMask>
<EuiConfirmModal
title="Reindex this repository?"
onCancel={this.closeReindexModal}
onConfirm={this.confirmReindex}
cancelButtonText="No, don't do it"
confirmButtonText="Yes, do it"
defaultFocusedButton={EUI_MODAL_CONFIRM_BUTTON}
/>
</EuiOverlayMask>
);
};
renderDeleteConfirmModal = () => {
return (
<EuiOverlayMask>
<EuiConfirmModal
title="Delete this repository?"
onCancel={this.closeDeleteModal}
onConfirm={this.confirmDelete}
cancelButtonText="No, don't do it"
confirmButtonText="Yes, do it"
buttonColor="danger"
defaultFocusedButton={EUI_MODAL_CONFIRM_BUTTON}
/>
</EuiOverlayMask>
);
};
private renderProgress() {
const { status } = this.props;
if (

View file

@ -117,6 +117,16 @@ export default function codeIntelligenceFunctionalTests({
// Clean up the imported repository
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);
});
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);

View file

@ -64,6 +64,13 @@ export default function exploreRepositoryFunctionalTests({
// Clean up the imported repository
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);

View file

@ -54,6 +54,12 @@ export default function manageRepositoriesFunctionalTests({
// Clean up the imported repository
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);

View file

@ -65,6 +65,12 @@ export default function manageRepositoriesFunctionalTests({
// Click the delete repository button.
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);
@ -101,6 +107,12 @@ export default function manageRepositoriesFunctionalTests({
// Delete the repository
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
await retry.tryForTime(300000, async () => {
const repositoryItems = await testSubjects.findAll(repositoryListSelector);
expect(repositoryItems).to.have.length(0);

View file

@ -135,6 +135,11 @@ export default function testWithSecurity({ getService, getPageObjects }: TestInv
const deleteButton = await testSubjects.findAll('deleteRepositoryButton');
if (deleteButton.length > 0) {
await PageObjects.code.clickDeleteRepositoryButton();
await retry.try(async () => {
expect(await testSubjects.exists('confirmModalConfirmButton')).to.be(true);
});
await testSubjects.click('confirmModalConfirmButton');
}
}
expect(repositoryItems).to.have.length(0);