import React, { Component, Fragment } from 'react'; import { Button } from 'reactstrap'; import { Utils } from '../../../utils/utils'; import { seafileAPI } from '../../../utils/seafile-api'; import { loginUrl, gettext, siteRoot, isPro } from '../../../utils/constants'; import toaster from '../../../components/toast'; import EmptyTip from '../../../components/empty-tip'; import Loading from '../../../components/loading'; import Paginator from '../../../components/paginator'; import ModalPortal from '../../../components/modal-portal'; import TransferDialog from '../../../components/dialog/transfer-dialog'; import DeleteRepoDialog from '../../../components/dialog/delete-repo-dialog'; import SysAdminShareDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-share-dialog'; import SysAdminLibHistorySettingDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-lib-history-setting-dialog'; import SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog'; import MainPanelTopbar from '../main-panel-topbar'; import ReposNav from './repos-nav'; import RepoOpMenu from './repo-op-menu'; const { enableSysAdminViewRepo } = window.sysadmin.pageOptions; class Content extends Component { constructor(props) { super(props); this.state = { isItemFreezed: false }; } onFreezedItem = () => { this.setState({isItemFreezed: true}); } onUnfreezedItem = () => { this.setState({isItemFreezed: false}); } getPreviousPageList = () => { this.props.getListByPage(this.props.pageInfo.current_page - 1); } getNextPageList = () => { this.props.getListByPage(this.props.pageInfo.current_page + 1); } render() { const { loading, errorMsg, items, pageInfo } = this.props; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('No libraries')}

); const table = ( {items.map((item, index) => { return (); })}
{/*icon*/} {gettext('Name')} {gettext('Files')}{' / '}{gettext('Size')} ID {gettext('Owner')} {/*Operations*/}
); return items.length ? table : emptyTip; } } } class Item extends Component { constructor(props) { super(props); this.state = { isOpIconShown: false, highlight: false, isShareDialogOpen: false, isDeleteDialogOpen: false, isTransferDialogOpen: false, isHistorySettingDialogOpen: false }; } onDeleteRepo = (repo) => { seafileAPI.sysAdminDeleteRepo(repo.id).then((res) => { this.props.onDeleteRepo(repo); const msg = gettext('Successfully deleted {name}.').replace('{name}', repo.name); toaster.success(msg); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); this.toggleDeleteDialog(); } onTransferRepo = (owner) => { seafileAPI.sysAdminTransferRepo(this.props.repo.id, owner.email).then((res) => { this.props.onTransferRepo(res.data); let message = gettext('Successfully transferred the library.'); toaster.success(message); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); this.toggleTransferDialog(); } handleMouseOver = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: true, highlight: true }); } } handleMouseOut = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: false, highlight: false }); } } onUnfreezedItem = () => { this.setState({ highlight: false, isOpIconShow: false }); this.props.onUnfreezedItem(); } onMenuItemClick = (operation) => { switch(operation) { case 'Share': this.toggleShareDialog(); break; case 'Delete': this.toggleDeleteDialog(); break; case 'Transfer': this.toggleTransferDialog(); break; case 'History Setting': this.toggleHistorySettingDialog(); break; default: break; } } toggleShareDialog = () => { this.setState({isShareDialogOpen: !this.state.isShareDialogOpen}); } toggleDeleteDialog = () => { this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen}); } toggleTransferDialog = () => { this.setState({isTransferDialogOpen: !this.state.isTransferDialogOpen}); } toggleHistorySettingDialog = () => { this.setState({isHistorySettingDialogOpen: !this.state.isHistorySettingDialogOpen}); } renderRepoName = () => { const { repo } = this.props; if (repo.name) { if (isPro && enableSysAdminViewRepo && !repo.encrypted) { return {repo.name}; } else { return repo.name; } } else { return '--'; } } render () { let { repo } = this.props; let { isOpIconShown, isShareDialogOpen, isDeleteDialogOpen, isTransferDialogOpen, isHistorySettingDialogOpen } = this.state; let iconUrl = Utils.getLibIconUrl(repo); let iconTitle = Utils.getLibIconTitle(repo); let isGroupOwnedRepo = repo.owner.indexOf('@seafile_group') != -1; return ( {iconTitle} {this.renderRepoName()} {`${repo.file_count} / ${Utils.bytesToSize(repo.size)}`} {repo.id} {isGroupOwnedRepo ? {repo.group_name} : {repo.owner_name} } {(!isGroupOwnedRepo && isOpIconShown) && } {isShareDialogOpen && } {isDeleteDialogOpen && } {isTransferDialogOpen && } {isHistorySettingDialogOpen && } ); } } class AllRepos extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', repos: [], pageInfo: {}, perPage: 100, isCreateRepoDialogOpen: false }; } componentDidMount () { this.getReposByPage(1); } toggleCreateRepoDialog = () => { this.setState({isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen}); } getReposByPage = (page) => { seafileAPI.sysAdminListAllRepos(page, this.state.perPage).then((res) => { this.setState({ loading: false, repos: res.data.repos, pageInfo: res.data.page_info }); }).catch((error) => { if (error.response) { if (error.response.status == 403) { this.setState({ loading: false, errorMsg: gettext('Permission denied') }); location.href = `${loginUrl}?next=${encodeURIComponent(location.href)}`; } else { this.setState({ loading: false, errorMsg: gettext('Error') }); } } else { this.setState({ loading: false, errorMsg: gettext('Please check the network.') }); } }); } createRepo = (repoName, Owner) => { seafileAPI.sysAdminCreateRepo(repoName, Owner).then(res => { this.state.repos.unshift(res.data); this.setState({ repos: this.state.repos }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } onDeleteRepo = (targetRepo) => { let repos = this.state.repos.filter(repo => { return repo.id != targetRepo.id; }); this.setState({ repos: repos }); } onTransferRepo = (targetRepo) => { let repos = this.state.repos.map((item) => { return item.id == targetRepo.id ? targetRepo : item; }); this.setState({ repos: repos }); } render() { let { isCreateRepoDialogOpen } = this.state; return (
{isCreateRepoDialogOpen && }
); } } export default AllRepos;