diff --git a/frontend/src/components/dialog/org-add-admin-dialog.js b/frontend/src/components/dialog/org-add-admin-dialog.js index 55d94ce3fd..70f1d16f40 100644 --- a/frontend/src/components/dialog/org-add-admin-dialog.js +++ b/frontend/src/components/dialog/org-add-admin-dialog.js @@ -36,8 +36,8 @@ class AddOrgAdminDialog extends React.Component { render() { return ( - - {gettext('Add Admins')} + + {gettext('Add Admins')} { - this.setState({isShowAddOrgUserDialog: !this.state.isShowAddOrgUserDialog}); - } - - toggleAddOrgAdmin = () => { - this.setState({isShowAddOrgAdminDialog: !this.state.isShowAddOrgAdminDialog}); - } - - toggleInviteUserDialog = () => { - this.setState({isInviteUserDialogOpen: !this.state.isInviteUserDialogOpen}); - } - - toggleAddDepartDialog = () => { - this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog}); - } - - toggleAddMemberDialog = () => { - this.setState({ isShowAddMemberDialog: !this.state.isShowAddMemberDialog }); - } - - toggleAddRepoDialog = () => { - this.setState({ isShowAddRepoDialog: !this.state.isShowAddRepoDialog }); - } - render() { - let { isSidePanelClosed, currentTab, isShowAddOrgUserDialog, isShowAddOrgAdminDialog, isInviteUserDialogOpen } = this.state; + let { isSidePanelClosed, currentTab } = this.state; return (
- + - - - - - - - - - + /> + + + + + + - - - + + +
diff --git a/frontend/src/pages/org-admin/main-panel-topbar.js b/frontend/src/pages/org-admin/main-panel-topbar.js index de960e99d5..07d724ae86 100644 --- a/frontend/src/pages/org-admin/main-panel-topbar.js +++ b/frontend/src/pages/org-admin/main-panel-topbar.js @@ -1,60 +1,20 @@ import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; -import { gettext, invitationLink } from '../../utils/constants'; import Account from '../../components/common/account'; const propTypes = { - currentTab: PropTypes.string, - toggleAddOrgUser: PropTypes.func, - toggleAddOrgAdmin: PropTypes.func, - toggleInviteUserDialog: PropTypes.func, - toggleAddDepartDialog: PropTypes.func, - toggleAddMemberDialog: PropTypes.func, - toggleAddRepoDialog: PropTypes.func, + children: PropTypes.object, }; class MainPanelTopbar extends Component { render() { - const topBtn = 'btn btn-secondary operation-item'; - const groupID = this.props.groupID; return (
- {this.props.currentTab === 'users' && - - - {invitationLink && - - } - - } - {this.props.currentTab === 'admins' && - - } - {this.props.currentTab === 'departmentadmin' && - - {!groupID && - } - {groupID && - } - {groupID && - } - {groupID && - } - - } + {this.props.children}
diff --git a/frontend/src/pages/org-admin/org-admin-list.js b/frontend/src/pages/org-admin/org-admin-list.js index d10d51efd6..79083b8ede 100644 --- a/frontend/src/pages/org-admin/org-admin-list.js +++ b/frontend/src/pages/org-admin/org-admin-list.js @@ -1,19 +1,16 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext, orgID } from '../../utils/constants'; -import { seafileAPI } from '../../utils/seafile-api'; -import Toast from '../../components/toast'; -import OrgUserInfo from '../../models/org-user'; -import ModalPortal from '../../components/modal-portal'; -import AddOrgAdminDialog from '../../components/dialog/org-add-admin-dialog'; +import { gettext } from '../../utils/constants'; import UserItem from './org-user-item'; import '../../css/org-admin-paginator.css'; const propTypes = { - toggleAddOrgAdmin: PropTypes.func.isRequired, currentTab: PropTypes.string.isRequired, - isShowAddOrgAdminDialog: PropTypes.bool.isRequired, + toggleDelete: PropTypes.func.isRequired, + toggleRevokeAdmin: PropTypes.func.isRequired, + orgAdminUsers: PropTypes.array.isRequired, + initOrgAdmin: PropTypes.func.isRequired, }; class OrgAdminList extends React.Component { @@ -21,18 +18,16 @@ class OrgAdminList extends React.Component { constructor(props) { super(props); this.state = { - orgAdminUsers: [], isItemFreezed: false, }; } componentDidMount() { - seafileAPI.listOrgUsers(orgID, true).then(res => { - let userList = res.data.user_list.map(item => { - return new OrgUserInfo(item); - }); - this.setState({orgAdminUsers: userList}); - }); + this.props.initOrgAdmin(); + } + + componentWillReceiveProps(nextProps) { + this.props.initOrgAdmin(); } onFreezedItem = () => { @@ -43,44 +38,8 @@ class OrgAdminList extends React.Component { this.setState({isItemFreezed: false}); } - toggleDelete = (email) => { - seafileAPI.deleteOrgUser(orgID, email).then(res => { - this.setState({ - orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email) - }); - let msg = gettext('Successfully deleted %s'); - msg = msg.replace('%s', email); - Toast.success(msg); - }); - } - - toggleRevokeAdmin = (email) => { - seafileAPI.setOrgAdmin(orgID, email, false).then(res => { - this.setState({ - orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email) - }); - let msg = gettext('Successfully revoke the admin permission of %s'); - msg = msg.replace('%s', email); - Toast.success(msg); - }); - } - - addOrgAdmin = (userEmail) => { - seafileAPI.setOrgAdmin(orgID, userEmail, true).then(res => { - let userInfo = new OrgUserInfo(res.data); - this.state.orgAdminUsers.unshift(userInfo); - this.setState({ - orgAdminUsers: this.state.orgAdminUsers - }); - this.props.toggleAddOrgAdmin(); - let msg = gettext('Successfully set %s as admin.'); - msg = msg.replace('%s', userInfo.email); - Toast.success(msg); - }); - } - render() { - let orgAdminUsers = this.state.orgAdminUsers; + let orgAdminUsers = this.props.orgAdminUsers; return (
@@ -102,8 +61,8 @@ class OrgAdminList extends React.Component { user={item} currentTab={this.props.currentTab} isItemFreezed={this.state.isItemFreezed} - toggleDelete={this.toggleDelete} - toggleRevokeAdmin={this.toggleRevokeAdmin} + toggleDelete={this.props.toggleDelete} + toggleRevokeAdmin={this.props.toggleRevokeAdmin} onFreezedItem={this.onFreezedItem} onUnfreezedItem={this.onUnfreezedItem} /> @@ -111,11 +70,6 @@ class OrgAdminList extends React.Component { })} - {this.props.isShowAddOrgAdminDialog && ( - - - - )}
); } diff --git a/frontend/src/pages/org-admin/org-department-item.js b/frontend/src/pages/org-admin/org-department-item.js index ec1374b3a3..2af7f95808 100644 --- a/frontend/src/pages/org-admin/org-department-item.js +++ b/frontend/src/pages/org-admin/org-department-item.js @@ -6,6 +6,7 @@ import { Utils } from '../../utils/utils.js'; import { serviceURL, siteRoot, gettext, orgID } from '../../utils/constants'; import OrgDepartmentsList from './org-departments-list'; import ModalPortal from '../../components/modal-portal'; +import AddDepartDialog from '../../components/dialog/org-add-department-dialog'; import AddMemberDialog from '../../components/dialog/org-add-member-dialog'; import DeleteMemberDialog from '../../components/dialog/org-delete-member-dialog'; import AddRepoDialog from '../../components/dialog/org-add-repo-dialog'; @@ -27,6 +28,9 @@ class OrgDepartmentItem extends React.Component { deletedRepo: {}, showDeleteMemberDialog: false, showDeleteRepoDialog: false, + isShowAddRepoDialog: false, + isShowAddMemberDialog: false, + isShowAddDepartDialog: false, isItemFreezed: false, groupName: '', }; @@ -80,6 +84,18 @@ class OrgDepartmentItem extends React.Component { }); } + toggleAddRepoDialog = () => { + this.setState({ isShowAddRepoDialog: !this.state.isShowAddRepoDialog }); + } + + toggleAddMemberDialog = () => { + this.setState({ isShowAddMemberDialog: !this.state.isShowAddMemberDialog }); + } + + toggleAddDepartDialog = () => { + this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog}); + } + componentWillMount() { const groupID = this.props.groupID; this.listOrgGroupRepo(groupID); @@ -96,15 +112,51 @@ class OrgDepartmentItem extends React.Component { render() { const { members, repos } = this.state; const groupID = this.props.groupID; + const topBtn = 'btn btn-secondary operation-item'; + const topbarChildren = ( + + {groupID && + } + {groupID && + } + {groupID && + } + {this.state.isShowAddMemberDialog && ( + + + + )} + {this.state.isShowAddRepoDialog && ( + + + + )} + {this.state.isShowAddDepartDialog && ( + + + + )} + + ); + return ( - +
@@ -124,11 +176,7 @@ class OrgDepartmentItem extends React.Component {
- +
@@ -222,24 +270,6 @@ class OrgDepartmentItem extends React.Component { /> )} - {this.props.isShowAddMemberDialog && ( - - - - )} - {this.props.isShowAddRepoDialog && ( - - - - )}
@@ -247,18 +277,6 @@ class OrgDepartmentItem extends React.Component { } } -const OrgDepartmentItemPropTypes = { - isShowAddDepartDialog: PropTypes.bool.isRequired, - isShowAddMemberDialog: PropTypes.bool.isRequired, - isShowAddRepoDialog: PropTypes.bool.isRequired, - toggleAddDepartDialog: PropTypes.func.isRequired, - toggleAddMemberDialog: PropTypes.func.isRequired, - toggleAddRepoDialog: PropTypes.func.isRequired, -}; - -OrgDepartmentItem.propTypes = OrgDepartmentItemPropTypes; - - class MemberItem extends React.Component { constructor(props) { diff --git a/frontend/src/pages/org-admin/org-departments-list.js b/frontend/src/pages/org-admin/org-departments-list.js index 45c758f42e..4bc1aac990 100644 --- a/frontend/src/pages/org-admin/org-departments-list.js +++ b/frontend/src/pages/org-admin/org-departments-list.js @@ -24,6 +24,7 @@ class OrgDepartmentsList extends React.Component { groupName: '', showDeleteDepartDialog: false, showSetGroupQuotaDialog: false, + isShowAddDepartDialog: false, }; } @@ -58,8 +59,13 @@ class OrgDepartmentsList extends React.Component { this.listDepartGroups(this.props.groupID); } + toggleAddDepartDialog = () => { + this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog}); + } + componentWillMount() { this.listDepartGroups(this.props.groupID); + window.onDepartChanged = this.onDepartChanged; } componentWillReceiveProps(nextProps) { @@ -73,17 +79,28 @@ class OrgDepartmentsList extends React.Component { let isSub = this.props.groupID ? true : false; let header = isSub ? gettext('Sub-departments') : gettext('Departments'); let noGroup = isSub ? gettext('No sub-departments') : gettext('No departments'); + + const topbarChildren = ( + + {!this.props.groupID && + } + {this.state.isShowAddDepartDialog && ( + + + + )} + + ); + return ( - {!isSub && - - } + {!isSub && }
@@ -119,16 +136,6 @@ class OrgDepartmentsList extends React.Component { }
- {this.props.isShowAddDepartDialog && ( - - - - )} {this.state.showDeleteDepartDialog && ( - +
diff --git a/frontend/src/pages/org-admin/org-info.js b/frontend/src/pages/org-admin/org-info.js index 8d70c22ca8..807c1fc712 100644 --- a/frontend/src/pages/org-admin/org-info.js +++ b/frontend/src/pages/org-admin/org-info.js @@ -32,7 +32,7 @@ class OrgInfo extends Component { render() { return ( - +
diff --git a/frontend/src/pages/org-admin/org-libraries.js b/frontend/src/pages/org-admin/org-libraries.js index 6877e7ea9f..fbbffc64e1 100644 --- a/frontend/src/pages/org-admin/org-libraries.js +++ b/frontend/src/pages/org-admin/org-libraries.js @@ -88,7 +88,7 @@ class OrgLibraries extends Component { let repos = this.state.orgRepos; return ( - +
diff --git a/frontend/src/pages/org-admin/org-links.js b/frontend/src/pages/org-admin/org-links.js index 5f43855c52..682bedd725 100644 --- a/frontend/src/pages/org-admin/org-links.js +++ b/frontend/src/pages/org-admin/org-links.js @@ -64,7 +64,7 @@ class OrgLinks extends React.Component { const linkList = this.state.linkList; return ( - +
diff --git a/frontend/src/pages/org-admin/org-logs.js b/frontend/src/pages/org-admin/org-logs.js index 43d6807347..3b17fc31c0 100644 --- a/frontend/src/pages/org-admin/org-logs.js +++ b/frontend/src/pages/org-admin/org-logs.js @@ -16,7 +16,7 @@ class OrgLogs extends Component { render() { return ( - +
diff --git a/frontend/src/pages/org-admin/org-users-list.js b/frontend/src/pages/org-admin/org-users-list.js index d57d7425f0..4e575f5af9 100644 --- a/frontend/src/pages/org-admin/org-users-list.js +++ b/frontend/src/pages/org-admin/org-users-list.js @@ -1,20 +1,15 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { gettext, orgID, invitationLink } from '../../utils/constants'; -import { seafileAPI } from '../../utils/seafile-api'; -import OrgUserInfo from '../../models/org-user'; -import Toast from '../../components/toast'; -import ModalPortal from '../../components/modal-portal'; -import AddOrgUserDialog from '../../components/dialog/org-add-user-dialog'; -import InviteUserDialog from '../../components/dialog/org-admin-invite-user-dialog'; +import { gettext } from '../../utils/constants'; import UserItem from './org-user-item'; const propTypes = { currentTab: PropTypes.string.isRequired, - toggleAddOrgUser: PropTypes.func.isRequired, - isShowAddOrgUserDialog: PropTypes.bool.isRequired, - toggleInviteUserDialog: PropTypes.func.isRequired, - isInviteUserDialogOpen: PropTypes.bool.isRequired + initOrgUsersData: PropTypes.func.isRequired, + toggleDelete: PropTypes.func.isRequired, + orgUsers: PropTypes.array.isRequired, + page: PropTypes.number.isRequired, + pageNext: PropTypes.bool.isRequired, }; class OrgUsersList extends React.Component { @@ -22,29 +17,12 @@ class OrgUsersList extends React.Component { constructor(props) { super(props); this.state = { - orgUsers: [], isItemFreezed: false, - page: 1, - pageNext: false, }; } componentDidMount() { - let page = this.state.page; - this.initData(page); - } - - initData = (page) => { - seafileAPI.listOrgUsers(orgID, '', page).then(res => { - let userList = res.data.user_list.map(item => { - return new OrgUserInfo(item); - }); - this.setState({ - orgUsers: userList, - pageNext: res.data.page_next, - page: res.data.page, - }); - }); + this.props.initOrgUsersData(this.props.page); } onFreezedItem = () => { @@ -55,37 +33,9 @@ class OrgUsersList extends React.Component { this.setState({isItemFreezed: false}); } - toggleDelete = (email) => { - seafileAPI.deleteOrgUser(orgID, email).then(res => { - let users = this.state.orgUsers.filter(item => item.email != email); - this.setState({orgUsers: users}); - let msg = gettext('Successfully deleted %s'); - msg = msg.replace('%s', email); - Toast.success(msg); - }); - } - - handleSubmit = (email, name, password) => { - seafileAPI.addOrgUser(orgID, email, name, password).then(res => { - let userInfo = new OrgUserInfo(res.data); - this.state.orgUsers.unshift(userInfo); - this.setState({ - orgUsers: this.state.orgUsers - }); - this.props.toggleAddOrgUser(); - let msg; - msg = gettext('successfully added user %s.'); - msg = msg.replace('%s', email); - Toast.success(msg); - }).catch(err => { - Toast.danger(err.response.data.error_msg); - this.props.toggleAddOrgUser(); - }); - } - onChangePageNum = (e, num) => { e.preventDefault(); - let page = this.state.page; + let page = this.props.page; if (num == 1) { page = page + 1; @@ -93,12 +43,11 @@ class OrgUsersList extends React.Component { page = page - 1; } - this.initData(page); + this.props.initOrgUsersData(page); } render() { - let orgUsers = this.state.orgUsers; - + let { orgUsers, page, pageNext } = this.props; return (
@@ -119,7 +68,7 @@ class OrgUsersList extends React.Component { user={item} currentTab={this.props.currentTab} isItemFreezed={this.state.isItemFreezed} - toggleDelete={this.toggleDelete} + toggleDelete={this.props.toggleDelete} onFreezedItem={this.onFreezedItem} onUnfreezedItem={this.onUnfreezedItem} /> @@ -127,20 +76,10 @@ class OrgUsersList extends React.Component {
- {this.state.page !=1 && this.onChangePageNum(e, -1)}>{gettext('Previous')}} - {(this.state.page != 1 && this.state.pageNext) && | } - {this.state.pageNext && this.onChangePageNum(e, 1)}>{gettext('Next')}} + {page !=1 && this.onChangePageNum(e, -1)}>{gettext('Previous')}} + {(page != 1 && pageNext) && | } + {pageNext && this.onChangePageNum(e, 1)}>{gettext('Next')}}
- {this.props.isShowAddOrgUserDialog && ( - - - - )} - {this.props.isInviteUserDialogOpen && ( - - - - )}
); } diff --git a/frontend/src/pages/org-admin/org-users.js b/frontend/src/pages/org-admin/org-users.js index 3be281939d..671b467d7d 100644 --- a/frontend/src/pages/org-admin/org-users.js +++ b/frontend/src/pages/org-admin/org-users.js @@ -1,40 +1,204 @@ import React, { Component, Fragment } from 'react'; -import { Link } from '@reach/router'; -import { siteRoot, gettext } from '../../utils/constants'; +import OrgUsersList from './org-users-list'; +import OrgAdminList from './org-admin-list'; import MainPanelTopbar from './main-panel-topbar'; +import AddOrgAdminDialog from '../../components/dialog/org-add-admin-dialog'; +import ModalPortal from '../../components/modal-portal'; +import AddOrgUserDialog from '../../components/dialog/org-add-user-dialog'; +import InviteUserDialog from '../../components/dialog/org-admin-invite-user-dialog'; +import Toast from '../../components/toast'; +import { seafileAPI } from '../../utils/seafile-api'; +import OrgUserInfo from '../../models/org-user'; +import { siteRoot, gettext, invitationLink, orgID } from '../../utils/constants'; class OrgUsers extends Component { constructor(props) { super(props); + this.state = { + orgAdminUsers: [], + isShowAddOrgAdminDialog: false, + orgUsers: [], + page: 1, + pageNext: false, + isShowAddOrgUserDialog: false, + isInviteUserDialogOpen: false, + }; } tabItemClick = (param) => { this.props.tabItemClick(param); } + toggleAddOrgAdmin = () => { + this.setState({isShowAddOrgAdminDialog: !this.state.isShowAddOrgAdminDialog}); + } + + toggleAddOrgUser = () => { + this.setState({isShowAddOrgUserDialog: !this.state.isShowAddOrgUserDialog}); + } + + toggleInviteUserDialog = () => { + this.setState({isInviteUserDialogOpen: !this.state.isInviteUserDialogOpen}); + } + + initOrgUsersData = (page) => { + seafileAPI.listOrgUsers(orgID, '', page).then(res => { + let userList = res.data.user_list.map(item => { + return new OrgUserInfo(item); + }); + this.setState({ + orgUsers: userList, + pageNext: res.data.page_next, + page: res.data.page, + }); + }); + } + + addOrgUser = (email, name, password) => { + seafileAPI.addOrgUser(orgID, email, name, password).then(res => { + let userInfo = new OrgUserInfo(res.data); + this.state.orgUsers.unshift(userInfo); + this.setState({ + orgUsers: this.state.orgUsers + }); + this.toggleAddOrgUser(); + let msg = gettext('successfully added user %s.'); + msg = msg.replace('%s', email); + Toast.success(msg); + }).catch(err => { + Toast.danger(err.response.data.error_msg); + }); + } + + toggleOrgUsersDelete = (email) => { + seafileAPI.deleteOrgUser(orgID, email).then(res => { + let users = this.state.orgUsers.filter(item => item.email != email); + this.setState({orgUsers: users}); + let msg = gettext('Successfully deleted %s'); + msg = msg.replace('%s', email); + Toast.success(msg); + }); + } + + initOrgAdmin = () => { + seafileAPI.listOrgUsers(orgID, true).then(res => { + let userList = res.data.user_list.map(item => { + return new OrgUserInfo(item); + }); + this.setState({orgAdminUsers: userList}); + }); + } + + toggleOrgAdminDelete = (email) => { + seafileAPI.deleteOrgUser(orgID, email).then(res => { + this.setState({ + orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email) + }); + let msg = gettext('Successfully deleted %s'); + msg = msg.replace('%s', email); + Toast.success(msg); + }); + } + + toggleRevokeAdmin = (email) => { + seafileAPI.setOrgAdmin(orgID, email, false).then(res => { + this.setState({ + orgAdminUsers: this.state.orgAdminUsers.filter(item => item.email != email) + }); + let msg = gettext('Successfully revoke the admin permission of %s'); + msg = msg.replace('%s', email); + Toast.success(msg); + }); + } + + addOrgAdmin = (userEmail) => { + seafileAPI.setOrgAdmin(orgID, userEmail, true).then(res => { + let userInfo = new OrgUserInfo(res.data); + this.state.orgAdminUsers.unshift(userInfo); + this.setState({ + orgAdminUsers: this.state.orgAdminUsers + }); + let msg = gettext('Successfully set %s as admin.'); + msg = msg.replace('%s', userInfo.email); + Toast.success(msg); + this.toggleAddOrgAdmin(); + }); + } + render() { + const topBtn = 'btn btn-secondary operation-item'; + let topbarChildren; + if (this.props.currentTab === 'admins') { + topbarChildren = ( + + + {this.state.isShowAddOrgAdminDialog && + + + + } + + ); + } else if (this.props.currentTab === 'users') { + topbarChildren = ( + + + {invitationLink && + + } + {this.state.isShowAddOrgUserDialog && + + + + } + {this.state.isInviteUserDialogOpen && + + + + } + + ); + } + return ( - +
  • this.tabItemClick('users')}> - {gettext('All')} + {gettext('All')}
  • this.tabItemClick('admins')}> - {gettext('Admin')} + {gettext('Admin')}
- {this.props.children} + {this.props.currentTab === 'users' && + + } + {this.props.currentTab === 'admins' && + + }