TeamMemberRow.tsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import React, { PureComponent } from 'react';
  2. import { connect } from 'react-redux';
  3. import { DeleteButton, Select, SelectOptionItem } from '@grafana/ui';
  4. import { TeamMember, teamsPermissionLevels } from 'app/types';
  5. import { WithFeatureToggle } from 'app/core/components/WithFeatureToggle';
  6. import { updateTeamMember, removeTeamMember } from './state/actions';
  7. import { TagBadge } from 'app/core/components/TagFilter/TagBadge';
  8. export interface Props {
  9. member: TeamMember;
  10. syncEnabled: boolean;
  11. editorsCanAdmin: boolean;
  12. signedInUserIsTeamAdmin: boolean;
  13. removeTeamMember?: typeof removeTeamMember;
  14. updateTeamMember?: typeof updateTeamMember;
  15. }
  16. export class TeamMemberRow extends PureComponent<Props> {
  17. constructor(props: Props) {
  18. super(props);
  19. this.renderLabels = this.renderLabels.bind(this);
  20. this.renderPermissions = this.renderPermissions.bind(this);
  21. }
  22. onRemoveMember(member: TeamMember) {
  23. this.props.removeTeamMember(member.userId);
  24. }
  25. onPermissionChange = (item: SelectOptionItem, member: TeamMember) => {
  26. const permission = item.value;
  27. const updatedTeamMember = { ...member, permission };
  28. this.props.updateTeamMember(updatedTeamMember);
  29. };
  30. renderPermissions(member: TeamMember) {
  31. const { editorsCanAdmin, signedInUserIsTeamAdmin } = this.props;
  32. const value = teamsPermissionLevels.find(dp => dp.value === member.permission);
  33. return (
  34. <WithFeatureToggle featureToggle={editorsCanAdmin}>
  35. <td className="width-5 team-permissions">
  36. <div className="gf-form">
  37. {signedInUserIsTeamAdmin && (
  38. <Select
  39. isSearchable={false}
  40. options={teamsPermissionLevels}
  41. onChange={item => this.onPermissionChange(item, member)}
  42. className="gf-form-select-box__control--menu-right"
  43. value={value}
  44. />
  45. )}
  46. {!signedInUserIsTeamAdmin && <span>{value.label}</span>}
  47. </div>
  48. </td>
  49. </WithFeatureToggle>
  50. );
  51. }
  52. renderLabels(labels: string[]) {
  53. if (!labels) {
  54. return <td />;
  55. }
  56. return (
  57. <td>
  58. {labels.map(label => (
  59. <TagBadge key={label} label={label} removeIcon={false} count={0} onClick={() => {}} />
  60. ))}
  61. </td>
  62. );
  63. }
  64. render() {
  65. const { member, syncEnabled, signedInUserIsTeamAdmin } = this.props;
  66. return (
  67. <tr key={member.userId}>
  68. <td className="width-4 text-center">
  69. <img className="filter-table__avatar" src={member.avatarUrl} />
  70. </td>
  71. <td>{member.login}</td>
  72. <td>{member.email}</td>
  73. {this.renderPermissions(member)}
  74. {syncEnabled && this.renderLabels(member.labels)}
  75. <td className="text-right">
  76. <DeleteButton onConfirm={() => this.onRemoveMember(member)} disabled={!signedInUserIsTeamAdmin} />
  77. </td>
  78. </tr>
  79. );
  80. }
  81. }
  82. function mapStateToProps(state) {
  83. return {};
  84. }
  85. const mapDispatchToProps = {
  86. removeTeamMember,
  87. updateTeamMember,
  88. };
  89. export default connect(
  90. mapStateToProps,
  91. mapDispatchToProps
  92. )(TeamMemberRow);