import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Button } from 'reactstrap'; import { gettext, isPro, enableShareToDepartment } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import { Utils } from '../../utils/utils'; import toaster from '../toast'; import SharePermissionEditor from '../select-editor/share-permission-editor'; import { SeahubSelect, NoGroupMessage } from '../common/select'; class GroupItem extends React.Component { constructor(props) { super(props); this.state = { isOperationShow: false }; } onMouseEnter = () => { this.setState({isOperationShow: true}); }; onMouseLeave = () => { this.setState({isOperationShow: false}); }; deleteShareItem = () => { let item = this.props.item; this.props.deleteShareItem(item.group_info.id); }; onChangeUserPermission = (permission) => { let item = this.props.item; this.props.onChangeUserPermission(item, permission); }; render() { let item = this.props.item; let currentPermission = Utils.getSharedPermission(item); return ( {item.group_info.name} ); } } GroupItem.propTypes = { repoID: PropTypes.string.isRequired, item: PropTypes.object.isRequired, permissions: PropTypes.array.isRequired, deleteShareItem: PropTypes.func.isRequired, onChangeUserPermission: PropTypes.func.isRequired, }; class GroupList extends React.Component { render() { let items = this.props.items; return ( {items.map((item, index) => { return ( ); })} ); } } GroupList.propTypes = { repoID: PropTypes.string.isRequired, items: PropTypes.array.isRequired, permissions: PropTypes.array.isRequired, deleteShareItem: PropTypes.func.isRequired, onChangeUserPermission: PropTypes.func.isRequired, }; const propTypes = { isGroupOwnedRepo: PropTypes.bool, itemPath: PropTypes.string.isRequired, itemType: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, isRepoOwner: PropTypes.bool.isRequired, onAddCustomPermissionToggle: PropTypes.func, }; class ShareToGroup extends React.Component { constructor(props) { super(props); this.state = { options: [], selectedOption: null, errorMsg: [], permission: 'rw', sharedItems: [] }; this.permissions = []; let { itemType, isRepoOwner } = props; if (itemType === 'library') { this.permissions = isRepoOwner ? ['rw', 'r', 'admin', 'cloud-edit', 'preview'] : ['rw', 'r', 'cloud-edit', 'preview']; } else if (itemType === 'dir') { this.permissions = ['rw', 'r', 'cloud-edit', 'preview']; } if (!isPro) { this.permissions = ['rw', 'r']; } if (this.props.isGroupOwnedRepo) { this.permissions = ['rw', 'r', 'cloud-edit', 'preview']; } } handleSelectChange = (option) => { this.setState({selectedOption: option}); }; componentDidMount() { this.loadOptions(); this.listSharedGroups(); } loadOptions = () => { seafileAPI.shareableGroups().then((res) => { let options = []; for (let i = 0 ; i < res.data.length; i++) { const item = res.data[i]; if (item.parent_group_id != 0) { // it's a department if (!enableShareToDepartment) { continue; } } let obj = {}; obj.value = res.data[i].name; obj.id = res.data[i].id; obj.label = res.data[i].name; options.push(obj); } this.setState({options: options}); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; listSharedGroups = () => { let path = this.props.itemPath; let repoID = this.props.repoID; seafileAPI.listSharedItems(repoID, path, 'group').then((res) => { if (res.data.length !== 0) { this.setState({ sharedItems: res.data }); } }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; setPermission = (permission) => { this.setState({permission: permission}); }; shareToGroup = () => { let path = this.props.itemPath; let repoID = this.props.repoID; let isGroupOwnedRepo = this.props.isGroupOwnedRepo; if (isGroupOwnedRepo) { seafileAPI.shareGroupOwnedRepoToGroup(repoID, this.state.permission, this.state.selectedOption['id'], path).then(res => { let errorMsg = []; if (res.data.failed.length > 0) { for (let i = 0 ; i < res.data.failed.length ; i++) { errorMsg[i] = res.data.failed[i]; } } // todo modify api let items = res.data.success.map(item => { let sharedItem = { 'group_info': { 'id': item.group_id, 'name': item.group_name}, 'permission': item.permission, 'share_type': 'group', }; return sharedItem; }); this.setState({ errorMsg: errorMsg, sharedItems: this.state.sharedItems.concat(items), selectedOption: null, permission: 'rw', }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } else { seafileAPI.shareFolder(repoID, path, 'group', this.state.permission, [this.state.selectedOption['id']]).then(res => { let errorMsg = []; if (res.data.failed.length > 0) { for (let i = 0 ; i < res.data.failed.length ; i++) { errorMsg[i] = res.data.failed[i]; } } this.setState({ errorMsg: errorMsg, sharedItems: this.state.sharedItems.concat(res.data.success), selectedOption: null, permission: 'rw' }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } }; deleteShareItem = (groupID) => { let path = this.props.itemPath; let repoID = this.props.repoID; if (this.props.isGroupOwnedRepo) { seafileAPI.deleteGroupOwnedRepoSharedGroupItem(repoID, groupID, path).then(() => { this.setState({ sharedItems: this.state.sharedItems.filter(item => { return item.group_info.id !== groupID; }) }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } else { seafileAPI.deleteShareToGroupItem(repoID, path, 'group', groupID).then(() => { this.setState({ sharedItems: this.state.sharedItems.filter(item => { return item.group_info.id !== groupID; }) }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } }; onChangeUserPermission = (item, permission) => { let path = this.props.itemPath; let repoID = this.props.repoID; let groupID = item.group_info.id; if (this.props.isGroupOwnedRepo) { seafileAPI.modifyGroupOwnedRepoGroupSharedPermission(repoID, permission, groupID, path).then(() => { this.updateSharedItems(item, permission); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } else { seafileAPI.updateShareToGroupItemPermission(repoID, path, 'group', groupID, permission).then(() => { this.updateSharedItems(item, permission); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); } }; updateSharedItems = (item, permission) => { let groupID = item.group_info.id; let sharedItems = this.state.sharedItems.map(sharedItem => { let sharedItemGroupID = sharedItem.group_info.id; if (groupID === sharedItemGroupID) { sharedItem.permission = permission; sharedItem.is_admin = permission === 'admin' ? true : false; } return sharedItem; }); this.setState({sharedItems: sharedItems}); }; render() { const thead = ( {gettext('Group')} {gettext('Permission')} ); return ( {thead} {this.state.errorMsg.length > 0 && this.state.errorMsg.map((item, index) => { let errMessage = item.group_name + ': ' + item.error_msg; return ( ); }) }

{errMessage}

{thead}
); } } ShareToGroup.propTypes = propTypes; export default ShareToGroup;