import React, { Component, Fragment } from 'react'; import { Button } from 'reactstrap'; import moment from 'moment'; import { Utils } from '../../../utils/utils'; import { seafileAPI } from '../../../utils/seafile-api'; import { gettext } 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 OpMenu from '../../../components/dialog/op-menu'; import MainPanelTopbar from '../main-panel-topbar'; import UserLink from '../user-link'; class Content extends Component { constructor(props) { super(props); this.state = { isItemFreezed: false }; } onFreezedItem = () => { this.setState({isItemFreezed: true}); } onUnfreezedItem = () => { this.setState({isItemFreezed: false}); } getPreviousPage = () => { this.props.getItemsByPage(this.props.currentPage - 1); } getNextPage = () => { this.props.getItemsByPage(this.props.currentPage + 1); } render() { const { loading, errorMsg, items, pageInfo, curPerPage, hasNextPage, currentPage } = this.props; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('No invitations')}

); const table = ( {items.map((item, index) => { return (); })}
{gettext('Inviter')} {gettext('Accepter')} {gettext('Type')} {gettext('Invited at')} {gettext('Accepted at')} {gettext('Expired at')}
); return items.length ? table : emptyTip; } } } class Item extends Component { constructor(props) { super(props); this.state = { isOpIconShown: false, highlight: 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(); } deleteItem = () => { this.props.deleteItem(this.props.item); } translateOperations = (item) => { let translateResult = ''; switch (item) { case 'Delete': translateResult = gettext('Delete'); break; } return translateResult; } onMenuItemClick = (operation) => { switch(operation) { case 'Delete': this.deleteItem(); break; default: break; } } getInviteTypeText = () => { let translateResult = ''; switch (this.props.item.invite_type) { case 'Guest': translateResult = gettext('Guest'); break; } return translateResult; } render() { const { item } = this.props; const { isOpIconShown } = this.state; return ( {item.accept_time ? : item.accepter_email } {this.getInviteTypeText()} {moment(item.invite_time).fromNow()} {item.accept_time ? {moment(item.accept_time).fromNow()} : '--' } {item.is_expired ? {moment(item.expire_time).format('YYYY-MM-DD HH:mm')} : moment(item.expire_time).format('YYYY-MM-DD HH:mm') } {isOpIconShown && } ); } } class Invitations extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', items: [], totalItemCount: 0, hasNextPage: false, currentPage: 1, perPage: 25 }; } componentDidMount () { this.getItemsByPage(1); } getItemsByPage = (page) => { let { perPage } = this.state; seafileAPI.sysAdminListInvitations(page, perPage).then(res => { this.setState({ loading: false, items: res.data.invitation_list, hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count), currentPage: page }); }).catch((error) => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } deleteItem = (targetItem) => { const token = targetItem.token; seafileAPI.sysAdminDeleteInvitation(token).then(res => { let items = this.state.items.filter(item => { return item.token != token; }); this.setState({items: items}); toaster.success(gettext('Successfully deleted 1 item.')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } deleteItemInBatch = () => { seafileAPI.sysAdminDeleteExpiredInvitations().then(res => { const prevItems = this.state.items; const items = this.state.items.filter(item => !item.is_expired); if (items.length < prevItems.length) { this.setState({ items: items }); toaster.success(gettext('Operation succeeded.')); } }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } resetPerPage = (perPage) => { this.setState({ perPage: perPage }, () => { this.getItemsByPage(1); }); } render() { return (

{gettext('Invitations')}

); } } export default Invitations;