import React, { Fragment, Component } from 'react'; import { Link } from '@reach/router'; import { Dropdown, DropdownToggle, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import { gettext, siteRoot, isPro } from '../../utils/constants'; import Loading from '../../components/loading'; import EmptyTip from '../../components/empty-tip'; import toaster from '../../components/toast'; import SharePermissionEditor from '../../components/select-editor/share-permission-editor'; import SharedFolderInfo from '../../models/shared-folder-info'; import PermSelect from '../../components/dialog/perm-select'; class Content extends Component { sortByName = (e) => { e.preventDefault(); const sortBy = 'name'; const sortOrder = this.props.sortOrder == 'asc' ? 'desc' : 'asc'; this.props.sortItems(sortBy, sortOrder); } render() { const { loading, errorMsg, items, sortBy, sortOrder } = this.props; if (loading) { return ; } else if (errorMsg) { return

{errorMsg}

; } else { const emptyTip = (

{gettext('No folders shared')}

{gettext('You have not shared any folders with other users yet. You can share a folder with other users by clicking the share icon to the right of a folder\'s name.')}

); // sort const sortByName = sortBy == 'name'; const sortIcon = sortOrder == 'asc' ? : ; const isDesktop = Utils.isDesktop(); const table = ( {isDesktop ? ( ) : ( )} {items.map((item, index) => { return (); })}
{/*icon*/} {gettext('Name')} {sortByName && sortIcon} {gettext('Share To')} {gettext('Permission')}
); return items.length ? table : emptyTip; } } } class Item extends Component { constructor(props) { super(props); this.state = { share_permission: this.props.item.share_permission, isOpIconShown: false, isOpMenuOpen: false, // for mobile isPermSelectDialogOpen: false, // for mobile unshared: false }; this.permissions = ['rw', 'r']; if (isPro) { this.permissions.push('cloud-edit', 'preview'); } } toggleOpMenu = () => { this.setState({ isOpMenuOpen: !this.state.isOpMenuOpen }); } togglePermSelectDialog = () => { this.setState({ isPermSelectDialogOpen: !this.state.isPermSelectDialogOpen }); } onMouseEnter = () => { this.setState({isOpIconShown: true}); } onMouseLeave = () => { this.setState({isOpIconShown: false}); } unshare = (e) => { e.preventDefault(); const item = this.props.item; let options = { 'p': item.path }; if (item.share_type == 'personal') { Object.assign(options, { 'share_type': 'user', 'username': item.user_email }); } else { Object.assign(options, { 'share_type': item.share_type, // 'group' 'group_id': item.group_id }); } seafileAPI.unshareFolder(item.repo_id, options).then((res) => { this.setState({ unshared: true }); let message = gettext('Successfully unshared {name}').replace('{name}', item.folder_name); toaster.success(message); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster(errMessage); }); } changePerm = (permission) => { const item = this.props.item; const postData = { 'permission': permission }; let options = { 'p': item.path }; if (item.share_type == 'personal') { Object.assign(options, { 'share_type': 'user', 'username': item.user_email }); } else { Object.assign(options, { 'share_type': item.share_type, // 'group' 'group_id': item.group_id }); } seafileAPI.updateFolderSharePerm(item.repo_id, postData, options).then((res) => { this.setState({share_permission: permission}); toaster.success(gettext('Successfully modified permission.')); }).catch((error) => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } render() { if (this.state.unshared) { return null; } const item = this.props.item; let { share_permission, isOpIconShown, isPermSelectDialogOpen } = this.state; let is_readonly = false; if (share_permission == 'r' || share_permission == 'preview') { is_readonly = true; } let iconUrl = Utils.getFolderIconUrl(is_readonly); let iconTitle = Utils.getFolderIconTitle({ 'permission': share_permission }); let folderUrl = `${siteRoot}library/${item.repo_id}/${encodeURIComponent(item.repo_name)}${Utils.encodePath(item.path)}`; const desktopItem = ( {iconTitle} {item.folder_name} {item.share_type == 'personal' ? {item.user_name} : item.group_name} ); const mobileItem = ( {iconTitle} {item.folder_name} {Utils.sharePerms(share_permission)}
{`${gettext('Share To:')} ${item.share_type == 'personal' ? item.user_name : item.group_name}`}
{gettext('Permission')} {gettext('Unshare')}
{isPermSelectDialogOpen && }
); return this.props.isDesktop ? desktopItem : mobileItem; } } class ShareAdminFolders extends Component { constructor(props) { super(props); this.state = { loading: true, errorMsg: '', items: [], sortBy: 'name', sortOrder: 'asc' // 'asc' or 'desc' }; } _sortItems = (items, sortBy, sortOrder) => { let comparator; switch (`${sortBy}-${sortOrder}`) { case 'name-asc': comparator = function(a, b) { var result = Utils.compareTwoWord(a.folder_name, b.folder_name); return result; }; break; case 'name-desc': comparator = function(a, b) { var result = Utils.compareTwoWord(a.folder_name, b.folder_name); return -result; }; break; } items.sort(comparator); return items; } sortItems = (sortBy, sortOrder) => { this.setState({ sortBy: sortBy, sortOrder: sortOrder, items: this._sortItems(this.state.items, sortBy, sortOrder) }); } componentDidMount() { seafileAPI.listSharedFolders().then((res) => { let items = res.data.map(item => { return new SharedFolderInfo(item); }); this.setState({ loading: false, items: this._sortItems(items, this.state.sortBy, this.state.sortOrder) }); }).catch((error) => { this.setState({ loading: false, errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403 }); }); } render() { return (

{gettext('Folders')}

); } } export default ShareAdminFolders;