diff --git a/frontend/src/components/dialog/group-members-dialog.js b/frontend/src/components/dialog/group-members-dialog.js
index ac950d6e42..d9cde8b372 100644
--- a/frontend/src/components/dialog/group-members-dialog.js
+++ b/frontend/src/components/dialog/group-members-dialog.js
@@ -1,31 +1,104 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalHeader, ModalBody } from 'reactstrap';
+import { Utils } from '../../utils/utils';
import { gettext } from '../../utils/constants';
+import { seafileAPI } from '../../utils/seafile-api';
+import toaster from '../toast';
+import Loading from '../loading';
const propTypes = {
- members: PropTypes.array.isRequired,
+ groupID: PropTypes.string.isRequired,
toggleDialog: PropTypes.func.isRequired
};
class GroupMembers extends React.Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ isLoading: true, // first loading
+ isLoadingMore: false,
+ groupMembers: [],
+ page: 1,
+ perPage: 100,
+ hasNextPage: false
+ };
+ }
+
+ componentDidMount() {
+ this.listGroupMembers(this.state.page);
+ }
+
+ listGroupMembers = (page) => {
+ const { groupID } = this.props;
+ const { perPage, groupMembers } = this.state;
+ seafileAPI.listGroupMembers(groupID, page, perPage).then((res) => {
+ const members = res.data;
+ this.setState({
+ isLoading: false,
+ isLoadingMore: false,
+ page: page,
+ hasNextPage: members.length < perPage ? false : true,
+ groupMembers: groupMembers.concat(members)
+ });
+ }).catch(error => {
+ let errMessage = Utils.getErrorMsg(error);
+ toaster.danger(errMessage);
+ this.setState({
+ isLoading: false,
+ isLoadingMore: false,
+ hasNextPage: false
+ });
+ });
+ };
+
+ handleScroll = (event) => {
+ // isLoadingMore: to avoid repeated request
+ const { page, hasNextPage, isLoadingMore } = this.state;
+ if (hasNextPage && !isLoadingMore) {
+ const clientHeight = event.target.clientHeight;
+ const scrollHeight = event.target.scrollHeight;
+ const scrollTop = event.target.scrollTop;
+ const isBottom = (clientHeight + scrollTop + 1 >= scrollHeight);
+ if (isBottom) { // scroll to the bottom
+ this.setState({ isLoadingMore: true }, () => {
+ this.listGroupMembers(page + 1);
+ });
+ }
+ }
+ };
+
render() {
- const { members } = this.props;
+ const {
+ isLoading, hasNextPage, groupMembers, perPage
+ } = this.state;
+
+ let memberNumber;
+ if (groupMembers.length < perPage) {
+ memberNumber = groupMembers.length;
+ } else {
+ memberNumber = `${perPage}+`;
+ }
return (
- {`${gettext('Group members')} (${members.length})`}
-
-
- {members.map((item, index) => {
- return (
- -
-
- {item.name}
-
- );
- })}
-
+ {`${gettext('Group members')} (${memberNumber})`}
+
+ {isLoading ? : (
+ <>
+
+ {groupMembers.map((item, index) => {
+ return (
+ -
+
+ {item.name}
+
+ );
+ })}
+
+ {hasNextPage && }
+ >
+ )}
);
diff --git a/frontend/src/pages/groups/group-view.js b/frontend/src/pages/groups/group-view.js
index 8c7fc12d48..ff993e8f69 100644
--- a/frontend/src/pages/groups/group-view.js
+++ b/frontend/src/pages/groups/group-view.js
@@ -59,7 +59,6 @@ class GroupView extends React.Component {
showTransferGroupDialog: false,
showImportMembersDialog: false,
showManageMembersDialog: false,
- groupMembers: [],
isLeaveGroupDialogOpen: false,
isMembersDialogOpen: false
};
@@ -93,7 +92,6 @@ class GroupView extends React.Component {
repoList: [] // empty it for the current group
}, () => {
this.loadRepos(this.state.currentPage);
- this.listGroupMembers();
});
}).catch((error) => {
this.setState({
@@ -309,29 +307,6 @@ class GroupView extends React.Component {
});
};
- listGroupMembers = () => {
- seafileAPI.listGroupMembers(this.props.groupID).then((res) => {
- this.setState({
- groupMembers: res.data
- });
- }).catch(error => {
- let errMessage = Utils.getErrorMsg(error);
- toaster.danger(errMessage);
- });
- };
-
- toggleGroupMembersPopover = (state) => {
- if (state === 'open') {
- this.listGroupMembers();
- this.setState({
- showGroupMembersPopover: true
- });
- } else {
- this.setState({
- showGroupMembersPopover: false
- });
- }
- };
sortItems = (sortBy, sortOrder) => {
cookie.save('seafile-repo-dir-sort-by', sortBy);
@@ -414,7 +389,7 @@ class GroupView extends React.Component {
render() {
const { errMessage, emptyTip, currentGroup, isDepartmentGroup,
- groupMembers, isMembersDialogOpen
+ isMembersDialogOpen
} = this.state;
let useRate = 0;
@@ -502,7 +477,7 @@ class GroupView extends React.Component {
}
{isMembersDialogOpen &&
}