123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- import React from 'react';
- import {addErrorMessage, addSuccessMessage} from 'app/actionCreators/indicator';
- import AsyncComponent from 'app/components/asyncComponent';
- import Button from 'app/components/button';
- import Confirm from 'app/components/confirm';
- import {IconDelete} from 'app/icons';
- import {t} from 'app/locale';
- import {CodeOwners, Organization, Project} from 'app/types';
- import RulesPanel from 'app/views/settings/project/projectOwnership/rulesPanel';
- type Props = AsyncComponent['props'] & {
- organization: Organization;
- project: Project;
- };
- type State = {} & AsyncComponent['state'];
- class CodeOwnersPanel extends AsyncComponent<Props, State> {
- getEndpoints(): ReturnType<AsyncComponent['getEndpoints']> {
- const {organization, project} = this.props;
- return [
- [
- 'codeowners',
- `/projects/${organization.slug}/${project.slug}/codeowners/?expand=codeMapping`,
- ],
- ];
- }
- handleDelete = async (codeowner: CodeOwners) => {
- const {organization, project} = this.props;
- const endpoint = `/api/0/projects/${organization.slug}/${project.slug}/codeowners/${codeowner.id}/`;
- try {
- await this.api.requestPromise(endpoint, {
- method: 'DELETE',
- });
- // remove config and update state
- const {codeowners} = this.state;
- this.setState({
- codeowners: codeowners.filter(config => config.id !== codeowner.id),
- });
- addSuccessMessage(t('Deletion successful'));
- } catch {
- //no 4xx errors should happen on delete
- addErrorMessage(t('An error occurred'));
- }
- };
- renderBody() {
- const {codeowners} = this.state;
- return codeowners.map(codeowner => {
- const {
- raw,
- dateUpdated,
- provider,
- codeMapping: {repoName},
- } = codeowner;
- return (
- <React.Fragment key={codeowner.id}>
- <RulesPanel
- data-test-id="codeowners-panel"
- type="codeowners"
- raw={raw}
- dateUpdated={dateUpdated}
- provider={provider}
- repoName={repoName}
- readOnly
- controls={[
- <Confirm
- onConfirm={() => this.handleDelete(codeowner)}
- message={t('Are you sure you want to remove this CODEOWNERS file?')}
- key="confirm-delete"
- >
- <Button key="delete" icon={<IconDelete size="xs" />} size="xsmall" />
- </Confirm>,
- ]}
- />
- </React.Fragment>
- );
- });
- }
- }
- export default CodeOwnersPanel;
|