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;