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 EmptyListCTA from 'app/core/components/EmptyListCTA/EmptyListCTA'; import { NavModel, Team } from 'app/types'; import { loadTeams, deleteTeam, setSearchQuery } from './state/actions'; import { getSearchQuery, getTeams, getTeamsCount } from './state/selectors'; import { getNavModel } from 'app/core/selectors/navModel'; export interface Props { navModel: NavModel; teams: Team[]; searchQuery: string; teamsCount: number; hasFetched: boolean; loadTeams: typeof loadTeams; deleteTeam: typeof deleteTeam; setSearchQuery: typeof setSearchQuery; } export class TeamList extends PureComponent { componentDidMount() { this.fetchTeams(); } async fetchTeams() { await this.props.loadTeams(); } deleteTeam = (team: Team) => { this.props.deleteTeam(team.id); }; onSearchQueryChange = event => { this.props.setSearchQuery(event.target.value); }; renderTeam(team: Team) { const teamUrl = `org/teams/edit/${team.id}`; return ( {team.name} {team.email} {team.memberCount} this.deleteTeam(team)} /> ); } renderEmptyList() { return (
); } renderTeamList() { const { teams, searchQuery } = this.props; return (
{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) { return { navModel: getNavModel(state.navIndex, 'teams'), teams: getTeams(state.teams), searchQuery: getSearchQuery(state.teams), teamsCount: getTeamsCount(state.teams), hasFetched: state.teams.hasFetched, }; } const mapDispatchToProps = { loadTeams, deleteTeam, setSearchQuery, }; export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(TeamList));