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..f2aad49bc8 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 ItemDropdownMenu from '../dropdown-menu/item-dropdown-menu';
import Rename from '../rename';
import ModalPortal from '../modal-portal';
import MoveDirentDialog from '../dialog/move-dirent-dialog';
@@ -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,
@@ -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 {
@@ -109,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
@@ -247,7 +248,7 @@ class DirentListItem extends React.Component {
onRenameCancel = () => {
this.setState({isRenameing: false});
- this.onUnfreezedItem();
+ this.unfreezeItem();
}
onItemMoveToggle = () => {
@@ -428,13 +429,14 @@ class DirentListItem extends React.Component {
-
@@ -457,13 +459,14 @@ 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..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}
@@ -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/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;
diff --git a/frontend/src/components/dropdown-menu/item-dropdown-menu.js b/frontend/src/components/dropdown-menu/item-dropdown-menu.js
new file mode 100644
index 0000000000..ae229a0aab
--- /dev/null
+++ b/frontend/src/components/dropdown-menu/item-dropdown-menu.js
@@ -0,0 +1,158 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import listener from '../context-menu/globalEventListener';
+import { Dropdown, ButtonDropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap';
+import { gettext } from '../../utils/constants';
+
+const propTypes = {
+ tagName: PropTypes.string,
+ item: PropTypes.object.isRequired,
+ toggleClass: PropTypes.string,
+ isHandleContextMenuEvent: PropTypes.bool,
+ getMenuList: PropTypes.func.isRequired,
+ onMenuItemClick: PropTypes.func.isRequired,
+ freezeItem: PropTypes.func,
+ unfreezeItem: PropTypes.func,
+};
+
+class ItemDropdownMenu extends React.Component {
+
+ static defaultProps = {
+ isHandleContextMenuEvent: true,
+ toggleClass: 'sf2-icon-caret-down'
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ menuList: [],
+ isItemMenuShow: false,
+ };
+ }
+
+ componentDidMount() {
+ if (this.props.isHandleContextMenuEvent) {
+ this.listenerId = listener.register(this.onShowMenu, this.onHideMenu);
+ }
+ let { item } = this.props;
+ let menuList = this.props.getMenuList(item);
+ this.setState({menuList: menuList});
+ }
+
+ componentWillReceiveProps(nextProps) { // for toolbar item operation
+ let { item } = nextProps;
+ if (item.name !== this.props.item.name) {
+ let menuList = this.props.getMenuList(item);
+ 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.unfreezeItem) === 'function') {
+ this.props.unfreezeItem();
+ }
+ }
+ }
+
+ onDropdownToggleClick = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ this.toggleOperationMenu();
+ }
+
+ toggleOperationMenu = () => {
+ this.setState(
+ {isItemMenuShow: !this.state.isItemMenuShow},
+ () => {
+ 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();
+ }
+ }
+ );
+ }
+
+ onMenuItemClick = (event) => {
+ let operation = event.target.dataset.toggle;
+ let item = this.props.item;
+ this.props.onMenuItemClick(operation, event, item);
+ }
+
+ render() {
+ let menuList = this.state.menuList;
+ let { toggleClass, tagName } = this.props;
+ toggleClass = 'sf-dropdown-toggle ' + toggleClass;
+
+ if (!menuList.length) {
+ 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 ;
+ } else {
+ return (
+ {menuItem.value}
+ );
+ }
+ })}
+
+
+ );
+ }
+}
+
+ItemDropdownMenu.propTypes = propTypes;
+
+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 0c33189856..b75373da27 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 ItemDropdownMenu from '../dropdown-menu/item-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,12 @@ class MutipleDirOperationToolbar extends React.Component {
{this.props.selectedDirentList.length === 1 &&
-
}
diff --git a/frontend/src/components/toolbar/view-file-toolbar.js b/frontend/src/components/toolbar/view-file-toolbar.js
index f636d6e557..f5834c5ba6 100644
--- a/frontend/src/components/toolbar/view-file-toolbar.js
+++ b/frontend/src/components/toolbar/view-file-toolbar.js
@@ -162,4 +162,4 @@ class ViewFileToolbar extends React.Component {
ViewFileToolbar.propTypes = propTypes;
-export default ViewFileToolbar;
+export default ViewFileToolbar;
\ No newline at end of file
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..4729a973b4 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,
@@ -14,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,
@@ -112,12 +113,12 @@ 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, node) => {
+ onMenuItemClick = (operation, event, node) => {
this.props.onMenuItemClick(operation, node);
}
@@ -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()) {
@@ -188,9 +199,9 @@ class TreeNodeView extends React.Component {
onNodeClick={this.props.onNodeClick}
onNodeCollapse={this.props.onNodeCollapse}
onNodeExpanded={this.props.onNodeExpanded}
- onFreezedItem={this.props.onFreezedItem}
- onMenuItemClick={this.onMenuItemClick}
- onUnFreezedItem={this.onUnFreezedItem}
+ freezeItem={this.props.freezeItem}
+ onMenuItemClick={this.props.onMenuItemClick}
+ unfreezeItem={this.unfreezeItem}
onNodeChanged={this.props.onNodeChanged}
registerHandlers={this.props.registerHandlers}
unregisterHandlers={this.props.unregisterHandlers}
@@ -242,14 +253,13 @@ class TreeNodeView extends React.Component {
{isNodeMenuShow && (
{((this.props.repoPermission || permission) && this.state.isShowOperationMenu) && (
-
)}
diff --git a/frontend/src/components/tree-view/tree-view.js b/frontend/src/components/tree-view/tree-view.js
index 4e5ad5eed9..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}