codeowners.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React from 'react';
  2. import {addErrorMessage, addSuccessMessage} from 'app/actionCreators/indicator';
  3. import AsyncComponent from 'app/components/asyncComponent';
  4. import Button from 'app/components/button';
  5. import Confirm from 'app/components/confirm';
  6. import {IconDelete} from 'app/icons';
  7. import {t} from 'app/locale';
  8. import {CodeOwners, Organization, Project} from 'app/types';
  9. import RulesPanel from 'app/views/settings/project/projectOwnership/rulesPanel';
  10. type Props = AsyncComponent['props'] & {
  11. organization: Organization;
  12. project: Project;
  13. };
  14. type State = {} & AsyncComponent['state'];
  15. class CodeOwnersPanel extends AsyncComponent<Props, State> {
  16. getEndpoints(): ReturnType<AsyncComponent['getEndpoints']> {
  17. const {organization, project} = this.props;
  18. return [
  19. [
  20. 'codeowners',
  21. `/projects/${organization.slug}/${project.slug}/codeowners/?expand=codeMapping`,
  22. ],
  23. ];
  24. }
  25. handleDelete = async (codeowner: CodeOwners) => {
  26. const {organization, project} = this.props;
  27. const endpoint = `/api/0/projects/${organization.slug}/${project.slug}/codeowners/${codeowner.id}/`;
  28. try {
  29. await this.api.requestPromise(endpoint, {
  30. method: 'DELETE',
  31. });
  32. // remove config and update state
  33. const {codeowners} = this.state;
  34. this.setState({
  35. codeowners: codeowners.filter(config => config.id !== codeowner.id),
  36. });
  37. addSuccessMessage(t('Deletion successful'));
  38. } catch {
  39. //no 4xx errors should happen on delete
  40. addErrorMessage(t('An error occurred'));
  41. }
  42. };
  43. renderBody() {
  44. const {codeowners} = this.state;
  45. return codeowners.map(codeowner => {
  46. const {
  47. raw,
  48. dateUpdated,
  49. provider,
  50. codeMapping: {repoName},
  51. } = codeowner;
  52. return (
  53. <React.Fragment key={codeowner.id}>
  54. <RulesPanel
  55. data-test-id="codeowners-panel"
  56. type="codeowners"
  57. raw={raw}
  58. dateUpdated={dateUpdated}
  59. provider={provider}
  60. repoName={repoName}
  61. readOnly
  62. controls={[
  63. <Confirm
  64. onConfirm={() => this.handleDelete(codeowner)}
  65. message={t('Are you sure you want to remove this CODEOWNERS file?')}
  66. key="confirm-delete"
  67. >
  68. <Button key="delete" icon={<IconDelete size="xs" />} size="xsmall" />
  69. </Confirm>,
  70. ]}
  71. />
  72. </React.Fragment>
  73. );
  74. });
  75. }
  76. }
  77. export default CodeOwnersPanel;