import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import { hot } from 'react-hot-loader'; import Page from 'app/core/components/Page/Page'; import { DeleteButton } from '@grafana/ui'; import { NavModel } from '@grafana/data'; import EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA'; import { Team, OrgRole } from 'app/types'; import { loadTeams, deleteTeam, setSearchQuery } from './state/actions'; import { getSearchQuery, getTeams, getTeamsCount, isPermissionTeamAdmin } from './state/selectors'; import { getNavModel } from 'app/core/selectors/navModel'; import { FilterInput } from 'app/core/components/FilterInput/FilterInput'; import { config } from 'app/core/config'; import { contextSrv, User } from 'app/core/services/context_srv'; export interface Props { navModel: NavModel; teams: Team[]; searchQuery: string; teamsCount: number; hasFetched: boolean; loadTeams: typeof loadTeams; deleteTeam: typeof deleteTeam; setSearchQuery: typeof setSearchQuery; editorsCanAdmin?: boolean; signedInUser?: User; } export class TeamList extends PureComponent { componentDidMount() { this.fetchTeams(); } async fetchTeams() { await this.props.loadTeams(); } deleteTeam = (team: Team) => { this.props.deleteTeam(team.id); }; onSearchQueryChange = (value: string) => { this.props.setSearchQuery(value); }; renderTeam(team: Team) { const { editorsCanAdmin, signedInUser } = this.props; const permission = team.permission; const teamUrl = `org/teams/edit/${team.id}`; const canDelete = isPermissionTeamAdmin({ permission, editorsCanAdmin, signedInUser }); return ( {team.name} {team.email} {team.memberCount} this.deleteTeam(team)} disabled={!canDelete} /> ); } renderEmptyList() { return ( ); } renderTeamList() { const { teams, searchQuery, editorsCanAdmin, signedInUser } = this.props; const isCanAdminAndViewer = editorsCanAdmin && signedInUser.orgRole === OrgRole.Viewer; const disabledClass = isCanAdminAndViewer ? ' disabled' : ''; const newTeamHref = isCanAdminAndViewer ? '#' : 'org/teams/new'; return ( <>
New team
{teams.map(team => this.renderTeam(team))}
Name Email Members
); } renderList() { const { teamsCount } = this.props; if (teamsCount > 0) { return this.renderTeamList(); } else { return this.renderEmptyList(); } } render() { const { hasFetched, navModel } = this.props; return ( {hasFetched && this.renderList()} ); } } function mapStateToProps(state: any) { return { navModel: getNavModel(state.navIndex, 'teams'), teams: getTeams(state.teams), searchQuery: getSearchQuery(state.teams), teamsCount: getTeamsCount(state.teams), hasFetched: state.teams.hasFetched, editorsCanAdmin: config.editorsCanAdmin, // this makes the feature toggle mockable/controllable from tests, signedInUser: contextSrv.user, // this makes the feature toggle mockable/controllable from tests, }; } const mapDispatchToProps = { loadTeams, deleteTeam, setSearchQuery, }; export default hot(module)( connect( mapStateToProps, mapDispatchToProps )(TeamList) );