import React, { PureComponent } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { renderMarkdown } from '@grafana/data'; import { HorizontalGroup, Pagination, VerticalGroup } from '@grafana/ui'; import Page from 'app/core/components/Page/Page'; import { getNavModel } from 'app/core/selectors/navModel'; import { contextSrv } from 'app/core/services/context_srv'; import { OrgUser, OrgRole, StoreState } from 'app/types'; import InviteesTable from '../invites/InviteesTable'; import { fetchInvitees } from '../invites/state/actions'; import { selectInvitesMatchingQuery } from '../invites/state/selectors'; import UsersActionBar from './UsersActionBar'; import UsersTable from './UsersTable'; import { loadUsers, removeUser, updateUser } from './state/actions'; import { setUsersSearchQuery, setUsersSearchPage } from './state/reducers'; import { getUsers, getUsersSearchQuery, getUsersSearchPage } from './state/selectors'; function mapStateToProps(state: StoreState) { const searchQuery = getUsersSearchQuery(state.users); return { navModel: getNavModel(state.navIndex, 'users'), users: getUsers(state.users), searchQuery: getUsersSearchQuery(state.users), searchPage: getUsersSearchPage(state.users), invitees: selectInvitesMatchingQuery(state.invites, searchQuery), externalUserMngInfo: state.users.externalUserMngInfo, hasFetched: state.users.hasFetched, }; } const mapDispatchToProps = { loadUsers, fetchInvitees, setUsersSearchQuery, setUsersSearchPage, updateUser, removeUser, }; const connector = connect(mapStateToProps, mapDispatchToProps); export type Props = ConnectedProps; export interface State { showInvites: boolean; } const pageLimit = 30; export class UsersListPage extends PureComponent { declare externalUserMngInfoHtml: string; constructor(props: Props) { super(props); if (this.props.externalUserMngInfo) { this.externalUserMngInfoHtml = renderMarkdown(this.props.externalUserMngInfo); } this.state = { showInvites: false, }; } componentDidMount() { this.fetchUsers(); this.fetchInvitees(); } async fetchUsers() { return await this.props.loadUsers(); } async fetchInvitees() { return await this.props.fetchInvitees(); } onRoleChange = (role: OrgRole, user: OrgUser) => { const updatedUser = { ...user, role: role }; this.props.updateUser(updatedUser); }; onShowInvites = () => { this.setState((prevState) => ({ showInvites: !prevState.showInvites, })); }; getPaginatedUsers = (users: OrgUser[]) => { const offset = (this.props.searchPage - 1) * pageLimit; return users.slice(offset, offset + pageLimit); }; renderTable() { const { invitees, users, setUsersSearchPage } = this.props; const paginatedUsers = this.getPaginatedUsers(users); const totalPages = Math.ceil(users.length / pageLimit); if (this.state.showInvites) { return ; } else { return ( this.onRoleChange(role, user)} onRemoveUser={(user) => this.props.removeUser(user.userId)} /> ); } } render() { const { navModel, hasFetched } = this.props; const externalUserMngInfoHtml = this.externalUserMngInfoHtml; return ( <> {externalUserMngInfoHtml && (
)} {hasFetched && this.renderTable()} ); } } export default connector(UsersListPage);