import React from 'react'; import PropTypes from 'prop-types'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils.js'; import { serviceURL, mediaUrl, gettext, orgID } from '../../utils/constants'; import OrgDepartmentsList from './org-departments-list'; import ModalPortal from '../../components/modal-portal'; 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'; import DeleteRepoDialog from '../../components/dialog/org-delete-repo-dialog'; import RoleEditor from '../../components/select-editor/role-editor'; import '../../css/org-department-item.css'; class OrgDepartmentItem extends React.Component { constructor(props) { super(props); this.state = { members: [], repos: [], groups: [], ancestorGroups: [], deletedMember: {}, deletedRepo: {}, showAddMemberDialog: false, showDeleteMemberDialog: false, showAddRepoDialog: false, showDeleteRepoDialog: false, isItemFreezed: false, groupID: null, groupName: '', } } listOrgGroupRepo = (groupID) => { seafileAPI.orgAdminListDepartGroupRepos(orgID, groupID).then(res => { this.setState({ repos: res.data.libraries }); }); } listOrgMembers = (groupID) => { seafileAPI.orgAdminListGroupInfo(orgID, groupID, true).then(res => { this.setState({ members: res.data.members, groups: res.data.groups, ancestorGroups: res.data.ancestor_groups, groupName: res.data.name, }); }); } showAddMemberDialog = () => { this.setState({ showAddMemberDialog: true }); } showDeleteMemberDialog = (member) => { this.setState({ showDeleteMemberDialog: true, deletedMember: member }); } showAddRepoDialog = () => { this.setState({ showAddRepoDialog: true }); } showDeleteRepoDialog = (repo) => { this.setState({ showDeleteRepoDialog: true, deletedRepo: repo }); } toggleCancel = () => { this.setState({ showAddMemberDialog: false, showDeleteMemberDialog: false, showAddRepoDialog: false, showDeleteRepoDialog: false, }); } onRepoChanged = () => { this.listOrgGroupRepo(this.state.groupID); } onMemberChanged = () => { this.listOrgMembers(this.state.groupID); } toggleItemFreezed = (isFreezed) => { this.setState({ isItemFreezed: isFreezed }); } componentWillMount() { const href = window.location.href; let path = href.slice(href.indexOf('groups/')); let groupID = path.slice(7, path.length - 1); this.setState({ groupID: groupID }); this.listOrgGroupRepo(groupID); this.listOrgMembers(groupID); } render() { const members = this.state.members; const repos = this.state.repos; return (

{ this.state.groupID ? {gettext('Departments')} : {gettext('Departments')} } { this.state.ancestorGroups.map(ancestor => { let newHref = serviceURL + '/org/departmentadmin/groups/' + ancestor.id + '/'; return ( {' / '}{ancestor.name} ); }) } { this.state.groupID && {' / '}{this.state.groupName} }

{gettext('Members')}

{(members && members.length === 1 && members[0].role === "Owner") ?

{gettext('No members')}

: {members.map((member, index) => { return ( ); })}
{gettext('Name')} {gettext('Role')}
}

{gettext('Libraries')}

{ repos.length > 0 ?
{repos.map((repo, index) => { return( ); })}
{gettext('Name')} {gettext('Size')}
:

{gettext('No libraries')}

}
{this.state.showDeleteMemberDialog && ( )} {this.state.showDeleteRepoDialog && ( )} {this.state.showAddMemberDialog && ( )} {this.state.showAddRepoDialog && ( )}
); } } class MemberItem extends React.Component { constructor(props) { super(props); this.state = { highlight: false, showRoleMenu: false, }; this.roles = ['Admin', 'Member']; } onMouseEnter = () => { if (this.props.isItemFreezed) return; this.setState({ highlight: true }); } onMouseLeave = () => { if (this.props.isItemFreezed) return; this.setState({ highlight: false }); } toggleMemberRoleMenu = () => { this.setState({ showRoleMenu: !this.state.showRoleMenu }); } onChangeUserRole = (role) => { let isAdmin = role === 'Admin' ? true : false; seafileAPI.orgAdminSetDepartGroupUserRole(orgID, this.props.groupID, this.props.member.email, isAdmin).then((res) => { this.props.onMemberChanged(); }); this.setState({ highlight: false, }); } render() { const member = this.props.member; const highlight = this.state.highlight; let memberLink = serviceURL + '/org/useradmin/info/' + member.email + '/'; if (member.role === 'Owner') return null; return ( member-header {member.name} { !this.props.isItemFreezed ? : } ); } } const MemberItemPropTypes = { isItemFreezed: PropTypes.bool.isRequired, onMemberChanged: PropTypes.func.isRequired, showDeleteMemberDialog: PropTypes.func.isRequired, toggleItemFreezed: PropTypes.func.isRequired, }; MemberItem.propTypes = MemberItemPropTypes; class RepoItem extends React.Component { constructor(props) { super(props); this.state = { highlight: false, }; } onMouseEnter = () => { this.setState({ highlight: true }); } onMouseLeave = () => { this.setState({ highlight: false }); } render() { const repo = this.props.repo; const highlight = this.state.highlight; let iconUrl = Utils.getLibIconUrl(repo); return ( {gettext('icon')}/ {repo.name} {Utils.bytesToSize(repo.size)}{' '} ); } } const RepoItemPropTypes = { repo: PropTypes.object.isRequired, showDeleteRepoDialog: PropTypes.func.isRequired, }; RepoItem.propTypes = RepoItemPropTypes; export default OrgDepartmentItem;