import React from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; import { gettext, isPro, folderPermEnabled, enableRepoSnapshotLabel, enableResetEncryptedRepoPassword, isEmailConfigured, enableMultipleOfficeSuite } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import MobileItemMenu from '../../components/mobile-item-menu'; const propTypes = { isPC: PropTypes.bool, repo: PropTypes.object.isRequired, isStarred: PropTypes.bool, onFreezedItem: PropTypes.func, onUnfreezedItem: PropTypes.func, onMenuItemClick: PropTypes.func.isRequired, }; class MylibRepoMenu extends React.Component { constructor(props) { super(props); this.state = { isItemMenuShow: false, isAdvancedMenuShown: false }; } onMenuItemClick = (e) => { const operation = Utils.getEventData(e, 'toggle'); this.props.onMenuItemClick(operation); }; onMenuItemKeyDown = (e) => { if (e.key == 'Enter' || e.key == 'Space') { this.onMenuItemClick(e); } }; onDropdownToggleClick = (e) => { this.toggleOperationMenu(e); }; onDropdownToggleKeyDown = (e) => { if (e.key == 'Enter' || e.key == 'Space') { this.onDropdownToggleClick(e); } }; toggleOperationMenu = (e) => { const { isLibView } = this.props; if (isLibView) { this.setState({ isItemMenuShow: !this.state.isItemMenuShow }); return; } let dataset = e.target ? e.target.dataset : null; if (dataset && dataset.toggle && dataset.toggle === 'Rename') { this.setState({ isItemMenuShow: !this.state.isItemMenuShow }); return; } this.setState( { isItemMenuShow: !this.state.isItemMenuShow }, () => { if (this.state.isItemMenuShow) { this.props.onFreezedItem(); } else { this.props.onUnfreezedItem(); } } ); }; toggleAdvancedMenuShown = (e) => { this.setState({ isAdvancedMenuShown: true }); }; toggleAdvancedMenu = (e) => { e.stopPropagation(); this.setState({ isAdvancedMenuShown: !this.state.isAdvancedMenuShown }, () => { this.toggleOperationMenu(e); }); }; onDropDownMouseMove = (e) => { if (this.state.isAdvancedMenuShown && e.target && e.target.className === 'dropdown-item') { this.setState({ isAdvancedMenuShown: false }); } }; generatorOperations = () => { let repo = this.props.repo; let showResetPasswordMenuItem = isPro && repo.encrypted && enableResetEncryptedRepoPassword && isEmailConfigured; let operations = ['Rename', 'Transfer']; if (folderPermEnabled) { operations.push('Folder Permission'); } operations.push('Share Admin', 'Divider'); if (repo.encrypted) { operations.push('Change Password'); } if (showResetPasswordMenuItem) { operations.push('Reset Password'); } operations.push('Divider', 'Advanced'); // Remove adjacent excess 'Divider' for (let i = 0; i < operations.length; i++) { if (operations[i] === 'Divider' && operations[i + 1] === 'Divider') { operations.splice(i, 1); i--; } } return operations; }; getAdvancedOperations = () => { const operations = []; operations.push('API Token'); if (this.props.isPC && enableRepoSnapshotLabel) { operations.push('Label Current State'); } if (enableMultipleOfficeSuite && isPro) { operations.push('Office Suite'); } return operations; }; translateOperations = (item) => { let translateResult = ''; switch (item) { case 'Star': translateResult = gettext('Star'); break; case 'Unstar': translateResult = gettext('Unstar'); break; case 'Share': translateResult = gettext('Share'); break; case 'Delete': translateResult = gettext('Delete'); break; case 'Rename': translateResult = gettext('Rename'); break; case 'Transfer': translateResult = gettext('Transfer'); break; case 'Change Password': translateResult = gettext('Change Password'); break; case 'Reset Password': translateResult = gettext('Reset Password'); break; case 'Folder Permission': translateResult = gettext('Folder Permission'); break; case 'Label Current State': translateResult = gettext('Label Current State'); break; case 'API Token': translateResult = 'API Token'; // translation is not needed here break; case 'Share Admin': translateResult = gettext('Share Admin'); break; case 'Advanced': translateResult = gettext('Advanced'); break; case 'Office Suite': translateResult = gettext('Office Suite'); break; default: break; } return translateResult; }; render() { let operations = this.generatorOperations(); const advancedOperations = this.getAdvancedOperations(); const { children, isLibView } = this.props; // pc menu if (this.props.isPC) { return ( {children} {operations.map((item, index) => { if (item == 'Divider') { return ; } else if (item == 'Advanced') { return ( {e.stopPropagation();}} > {this.translateOperations(item)} {advancedOperations.map((item, index) => { return ({this.translateOperations(item)}); })} ); } else { return ({this.translateOperations(item)}); } })} ); } // mobile menu operations.pop(); // removed the last item 'Advanced' operations.unshift('Delete'); operations.unshift('Share'); this.props.isStarred ? operations.unshift('Unstar') : operations.unshift('Star'); return ( {operations.filter(item => item != 'Divider').map((item, index) => { return ({this.translateOperations(item)}); })} ); } } MylibRepoMenu.propTypes = propTypes; export default MylibRepoMenu;