UserGroupPageList.jsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import React, { Fragment } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import Page from '../../PageList/Page';
  5. import PaginationWrapper from '../../PaginationWrapper';
  6. import { createSubscribedElement } from '../../UnstatedUtils';
  7. import AppContainer from '../../../services/AppContainer';
  8. import UserGroupDetailContainer from '../../../services/UserGroupDetailContainer';
  9. import { toastError } from '../../../util/apiNotification';
  10. class UserGroupPageList extends React.Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = {
  14. currentPages: [],
  15. activePage: 1,
  16. total: 0,
  17. pagingLimit: 10,
  18. };
  19. this.handlePageChange = this.handlePageChange.bind(this);
  20. }
  21. async componentDidMount() {
  22. await this.handlePageChange(this.state.activePage);
  23. }
  24. async handlePageChange(pageNum) {
  25. const limit = this.state.pagingLimit;
  26. const offset = (pageNum - 1) * limit;
  27. try {
  28. const res = await this.props.appContainer.apiv3.get(`/user-groups/${this.props.userGroupDetailContainer.state.userGroup._id}/pages`, {
  29. limit,
  30. offset,
  31. });
  32. const { total, pages } = res.data;
  33. this.setState({
  34. total: total || 0,
  35. activePage: pageNum,
  36. currentPages: pages,
  37. });
  38. }
  39. catch (err) {
  40. toastError(err);
  41. }
  42. }
  43. render() {
  44. const { t, userGroupDetailContainer } = this.props;
  45. return (
  46. <Fragment>
  47. <ul className="page-list-ul page-list-ul-flat">
  48. {this.state.currentPages.map((page) => { return <Page key={page._id} page={page} /> })}
  49. </ul>
  50. {userGroupDetailContainer.state.relatedPages.length === 0 ? <p>{ t('user_group_management.no_pages') }</p> : null}
  51. <PaginationWrapper
  52. activePage={this.state.activePage}
  53. changePage={this.handlePageChange}
  54. totalItemsCount={this.state.total}
  55. pagingLimit={this.state.pagingLimit}
  56. />
  57. </Fragment>
  58. );
  59. }
  60. }
  61. UserGroupPageList.propTypes = {
  62. t: PropTypes.func.isRequired, // i18next
  63. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  64. userGroupDetailContainer: PropTypes.instanceOf(UserGroupDetailContainer).isRequired,
  65. };
  66. /**
  67. * Wrapper component for using unstated
  68. */
  69. const UserGroupPageListWrapper = (props) => {
  70. return createSubscribedElement(UserGroupPageList, props, [AppContainer, UserGroupDetailContainer]);
  71. };
  72. export default withTranslation()(UserGroupPageListWrapper);