import React, { Fragment, Component } from 'react'; import PropTypes from 'prop-types'; import { Link } from '@gatsbyjs/reach-router'; import { Dropdown, DropdownToggle, DropdownItem } from 'reactstrap'; import classnames from 'classnames'; 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'; import FixedWidthTable from '../../components/common/fixed-width-table'; 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 ; } if (errorMsg) { return

{errorMsg}

; } if (!items.length) { return ( ); } // sort const sortByName = sortBy == 'name'; const sortIcon = sortOrder == 'asc' ? : ; const isDesktop = Utils.isDesktop(); return ( {gettext('Name')} {sortByName && sortIcon}) }, { isFixed: false, width: 0.3, children: gettext('Share To') }, { isFixed: false, width: 0.25, children: gettext('Permission') }, { isFixed: false, width: 0.1 }, ] : [ { isFixed: false, width: 0.12 }, { isFixed: false, width: 0.8 }, { isFixed: false, width: 0.08 }, ]} > {items.map((item, index) => { return (); })} ); } } Content.propTypes = { loading: PropTypes.bool.isRequired, errorMsg: PropTypes.string.isRequired, items: PropTypes.array.isRequired, sortItems: PropTypes.func.isRequired, sortBy: PropTypes.string.isRequired, sortOrder: PropTypes.string.isRequired, }; class Item extends Component { constructor(props) { super(props); this.state = { share_permission: this.props.item.share_permission, share_permission_name: this.props.item.share_permission_name, isOpIconShown: false, isOpMenuOpen: false, // for mobile isPermSelectDialogOpen: false, // for mobile unshared: false, isShowPermEditor: 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); }); }; onEditPermission = (event) => { event.nativeEvent.stopImmediatePropagation(); this.setState({ isShowPermEditor: true }); }; render() { if (this.state.unshared) { return null; } const item = this.props.item; let { share_permission, share_permission_name, isOpIconShown, isPermSelectDialogOpen, isShowPermEditor } = 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)}`; // custom defined permission if (share_permission.startsWith('custom-')) { share_permission = share_permission.slice(7); } if (this.props.isDesktop) { return ( {iconTitle} {item.folder_name} {item.share_type == 'personal' ? {item.user_name} : item.group_name} {!isShowPermEditor && (
{Utils.sharePerms(share_permission) || share_permission_name} {isOpIconShown && ( )}
)} {isShowPermEditor && ( )} ); } else { return ( {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 && ( )}
); } } } Item.propTypes = { item: PropTypes.object.isRequired, isDesktop: PropTypes.bool.isRequired, }; 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;