import React, { Component, Fragment } from 'react'; import { Link } from '@reach/router'; import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownItem } from 'reactstrap'; import { gettext, siteRoot, canGenerateShareLink } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import toaster from '../../components/toast'; import Loading from '../../components/loading'; import EmptyTip from '../../components/empty-tip'; import UploadLink from '../../models/upload-link'; import ShareAdminLink from '../../components/dialog/share-admin-link'; class Content extends Component { render() { const { loading, errorMsg, items } = this.props; if (loading) { return ; } if (errorMsg) { return

{errorMsg}

; } const emptyTip = (

{gettext('No upload links')}

{gettext('You have not created any upload links yet. An upload link allows anyone to upload files to a folder or library. You can create an upload link for a folder or library by clicking the share icon to the right of its name.')}

); const isDesktop = Utils.isDesktop(); const table = ( {isDesktop ? ( ) : ( )} {items.map((item, index) => { return (); })}
{/*icon*/} {gettext('Name')} {gettext('Library')} {gettext('Visits')} {gettext('Expiration')} {/*Operations*/}
); return items.length ? table : emptyTip; } } class Item extends Component { constructor(props) { super(props); this.state = { isOpIconShown: false, isOpMenuOpen: false, // for mobile isLinkDialogOpen: false }; } toggleOpMenu = () => { this.setState({ isOpMenuOpen: !this.state.isOpMenuOpen }); } toggleLinkDialog = () => { this.setState({ isLinkDialogOpen: !this.state.isLinkDialogOpen }); } handleMouseOver = () => { this.setState({isOpIconShown: true}); } handleMouseOut = () => { this.setState({isOpIconShown: false}); } viewLink = (e) => { e.preventDefault(); this.toggleLinkDialog(); } removeLink = (e) => { e.preventDefault(); this.props.onRemoveLink(this.props.item); } renderExpiration = () => { const item = this.props.item; if (!item.expire_date) { return '--'; } const expire_date = moment(item.expire_date).format('YYYY-MM-DD'); const expire_time = moment(item.expire_date).format('YYYY-MM-DD HH:mm:ss'); return ({expire_date}); } render() { let item = this.props.item; const { isOpIconShown, isLinkDialogOpen } = this.state; const iconUrl = Utils.getFolderIconUrl(false); const repoUrl = `${siteRoot}library/${item.repo_id}/${encodeURIComponent(item.repo_name)}`; const objUrl = `${repoUrl}${Utils.encodePath(item.path)}`; const desktopItem = ( {item.obj_name} {item.repo_name} {item.view_cnt} {this.renderExpiration()} {!item.is_expired && } ); const mobileItem = ( {item.obj_name}
{item.repo_name}
{item.view_cnt}({gettext('Visits')}) {this.renderExpiration()}({gettext('Expiration')})
{!item.is_expired && {gettext('View')}} {gettext('Remove')}
); return ( {this.props.isDesktop ? desktopItem : mobileItem} {isLinkDialogOpen && } ); } } class ShareAdminUploadLinks extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', items: [] }; } componentDidMount() { seafileAPI.listUserUploadLinks().then((res) => { let items = res.data.map(item => { return new UploadLink(item); }); this.setState({ loading: false, items: items }); }).catch((error) => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } onRemoveLink = (item) => { seafileAPI.deleteUploadLink(item.token).then(() => { let items = this.state.items.filter(uploadItem => { return uploadItem.token !== item.token; }); this.setState({items: items}); const message = gettext('Successfully deleted 1 item.'); toaster.success(message); }).catch((error) => { const errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } render() { return (
    {canGenerateShareLink && (
  • {gettext('Share Links')}
  • )}
  • {gettext('Upload Links')}
); } } export default ShareAdminUploadLinks;