UserGroupPageList.jsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import React, { Fragment } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import PropTypes from 'prop-types';
  4. import AdminUserGroupDetailContainer from '~/client/services/AdminUserGroupDetailContainer';
  5. import { toastError } from '~/client/util/apiNotification';
  6. import { apiv3Get } from '~/client/util/apiv3-client';
  7. import { IPageHasId } from '~/interfaces/page';
  8. import PageListItemS from '../../PageList/PageListItemS';
  9. import PaginationWrapper from '../../PaginationWrapper';
  10. import { withUnstatedContainers } from '../../UnstatedUtils';
  11. class UserGroupPageList extends React.Component {
  12. constructor(props) {
  13. super(props);
  14. this.state = {
  15. currentPages: [],
  16. activePage: 1,
  17. total: 0,
  18. pagingLimit: 10,
  19. };
  20. this.handlePageChange = this.handlePageChange.bind(this);
  21. }
  22. async componentDidMount() {
  23. await this.handlePageChange(this.state.activePage);
  24. }
  25. async handlePageChange(pageNum) {
  26. const limit = this.state.pagingLimit;
  27. const offset = (pageNum - 1) * limit;
  28. try {
  29. const res = await apiv3Get(`/user-groups/${this.props.userGroupId}/pages`, {
  30. limit,
  31. offset,
  32. });
  33. const { total, pages } = res.data;
  34. this.setState({
  35. total,
  36. activePage: pageNum,
  37. currentPages: pages,
  38. });
  39. }
  40. catch (err) {
  41. toastError(err);
  42. }
  43. }
  44. render() {
  45. const { t, adminUserGroupDetailContainer } = this.props;
  46. const { relatedPages } = this.props;
  47. return (
  48. <Fragment>
  49. <ul className="page-list-ul page-list-ul-flat mb-3">
  50. {this.state.currentPages.map(page => <li key={page._id}><PageListItemS page={page} /></li>)}
  51. </ul>
  52. {relatedPages.length === 0 ? <p>{t('admin:user_group_management.no_pages')}</p> : (
  53. <PaginationWrapper
  54. activePage={this.state.activePage}
  55. changePage={this.handlePageChange}
  56. totalItemsCount={this.state.total}
  57. pagingLimit={this.state.pagingLimit}
  58. align="center"
  59. size="sm"
  60. />
  61. )}
  62. </Fragment>
  63. );
  64. }
  65. }
  66. UserGroupPageList.propTypes = {
  67. t: PropTypes.func.isRequired, // i18next
  68. adminUserGroupDetailContainer: PropTypes.instanceOf(AdminUserGroupDetailContainer).isRequired,
  69. userGroupId: PropTypes.string.isRequired,
  70. relatedPages: PropTypes.arrayOf(IPageHasId),
  71. };
  72. const UserGroupPageListWrapperFC = (props) => {
  73. const { t } = useTranslation();
  74. const { userGroupId, relatedPages } = props;
  75. if (userGroupId == null || relatedPages == null) {
  76. return <></>;
  77. }
  78. return <UserGroupPageList t={t} userGroupId={userGroupId} relatedPages={relatedPages} {...props} />;
  79. };
  80. /**
  81. * Wrapper component for using unstated
  82. */
  83. const UserGroupPageListWrapper = withUnstatedContainers(UserGroupPageListWrapperFC, [AdminUserGroupDetailContainer]);
  84. export default UserGroupPageListWrapper;