1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-16 07:08:55 +00:00

improve tree loading for Wiki mode (#2842)

This commit is contained in:
杨顺强
2019-01-23 16:25:14 +08:00
committed by Daniel Pan
parent 4b4233ebb9
commit 123a442319
19 changed files with 1386 additions and 601 deletions

View File

@@ -2,9 +2,9 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { gettext } from '../../utils/constants';
import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap';
import TreeView from '../../components/tree-view/tree-view';
import NodeMenu from '../../components/tree-view/node-menu';
import TreeView from '../../components/tree-view-2/tree-view';
import Logo from '../../components/logo';
import Loading from '../../components/loading';
import ModalPortal from '../../components/modal-portal';
import Delete from '../../components/dialog/delete-dialog';
import Rename from '../../components/dialog/rename-dialog';
@@ -13,12 +13,14 @@ import CreateFile from '../../components/dialog/create-file-dialog';
const propTypes = {
currentNode: PropTypes.object,
isTreeDataLoading: PropTypes.bool.isRequired,
treeData: PropTypes.object.isRequired,
currentPath: PropTypes.string.isRequired,
closeSideBar: PropTypes.bool.isRequired,
onCloseSide: PropTypes.func.isRequired,
onDirCollapse: PropTypes.func.isRequired,
onNodeClick: PropTypes.func.isRequired,
onNodeCollapse: PropTypes.func.isRequired,
onNodeExpanded: PropTypes.func.isRequired,
onRenameNode: PropTypes.func.isRequired,
onDeleteNode: PropTypes.func.isRequired,
onAddFileNode: PropTypes.func.isRequired,
@@ -30,13 +32,7 @@ class SidePanel extends Component {
constructor(props) {
super(props);
this.state = {
currentNode: null,
isNodeItemFrezee: false,
isShowMenu: false,
menuPosition: {
left: 0,
top: 0
},
opNode: null,
isLoadFailed: false,
isMenuIconShow: false,
isHeaderMenuShow: false,
@@ -47,6 +43,10 @@ class SidePanel extends Component {
};
}
componentWillReceiveProps(nextProps) {
this.setState({opNode: nextProps.currentNode});
}
onMouseEnter = () => {
this.setState({isMenuIconShow: true});
}
@@ -65,56 +65,58 @@ class SidePanel extends Component {
}
onNodeClick = (node) => {
this.setState({currentNode: node});
this.setState({opNode: node});
this.props.onNodeClick(node);
}
onShowContextMenu = (e, node) => {
let left = e.clientX - 8*16;
let top = e.clientY + 10;
let position = Object.assign({},this.state.menuPosition, {left: left, top: top});
this.setState({
isShowMenu: !this.state.isShowMenu,
currentNode: node,
menuPosition: position,
isNodeItemFrezee: true
});
}
onHideContextMenu = () => {
if (!this.state.isShowMenu) {
return;
onMenuItemClick = (operation, node) => {
this.setState({opNode: node});
switch (operation) {
case 'New Folder':
this.onAddFolderToggle();
break;
case 'New File':
this.onAddFileToggle();
break;
case 'Rename':
this.onRenameToggle();
break;
case 'Delete':
this.onDeleteToggle();
break;
}
this.setState({
isShowMenu: false,
isNodeItemFrezee: false
});
}
onAddFileToggle = () => {
this.setState({
isMenuIconShow: false,
isAddFileDialogShow: !this.state.isAddFileDialogShow
});
this.onHideContextMenu();
onAddFileToggle = (type) => {
if (type === 'root') {
let root = this.props.treeData.root;
this.setState({
isAddFileDialogShow: !this.state.isAddFileDialogShow,
opNode: root,
});
} else {
this.setState({isAddFileDialogShow: !this.state.isAddFileDialogShow});
}
}
onAddFolderToggle = () => {
this.setState({
isMenuIconShow: false,
isAddFolderDialogShow: !this.state.isAddFolderDialogShow
});
this.onHideContextMenu();
onAddFolderToggle = (type) => {
if (type === 'root') {
let root = this.props.treeData.root;
this.setState({
isAddFolderDialogShow: !this.state.isAddFolderDialogShow,
opNode: root,
});
} else {
this.setState({isAddFolderDialogShow: !this.state.isAddFolderDialogShow});
}
}
onRenameToggle = () => {
this.setState({isRenameDialogShow: !this.state.isRenameDialogShow});
this.onHideContextMenu();
}
onDeleteToggle = () => {
this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow});
this.onHideContextMenu();
}
onAddFolderNode = (dirPath) => {
@@ -129,44 +131,16 @@ class SidePanel extends Component {
onRenameNode = (newName) => {
this.setState({isRenameDialogShow: !this.state.isRenameDialogShow});
let node = this.state.currentNode;
let node = this.state.opNode;
this.props.onRenameNode(node, newName);
}
onDeleteNode = () => {
this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow});
let node = this.state.currentNode;
let node = this.state.opNode;
this.props.onDeleteNode(node);
}
componentDidMount() {
document.addEventListener('click', this.onHideContextMenu);
}
componentWillReceiveProps(nextProps) {
this.setState({currentNode: nextProps.currentNode});
}
componentWillUnmount() {
document.removeEventListener('click', this.onHideContextMenu);
}
addFolderCancel = () => {
this.setState({isAddFolderDialogShow: !this.state.isAddFolderDialogShow});
}
addFileCancel = () => {
this.setState({isAddFileDialogShow: !this.state.isAddFileDialogShow});
}
deleteCancel = () => {
this.setState({isDeleteDialogShow: !this.state.isDeleteDialogShow});
}
renameCancel = () => {
this.setState({isRenameDialogShow: !this.state.isRenameDialogShow});
}
render() {
return (
<div className={`side-panel wiki-side-panel ${this.props.closeSideBar ? '': 'left-zero'}`}>
@@ -188,70 +162,63 @@ class SidePanel extends Component {
onClick={this.onDropdownToggleClick}
/>
<DropdownMenu right>
<DropdownItem onClick={this.onAddFolderToggle}>{gettext('New Folder')}</DropdownItem>
<DropdownItem onClick={this.onAddFileToggle}>{gettext('New File')}</DropdownItem>
<DropdownItem onClick={this.onAddFolderToggle.bind(this, 'root')}>{gettext('New Folder')}</DropdownItem>
<DropdownItem onClick={this.onAddFileToggle.bind(this, 'root')}>{gettext('New File')}</DropdownItem>
</DropdownMenu>
</Dropdown>
)}
</div>
</h3>
<div className="wiki-pages-container">
{this.props.treeData && (
<TreeView
{this.props.isTreeDataLoading ?
(<Loading/>) :
(<TreeView
treeData={this.props.treeData}
currentPath={this.props.currentPath}
isNodeItemFrezee={this.state.isNodeItemFrezee}
onShowContextMenu={this.onShowContextMenu}
onNodeClick={this.onNodeClick}
onDirCollapse={this.props.onDirCollapse}
/>
)}
{this.state.isShowMenu && (
<NodeMenu
menuPosition={this.state.menuPosition}
currentNode={this.state.currentNode}
toggleAddFile={this.onAddFileToggle}
toggleAddFolder={this.onAddFolderToggle}
toggleRename={this.onRenameToggle}
toggleDelete={this.onDeleteToggle}
onNodeExpanded={this.props.onNodeExpanded}
onNodeCollapse={this.props.onNodeCollapse}
onMenuItemClick={this.onMenuItemClick}
onFreezedItem={this.onFreezedItem}
onUnFreezedItem={this.onUnFreezedItem}
/>
)}
</div>
</div>
{this.state.isDeleteDialogShow && (
{this.state.isAddFolderDialogShow && (
<ModalPortal>
<Delete
currentNode={this.state.currentNode}
handleSubmit={this.onDeleteNode}
toggleCancel={this.deleteCancel}
/>
<CreateFolder
parentPath={this.state.opNode.path}
onAddFolder={this.onAddFolderNode}
addFolderCancel={this.onAddFolderToggle}
/>
</ModalPortal>
)}
{this.state.isAddFileDialogShow && (
<ModalPortal>
<CreateFile
fileType={'.md'}
parentPath={this.state.currentNode.path}
parentPath={this.state.opNode.path}
onAddFile={this.onAddFileNode}
addFileCancel={this.addFileCancel}
/>
</ModalPortal>
)}
{this.state.isAddFolderDialogShow && (
<ModalPortal>
<CreateFolder
parentPath={this.state.currentNode.path}
onAddFolder={this.onAddFolderNode}
addFolderCancel={this.addFolderCancel}
/>
addFileCancel={this.onAddFileToggle}
/>
</ModalPortal>
)}
{this.state.isRenameDialogShow && (
<ModalPortal>
<Rename
currentNode={this.state.currentNode}
currentNode={this.state.opNode}
onRename={this.onRenameNode}
toggleCancel={this.renameCancel}
toggleCancel={this.onRenameToggle}
/>
</ModalPortal>
)}
{this.state.isDeleteDialogShow && (
<ModalPortal>
<Delete
currentNode={this.state.opNode}
handleSubmit={this.onDeleteNode}
toggleCancel={this.onDeleteToggle}
/>
</ModalPortal>
)}
@@ -262,4 +229,4 @@ class SidePanel extends Component {
SidePanel.propTypes = propTypes;
export default SidePanel;
export default SidePanel;