2019-02-28 06:33:21 +00:00
|
|
|
import React from 'react';
|
2019-02-21 09:37:04 +00:00
|
|
|
import PropTypes from 'prop-types';
|
|
|
|
import DirColumnNav from './dir-column-nav';
|
|
|
|
import DirColumnFile from './dir-column-file';
|
2019-02-27 05:53:36 +00:00
|
|
|
import DirListView from './dir-list-view';
|
2019-02-21 09:37:04 +00:00
|
|
|
|
|
|
|
const propTypes = {
|
|
|
|
path: PropTypes.string.isRequired,
|
|
|
|
repoID: PropTypes.string.isRequired,
|
|
|
|
// repoinfo
|
|
|
|
currentRepoInfo: PropTypes.object.isRequired,
|
|
|
|
repoPermission: PropTypes.bool.isRequired,
|
|
|
|
enableDirPrivateShare: PropTypes.bool.isRequired,
|
|
|
|
userPrem: PropTypes.bool,
|
|
|
|
isGroupOwnedRepo: PropTypes.bool.isRequired,
|
|
|
|
// tree
|
|
|
|
isTreeDataLoading: PropTypes.bool.isRequired,
|
|
|
|
treeData: PropTypes.object.isRequired,
|
|
|
|
currentNode: PropTypes.object,
|
|
|
|
onNodeClick: PropTypes.func.isRequired,
|
|
|
|
onNodeCollapse: PropTypes.func.isRequired,
|
|
|
|
onNodeExpanded: PropTypes.func.isRequired,
|
|
|
|
onRenameNode: PropTypes.func.isRequired,
|
|
|
|
onDeleteNode: PropTypes.func.isRequired,
|
|
|
|
onAddFileNode: PropTypes.func.isRequired,
|
|
|
|
onAddFolderNode: PropTypes.func.isRequired,
|
|
|
|
// file
|
|
|
|
isViewFile: PropTypes.bool.isRequired,
|
|
|
|
isFileLoading: PropTypes.bool.isRequired,
|
|
|
|
isFileLoadedErr: PropTypes.bool.isRequired,
|
|
|
|
hash: PropTypes.string,
|
|
|
|
isDraft: PropTypes.bool.isRequired,
|
|
|
|
hasDraft: PropTypes.bool.isRequired,
|
|
|
|
goDraftPage: PropTypes.func.isRequired,
|
2019-04-19 07:50:27 +00:00
|
|
|
filePermission: PropTypes.string,
|
2019-02-21 09:37:04 +00:00
|
|
|
content: PropTypes.string,
|
|
|
|
lastModified: PropTypes.string,
|
|
|
|
latestContributor: PropTypes.string,
|
|
|
|
onLinkClick: PropTypes.func.isRequired,
|
|
|
|
// repo content
|
|
|
|
isRepoInfoBarShow: PropTypes.bool.isRequired,
|
|
|
|
draftCounts: PropTypes.number.isRequired,
|
|
|
|
usedRepoTags: PropTypes.array.isRequired,
|
|
|
|
readmeMarkdown: PropTypes.object,
|
|
|
|
updateUsedRepoTags: PropTypes.func.isRequired,
|
|
|
|
// list
|
|
|
|
isDirentListLoading: PropTypes.bool.isRequired,
|
|
|
|
direntList: PropTypes.array.isRequired,
|
|
|
|
sortBy: PropTypes.string.isRequired,
|
|
|
|
sortOrder: PropTypes.string.isRequired,
|
|
|
|
sortItems: PropTypes.func.isRequired,
|
2019-04-11 13:04:47 +00:00
|
|
|
onAddFolder: PropTypes.func.isRequired,
|
2019-02-21 09:37:04 +00:00
|
|
|
onAddFile: PropTypes.func.isRequired,
|
|
|
|
updateDirent: PropTypes.func.isRequired,
|
|
|
|
onItemClick: PropTypes.func.isRequired,
|
|
|
|
onItemSelected: PropTypes.func.isRequired,
|
|
|
|
onItemDelete: PropTypes.func.isRequired,
|
|
|
|
onItemRename: PropTypes.func.isRequired,
|
|
|
|
onItemMove: PropTypes.func.isRequired,
|
|
|
|
onItemCopy: PropTypes.func.isRequired,
|
|
|
|
onDirentClick: PropTypes.func.isRequired,
|
|
|
|
isAllItemSelected: PropTypes.bool.isRequired,
|
|
|
|
onAllItemSelected: PropTypes.func.isRequired,
|
2019-04-11 13:04:47 +00:00
|
|
|
selectedDirentList: PropTypes.array.isRequired,
|
|
|
|
onItemsMove: PropTypes.func.isRequired,
|
|
|
|
onItemsCopy: PropTypes.func.isRequired,
|
|
|
|
onItemsDelete: PropTypes.func.isRequired,
|
2019-04-17 02:48:44 +00:00
|
|
|
onFileTagChanged: PropTypes.func,
|
2019-05-30 04:11:52 +00:00
|
|
|
showDirentDetail: PropTypes.func.isRequired,
|
2019-02-21 09:37:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
class DirColumnView extends React.Component {
|
2019-02-28 06:33:21 +00:00
|
|
|
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
this.state = {
|
|
|
|
inResizing: false,
|
|
|
|
navRate: 0.25,
|
|
|
|
};
|
|
|
|
this.containerWidth = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
onResizeMouseUp = () => {
|
|
|
|
if (this.state.inResizing) {
|
|
|
|
this.setState({
|
|
|
|
inResizing: false
|
|
|
|
});
|
|
|
|
}
|
|
|
|
this.setCookie('navRate', this.state.navRate);
|
|
|
|
}
|
|
|
|
|
|
|
|
onResizeMouseDown = () => {
|
2019-02-28 13:35:22 +00:00
|
|
|
this.containerWidth = this.refs.viewModeContainer.clientWidth;
|
2019-02-28 06:33:21 +00:00
|
|
|
this.setState({
|
|
|
|
inResizing: true
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
onResizeMouseMove = (e) => {
|
|
|
|
let sizeNavWidth = this.containerWidth / 0.78 * 0.22 + 3;
|
|
|
|
let rate = (e.nativeEvent.clientX - sizeNavWidth) / this.containerWidth;
|
|
|
|
if (rate < 0.1) {
|
|
|
|
this.setState({
|
|
|
|
inResizing: false,
|
|
|
|
navRate: 0.12,
|
|
|
|
});
|
|
|
|
}
|
2019-02-28 08:39:43 +00:00
|
|
|
else if (rate > 0.4) {
|
2019-02-28 06:33:21 +00:00
|
|
|
this.setState({
|
|
|
|
inResizing: false,
|
2019-02-28 08:39:43 +00:00
|
|
|
navRate: 0.38,
|
2019-02-28 06:33:21 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
this.setState({
|
|
|
|
navRate: rate
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
setCookie = (name, value) => {
|
|
|
|
let cookie = name + '=' + value + ';';
|
|
|
|
document.cookie = cookie;
|
|
|
|
}
|
|
|
|
|
|
|
|
getCookie = (cookiename) => {
|
|
|
|
let name = cookiename + '=';
|
|
|
|
let cookie = document.cookie.split(';');
|
|
|
|
for (let i = 0, len = cookie.length; i < len; i++) {
|
|
|
|
let c = cookie[i].trim();
|
|
|
|
if (c.indexOf(name) == 0) {
|
|
|
|
return c.substring(name.length, c.length) * 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return '';
|
|
|
|
}
|
|
|
|
|
2019-03-01 03:02:24 +00:00
|
|
|
componentWillMount() {
|
2019-02-28 06:33:21 +00:00
|
|
|
let rate = this.getCookie('navRate');
|
|
|
|
if (rate) {
|
|
|
|
this.setState({
|
|
|
|
navRate: rate,
|
|
|
|
});
|
2019-02-28 08:39:43 +00:00
|
|
|
}
|
2019-02-28 06:33:21 +00:00
|
|
|
}
|
2019-02-21 09:37:04 +00:00
|
|
|
|
|
|
|
render() {
|
2019-02-28 06:33:21 +00:00
|
|
|
const onResizeMove = this.state.inResizing ? this.onResizeMouseMove : null;
|
|
|
|
const select = this.state.inResizing ? 'none' : '';
|
2019-04-17 06:18:12 +00:00
|
|
|
const mainFlex = '1 0 ' + (1 - this.state.navRate - 0.05) * 100 + '%';
|
2019-02-21 09:37:04 +00:00
|
|
|
return (
|
2019-03-01 03:02:24 +00:00
|
|
|
<div className="dir-colunm-view" onMouseMove={onResizeMove} onMouseUp={this.onResizeMouseUp} ref="viewModeContainer">
|
2019-02-21 09:37:04 +00:00
|
|
|
<DirColumnNav
|
|
|
|
currentPath={this.props.path}
|
|
|
|
repoPermission={this.props.repoPermission}
|
|
|
|
isTreeDataLoading={this.props.isTreeDataLoading}
|
|
|
|
treeData={this.props.treeData}
|
|
|
|
currentNode={this.props.currentNode}
|
|
|
|
onNodeClick={this.props.onNodeClick}
|
|
|
|
onNodeCollapse={this.props.onNodeCollapse}
|
|
|
|
onNodeExpanded={this.props.onNodeExpanded}
|
|
|
|
onAddFolderNode={this.props.onAddFolderNode}
|
|
|
|
onAddFileNode={this.props.onAddFileNode}
|
|
|
|
onRenameNode={this.props.onRenameNode}
|
|
|
|
onDeleteNode={this.props.onDeleteNode}
|
2019-02-27 09:34:39 +00:00
|
|
|
repoID={this.props.repoID}
|
2019-02-28 06:33:21 +00:00
|
|
|
navRate={this.state.navRate}
|
|
|
|
inResizing={this.state.inResizing}
|
2019-03-15 07:48:16 +00:00
|
|
|
currentRepoInfo={this.props.currentRepoInfo}
|
2019-03-20 03:04:36 +00:00
|
|
|
onItemMove={this.props.onItemMove}
|
|
|
|
onItemCopy={this.props.onItemCopy}
|
2019-04-11 13:04:47 +00:00
|
|
|
selectedDirentList={this.props.selectedDirentList}
|
2019-06-17 08:11:54 +00:00
|
|
|
onItemsMove={this.props.onItemsMove}
|
2019-02-21 09:37:04 +00:00
|
|
|
/>
|
2019-02-28 06:33:21 +00:00
|
|
|
<div className="dir-content-resize" onMouseDown={this.onResizeMouseDown}></div>
|
2019-02-28 08:39:43 +00:00
|
|
|
<div className="dir-content-main" style={{userSelect: select, flex: mainFlex}}>
|
2019-02-21 09:37:04 +00:00
|
|
|
{this.props.isViewFile ? (
|
|
|
|
<DirColumnFile
|
|
|
|
path={this.props.path}
|
|
|
|
repoID={this.props.repoID}
|
|
|
|
hash={this.props.hash}
|
|
|
|
isDraft={this.props.isDraft}
|
|
|
|
hasDraft={this.props.hasDraft}
|
|
|
|
goDraftPage={this.props.goDraftPage}
|
|
|
|
isFileLoading={this.props.isFileLoading}
|
|
|
|
isFileLoadedErr={this.props.isFileLoadedErr}
|
|
|
|
filePermission={this.props.filePermission}
|
|
|
|
content={this.props.content}
|
|
|
|
lastModified={this.props.lastModified}
|
|
|
|
latestContributor={this.props.latestContributor}
|
|
|
|
onLinkClick={this.props.onLinkClick}
|
|
|
|
/>
|
|
|
|
) : (
|
2019-02-27 05:53:36 +00:00
|
|
|
<DirListView
|
2019-02-21 09:37:04 +00:00
|
|
|
path={this.props.path}
|
|
|
|
repoID={this.props.repoID}
|
|
|
|
currentRepoInfo={this.props.currentRepoInfo}
|
|
|
|
isGroupOwnedRepo={this.props.isGroupOwnedRepo}
|
|
|
|
enableDirPrivateShare={this.props.enableDirPrivateShare}
|
|
|
|
isRepoInfoBarShow={this.props.isRepoInfoBarShow}
|
|
|
|
usedRepoTags={this.props.usedRepoTags}
|
|
|
|
readmeMarkdown={this.props.readmeMarkdown}
|
|
|
|
draftCounts={this.props.draftCounts}
|
|
|
|
updateUsedRepoTags={this.props.updateUsedRepoTags}
|
|
|
|
isDirentListLoading={this.props.isDirentListLoading}
|
|
|
|
direntList={this.props.direntList}
|
|
|
|
sortBy={this.props.sortBy}
|
|
|
|
sortOrder={this.props.sortOrder}
|
|
|
|
sortItems={this.props.sortItems}
|
2019-04-11 13:04:47 +00:00
|
|
|
onAddFolder={this.props.onAddFolder}
|
2019-02-21 09:37:04 +00:00
|
|
|
onAddFile={this.props.onAddFile}
|
|
|
|
onItemClick={this.props.onItemClick}
|
|
|
|
onItemSelected={this.props.onItemSelected}
|
|
|
|
onItemDelete={this.props.onItemDelete}
|
|
|
|
onItemRename={this.props.onItemRename}
|
|
|
|
onItemMove={this.props.onItemMove}
|
|
|
|
onItemCopy={this.props.onItemCopy}
|
|
|
|
onDirentClick={this.props.onDirentClick}
|
|
|
|
updateDirent={this.props.updateDirent}
|
|
|
|
isAllItemSelected={this.props.isAllItemSelected}
|
|
|
|
onAllItemSelected={this.props.onAllItemSelected}
|
2019-04-11 13:04:47 +00:00
|
|
|
selectedDirentList={this.props.selectedDirentList}
|
|
|
|
onItemsMove={this.props.onItemsMove}
|
|
|
|
onItemsCopy={this.props.onItemsCopy}
|
|
|
|
onItemsDelete={this.props.onItemsDelete}
|
2019-04-17 02:48:44 +00:00
|
|
|
onFileTagChanged={this.props.onFileTagChanged}
|
2019-05-30 04:11:52 +00:00
|
|
|
showDirentDetail={this.props.showDirentDetail}
|
2019-02-21 09:37:04 +00:00
|
|
|
/>
|
|
|
|
)}
|
|
|
|
</div>
|
2019-02-28 06:33:21 +00:00
|
|
|
</div>
|
2019-02-21 09:37:04 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DirColumnView.propTypes = propTypes;
|
|
|
|
|
|
|
|
export default DirColumnView;
|