1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-02 07:27:04 +00:00
Files
seahub/frontend/src/pages/groups/group-view.js

596 lines
21 KiB
JavaScript
Raw Normal View History

2024-07-18 11:58:42 +08:00
import React, { Fragment } from 'react';
2018-12-08 08:37:18 +08:00
import PropTypes from 'prop-types';
2019-03-19 10:35:21 +08:00
import cookie from 'react-cookies';
import classnames from 'classnames';
import { gettext, username, canAddRepo } from '../../utils/constants';
2018-12-08 08:37:18 +08:00
import { seafileAPI } from '../../utils/seafile-api';
import { Utils } from '../../utils/utils';
2018-12-10 13:44:11 +08:00
import Loading from '../../components/loading';
2019-06-10 17:30:10 +08:00
import EmptyTip from '../../components/empty-tip';
2018-12-10 17:59:26 +08:00
import ModalPortal from '../../components/modal-portal';
import toaster from '../../components/toast';
import { Group, Repo } from '../../models';
2018-12-10 17:59:26 +08:00
import CreateRepoDialog from '../../components/dialog/create-repo-dialog';
import GroupMembersDialog from '../../components/dialog/group-members-dialog';
2018-12-19 10:44:23 +08:00
import DismissGroupDialog from '../../components/dialog/dismiss-group-dialog';
import RenameGroupDialog from '../../components/dialog/rename-group-dialog';
2018-12-24 18:25:12 +08:00
import TransferGroupDialog from '../../components/dialog/transfer-group-dialog';
import ImportMembersDialog from '../../components/dialog/import-members-dialog';
2018-12-24 18:25:12 +08:00
import ManageMembersDialog from '../../components/dialog/manage-members-dialog';
import DepartmentDetailDialog from '../../components/dialog/department-detail-dialog';
2019-07-04 13:49:16 +08:00
import LeaveGroupDialog from '../../components/dialog/leave-group-dialog';
2018-12-10 18:19:03 +08:00
import SharedRepoListView from '../../components/shared-repo-list-view/shared-repo-list-view';
import SortOptionsDialog from '../../components/dialog/sort-options';
import SingleDropdownToolbar from '../../components/toolbar/single-dropdown-toolbar';
import ViewModes from '../../components/view-modes';
2025-01-22 14:38:40 +08:00
import AddRepos from '../../components/add-repos';
import ReposSortMenu from '../../components/sort-menu';
import { LIST_MODE } from '../../components/dir-view-mode/constants';
2018-12-24 18:25:12 +08:00
import '../../css/group-view.css';
2018-12-08 08:37:18 +08:00
const propTypes = {
2018-12-19 10:44:23 +08:00
onGroupChanged: PropTypes.func.isRequired,
groupID: PropTypes.string,
2018-12-08 08:37:18 +08:00
};
class GroupView extends React.Component {
constructor(props) {
super(props);
this.state = {
isLoading: true, // first loading
isLoadingMore: false,
2018-12-08 08:37:18 +08:00
errMessage: '',
2018-12-08 16:35:00 +08:00
emptyTip: null,
2018-12-08 08:37:18 +08:00
currentGroup: null,
currentRepo: null,
2018-12-08 16:35:00 +08:00
isStaff: false,
2018-12-24 18:25:12 +08:00
isOwner: false,
currentViewMode: localStorage.getItem('sf_repo_list_view_mode') || LIST_MODE,
2019-05-29 13:57:12 +08:00
sortBy: cookie.load('seafile-repo-dir-sort-by') || 'name', // 'name' or 'time' or 'size'
sortOrder: cookie.load('seafile-repo-dir-sort-order') || 'asc', // 'asc' or 'desc'
isSortOptionsDialogOpen: false,
2018-12-08 08:37:18 +08:00
repoList: [],
currentPage: 1,
perPage: 300,
hasNextPage: false,
2018-12-10 17:59:26 +08:00
libraryType: 'group',
isCreateRepoDialogShow: false,
isDepartmentGroup: false,
isShowDepartmentDetailDialog: false,
2018-12-19 10:44:23 +08:00
showGroupDropdown: false,
2018-12-24 18:25:12 +08:00
showGroupMembersPopover: false,
2018-12-19 10:44:23 +08:00
showRenameGroupDialog: false,
showDismissGroupDialog: false,
2018-12-24 18:25:12 +08:00
showTransferGroupDialog: false,
showImportMembersDialog: false,
2018-12-24 18:25:12 +08:00
showManageMembersDialog: false,
2019-07-05 11:05:26 +08:00
isLeaveGroupDialogOpen: false,
isMembersDialogOpen: false
2018-12-19 10:44:23 +08:00
};
2018-12-08 08:37:18 +08:00
}
componentDidMount() {
this.loadGroup(this.props.groupID);
2018-12-08 08:37:18 +08:00
}
UNSAFE_componentWillReceiveProps(nextProps) {
2018-12-08 08:37:18 +08:00
if (nextProps.groupID !== this.props.groupID) {
this.loadGroup(nextProps.groupID);
}
}
loadGroup = (groupID) => {
seafileAPI.getGroup(groupID).then((res) => {
let currentGroup = new Group(res.data);
2018-12-08 16:35:00 +08:00
this.setState({
emptyTip: this.getEmptyTip(currentGroup),
currentGroup,
isStaff: currentGroup.admins.indexOf(username) > -1, // for item operations
isDepartmentGroup: currentGroup.parent_group_id !== 0,
isOwner: currentGroup.owner === username,
2020-08-25 14:54:19 +08:00
currentPage: 1,
2024-07-18 11:58:42 +08:00
repoList: [] // empty it for the current group
2020-08-25 14:54:19 +08:00
}, () => {
this.loadRepos(this.state.currentPage);
2018-12-08 16:35:00 +08:00
});
2018-12-08 08:37:18 +08:00
}).catch((error) => {
this.setState({
isLoading: false,
errMessage: Utils.getErrorMsg(error, true) // true: show login tip if 403
});
2018-12-08 08:37:18 +08:00
});
};
2018-12-08 08:37:18 +08:00
loadRepos = (page) => {
const { perPage } = this.state;
seafileAPI.listGroupRepos(this.props.groupID, page, perPage).then((res) => {
let hasNextPage = true;
if (res.data.length < perPage) {
hasNextPage = false;
}
let repoList = this.state.repoList;
let newRepoList = res.data.map(item => {
2018-12-18 17:21:01 +08:00
let repo = new Repo(item);
return repo;
2018-12-08 08:37:18 +08:00
});
if (newRepoList.length) {
repoList = repoList.concat(newRepoList);
}
2018-12-08 08:37:18 +08:00
this.setState({
isLoading: false,
isLoadingMore: false,
currentPage: page,
hasNextPage: hasNextPage,
repoList: Utils.sortRepos(repoList, this.state.sortBy, this.state.sortOrder)
2018-12-08 08:37:18 +08:00
});
}).catch((error) => {
this.setState({
isLoading: false,
isLoadingMore: false,
errMessage: Utils.getErrorMsg(error, true) // true: show login tip if 403
});
2018-12-08 08:37:18 +08:00
});
};
2018-12-08 08:37:18 +08:00
2018-12-08 16:35:00 +08:00
getEmptyTip = (currentGroup) => {
2018-12-08 08:37:18 +08:00
if (currentGroup) {
if (currentGroup.parent_group_id === 0) {
return (
<EmptyTip
title={gettext('No libraries shared with this group')}
text={gettext('No libraries have been shared with this group yet. A library shared with a group can be accessed by all group members. You can share a library with a group in "My Libraries". You can also create a new library to be shared with this group by clicking the "New Library" item in the dropdown menu.')}
/>
2018-12-08 08:37:18 +08:00
);
} else {
2024-07-18 11:58:42 +08:00
if (currentGroup.admins.indexOf(username) == -1) { // is a member of this group
return (
<EmptyTip title={gettext('No libraries')} />
2018-12-08 08:37:18 +08:00
);
} else {
return (
<EmptyTip
title={gettext('No libraries')}
text={gettext('You can create libraries by clicking the "New Library" item in the dropdown menu.')}
/>
2018-12-08 08:37:18 +08:00
);
}
}
}
return null;
};
2018-12-08 08:37:18 +08:00
2018-12-10 17:59:26 +08:00
onCreateRepoToggle = () => {
2024-07-18 11:58:42 +08:00
this.setState({ isCreateRepoDialogShow: !this.state.isCreateRepoDialogShow });
};
2018-12-10 17:59:26 +08:00
2018-12-16 11:17:17 +08:00
onCreateRepo = (repo, groupOwnerType) => {
2018-12-10 13:44:11 +08:00
let groupId = this.props.groupID;
2018-12-16 11:17:17 +08:00
if (groupOwnerType && groupOwnerType === 'department') {
2024-07-18 11:58:42 +08:00
seafileAPI.createGroupOwnedLibrary(groupId, repo).then(res => { // need modify endpoint api
2018-12-16 11:17:17 +08:00
let object = {
repo_id: res.data.id,
repo_name: res.data.name,
2018-12-17 15:12:10 +08:00
owner_name: res.data.group_name,
2018-12-16 11:17:17 +08:00
owner_email: res.data.owner,
permission: res.data.permission,
mtime: res.data.mtime,
size: res.data.size,
encrypted: res.data.encrypted,
};
2018-12-18 17:21:01 +08:00
let repo = new Repo(object);
2018-12-16 11:17:17 +08:00
let repoList = this.addRepoItem(repo);
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
2018-12-16 11:17:17 +08:00
});
} else {
seafileAPI.createGroupRepo(groupId, repo).then(res => {
2018-12-18 17:21:01 +08:00
let repo = new Repo(res.data);
2018-12-16 11:17:17 +08:00
let repoList = this.addRepoItem(repo);
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
2018-12-16 11:17:17 +08:00
});
}
this.onCreateRepoToggle();
};
2018-12-16 11:17:17 +08:00
onItemDelete = (repo) => {
let repoList = this.state.repoList.filter(item => {
return item.repo_id !== repo.repo_id;
2018-12-10 13:44:11 +08:00
});
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
this.loadGroup(this.props.groupID);
};
2018-12-10 13:44:11 +08:00
2024-10-22 17:53:40 +08:00
onItemTransfer = (repoId, groupID, owner) => {
let repoList = this.state.repoList.filter(item => {
return item.repo_id !== repoId;
});
this.setState({ repoList: repoList });
this.loadGroup(this.props.groupID);
};
2018-12-10 13:44:11 +08:00
addRepoItem = (repo) => {
let newRepoList = this.state.repoList.map(item => {return item;});
2018-12-22 15:18:53 +08:00
newRepoList.unshift(repo);
2018-12-10 13:44:11 +08:00
return newRepoList;
};
2018-12-10 13:44:11 +08:00
2018-12-10 18:37:59 +08:00
onItemUnshare = (repo) => {
2018-12-10 17:59:26 +08:00
let group = this.state.currentGroup;
2019-07-02 15:36:08 +08:00
seafileAPI.unshareRepoToGroup(repo.repo_id, group.id).then(() => {
2018-12-10 17:59:26 +08:00
let repoList = this.state.repoList.filter(item => {
return item.repo_id !== repo.repo_id;
});
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
2019-07-01 15:41:30 +08:00
this.loadGroup(group.id);
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
2018-12-10 17:59:26 +08:00
});
};
2018-12-10 17:59:26 +08:00
onItemRename = (repo, newName) => {
seafileAPI.renameGroupOwnedLibrary(this.props.groupID, repo.repo_id, newName).then(res => {
let repoList = this.state.repoList.map(item => {
if (item.repo_id === repo.repo_id) {
item.repo_name = newName;
}
return item;
});
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
}).catch(error => {
let errMessage = Utils.getErrorMsg(error);
toaster.danger(errMessage);
});
};
onMonitorRepo = (repo, monitored) => {
let repoList = this.state.repoList.map(item => {
if (item.repo_id === repo.repo_id) {
item.monitored = monitored;
}
return item;
});
2024-07-18 11:58:42 +08:00
this.setState({ repoList: repoList });
};
2018-12-19 10:44:23 +08:00
toggleDismissGroupDialog = () => {
this.setState({
showDismissGroupDialog: !this.state.showDismissGroupDialog,
showGroupDropdown: false,
2018-12-19 10:44:23 +08:00
});
};
2018-12-19 10:44:23 +08:00
toggleRenameGroupDialog = () => {
this.setState({
showRenameGroupDialog: !this.state.showRenameGroupDialog,
showGroupDropdown: false,
2018-12-19 10:44:23 +08:00
});
};
2018-12-13 14:40:09 +08:00
2018-12-24 18:25:12 +08:00
toggleTransferGroupDialog = () => {
this.setState({
showTransferGroupDialog: !this.state.showTransferGroupDialog,
showGroupDropdown: false,
2018-12-24 18:25:12 +08:00
});
};
2018-12-24 18:25:12 +08:00
2024-07-18 11:58:42 +08:00
toggleImportMembersDialog = () => {
this.setState({
showImportMembersDialog: !this.state.showImportMembersDialog
});
};
2024-07-18 11:58:42 +08:00
importMembersInBatch = (file) => {
toaster.notify(gettext('It may take some time, please wait.'));
seafileAPI.importGroupMembersViaFile(this.state.currentGroup.id, file).then((res) => {
res.data.failed.forEach(item => {
toaster.danger(`${item.email}: ${item.error_msg}`);
});
}).catch((error) => {
let errMsg = Utils.getErrorMsg(error);
toaster.danger(errMsg);
});
};
2018-12-24 18:25:12 +08:00
toggleManageMembersDialog = () => {
this.setState({
showManageMembersDialog: !this.state.showManageMembersDialog,
showGroupDropdown: false,
2018-12-24 18:25:12 +08:00
});
};
2018-12-24 18:25:12 +08:00
2019-07-04 13:49:16 +08:00
toggleLeaveGroupDialog = () => {
this.setState({
2019-07-05 11:05:26 +08:00
isLeaveGroupDialogOpen: !this.state.isLeaveGroupDialogOpen,
2019-07-04 13:49:16 +08:00
showGroupDropdown: false,
});
};
2019-07-04 13:49:16 +08:00
sortItems = (sortBy, sortOrder) => {
cookie.save('seafile-repo-dir-sort-by', sortBy);
cookie.save('seafile-repo-dir-sort-order', sortOrder);
this.setState({
sortBy,
sortOrder,
repoList: Utils.sortRepos(this.state.repoList, sortBy, sortOrder)
});
};
2019-03-07 16:40:01 +08:00
translateRole = (role) => {
if (role === 'Admin') {
return gettext('Admin');
}
2019-03-07 16:40:01 +08:00
else if (role === 'Member') {
return gettext('Member');
}
else if (role === 'Owner') {
return gettext('Owner');
}
};
2019-03-07 16:40:01 +08:00
toggleSortOptionsDialog = () => {
this.setState({
isSortOptionsDialogOpen: !this.state.isSortOptionsDialogOpen
});
};
handleScroll = (event) => {
// isLoadingMore: to avoid repeated request
const { currentPage, hasNextPage, isLoadingMore } = this.state;
if (hasNextPage && !isLoadingMore) {
const clientHeight = event.target.clientHeight;
const scrollHeight = event.target.scrollHeight;
2024-07-18 11:58:42 +08:00
const scrollTop = event.target.scrollTop;
const isBottom = (clientHeight + scrollTop + 1 >= scrollHeight);
if (isBottom) { // scroll to the bottom
2024-07-18 11:58:42 +08:00
this.setState({ isLoadingMore: true }, () => {
this.loadRepos(currentPage + 1);
});
}
}
};
toggleMembersDialog = () => {
this.setState({
isMembersDialogOpen: !this.state.isMembersDialogOpen
});
};
getOpList = () => {
const { currentGroup, isDepartmentGroup, isStaff, isOwner } = this.state;
const opList = [];
if ((!isDepartmentGroup && canAddRepo) ||
(isDepartmentGroup && isStaff)) {
opList.push({ 'text': gettext('New Library'), 'onClick': this.onCreateRepoToggle }, 'Divider');
}
2024-07-18 11:58:42 +08:00
opList.push({ 'text': gettext('Members'), 'onClick': this.toggleMembersDialog });
if (currentGroup) {
if (isStaff || isOwner) {
opList.push({ 'text': gettext('Import members'), 'onClick': this.toggleImportMembersDialog });
opList.push({ 'text': gettext('Manage members'), 'onClick': this.toggleManageMembersDialog });
opList.push('Divider');
2024-07-18 11:58:42 +08:00
opList.push({ 'text': gettext('Rename'), 'onClick': this.toggleRenameGroupDialog });
if (isOwner) {
2024-07-18 11:58:42 +08:00
opList.push({ 'text': gettext('Transfer'), 'onClick': this.toggleTransferGroupDialog });
}
if (isOwner) {
2024-07-18 11:58:42 +08:00
opList.push({ 'text': gettext('Delete group'), 'onClick': this.toggleDismissGroupDialog });
}
}
if (!isOwner && !isDepartmentGroup) {
2024-07-18 11:58:42 +08:00
opList.push({ 'text': gettext('Leave group'), 'onClick': this.toggleLeaveGroupDialog });
}
}
return opList;
};
switchViewMode = (newMode) => {
this.setState({
currentViewMode: newMode
}, () => {
localStorage.setItem('sf_repo_list_view_mode', newMode);
});
};
onSelectSortOption = (sortOption) => {
const [sortBy, sortOrder] = sortOption.value.split('-');
this.setState({ sortBy, sortOrder }, () => {
this.sortItems(sortBy, sortOrder);
});
};
toggleDepartmentDetailDialog = () => {
this.setState({
isShowDepartmentDetailDialog: !this.state.isShowDepartmentDetailDialog
});
};
render() {
const {
isLoading, repoList, errMessage, emptyTip,
currentGroup, isDepartmentGroup, isMembersDialogOpen,
currentViewMode, sortBy, sortOrder
} = this.state;
2019-07-01 15:41:30 +08:00
let useRate = 0;
if (isDepartmentGroup && currentGroup.group_quota) {
useRate = currentGroup.group_quota_usage / currentGroup.group_quota * 100 + '%';
}
const opList = this.getOpList();
2018-12-08 08:37:18 +08:00
return (
2018-12-10 13:44:11 +08:00
<Fragment>
<div className="main-panel-center flex-row">
2018-12-10 13:44:11 +08:00
<div className="cur-view-container">
<div className="cur-view-path">
2019-05-05 13:16:32 +08:00
{currentGroup && (
2018-12-10 18:12:46 +08:00
<Fragment>
<div className="sf-heading d-flex align-items-center">
{isDepartmentGroup &&
<span className="sf3-font-department sf3-font nav-icon" title={gettext('This is a special group representing a department.')}></span>
}
2018-12-10 18:12:46 +08:00
<span>{currentGroup.name}</span>
<SingleDropdownToolbar opList={opList} />
</div>
<div className="path-tool d-flex align-items-center">
2019-07-01 18:40:49 +08:00
{isDepartmentGroup && (
<>
2019-07-01 18:40:49 +08:00
{currentGroup.group_quota > 0 &&
<div className="department-usage-container mr-3">
2019-07-01 18:40:49 +08:00
<div className="department-usage">
2024-07-18 11:58:42 +08:00
<span id="quota-bar" className="department-quota-bar"><span id="quota-usage" className="usage" style={{ width: useRate }}></span></span>
2019-07-01 18:40:49 +08:00
<span className="department-quota-info">{Utils.bytesToSize(currentGroup.group_quota_usage)} / {Utils.bytesToSize(currentGroup.group_quota)}</span>
</div>
</div>
2019-07-01 18:40:49 +08:00
}
</>
2018-12-10 18:12:46 +08:00
)}
{Utils.isDesktop() && (
<div className="d-flex align-items-center">
2025-01-22 14:38:40 +08:00
<AddRepos className="mr-2" onAddRepo={this.onCreateRepoToggle} />
<ViewModes currentViewMode={currentViewMode} switchViewMode={this.switchViewMode} className="mr-2" />
<ReposSortMenu sortBy={sortBy} sortOrder={sortOrder} onSelectSortOption={this.onSelectSortOption}/>
</div>
)}
{(!Utils.isDesktop() && this.state.repoList.length > 0) &&
<span className="sf3-font sf3-font-sort action-icon" onClick={this.toggleSortOptionsDialog}></span>}
{this.state.isSortOptionsDialogOpen &&
<SortOptionsDialog
sortBy={sortBy}
sortOrder={sortOrder}
sortItems={this.sortItems}
toggleDialog={this.toggleSortOptionsDialog}
/>
}
2018-12-10 18:12:46 +08:00
</div>
</Fragment>
)}
2018-12-10 13:44:11 +08:00
</div>
<div
className={classnames('cur-view-content', 'd-block', 'repos-container', { 'pt-3': currentViewMode != LIST_MODE })}
onScroll={this.handleScroll}
>
{isLoading
? <Loading />
: errMessage
? <p className="error text-center mt-2">{errMessage}</p>
: repoList.length == 0
? emptyTip
: (
<SharedRepoListView
repoList={this.state.repoList}
hasNextPage={this.state.hasNextPage}
currentGroup={this.state.currentGroup}
sortBy={this.state.sortBy}
sortOrder={this.state.sortOrder}
sortItems={this.sortItems}
onItemUnshare={this.onItemUnshare}
onItemDelete={this.onItemDelete}
onItemRename={this.onItemRename}
onMonitorRepo={this.onMonitorRepo}
onTransferRepo={this.onItemTransfer}
currentViewMode={currentViewMode}
/>
)
2018-12-10 13:44:11 +08:00
}
</div>
</div>
</div>
2018-12-10 17:59:26 +08:00
{this.state.isCreateRepoDialogShow && !this.state.isDepartmentGroup && (
<ModalPortal>
<CreateRepoDialog
2018-12-10 17:59:26 +08:00
libraryType={this.state.libraryType}
onCreateToggle={this.onCreateRepoToggle}
onCreateRepo={this.onCreateRepo}
/>
</ModalPortal>
)}
{this.state.isCreateRepoDialogShow && this.state.isDepartmentGroup &&
<CreateRepoDialog
2018-12-10 17:59:26 +08:00
onCreateToggle={this.onCreateRepoToggle}
onCreateRepo={this.onCreateRepo}
libraryType='department'
2018-12-10 17:59:26 +08:00
/>
}
{isMembersDialogOpen &&
<GroupMembersDialog
groupID={this.props.groupID}
toggleDialog={this.toggleMembersDialog}
/>
}
2018-12-24 18:25:12 +08:00
{this.state.showRenameGroupDialog &&
2018-12-19 10:44:23 +08:00
<RenameGroupDialog
showRenameGroupDialog={this.state.showRenameGroupDialog}
toggleRenameGroupDialog={this.toggleRenameGroupDialog}
loadGroup={this.loadGroup}
groupID={this.props.groupID}
onGroupChanged={this.props.onGroupChanged}
currentGroupName={currentGroup.name}
2018-12-19 10:44:23 +08:00
/>
}
2018-12-24 18:25:12 +08:00
{this.state.showDismissGroupDialog &&
2018-12-19 10:44:23 +08:00
<DismissGroupDialog
showDismissGroupDialog={this.state.showDismissGroupDialog}
toggleDismissGroupDialog={this.toggleDismissGroupDialog}
loadGroup={this.loadGroup}
groupID={this.props.groupID}
onGroupChanged={this.props.onGroupChanged}
/>
}
2018-12-24 18:25:12 +08:00
{this.state.showTransferGroupDialog &&
<TransferGroupDialog
toggleTransferGroupDialog={this.toggleTransferGroupDialog}
groupID={this.props.groupID}
onGroupChanged={this.props.onGroupChanged}
/>
}
{ this.state.showImportMembersDialog &&
2018-12-24 18:25:12 +08:00
<ImportMembersDialog
toggleImportMembersDialog={this.toggleImportMembersDialog}
importMembersInBatch={this.importMembersInBatch}
2018-12-24 18:25:12 +08:00
/>
}
2018-12-24 18:25:12 +08:00
{this.state.showManageMembersDialog &&
<ManageMembersDialog
toggleManageMembersDialog={this.toggleManageMembersDialog}
groupID={this.props.groupID}
onGroupChanged={this.props.onGroupChanged}
isOwner={this.state.isOwner}
toggleDepartmentDetailDialog={this.toggleDepartmentDetailDialog}
/>
}
{this.state.isShowDepartmentDetailDialog &&
<DepartmentDetailDialog
usedFor='add_group_member'
toggleDepartmentDetailDialog={this.toggleDepartmentDetailDialog}
toggleManageMembersDialog={this.toggleManageMembersDialog}
groupID={this.props.groupID}
isOwner={this.state.isOwner}
2018-12-24 18:25:12 +08:00
/>
}
2019-07-05 11:05:26 +08:00
{this.state.isLeaveGroupDialogOpen &&
2019-07-04 13:49:16 +08:00
<LeaveGroupDialog
toggleLeaveGroupDialog={this.toggleLeaveGroupDialog}
groupID={this.props.groupID}
onGroupChanged={this.props.onGroupChanged}
/>
}
2018-12-10 13:44:11 +08:00
</Fragment>
2018-12-08 08:37:18 +08:00
);
}
}
GroupView.propTypes = propTypes;
export default GroupView;