import React, { Component, Fragment } from 'react'; import { Link } from '@reach/router'; import moment from 'moment'; import { Utils } from '../../../utils/utils'; import { seafileAPI } from '../../../utils/seafile-api'; import { isPro, siteRoot, gettext } from '../../../utils/constants'; import toaster from '../../../components/toast'; import EmptyTip from '../../../components/empty-tip'; import Loading from '../../../components/loading'; import CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog'; import TransferDialog from '../../../components/dialog/transfer-dialog'; import OpMenu from '../../../components/dialog/op-menu'; import MainPanelTopbar from '../main-panel-topbar'; import Nav from './user-nav'; 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}); } render() { const { loading, errorMsg, items } = this.props; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('No libraries')}

); const table = ( {items.map((item, index) => { return (); })}
{gettext('Name')} {gettext('Size')} {gettext('Last Update')} {/* Operations */}
); return items.length ? table : emptyTip; } } } class Item extends Component { constructor(props) { super(props); this.state = { isOpIconShown: false, highlight: false, isDeleteDialogOpen: false, isTransferDialogOpen: false }; } handleMouseEnter = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: true, highlight: true }); } } handleMouseLeave = () => { if (!this.props.isItemFreezed) { this.setState({ isOpIconShown: false, highlight: false }); } } onUnfreezedItem = () => { this.setState({ highlight: false, isOpIconShow: false }); this.props.onUnfreezedItem(); } toggleDeleteDialog = () => { this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen}); } deleteRepo = () => { this.props.deleteRepo(this.props.item.id); } toggleTransferDialog = () => { this.setState({isTransferDialogOpen: !this.state.isTransferDialogOpen}); } transferRepo = (owner) => { this.props.transferRepo(this.props.item.id, owner.email); this.toggleTransferDialog(); } renderRepoName = () => { const { item } = this.props; const repo = item; if (repo.name) { if (isPro && enableSysAdminViewRepo && !repo.encrypted) { return {repo.name}; } else { return repo.name; } } else { return gettext('Broken ({repo_id_placeholder})') .replace('{repo_id_placeholder}', repo.id); } } translateOperations = (item) => { let translateResult = ''; switch (item) { case 'Delete': translateResult = gettext('Delete'); break; case 'Transfer': translateResult = gettext('Transfer'); break; } return translateResult; } onMenuItemClick = (operation) => { switch(operation) { case 'Delete': this.toggleDeleteDialog(); break; case 'Transfer': this.toggleTransferDialog(); break; } } render() { const { item } = this.props; const { isOpIconShown, isDeleteDialogOpen, isTransferDialogOpen } = this.state; const iconUrl = Utils.getLibIconUrl(item); const iconTitle = Utils.getLibIconTitle(item); const itemName = '' + Utils.HTMLescape(item.name) + ''; const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName); return ( {iconTitle} {this.renderRepoName()} {Utils.bytesToSize(item.size)} {moment(item.last_modified).fromNow()} {isOpIconShown && } {isDeleteDialogOpen && } {isTransferDialogOpen && } ); } } class Repos extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', userInfo: {}, repoList: [] }; } componentDidMount () { seafileAPI.sysAdminGetUser(this.props.email).then((res) => { this.setState({ userInfo: res.data }); }); seafileAPI.sysAdminListReposByOwner(this.props.email).then(res => { this.setState({ loading: false, repoList: res.data.repos }); }).catch((error) => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } deleteRepo = (repoID) => { seafileAPI.sysAdminDeleteRepo(repoID).then(res => { let newRepoList = this.state.repoList.filter(item => { return item.id != repoID; }); this.setState({repoList: newRepoList}); toaster.success(gettext('Successfully deleted 1 item.')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } transferRepo = (repoID, email) => { seafileAPI.sysAdminTransferRepo(repoID, email).then((res) => { let newRepoList = this.state.repoList.filter(item => { return item.id != repoID; }); this.setState({repoList: newRepoList}); let message = gettext('Successfully transferred the library.'); toaster.success(message); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } render() { return (
); } } export default Repos;