TeamMemberRow.tsx 3.1 KB

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