import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import toaster from '../../../../components/toast'; import { gettext } from '../../../../utils/constants'; import Icon from '../../../../components/icon'; export default class PageDropdownMenu extends Component { static propTypes = { view: PropTypes.object.isRequired, views: PropTypes.array, tableGridsLength: PropTypes.number, folderId: PropTypes.string, canDelete: PropTypes.bool, canDuplicate: PropTypes.bool, renderFolderMenuItems: PropTypes.func, toggle: PropTypes.func, toggleViewEditor: PropTypes.func, duplicatePage: PropTypes.func, onSetFolderId: PropTypes.func, onDeleteView: PropTypes.func, onModifyViewType: PropTypes.func, onMoveViewToFolder: PropTypes.func, isOnlyOneView: PropTypes.bool, }; constructor(props) { super(props); this.state = { isShowMenu: false, }; this.pageNameMap = this.calculateNameMap(); } calculateNameMap = () => { const { views } = this.props; return views.reduce((map, view) => { map[view.name] = true; return map; }, {}); }; onDropdownToggle = (evt) => { if (evt.target && this.foldersDropdownToggle && this.foldersDropdownToggle.contains(evt.target)) { return; } evt.stopPropagation(); this.props.toggle(); }; onRenameView = (event) => { event.nativeEvent.stopImmediatePropagation(); this.props.toggleViewEditor(); }; onDeleteView = (event) => { event.nativeEvent.stopImmediatePropagation(); this.props.onDeleteView(); }; onModifyViewType = (event) => { event.nativeEvent.stopImmediatePropagation(); this.props.onModifyViewType(); }; onMoveViewToFolder = (targetFolderId) => { this.props.onMoveViewToFolder(targetFolderId); }; onRemoveFromFolder = (evt) => { evt.nativeEvent.stopImmediatePropagation(); this.props.onMoveViewToFolder(null); }; onToggleFoldersMenu = () => { this.setState({ isShowMenu: !this.state.isShowMenu }); }; duplicatePage = () => { const { view, folderId } = this.props; const { id: from_page_id, name } = view; let duplicateCount = 1; let newName = name + '(copy)'; while (this.pageNameMap[newName]) { newName = `${name}(copy${duplicateCount})`; duplicateCount++; } const onsuccess = () => {}; this.props.onSetFolderId(folderId); this.props.duplicatePage({ name: newName, from_page_id }, onsuccess, this.duplicatePageFailure); }; duplicatePageFailure = () => { toaster.danger(gettext('Failed_to_duplicate_page')); }; showMenu = () => { this.setState({ isShowMenu: true }); }; hideMenu = () => { this.setState({ isShowMenu: false }); }; render() { const { folderId, canDelete, canDuplicate, renderFolderMenuItems, tableGridsLength, isOnlyOneView, } = this.props; const folderMenuItems = renderFolderMenuItems && renderFolderMenuItems({ currentFolderId: folderId, onMoveViewToFolder: this.onMoveViewToFolder }); return ( {gettext('Modify name')} {canDuplicate && {gettext('Duplicate page')} } {(isOnlyOneView || tableGridsLength === 1 || !canDelete) ? '' : ( {gettext('Delete page')} )} {folderId && {gettext('Remove from folder')} } {renderFolderMenuItems && folderMenuItems.length > 0 && { evt.stopPropagation(); evt.nativeEvent.stopImmediatePropagation(); this.showMenu(); }} onMouseEnter={this.showMenu} onMouseLeave={this.hideMenu} >
this.foldersDropdownToggle = ref}> {gettext('Move to')}
{this.state.isShowMenu && {folderMenuItems} }
}
); } }