import React, { Fragment, Component } from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import OrgAdminRepo from '../../models/org-admin-repo'; import toaster from '../../components/toast'; import TransferDialog from '../../components/dialog/transfer-dialog'; import ModalPortal from '../../components/modal-portal'; import { seafileAPI } from '../../utils/seafile-api'; import { mediaUrl, siteRoot, gettext, orgID } from '../../utils/constants'; class OrgLibraries extends Component { constructor(props) { super(props); this.state = { page: 1, pageNext: false, orgRepos: [], isItemFreezed: false }; } componentDidMount() { let page = this.state.page; this.initData(page); } initData = (page) => { seafileAPI.listOrgRepos(orgID, page).then(res => { let orgRepos = res.data.repo_list.map(item => { return new OrgAdminRepo(item); }); this.setState({ orgRepos: orgRepos, pageNext: res.data.page_next, page: res.data.page, }); }); } onChangePageNum = (e, num) => { e.preventDefault(); let page = this.state.page; if (num == 1) { page = page + 1; } else { page = page - 1; } this.initData(page); } onFreezedItem = () => { this.setState({isItemFreezed: true}); } onUnfreezedItem = () => { this.setState({isItemFreezed: false}); } deleteRepoItem = (repo) => { seafileAPI.deleteOrgRepo(orgID, repo.repoID).then(res => { this.setState({ orgRepos: this.state.orgRepos.filter(item => item.repoID != repo.repoID) }); let msg = gettext('Successfully deleted {name}'); msg = msg.replace('{name}', repo.repoName); toaster.success(msg); }); } transferRepoItem = (repoID, user) => { this.setState({ orgRepos: this.state.orgRepos.map(item =>{ if (item.repoID == repoID) { item.ownerEmail = user.email; item.ownerName = user.value; } return item; }) }); } render() { let repos = this.state.orgRepos; return (

{gettext('All Libraries')}

{repos.map(item => { return ( )} )};
{gettext('Name')} ID {gettext('Owner')} {gettext('Operations')}
{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')}}
); } } const propTypes = { key: PropTypes.number.isRequired, repo: PropTypes.object.isRequired, isItemFreezed: PropTypes.boolean, onFreezedItem: PropTypes.func.isRequired, onUnfreezedItem: PropTypes.func.isRequired, deleteRepoItem: PropTypes.func.isRequired, transferRepoItem: PropTypes.func.isRequired, }; class RepoItem extends React.Component { constructor(props) { super(props); this.state = { highlight: false, showMenu: false, isItemMenuShow: false, isTransferDialogShow: false }; } onMouseEnter = () => { if (!this.props.isItemFreezed) { this.setState({ showMenu: true, highlight: true, }); } } onMouseLeave = () => { if (!this.props.isItemFreezed) { this.setState({ showMenu: false, highlight: false }); } } onDropdownToggleClick = (e) => { e.preventDefault(); this.toggleOperationMenu(e); } toggleOperationMenu = (e) => { e.stopPropagation(); this.setState( {isItemMenuShow: !this.state.isItemMenuShow }, () => { if (this.state.isItemMenuShow) { this.props.onFreezedItem(); } else { this.setState({ highlight: false, showMenu: false, }); this.props.onUnfreezedItem(); } } ); } toggleDelete = () => { this.props.deleteRepoItem(this.props.repo); } toggleTransfer = () => { this.props.transferRepoItem(this.props.repo); } renderLibIcon = (repo) => { let href; let iconTitle; if (repo.encrypted) { href = mediaUrl + 'img/lib/48/lib-encrypted.png'; iconTitle = gettext('Encrypted library'); } else { href = mediaUrl + 'img/lib/48/lib.png'; iconTitle = gettext('Read-Write library'); } return {iconTitle}; } renderRepoOwnerHref = (repo) => { let href; if (repo.isDepartmentRepo) { href = siteRoot + 'org/admin/#address-book/groups/' + repo.groupID + '/'; } else { href = siteRoot + 'org/useradmin/info/' + repo.ownerEmail + '/'; } return href; } toggleTransfer = () => { this.setState({isTransferDialogShow: !this.state.isTransferDialogShow}); } onTransferRepo = (user) => { let repo = this.props.repo; seafileAPI.transferOrgRepo(orgID, repo.repoID, user.email).then(res => { this.props.transferRepoItem(repo.repoID, user); let msg = gettext('Successfully transferred the library.'); toaster.success(msg); }).catch(res => { let msg = gettext('Failed. Please check the network.'); toaster.danger(msg); }); this.toggleTransfer(); } render() { let { repo } = this.props; let isOperationMenuShow = this.state.showMenu && !repo.isDepartmentRepo; return ( {this.renderLibIcon(repo)} {repo.repoName} {repo.repoID} {repo.ownerName} {isOperationMenuShow && {gettext('Delete')} {gettext('Transfer')} } {this.state.isTransferDialogShow && ( )} ); } } RepoItem.propTypes = propTypes; export default OrgLibraries;