UsersListPage.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import OrgActionBar from 'app/core/components/OrgActionBar/OrgActionBar';
  5. import PageHeader from 'app/core/components/PageHeader/PageHeader';
  6. import UsersTable from 'app/features/users/UsersTable';
  7. import { NavModel, User } from 'app/types';
  8. import appEvents from 'app/core/app_events';
  9. import { loadUsers, setUsersSearchQuery, updateUser, removeUser } from './state/actions';
  10. import { getNavModel } from '../../core/selectors/navModel';
  11. import { getUsers, getUsersSearchQuery } from './state/selectors';
  12. export interface Props {
  13. navModel: NavModel;
  14. users: User[];
  15. searchQuery: string;
  16. loadUsers: typeof loadUsers;
  17. setUsersSearchQuery: typeof setUsersSearchQuery;
  18. updateUser: typeof updateUser;
  19. removeUser: typeof removeUser;
  20. }
  21. export class UsersListPage extends PureComponent<Props> {
  22. componentDidMount() {
  23. this.fetchUsers();
  24. }
  25. async fetchUsers() {
  26. return await this.props.loadUsers();
  27. }
  28. onRoleChange = (role, user) => {
  29. const updatedUser = { ...user, role: role };
  30. this.props.updateUser(updatedUser);
  31. };
  32. onRemoveUser = user => {
  33. appEvents.emit('confirm-modal', {
  34. title: 'Delete',
  35. text: 'Are you sure you want to delete user ' + user.login + '?',
  36. yesText: 'Delete',
  37. icon: 'fa-warning',
  38. onConfirm: () => {
  39. this.props.removeUser(user.userId);
  40. },
  41. });
  42. };
  43. render() {
  44. const { navModel, searchQuery, setUsersSearchQuery, users } = this.props;
  45. const linkButton = {
  46. href: '/org/users/add',
  47. title: 'Add user',
  48. };
  49. return (
  50. <div>
  51. <PageHeader model={navModel} />
  52. <div className="page-container page-body">
  53. <OrgActionBar
  54. searchQuery={searchQuery}
  55. showLayoutMode={false}
  56. setSearchQuery={setUsersSearchQuery}
  57. linkButton={linkButton}
  58. />
  59. <UsersTable
  60. users={users}
  61. onRoleChange={(role, user) => this.onRoleChange(role, user)}
  62. onRemoveUser={user => this.onRemoveUser(user)}
  63. />
  64. </div>
  65. </div>
  66. );
  67. }
  68. }
  69. function mapStateToProps(state) {
  70. return {
  71. navModel: getNavModel(state.navIndex, 'users'),
  72. users: getUsers(state.users),
  73. searchQuery: getUsersSearchQuery(state.users),
  74. };
  75. }
  76. const mapDispatchToProps = {
  77. loadUsers,
  78. setUsersSearchQuery,
  79. updateUser,
  80. removeUser,
  81. };
  82. export default hot(module)(connect(mapStateToProps, mapDispatchToProps)(UsersListPage));