From c827c880f92cbca59ed30788b93697e022aa4a68 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 10:43:34 +0800 Subject: [PATCH 01/15] package drop-down menu component --- .../dirent-list-view/dirent-list-item.js | 27 ++-- .../dirent-list-view/dirent-list-view.js | 1 + .../components/dropdown-menu/dropdown-menu.js | 129 ++++++++++++++++++ 3 files changed, 146 insertions(+), 11 deletions(-) create mode 100644 frontend/src/components/dropdown-menu/dropdown-menu.js diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index b21b71b46e..edf87a84f2 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -6,7 +6,7 @@ import { gettext, siteRoot, mediaUrl } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; -import DirentMenu from './dirent-menu'; +import DropDownMenu from '../dropdown-menu/dropdown-menu'; import Rename from '../rename'; import ModalPortal from '../modal-portal'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; @@ -44,6 +44,7 @@ const propTypes = { onItemContextMenu: PropTypes.func.isRequired, selectedDirentList: PropTypes.array.isRequired, activeDirent: PropTypes.object, + getDirentItemMenuList: PropTypes.func.isRequired, }; class DirentListItem extends React.Component { @@ -428,13 +429,15 @@ class DirentListItem extends React.Component {
  • -
  • @@ -457,13 +460,15 @@ class DirentListItem extends React.Component {
  • -
  • diff --git a/frontend/src/components/dirent-list-view/dirent-list-view.js b/frontend/src/components/dirent-list-view/dirent-list-view.js index 383504a34d..6c1402f193 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-view.js +++ b/frontend/src/components/dirent-list-view/dirent-list-view.js @@ -584,6 +584,7 @@ class DirentListView extends React.Component { selectedDirentList={this.props.selectedDirentList} activeDirent={this.state.activeDirent} onFileTagChanged={this.props.onFileTagChanged} + getDirentItemMenuList={this.getDirentItemMenuList} /> ); })} diff --git a/frontend/src/components/dropdown-menu/dropdown-menu.js b/frontend/src/components/dropdown-menu/dropdown-menu.js new file mode 100644 index 0000000000..1a137ed28e --- /dev/null +++ b/frontend/src/components/dropdown-menu/dropdown-menu.js @@ -0,0 +1,129 @@ +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 = { + tagName: PropTypes.string, + opItem: PropTypes.object.isRequired, + menuType: PropTypes.oneOf(['pc', 'mobile']).isRequired, + menuClass: PropTypes.string.isRequired, + isHandleContextMenuEvent: PropTypes.bool, + getOpItemMenuList: PropTypes.func.isRequired, + onMenuItemClick: PropTypes.func.isRequired, + onFrezeedItem: PropTypes.func, + onUnfrezeedItem: PropTypes.func, +}; + +class DropDownMenu extends React.Component { + + static defaultProps = { + isHandleContextMenuEvent: false, + menuType: 'pc', + }; + + constructor(props) { + super(props); + this.state = { + menuList: [], + isItemMenuShow: false, + }; + + } + + componentDidMount() { + if (this.props.isHandleContextMenuEvent) { + this.listenerId = listener.register(this.onShowMenu, this.onHideMenu); + } + let { opItem, menuType } = this.props; + + // scene 1: menuType === 'pc', Get some menu operations + // scene 2: menuType === 'mobile', Get all menu operations + let isAllOperations = menuType === 'pc' ? false : true; + let menuList = this.props.getOpItemMenuList(opItem, isAllOperations); + this.setState({menuList: menuList}); + } + + componentWillUnmount() { + if (this.props.isHandleContextMenuEvent && this.listenerId) { + listener.unregister(this.listenerId); + } + } + + onShowMenu = () => { + // nothing todo + } + + onHideMenu = () => { + if (this.state.isItemMenuShow) { + this.setState({isItemMenuShow: false}); + if (typeof(this.props.onUnfreezedItem) === 'function') { + this.props.onUnfreezedItem(); + } + } + } + + onDropdownToggleClick = (e) => { + e.preventDefault(); + e.stopPropagation(); + + this.toggleOperationMenu(); + } + + toggleOperationMenu = () => { + this.setState( + {isItemMenuShow: !this.state.isItemMenuShow}, + () => { + if (this.state.isItemMenuShow && typeof(this.props.onFreezedItem) === 'function') { + this.props.onFreezedItem(); + } else if (!this.state.isItemMenuShow && typeof(this.props.onUnfreezedItem) === 'function') { + this.props.onUnfreezedItem(); + } + } + ); + } + + onMenuItemClick = (event) => { + let operation = event.target.dataset.toggle; + this.props.onMenuItemClick(operation); + } + + render() { + let menuList = this.state.menuList; + let { menuClass, tagName } = this.props; + menuClass = 'sf-dropdown-toggle ' + menuClass; + + if (!menuList.length) { + return ''; + } + + return ( + + + + {menuList.map((menuItem, index) => { + if (menuItem === 'Divider') { + return ; + } else { + return ( + {menuItem.value} + ); + } + })} + + + ); + } +} + +DropDownMenu.propTypes = propTypes; + +export default DropDownMenu; From 681adcf27b188c58d5b3c92e082e6642aea966cd Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 13:57:58 +0800 Subject: [PATCH 02/15] improve dropdown-menu --- .../components/dropdown-menu/dropdown-menu.js | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/dropdown-menu/dropdown-menu.js b/frontend/src/components/dropdown-menu/dropdown-menu.js index 1a137ed28e..ff4733ace7 100644 --- a/frontend/src/components/dropdown-menu/dropdown-menu.js +++ b/frontend/src/components/dropdown-menu/dropdown-menu.js @@ -1,14 +1,14 @@ import React from 'react'; import PropTypes from 'prop-types'; import listener from '../context-menu/globalEventListener'; -import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; +import { Dropdown, ButtonDropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; import { gettext } from '../../utils/constants'; const propTypes = { tagName: PropTypes.string, opItem: PropTypes.object.isRequired, - menuType: PropTypes.oneOf(['pc', 'mobile']).isRequired, - menuClass: PropTypes.string.isRequired, + menuType: PropTypes.oneOf(['pc', 'mobile']), + menuClass: PropTypes.string, isHandleContextMenuEvent: PropTypes.bool, getOpItemMenuList: PropTypes.func.isRequired, onMenuItemClick: PropTypes.func.isRequired, @@ -19,8 +19,9 @@ const propTypes = { class DropDownMenu extends React.Component { static defaultProps = { - isHandleContextMenuEvent: false, + isHandleContextMenuEvent: true, menuType: 'pc', + menuClass: 'sf2-icon-caret-down' }; constructor(props) { @@ -45,6 +46,15 @@ class DropDownMenu extends React.Component { this.setState({menuList: menuList}); } + componentWillReceiveProps(nextProps) { // for toolbar opItem operation + let { opItem, menuType } = nextProps; + if (opItem.name !== this.props.opItem.name) { + let isAllOperations = menuType === 'pc' ? false : true; + let menuList = this.props.getOpItemMenuList(opItem, isAllOperations); + this.setState({menuList: menuList}); + } + } + componentWillUnmount() { if (this.props.isHandleContextMenuEvent && this.listenerId) { listener.unregister(this.listenerId); @@ -98,6 +108,32 @@ class DropDownMenu extends React.Component { return ''; } + if (tagName && tagName === 'button') { + return ( + + + + + {menuList.map((menuItem, index) => { + if (menuItem === 'Divider') { + return ; + } else { + return ( + {menuItem.value} + ); + } + })} + + + ); + } + return ( {menuList.map((menuItem, index) => { if (menuItem === 'Divider') { - return ; + return ; } else { return ( {menuItem.value} From da09d856cc8f0a905826dead4a0d8e9d5db339e5 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 14:02:12 +0800 Subject: [PATCH 03/15] optimized toolbar more operation menu --- .../toolbar/mutilple-dir-operation-toolbar.js | 45 ++++++++++++++++--- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js index 0c33189856..67de358092 100644 --- a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js @@ -2,17 +2,20 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Button, ButtonGroup } from 'reactstrap'; import { gettext } from '../../utils/constants'; -import { Utils } from '../../utils/utils'; +import { Utils, isPro } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; +import TextTranslation from '../../utils/text-translation'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; import CopyDirentDialog from '../dialog/copy-dirent-dialog'; -import DirentsMenu from '../dirent-list-view/dirents-menu'; import ShareDialog from '../dialog/share-dialog'; import RelatedFileDialogs from '../dialog/related-file-dialogs'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import ZipDownloadDialog from '../dialog/zip-download-dialog'; import ModalPortal from '../modal-portal'; +import DropDownMenu from '../dropdown-menu/dropdown-menu'; + +import '../../css/dirents-menu.css'; const propTypes = { path: PropTypes.string.isRequired, @@ -83,6 +86,35 @@ class MutipleDirOperationToolbar extends React.Component { }); } + getDirentMenuList = (dirent) => { + let menuList = []; + let currentRepoInfo = this.props.currentRepoInfo; + + const { SHARE, TAGS, RELATED_FILES, HISTORY, OPEN_VIA_CLIENT, LOCK, UNLOCK } = TextTranslation; + + if (dirent.type === 'dir') { + menuList = [SHARE]; + return menuList; + } + + if (dirent.type === 'file') { + menuList = [SHARE, TAGS, RELATED_FILES, 'Divider', HISTORY, 'Divider', OPEN_VIA_CLIENT]; + if (!Utils.isMarkdownFile(dirent.name)) { + menuList.splice(2, 1); + } + if (isPro) { + if (dirent.is_locked) { + if (dirent.locked_by_me || (dirent.lock_owner === 'OnlineOffice' && currentRepoInfo.permission === 'rw')) { + menuList.splice(1, 0, UNLOCK); + } + } else { + menuList.splice(1, 0, LOCK); + } + } + return menuList; + } + } + onMenuItemClick = (operation) => { const dirents = this.props.selectedDirentList; const dirent = dirents[0]; @@ -250,10 +282,13 @@ class MutipleDirOperationToolbar extends React.Component { {this.props.selectedDirentList.length === 1 && - } From bafc77f17ef83b2e08d953f18ac712f3dc831d6d Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 15:23:32 +0800 Subject: [PATCH 04/15] rename dropdown-menu to item-dropdown-menu --- .../src/components/dirent-list-view/dirent-list-item.js | 6 +++--- .../{dropdown-menu.js => item-dropdown-menu.js} | 6 +++--- .../components/toolbar/mutilple-dir-operation-toolbar.js | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) rename frontend/src/components/dropdown-menu/{dropdown-menu.js => item-dropdown-menu.js} (97%) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index edf87a84f2..9a32ba1e0b 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -6,7 +6,7 @@ import { gettext, siteRoot, mediaUrl } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; -import DropDownMenu from '../dropdown-menu/dropdown-menu'; +import ItemDropDownMenu from '../dropdown-menu/dropdown-menu'; import Rename from '../rename'; import ModalPortal from '../modal-portal'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; @@ -429,7 +429,7 @@ class DirentListItem extends React.Component {
  • -
  • - {this.props.selectedDirentList.length === 1 && - Date: Sun, 21 Apr 2019 16:25:43 +0800 Subject: [PATCH 05/15] repair import bug --- frontend/src/components/dirent-list-view/dirent-list-item.js | 2 +- .../src/components/toolbar/mutilple-dir-operation-toolbar.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index 9a32ba1e0b..3ba49c636c 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -6,7 +6,7 @@ import { gettext, siteRoot, mediaUrl } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; -import ItemDropDownMenu from '../dropdown-menu/dropdown-menu'; +import ItemDropDownMenu from '../dropdown-menu/item-dropdown-menu'; import Rename from '../rename'; import ModalPortal from '../modal-portal'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; diff --git a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js index cec6cf45e9..d169060bce 100644 --- a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js @@ -13,7 +13,7 @@ import RelatedFileDialogs from '../dialog/related-file-dialogs'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import ZipDownloadDialog from '../dialog/zip-download-dialog'; import ModalPortal from '../modal-portal'; -import ItemDropDownMenu from '../dropdown-menu/dropdown-menu'; +import ItemDropDownMenu from '../dropdown-menu/item-dropdown-menu'; import '../../css/dirents-menu.css'; 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 06/15] 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 && ( From d90d486864044d619c78bbb40165ec8761c97d31 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 16:29:26 +0800 Subject: [PATCH 07/15] delete unnecessary code --- .../dirent-list-view/dirent-menu.js | 220 ------------------ .../dirent-list-view/dirents-menu.js | 101 -------- 2 files changed, 321 deletions(-) delete mode 100644 frontend/src/components/dirent-list-view/dirent-menu.js delete mode 100644 frontend/src/components/dirent-list-view/dirents-menu.js diff --git a/frontend/src/components/dirent-list-view/dirent-menu.js b/frontend/src/components/dirent-list-view/dirent-menu.js deleted file mode 100644 index 9fa4d33350..0000000000 --- a/frontend/src/components/dirent-list-view/dirent-menu.js +++ /dev/null @@ -1,220 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import listener from '../context-menu/globalEventListener'; -import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap'; -import { gettext, isPro, enableFileComment, fileAuditEnabled, folderPermEnabled } from '../../utils/constants'; - -const propTypes = { - dirent: PropTypes.object.isRequired, - currentRepoInfo: PropTypes.object.isRequired, - isRepoOwner: PropTypes.bool.isRequired, - onMenuItemClick: PropTypes.func.isRequired, - onFreezedItem: PropTypes.func.isRequired, - onUnfreezedItem: PropTypes.func.isRequired, -}; - -class DirentMenu extends React.Component { - - constructor(props) { - super(props); - this.state = { - isItemMenuShow: false, - menuList: [], - }; - } - - componentDidMount() { - this.listenerId = listener.register(this.onShowMenu, this.onHideMenu); - let { currentRepoInfo, dirent, isRepoOwner } = this.props; - let menuList = this.calculateMenuList(currentRepoInfo, dirent, isRepoOwner); - this.setState({menuList: menuList}); - } - - componentWillReceiveProps(nextProps) { - let { currentRepoInfo, dirent, isRepoOwner } = nextProps; - let menuList = this.calculateMenuList(currentRepoInfo, dirent, isRepoOwner); - this.setState({menuList: menuList}); - - } - - componentWillUnmount () { - if (this.listenerId) { - listener.unregister(this.listenerId); - } - } - - onShowMenu = () => { - // nothing todo - } - - onHideMenu = () => { - if (this.state.isItemMenuShow) { - this.setState({isItemMenuShow: false}); - this.props.onUnfreezedItem(); - } - } - - calculateMenuList(currentRepoInfo, dirent, isRepoOwner) { - - let type = dirent.type; - let permission = dirent.permission; - let can_set_folder_perm = folderPermEnabled && ((isRepoOwner && currentRepoInfo.has_been_shared_out) || currentRepoInfo.is_admin); - if (type === 'dir' && permission === 'rw') { - let menuList = []; - if (can_set_folder_perm) { - menuList = ['Rename', 'Move', 'Copy', 'Divider', 'Permission', 'Divider', 'Open via Client']; - } else { - menuList = ['Rename', 'Move', 'Copy', 'Divider', 'Open via Client']; - } - return menuList; - } - - if (type === 'dir' && permission === 'r') { - let menuList = currentRepoInfo.encrypted ? ['Copy'] : []; - return menuList; - } - - if (type === 'file' && permission === 'rw') { - let menuList = []; - if (!dirent.is_locked || (dirent.is_locked && dirent.locked_by_me)) { - menuList.push('Rename'); - menuList.push('Move'); - } - menuList.push('Copy'); - menuList.push('Tags'); - if (isPro) { - if (dirent.is_locked) { - if (dirent.locked_by_me || (dirent.lock_owner === 'OnlineOffice' && permission === 'rw')) { - menuList.push('Unlock'); - } - } else { - menuList.push('Lock'); - } - } - menuList.push('Divider'); - if (enableFileComment) { - menuList.push('Comment'); - } - menuList.push('History'); - if (fileAuditEnabled) { - menuList.push('Access Log'); - } - menuList.push('Divider'); - menuList.push('Open via Client'); - return menuList; - } - - if (type === 'file' && permission === 'r') { - let menuList = []; - if (!currentRepoInfo.encrypted) { - menuList.push('Copy'); - } - if (enableFileComment) { - menuList.push('Comment'); - } - menuList.push('History'); - return menuList; - } - - return []; - } - - translateMenuItem = (menuItem) => { - let translateResult = ''; - switch(menuItem) { - case 'Rename': - translateResult = gettext('Rename'); - break; - case 'Move': - translateResult = gettext('Move'); - break; - case 'Copy': - translateResult = gettext('Copy'); - break; - case 'Tags': - translateResult = gettext('Tags'); - break; - case 'Permission': - translateResult = gettext('Permission'); - break; - case 'Unlock': - translateResult = gettext('Unlock'); - break; - case 'Lock': - translateResult = gettext('Lock'); - break; - case 'Comment': - translateResult = gettext('Comment'); - break; - case 'History': - translateResult = gettext('History'); - break; - case 'Access Log': - translateResult = gettext('Access Log'); - break; - case 'Open via Client': - translateResult = gettext('Open via Client'); - break; - default: - break; - } - return translateResult; - } - - onDropdownToggleClick = (e) => { - e.preventDefault(); - e.stopPropagation(); - this.toggleOperationMenu(); - } - - toggleOperationMenu = () => { - this.setState( - {isItemMenuShow: !this.state.isItemMenuShow}, - () => { - if (this.state.isItemMenuShow) { - this.props.onFreezedItem(); - } else { - this.props.onUnfreezedItem(); - } - } - ); - } - - onMenuItemClick = (event) => { - let operation = event.target.dataset.toggle; - this.props.onMenuItemClick(operation); - } - - render() { - if (!this.state.menuList.length) { - return ''; - } - return ( - - - - {this.state.menuList.map((menuItem, index) => { - if (menuItem === 'Divider') { - return ; - } else { - return ( - {this.translateMenuItem(menuItem)} - ); - } - })} - - - ); - } -} - -DirentMenu.propTypes = propTypes; - -export default DirentMenu; diff --git a/frontend/src/components/dirent-list-view/dirents-menu.js b/frontend/src/components/dirent-list-view/dirents-menu.js deleted file mode 100644 index bb1319c9fe..0000000000 --- a/frontend/src/components/dirent-list-view/dirents-menu.js +++ /dev/null @@ -1,101 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; -import { DropdownMenu, DropdownToggle, DropdownItem, ButtonDropdown } from 'reactstrap'; -import { Utils } from '../../utils/utils'; -import { gettext, isPro } from '../../utils/constants'; -import TextTranslation from '../../utils/text-translation'; - -import '../../css/dirents-menu.css'; - -const propTypes = { - dirent: PropTypes.object.isRequired, - currentRepoInfo: PropTypes.object.isRequired, - onMenuItemClick: PropTypes.func.isRequired, -}; - -class DirentMenu extends React.Component { - - constructor(props) { - super(props); - this.state = { - isItemMenuShow: false, - menuList: [], - }; - } - - componentDidMount() { - const { currentRepoInfo, dirent } = this.props; - let menuList = this.calculateMenuList(currentRepoInfo, dirent); - this.setState({menuList: menuList}); - } - - componentWillReceiveProps(nextProps) { - const { currentRepoInfo, dirent } = nextProps; - let menuList = this.calculateMenuList(currentRepoInfo, dirent); - this.setState({menuList: menuList}); - } - - calculateMenuList(currentRepoInfo, dirent) { - let menuList = []; - const { SHARE, TAGS, RELATED_FILES, HISTORY, OPEN_VIA_CLIENT, LOCK, UNLOCK } = TextTranslation; - - if (dirent.type === 'dir') { - menuList = [SHARE]; - return menuList; - } - - if (dirent.type === 'file') { - menuList = [SHARE, TAGS, RELATED_FILES, 'Divider', HISTORY, 'Divider', OPEN_VIA_CLIENT]; - if (!Utils.isMarkdownFile(dirent.name)) { - menuList.splice(2, 1); - } - if (isPro) { - if (dirent.is_locked) { - if (dirent.locked_by_me || (dirent.lock_owner === 'OnlineOffice' && currentRepoInfo.permission === 'rw')) { - menuList.splice(1, 0, UNLOCK); - } - } else { - menuList.splice(1, 0, LOCK); - } - } - return menuList; - } - } - - onDropdownToggleClick = (e) => { - e.preventDefault(); - this.setState({ - isItemMenuShow: !this.state.isItemMenuShow, - }); - } - - onMenuItemClick = (event) => { - let operation = event.target.dataset.toggle; - this.props.onMenuItemClick(operation, this.props.dirent); - } - - render() { - - return ( - - - - - {this.state.menuList.map((menuItem, index) => { - if (menuItem === 'Divider') { - return ; - } else { - return ( - {menuItem.value} - ); - } - })} - - - ); - } -} - -DirentMenu.propTypes = propTypes; - -export default DirentMenu; From 3a3b9e213a5fd84a0a5538ea986300b5b99ef84d Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 16:44:15 +0800 Subject: [PATCH 08/15] improve tree-node-menu code --- .../components/tree-view/tree-node-menu.js | 137 ------------------ .../components/tree-view/tree-node-view.js | 25 +++- 2 files changed, 18 insertions(+), 144 deletions(-) delete mode 100644 frontend/src/components/tree-view/tree-node-menu.js diff --git a/frontend/src/components/tree-view/tree-node-menu.js b/frontend/src/components/tree-view/tree-node-menu.js deleted file mode 100644 index deab669009..0000000000 --- a/frontend/src/components/tree-view/tree-node-menu.js +++ /dev/null @@ -1,137 +0,0 @@ -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 = { - node: PropTypes.object.isRequired, - onMenuItemClick: PropTypes.func.isRequired, - onFreezedItem: PropTypes.func.isRequired, - onUnFreezedItem: PropTypes.func.isRequired, -}; - -class TreeNodeMenu extends React.Component { - - constructor(props) { - super(props); - this.state = { - isItemMenuShow: false, - menuList: [] - }; - } - - componentDidMount() { - let menuList = this.caculateMenuList(); - this.setState({menuList: menuList}); - this.listenerId = listener.register(this.onShowMenu, this.onHideMenu); - } - - componentWillUnmount () { - if (this.listenerId) { - listener.unregister(this.listenerId); - } - } - - onShowMenu = () => { - // nothing todo - } - - onHideMenu = () => { - if (this.state.isItemMenuShow) { - this.setState({isItemMenuShow: false}); - this.props.onUnFreezedItem(); - } - } - - caculateMenuList() { - let { node } = this.props; - let menuList = []; - if (node.object.type === 'dir') { - menuList = ['New Folder', 'New File', 'Copy', 'Move', 'Rename', 'Delete']; - } else { - menuList = ['Rename', 'Delete', 'Copy', 'Move', 'Open in New Tab']; - } - return menuList; - } - - translateMenuItem = (menuItem) => { - let translateResult = ''; - switch(menuItem) { - case 'New Folder': - translateResult = gettext('New Folder'); - break; - case 'New File': - translateResult = gettext('New File'); - break; - case 'Rename': - translateResult = gettext('Rename'); - break; - case 'Copy': - translateResult = gettext('Copy'); - break; - case 'Move': - translateResult = gettext('Move'); - break; - case 'Delete': - translateResult = gettext('Delete'); - break; - case 'Open in New Tab': - translateResult = gettext('Open in New Tab'); - break; - default: - break; - } - return translateResult; - } - - onDropdownToggleClick = (e) => { - e.preventDefault(); - this.toggleOperationMenu(e); - } - - toggleOperationMenu = (e) => { - e.stopPropagation(); - this.setState( - {isItemMenuShow: !this.state.isItemMenuShow }, () => { - if (this.state.isItemMenuShow) { - this.props.onFreezedItem(); - } else { - this.props.onUnFreezedItem(); - } - } - ); - } - - onMenuItemClick = (event) => { - let operation = event.target.dataset.toggle; - let node = this.props.node; - this.props.onMenuItemClick(operation, node); - } - - render() { - return ( - - - - {this.state.menuList.map((menuItem, index) => { - return ( - {this.translateMenuItem(menuItem)} - ); - })} - - - ); - } -} - -TreeNodeMenu.propTypes = propTypes; - -export default TreeNodeMenu; diff --git a/frontend/src/components/tree-view/tree-node-view.js b/frontend/src/components/tree-view/tree-node-view.js index 2e08d8a579..8822999843 100644 --- a/frontend/src/components/tree-view/tree-node-view.js +++ b/frontend/src/components/tree-view/tree-node-view.js @@ -1,7 +1,8 @@ import React from 'react'; import PropTypes from 'prop-types'; -import TreeNodeMenu from './tree-node-menu'; import { permission } from '../../utils/constants'; +import TextTranslation from '../../utils/text-translation'; +import ItemDropDownMenu from '../dropdown-menu/item-dropdown-menu'; const propTypes = { repoPermission: PropTypes.bool, @@ -168,6 +169,16 @@ class TreeNodeView extends React.Component { return {icon, type}; } + caculateMenuList(node) { + let { NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE, OPEN_VIA_CLIENT} = TextTranslation; + + if (node.object.type === 'dir') { + return [NEW_FOLDER, NEW_FILE, COPY, MOVE, RENAME, DELETE]; + } + + return [RENAME, DELETE, COPY, MOVE, OPEN_VIA_CLIENT]; + } + renderChildren = () => { let { node, paddingLeft } = this.props; if (!node.hasChildren()) { @@ -242,14 +253,14 @@ class TreeNodeView extends React.Component { {isNodeMenuShow && (
    {((this.props.repoPermission || permission) && this.state.isShowOperationMenu) && ( - )}
    From 57d3865c7ff42e710ef45d16f0ea2c6d56ee7b21 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 17:31:28 +0800 Subject: [PATCH 09/15] repair bug --- .../components/dirent-list-view/dirent-list-item.js | 2 +- .../components/dropdown-menu/item-dropdown-menu.js | 5 +++-- frontend/src/components/toolbar/view-file-toolbar.js | 2 +- frontend/src/components/tree-view/tree-node-view.js | 12 ++++++------ frontend/src/components/tree-view/tree-view.js | 6 +++--- 5 files changed, 14 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index 3ba49c636c..e36380545e 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -173,7 +173,7 @@ class DirentListItem extends React.Component { this.setState({isShareDialogShow: !this.state.isShareDialogShow}); } - onMenuItemClick = (operation, event) => { + onMenuItemClick = (operation, opDirent, event) => { switch(operation) { case 'Download': this.onItemDownload(event); diff --git a/frontend/src/components/dropdown-menu/item-dropdown-menu.js b/frontend/src/components/dropdown-menu/item-dropdown-menu.js index c8988d9b1c..eb471bb0b6 100644 --- a/frontend/src/components/dropdown-menu/item-dropdown-menu.js +++ b/frontend/src/components/dropdown-menu/item-dropdown-menu.js @@ -95,7 +95,8 @@ class ItemDropDownMenu extends React.Component { onMenuItemClick = (event) => { let operation = event.target.dataset.toggle; - this.props.onMenuItemClick(operation, event); + let opItem = this.props.opItem; + this.props.onMenuItemClick(operation, opItem, event); } render() { @@ -134,7 +135,7 @@ class ItemDropDownMenu extends React.Component { } return ( - + { + onUnfreezedItem = () => { this.setState({isShowOperationMenu: false}); - this.props.onUnFreezedItem(); + this.props.onUnfreezedItem(); } onMenuItemClick = (operation, node) => { @@ -201,7 +201,7 @@ class TreeNodeView extends React.Component { onNodeExpanded={this.props.onNodeExpanded} onFreezedItem={this.props.onFreezedItem} onMenuItemClick={this.onMenuItemClick} - onUnFreezedItem={this.onUnFreezedItem} + onUnfreezedItem={this.onUnfreezedItem} onNodeChanged={this.props.onNodeChanged} registerHandlers={this.props.registerHandlers} unregisterHandlers={this.props.unregisterHandlers} @@ -259,8 +259,8 @@ class TreeNodeView extends React.Component { menuType={'pc'} getOpItemMenuList={this.caculateMenuList} onMenuItemClick={this.onMenuItemClick} - onFreezedItem={this.onFreezedItem} - onUnFreezedItem={this.onUnFreezedItem} + onFreezedItem={this.props.onFreezedItem} + onUnfreezedItem={this.onUnfreezedItem} /> )} diff --git a/frontend/src/components/tree-view/tree-view.js b/frontend/src/components/tree-view/tree-view.js index 4e5ad5eed9..c0a3ab3b55 100644 --- a/frontend/src/components/tree-view/tree-view.js +++ b/frontend/src/components/tree-view/tree-view.js @@ -116,7 +116,7 @@ class TreeView extends React.Component { this.setState({isItemFreezed: true}); } - onUnFreezedItem = () => { + onUnfreezedItem = () => { this.setState({isItemFreezed: false}); } @@ -198,7 +198,7 @@ class TreeView extends React.Component { } onHideMenu = () => { - this.onUnFreezedItem(); + this.onUnfreezedItem(); } render() { @@ -224,7 +224,7 @@ class TreeView extends React.Component { onNodeCollapse={this.props.onNodeCollapse} onNodeDragStart={this.onNodeDragStart} onFreezedItem={this.onFreezedItem} - onUnFreezedItem={this.onUnFreezedItem} + onUnfreezedItem={this.onUnfreezedItem} onNodeDragMove={this.onNodeDragMove} onNodeDrop={this.onNodeDrop} onNodeDragEnter={this.onNodeDragEnter} From 025fe6e29de682e21cfdfc7e4f5124856844abc3 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Sun, 21 Apr 2019 17:56:55 +0800 Subject: [PATCH 10/15] repair bug --- frontend/src/components/dirent-list-view/dirent-list-item.js | 2 +- frontend/src/components/dropdown-menu/item-dropdown-menu.js | 2 +- frontend/src/components/tree-view/tree-node-view.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index e36380545e..3ba49c636c 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -173,7 +173,7 @@ class DirentListItem extends React.Component { this.setState({isShareDialogShow: !this.state.isShareDialogShow}); } - onMenuItemClick = (operation, opDirent, event) => { + onMenuItemClick = (operation, event) => { switch(operation) { case 'Download': this.onItemDownload(event); diff --git a/frontend/src/components/dropdown-menu/item-dropdown-menu.js b/frontend/src/components/dropdown-menu/item-dropdown-menu.js index eb471bb0b6..0a688c7ec5 100644 --- a/frontend/src/components/dropdown-menu/item-dropdown-menu.js +++ b/frontend/src/components/dropdown-menu/item-dropdown-menu.js @@ -96,7 +96,7 @@ class ItemDropDownMenu extends React.Component { onMenuItemClick = (event) => { let operation = event.target.dataset.toggle; let opItem = this.props.opItem; - this.props.onMenuItemClick(operation, opItem, event); + this.props.onMenuItemClick(operation, event, opItem); } render() { diff --git a/frontend/src/components/tree-view/tree-node-view.js b/frontend/src/components/tree-view/tree-node-view.js index 9d4f783093..3c196c0111 100644 --- a/frontend/src/components/tree-view/tree-node-view.js +++ b/frontend/src/components/tree-view/tree-node-view.js @@ -118,7 +118,7 @@ class TreeNodeView extends React.Component { this.props.onUnfreezedItem(); } - onMenuItemClick = (operation, node) => { + onMenuItemClick = (operation, event, node) => { this.props.onMenuItemClick(operation, node); } @@ -200,7 +200,7 @@ class TreeNodeView extends React.Component { onNodeCollapse={this.props.onNodeCollapse} onNodeExpanded={this.props.onNodeExpanded} onFreezedItem={this.props.onFreezedItem} - onMenuItemClick={this.onMenuItemClick} + onMenuItemClick={this.props.onMenuItemClick} onUnfreezedItem={this.onUnfreezedItem} onNodeChanged={this.props.onNodeChanged} registerHandlers={this.props.registerHandlers} From 546313a3a763bee20d7b65d7286d3f9996c5f46e Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Mon, 22 Apr 2019 10:29:41 +0800 Subject: [PATCH 11/15] revert code to last version --- .../dropdown-menu/text-dropdown-menu.js | 105 ------------------ .../components/toolbar/view-file-toolbar.js | 40 +++---- 2 files changed, 15 insertions(+), 130 deletions(-) delete mode 100644 frontend/src/components/dropdown-menu/text-dropdown-menu.js diff --git a/frontend/src/components/dropdown-menu/text-dropdown-menu.js b/frontend/src/components/dropdown-menu/text-dropdown-menu.js deleted file mode 100644 index 2087ad55c3..0000000000 --- a/frontend/src/components/dropdown-menu/text-dropdown-menu.js +++ /dev/null @@ -1,105 +0,0 @@ -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 f6389e3d6a..f5834c5ba6 100644 --- a/frontend/src/components/toolbar/view-file-toolbar.js +++ b/frontend/src/components/toolbar/view-file-toolbar.js @@ -1,15 +1,13 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; -import { Tooltip} from 'reactstrap'; +import { DropdownToggle, Dropdown, DropdownMenu, DropdownItem, Tooltip} from 'reactstrap'; 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, @@ -33,6 +31,7 @@ class ViewFileToolbar extends React.Component { super(props); this.state = { isDraftMessageShow: false, + isMoreMenuShow: false, isShareDialogShow: false, isEditTagDialogShow: false, isRelatedFileDialogShow: false, @@ -59,20 +58,8 @@ class ViewFileToolbar extends React.Component { this.setState({isDraftMessageShow: !this.state.isDraftMessageShow}); } - onMenuItemClick = (operation) => { - switch (operation) { - case 'Share': - this.onShareToggle(); - break; - case 'Tags': - this.onEditFileTagToggle(); - break; - case 'Related Files': - this.onListRelatedFileToggle(); - break; - default: - break; - } + toggleMore = () => { + this.setState({isMoreMenuShow: !this.state.isMoreMenuShow}); } onShareToggle = () => { @@ -117,13 +104,16 @@ class ViewFileToolbar extends React.Component { )} {filePermission === 'rw' && ( - + + + {gettext('More')} + + + {gettext('Share')} + {gettext('Tags')} + {gettext('Related Files')} + + )} {this.state.isShareDialogShow && ( @@ -172,4 +162,4 @@ class ViewFileToolbar extends React.Component { ViewFileToolbar.propTypes = propTypes; -export default ViewFileToolbar; +export default ViewFileToolbar; \ No newline at end of file From ddb7ec369e2f21813943ee49fe94f6c1d1eb025f Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Mon, 22 Apr 2019 11:19:26 +0800 Subject: [PATCH 12/15] delete item-dropdown-menu unnecessary code --- .../dirent-list-view/dirent-list-item.js | 1 - .../dropdown-menu/item-dropdown-menu.js | 15 ++++----------- .../toolbar/mutilple-dir-operation-toolbar.js | 1 - .../src/components/tree-view/tree-node-view.js | 1 - 4 files changed, 4 insertions(+), 14 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index 3ba49c636c..d826d52beb 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -431,7 +431,6 @@ class DirentListItem extends React.Component {
  • Date: Mon, 22 Apr 2019 12:18:35 +0800 Subject: [PATCH 13/15] optimized code --- .../dirent-list-view/dirent-list-item.js | 23 +++++++++---------- .../dirent-list-view/dirent-list-view.js | 14 +++++------ .../dropdown-menu/item-dropdown-menu.js | 22 +++++++++--------- .../toolbar/mutilple-dir-operation-toolbar.js | 2 +- .../components/tree-view/tree-node-view.js | 18 +++++++-------- .../src/components/tree-view/tree-view.js | 12 +++++----- 6 files changed, 45 insertions(+), 46 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index d826d52beb..a6a56372db 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -24,8 +24,8 @@ const propTypes = { showShareBtn: PropTypes.bool.isRequired, dirent: PropTypes.object.isRequired, onItemClick: PropTypes.func.isRequired, - onFreezedItem: PropTypes.func.isRequired, - onUnfreezedItem: PropTypes.func.isRequired, + freezeItem: PropTypes.func.isRequired, + unfreezeItem: PropTypes.func.isRequired, onItemRenameToggle: PropTypes.func.isRequired, onItemSelected: PropTypes.func.isRequired, onItemDelete: PropTypes.func.isRequired, @@ -110,12 +110,12 @@ class DirentListItem extends React.Component { this.setState({isDragTipShow: false}); } - onUnfreezedItem = () => { + unfreezeItem = () => { this.setState({ highlight: false, isOperationShow: false, }); - this.props.onUnfreezedItem(); + this.props.unfreezeItem(); } //buiness handler @@ -248,7 +248,7 @@ class DirentListItem extends React.Component { onRenameCancel = () => { this.setState({isRenameing: false}); - this.onUnfreezedItem(); + this.unfreezeItem(); } onItemMoveToggle = () => { @@ -433,10 +433,10 @@ class DirentListItem extends React.Component { opItem={this.props.dirent} menuClass={'sf2-icon-caret-down'} isHandleContextMenuEvent={true} - getOpItemMenuList={this.props.getDirentItemMenuList} + getMenuList={this.props.getDirentItemMenuList} onMenuItemClick={this.onMenuItemClick} - onUnfreezedItem={this.onUnfreezedItem} - onFreezedItem={this.props.onFreezedItem} + unfreezeItem={this.unfreezeItem} + freezeItem={this.props.freezeItem} />
  • @@ -461,13 +461,12 @@ class DirentListItem extends React.Component {
  • diff --git a/frontend/src/components/dirent-list-view/dirent-list-view.js b/frontend/src/components/dirent-list-view/dirent-list-view.js index 6c1402f193..5b28016eb6 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-view.js +++ b/frontend/src/components/dirent-list-view/dirent-list-view.js @@ -78,11 +78,11 @@ class DirentListView extends React.Component { this.zipToken = null; } - onFreezedItem = () => { + freezeItem = () => { this.setState({isItemFreezed: true}); } - onUnfreezedItem = () => { + unfreezeItem = () => { this.setState({isItemFreezed: false}); } @@ -100,7 +100,7 @@ class DirentListView extends React.Component { } onItemRenameToggle = () => { - this.onFreezedItem(); + this.freezeItem(); } onItemSelected = (dirent) => { @@ -425,11 +425,11 @@ class DirentListView extends React.Component { } onShowMenu = (e) => { - this.onFreezedItem(); + this.freezeItem(); } onHideMenu = (e) => { - this.onUnfreezedItem(); + this.unfreezeItem(); } // contextmenu utils @@ -575,8 +575,8 @@ class DirentListView extends React.Component { onItemCopy={this.props.onItemCopy} updateDirent={this.props.updateDirent} isItemFreezed={this.state.isItemFreezed} - onFreezedItem={this.onFreezedItem} - onUnfreezedItem={this.onUnfreezedItem} + freezeItem={this.freezeItem} + unfreezeItem={this.unfreezeItem} onDirentClick={this.onDirentClick} showImagePopup={this.showImagePopup} onItemMouseDown={this.onItemMouseDown} diff --git a/frontend/src/components/dropdown-menu/item-dropdown-menu.js b/frontend/src/components/dropdown-menu/item-dropdown-menu.js index 9dce191322..c2ae297e36 100644 --- a/frontend/src/components/dropdown-menu/item-dropdown-menu.js +++ b/frontend/src/components/dropdown-menu/item-dropdown-menu.js @@ -9,10 +9,10 @@ const propTypes = { opItem: PropTypes.object.isRequired, menuClass: PropTypes.string, isHandleContextMenuEvent: PropTypes.bool, - getOpItemMenuList: PropTypes.func.isRequired, + getMenuList: PropTypes.func.isRequired, onMenuItemClick: PropTypes.func.isRequired, - onFrezeedItem: PropTypes.func, - onUnfrezeedItem: PropTypes.func, + freezeItem: PropTypes.func, + unfreezeItem: PropTypes.func, }; class ItemDropDownMenu extends React.Component { @@ -35,14 +35,14 @@ class ItemDropDownMenu extends React.Component { this.listenerId = listener.register(this.onShowMenu, this.onHideMenu); } let { opItem } = this.props; - let menuList = this.props.getOpItemMenuList(opItem); + let menuList = this.props.getMenuList(opItem); this.setState({menuList: menuList}); } componentWillReceiveProps(nextProps) { // for toolbar opItem operation let { opItem } = nextProps; if (opItem.name !== this.props.opItem.name) { - let menuList = this.props.getOpItemMenuList(opItem); + let menuList = this.props.getMenuList(opItem); this.setState({menuList: menuList}); } } @@ -60,8 +60,8 @@ class ItemDropDownMenu extends React.Component { onHideMenu = () => { if (this.state.isItemMenuShow) { this.setState({isItemMenuShow: false}); - if (typeof(this.props.onUnfreezedItem) === 'function') { - this.props.onUnfreezedItem(); + if (typeof(this.props.unfreezeItem) === 'function') { + this.props.unfreezeItem(); } } } @@ -77,10 +77,10 @@ class ItemDropDownMenu extends React.Component { this.setState( {isItemMenuShow: !this.state.isItemMenuShow}, () => { - if (this.state.isItemMenuShow && typeof(this.props.onFreezedItem) === 'function') { - this.props.onFreezedItem(); - } else if (!this.state.isItemMenuShow && typeof(this.props.onUnfreezedItem) === 'function') { - this.props.onUnfreezedItem(); + if (this.state.isItemMenuShow && typeof(this.props.freezeItem) === 'function') { + this.props.freezeItem(); + } else if (!this.state.isItemMenuShow && typeof(this.props.unfreezeItem) === 'function') { + this.props.unfreezeItem(); } } ); diff --git a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js index 4c45159761..4fb2007b99 100644 --- a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js @@ -287,7 +287,7 @@ class MutipleDirOperationToolbar extends React.Component { opItem={this.props.selectedDirentList[0]} menuClass={'fas fa-ellipsis-v dirents-more-menu'} onMenuItemClick={this.onMenuItemClick} - getOpItemMenuList={this.getDirentMenuList} + getMenuList={this.getDirentMenuList} /> } diff --git a/frontend/src/components/tree-view/tree-node-view.js b/frontend/src/components/tree-view/tree-node-view.js index 8cae098e07..3b41bb4e7e 100644 --- a/frontend/src/components/tree-view/tree-node-view.js +++ b/frontend/src/components/tree-view/tree-node-view.js @@ -15,8 +15,8 @@ const propTypes = { onNodeExpanded: PropTypes.func.isRequired, onNodeCollapse: PropTypes.func.isRequired, onNodeDragStart: PropTypes.func.isRequired, - onFreezedItem: PropTypes.func.isRequired, - onUnfreezedItem: PropTypes.func.isRequired, + freezeItem: PropTypes.func.isRequired, + unfreezeItem: PropTypes.func.isRequired, onMenuItemClick: PropTypes.func, registerHandlers: PropTypes.func, unregisterHandlers: PropTypes.func, @@ -113,9 +113,9 @@ class TreeNodeView extends React.Component { this.props.onNodeDrop(e, this.props.node); } - onUnfreezedItem = () => { + unfreezeItem = () => { this.setState({isShowOperationMenu: false}); - this.props.onUnfreezedItem(); + this.props.unfreezeItem(); } onMenuItemClick = (operation, event, node) => { @@ -199,9 +199,9 @@ class TreeNodeView extends React.Component { onNodeClick={this.props.onNodeClick} onNodeCollapse={this.props.onNodeCollapse} onNodeExpanded={this.props.onNodeExpanded} - onFreezedItem={this.props.onFreezedItem} + freezeItem={this.props.freezeItem} onMenuItemClick={this.props.onMenuItemClick} - onUnfreezedItem={this.onUnfreezedItem} + unfreezeItem={this.unfreezeItem} onNodeChanged={this.props.onNodeChanged} registerHandlers={this.props.registerHandlers} unregisterHandlers={this.props.unregisterHandlers} @@ -256,10 +256,10 @@ class TreeNodeView extends React.Component { )} diff --git a/frontend/src/components/tree-view/tree-view.js b/frontend/src/components/tree-view/tree-view.js index c0a3ab3b55..4d906173bc 100644 --- a/frontend/src/components/tree-view/tree-view.js +++ b/frontend/src/components/tree-view/tree-view.js @@ -112,11 +112,11 @@ class TreeView extends React.Component { this.onItemMove(this.props.currentRepoInfo, nodeDirent, dropNodeData.path, nodeParentPath); } - onFreezedItem = () => { + freezeItem = () => { this.setState({isItemFreezed: true}); } - onUnfreezedItem = () => { + unfreezeItem = () => { this.setState({isItemFreezed: false}); } @@ -194,11 +194,11 @@ class TreeView extends React.Component { } onShowMenu = () => { - this.onFreezedItem(); + this.freezeItem(); } onHideMenu = () => { - this.onUnfreezedItem(); + this.unfreezeItem(); } render() { @@ -223,8 +223,8 @@ class TreeView extends React.Component { onNodeExpanded={this.props.onNodeExpanded} onNodeCollapse={this.props.onNodeCollapse} onNodeDragStart={this.onNodeDragStart} - onFreezedItem={this.onFreezedItem} - onUnfreezedItem={this.onUnfreezedItem} + freezeItem={this.freezeItem} + unfreezeItem={this.unfreezeItem} onNodeDragMove={this.onNodeDragMove} onNodeDrop={this.onNodeDrop} onNodeDragEnter={this.onNodeDragEnter} From 8b05873b37e86ddbaa81ae6a7f621c8fa22cb1d0 Mon Sep 17 00:00:00 2001 From: shanshuirenjia <978987373@qq.com> Date: Mon, 22 Apr 2019 14:00:16 +0800 Subject: [PATCH 14/15] improve code --- .../dirent-list-view/dirent-list-item.js | 10 ++++---- .../dropdown-menu/item-dropdown-menu.js | 24 +++++++++---------- .../toolbar/mutilple-dir-operation-toolbar.js | 6 ++--- .../components/tree-view/tree-node-view.js | 6 ++--- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index a6a56372db..92aa16c12d 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -6,7 +6,7 @@ import { gettext, siteRoot, mediaUrl } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import { seafileAPI } from '../../utils/seafile-api'; import URLDecorator from '../../utils/url-decorator'; -import ItemDropDownMenu from '../dropdown-menu/item-dropdown-menu'; +import ItemDropdownMenu from '../dropdown-menu/item-dropdown-menu'; import Rename from '../rename'; import ModalPortal from '../modal-portal'; import MoveDirentDialog from '../dialog/move-dirent-dialog'; @@ -429,8 +429,8 @@ class DirentListItem extends React.Component {
  • -
  • - { let operation = event.target.dataset.toggle; - let opItem = this.props.opItem; - this.props.onMenuItemClick(operation, event, opItem); + let item = this.props.item; + this.props.onMenuItemClick(operation, event, item); } render() { @@ -153,6 +153,6 @@ class ItemDropDownMenu extends React.Component { } } -ItemDropDownMenu.propTypes = propTypes; +ItemDropdownMenu.propTypes = propTypes; -export default ItemDropDownMenu; +export default ItemDropdownMenu; diff --git a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js index 4fb2007b99..b00ca5860d 100644 --- a/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/mutilple-dir-operation-toolbar.js @@ -13,7 +13,7 @@ import RelatedFileDialogs from '../dialog/related-file-dialogs'; import EditFileTagDialog from '../dialog/edit-filetag-dialog'; import ZipDownloadDialog from '../dialog/zip-download-dialog'; import ModalPortal from '../modal-portal'; -import ItemDropDownMenu from '../dropdown-menu/item-dropdown-menu'; +import ItemDropdownMenu from '../dropdown-menu/item-dropdown-menu'; import '../../css/dirents-menu.css'; @@ -282,9 +282,9 @@ class MutipleDirOperationToolbar extends React.Component { {this.props.selectedDirentList.length === 1 && - {((this.props.repoPermission || permission) && this.state.isShowOperationMenu) && ( - Date: Mon, 22 Apr 2019 15:15:51 +0800 Subject: [PATCH 15/15] improve class naming --- .../components/dirent-list-view/dirent-list-item.js | 4 ++-- .../components/dropdown-menu/item-dropdown-menu.js | 12 ++++++------ .../toolbar/mutilple-dir-operation-toolbar.js | 2 +- frontend/src/components/tree-view/tree-node-view.js | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js index 92aa16c12d..f2aad49bc8 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-item.js +++ b/frontend/src/components/dirent-list-view/dirent-list-item.js @@ -431,7 +431,7 @@ class DirentListItem extends React.Component {
  • diff --git a/frontend/src/components/tree-view/tree-node-view.js b/frontend/src/components/tree-view/tree-node-view.js index 7d885497d6..4729a973b4 100644 --- a/frontend/src/components/tree-view/tree-node-view.js +++ b/frontend/src/components/tree-view/tree-node-view.js @@ -255,7 +255,7 @@ class TreeNodeView extends React.Component { {((this.props.repoPermission || permission) && this.state.isShowOperationMenu) && (