From 79462f5fd39c2f8a669ef5afbe460728e629ab46 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 16:27:20 +0800 Subject: [PATCH] package text-dropdown-menu for text-button dropdown menu --- .../dropdown-menu/item-dropdown-menu.js | 3 +- .../dropdown-menu/text-dropdown-menu.js | 105 ++++++++++++++++++ .../components/toolbar/view-file-toolbar.js | 36 +++--- 3 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 frontend/src/components/dropdown-menu/text-dropdown-menu.js diff --git a/frontend/src/components/dropdown-menu/item-dropdown-menu.js b/frontend/src/components/dropdown-menu/item-dropdown-menu.js index dcf73818dd..c8988d9b1c 100644 --- a/frontend/src/components/dropdown-menu/item-dropdown-menu.js +++ b/frontend/src/components/dropdown-menu/item-dropdown-menu.js @@ -30,7 +30,6 @@ class ItemDropDownMenu extends React.Component { menuList: [], isItemMenuShow: false, }; - } componentDidMount() { @@ -96,7 +95,7 @@ class ItemDropDownMenu extends React.Component { onMenuItemClick = (event) => { let operation = event.target.dataset.toggle; - this.props.onMenuItemClick(operation); + this.props.onMenuItemClick(operation, event); } render() { diff --git a/frontend/src/components/dropdown-menu/text-dropdown-menu.js b/frontend/src/components/dropdown-menu/text-dropdown-menu.js new file mode 100644 index 0000000000..2087ad55c3 --- /dev/null +++ b/frontend/src/components/dropdown-menu/text-dropdown-menu.js @@ -0,0 +1,105 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import listener from '../context-menu/globalEventListener'; +import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; +import { gettext } from '../../utils/constants'; + +const propTypes = { + menuClass: PropTypes.string, + menuType: PropTypes.oneOf(['pc', 'mobile']), + menuChildren: PropTypes.string.isRequired, + menuList: PropTypes.array.isRequired, + isHandleContextMenuEvent: PropTypes.bool, + onMenuItemClick: PropTypes.func.isRequired, +}; + +class TextDropDownMenu extends React.Component { + + static defaultProps = { + isHandleContextMenuEvent: true, + menuType: 'pc', + }; + + constructor(props) { + super(props); + this.state = { + isItemMenuShow: false, + }; + } + + componentDidMount() { + if (this.props.isHandleContextMenuEvent) { + this.listenerId = listener.register(this.onShowMenu, this.onHideMenu); + } + } + + componentWillUnmount() { + if (this.props.isHandleContextMenuEvent && this.listenerId) { + listener.unregister(this.listenerId); + } + } + + onShowMenu = () => { + // nothing todo + } + + onHideMenu = () => { + if (this.state.isItemMenuShow) { + this.setState({isItemMenuShow: false}); + } + } + + onDropdownToggleClick = (e) => { + e.preventDefault(); + e.stopPropagation(); + + this.toggleOperationMenu(); + } + + toggleOperationMenu = () => { + this.setState({isItemMenuShow: !this.state.isItemMenuShow}); + } + + onMenuItemClick = (event) => { + let operation = event.target.dataset.toggle; + this.props.onMenuItemClick(operation, event); + } + + render() { + let { menuClass, menuChildren, menuList } = this.props; + menuClass = 'btn btn-secondary operation-item ' + menuClass; + + if (!menuList.length) { + return ''; + } + + return ( + + + {menuChildren} + + + {menuList.map((menuItem, index) => { + if (menuItem === 'Divider') { + return ; + } else { + return ( + {menuItem.value} + ); + } + })} + + + ); + } +} + +TextDropDownMenu.propTypes = propTypes; + +export default TextDropDownMenu; diff --git a/frontend/src/components/toolbar/view-file-toolbar.js b/frontend/src/components/toolbar/view-file-toolbar.js index f636d6e557..1809fb7404 100644 --- a/frontend/src/components/toolbar/view-file-toolbar.js +++ b/frontend/src/components/toolbar/view-file-toolbar.js @@ -4,10 +4,12 @@ import { DropdownToggle, Dropdown, DropdownMenu, DropdownItem, Tooltip} from 're import { Utils } from '../../utils/utils'; import { gettext, siteRoot } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; +import TextTranslation from '../../utils/text-translation'; import ModalPotal from '../modal-portal'; import ShareDialog from '../dialog/share-dialog'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import RelatedFileDialogs from '../dialog/related-file-dialogs'; +import TextDropDownMenu from '../dropdown-menu/text-dropdown-menu'; const propTypes = { path: PropTypes.string.isRequired, @@ -31,7 +33,6 @@ class ViewFileToolbar extends React.Component { super(props); this.state = { isDraftMessageShow: false, - isMoreMenuShow: false, isShareDialogShow: false, isEditTagDialogShow: false, isRelatedFileDialogShow: false, @@ -58,8 +59,20 @@ class ViewFileToolbar extends React.Component { this.setState({isDraftMessageShow: !this.state.isDraftMessageShow}); } - toggleMore = () => { - this.setState({isMoreMenuShow: !this.state.isMoreMenuShow}); + onMenuItemClick = (operation) => { + switch (operation) { + case 'Share': + this.onShareToggle(); + break; + case 'Tags': + this.onEditFileTagToggle(); + break; + case 'Related Files': + this.onListRelatedFileToggle(); + break; + default: + break; + } } onShareToggle = () => { @@ -104,16 +117,13 @@ class ViewFileToolbar extends React.Component { )} {filePermission === 'rw' && ( - - - {gettext('More')} - - - {gettext('Share')} - {gettext('Tags')} - {gettext('Related Files')} - - + )} {this.state.isShareDialogShow && (