import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import SlideDown from 'app/core/components/Animations/SlideDown'; import { UserPicker } from 'app/core/components/Select/UserPicker'; import { DeleteButton, Select, SelectOptionItem } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { TeamMember, User, teamsPermissionLevels, TeamPermissionLevel, OrgRole } from 'app/types'; import { loadTeamMembers, addTeamMember, removeTeamMember, setSearchMemberQuery, updateTeamMember, } from './state/actions'; import { getSearchMemberQuery, getTeamMembers } from './state/selectors'; import { FilterInput } from 'app/core/components/FilterInput/FilterInput'; import { WithFeatureToggle } from 'app/core/components/WithFeatureToggle'; import { config } from 'app/core/config'; import { contextSrv } from 'app/core/services/context_srv'; export interface Props { members: TeamMember[]; searchMemberQuery: string; loadTeamMembers: typeof loadTeamMembers; addTeamMember: typeof addTeamMember; removeTeamMember: typeof removeTeamMember; setSearchMemberQuery: typeof setSearchMemberQuery; updateTeamMember: typeof updateTeamMember; syncEnabled: boolean; editorsCanAdmin?: boolean; } export interface State { isAdding: boolean; newTeamMember?: User; } export class TeamMembers extends PureComponent { constructor(props) { super(props); this.state = { isAdding: false, newTeamMember: null }; this.renderPermissions = this.renderPermissions.bind(this); } componentDidMount() { this.props.loadTeamMembers(); } onSearchQueryChange = (value: string) => { this.props.setSearchMemberQuery(value); }; onRemoveMember(member: TeamMember) { this.props.removeTeamMember(member.userId); } onToggleAdding = () => { this.setState({ isAdding: !this.state.isAdding }); }; onUserSelected = (user: User) => { this.setState({ newTeamMember: user }); }; onAddUserToTeam = async () => { this.props.addTeamMember(this.state.newTeamMember.id); this.setState({ newTeamMember: null }); }; renderLabels(labels: string[]) { if (!labels) { return ; } return ( {labels.map(label => ( {}} /> ))} ); } onPermissionChange = (item: SelectOptionItem, member: TeamMember) => { const permission = item.value; const updatedTeamMember = { ...member, permission }; this.props.updateTeamMember(updatedTeamMember); }; private isSignedInUserTeamAdmin = () => { const { members, editorsCanAdmin } = this.props; const userInMembers = members.find(m => m.userId === contextSrv.user.id); const isAdmin = contextSrv.isGrafanaAdmin || contextSrv.hasRole(OrgRole.Admin); const userIsTeamAdmin = userInMembers && userInMembers.permission === TeamPermissionLevel.Admin; const isSignedInUserTeamAdmin = isAdmin || userIsTeamAdmin; return isSignedInUserTeamAdmin || !editorsCanAdmin; }; renderPermissions(member: TeamMember) { const { editorsCanAdmin } = this.props; const isUserTeamAdmin = this.isSignedInUserTeamAdmin(); const value = teamsPermissionLevels.find(dp => dp.value === member.permission); return (
{isUserTeamAdmin && (