From 0fccd9530bd7d50f05055f3eb0dea5d1af07bfd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E9=A1=BA=E5=BC=BA?= Date: Thu, 21 Feb 2019 17:37:04 +0800 Subject: [PATCH] Lib view mode (#2975) * [update dir layout]rewrite dir layout * add file menu handler * optimized code * add file load error message for file component * repair pencil bug * delete unnecessary file * reapir file-chooser bug * add file uploader module * rename component name --- .../src/components/dialog/list-tag-dialog.js | 2 +- .../src/components/dialog/readme-dialog.js | 2 +- .../dir-view-mode/dir-column-file.js | 104 +++++++ .../dir-view-mode/dir-column-nav.js} | 80 ++--- .../dir-view-mode/dir-column-view.js | 155 ++++++++++ .../components/dir-view-mode/dir-grid-view.js | 19 ++ .../components/dir-view-mode/dir-list-view.js | 90 ++++++ .../dirent-detail/detail-list-view.js | 4 +- .../file-chooser/dirent-list-item.js | 6 +- .../components/file-chooser/file-chooser.js | 4 + .../components/select-editor/select-editor.js | 2 +- .../toolbar/dir-operation-toolbar.js | 14 +- .../src/components/tree-view/tree-node.js | 3 +- frontend/src/css/layout.css | 1 - frontend/src/css/lib-content-view.css | 58 +--- .../lib-content-view/lib-content-container.js | 270 +++++++++++++++++ .../lib-content-view/lib-content-main.js | 285 ------------------ .../lib-content-view/lib-content-toolbar.js | 130 ++++++++ .../lib-content-view/lib-content-view.js | 175 ++++++----- 19 files changed, 931 insertions(+), 473 deletions(-) create mode 100644 frontend/src/components/dir-view-mode/dir-column-file.js rename frontend/src/{pages/lib-content-view/lib-content-nav.js => components/dir-view-mode/dir-column-nav.js} (66%) create mode 100644 frontend/src/components/dir-view-mode/dir-column-view.js create mode 100644 frontend/src/components/dir-view-mode/dir-grid-view.js create mode 100644 frontend/src/components/dir-view-mode/dir-list-view.js create mode 100644 frontend/src/pages/lib-content-view/lib-content-container.js delete mode 100644 frontend/src/pages/lib-content-view/lib-content-main.js create mode 100644 frontend/src/pages/lib-content-view/lib-content-toolbar.js diff --git a/frontend/src/components/dialog/list-tag-dialog.js b/frontend/src/components/dialog/list-tag-dialog.js index cba8c1f8d6..9c3e4c55e5 100644 --- a/frontend/src/components/dialog/list-tag-dialog.js +++ b/frontend/src/components/dialog/list-tag-dialog.js @@ -54,7 +54,7 @@ class TagListItem extends React.Component { {this.props.item.fileCount}{' '}{'files'} - + ); } diff --git a/frontend/src/components/dialog/readme-dialog.js b/frontend/src/components/dialog/readme-dialog.js index 9c14f3ee84..1721638234 100644 --- a/frontend/src/components/dialog/readme-dialog.js +++ b/frontend/src/components/dialog/readme-dialog.js @@ -39,7 +39,7 @@ class ReadmeDialog extends React.Component { return ( {this.props.fileName} - + {this.state.isLoading ? diff --git a/frontend/src/components/dir-view-mode/dir-column-file.js b/frontend/src/components/dir-view-mode/dir-column-file.js new file mode 100644 index 0000000000..77727ec919 --- /dev/null +++ b/frontend/src/components/dir-view-mode/dir-column-file.js @@ -0,0 +1,104 @@ +import React, { Fragment } from 'react'; +import PropTypes from 'prop-types'; +import { Utils } from '../../utils/utils'; +import { gettext, siteRoot } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api'; +import WikiMarkdownViewer from '../wiki-markdown-viewer'; + +const propTypes = { + path: PropTypes.string.isRequired, + repoID: PropTypes.string.isRequired, + hash: PropTypes.string, + isDraft: PropTypes.bool, + hasDraft: PropTypes.bool, + goDraftPage: PropTypes.func.isRequired, + reviewStatus: PropTypes.any, + goReviewPage: PropTypes.func.isRequired, + isFileLoading: PropTypes.bool.isRequired, + isFileLoadedErr: PropTypes.bool.isRequired, + filePermission: PropTypes.bool, + content: PropTypes.string, + lastModified: PropTypes.string, + latestContributor: PropTypes.string, + onLinkClick: PropTypes.func.isRequired, +}; + +class DirColumnFile extends React.Component { + + componentDidMount() { + if (this.props.hash) { + let hash = this.props.hash; + setTimeout(function() { + window.location.hash = hash; + }, 500); + } + } + + onEditClick = (e) => { + e.preventDefault(); + let { path, repoID } = this.props; + let url = siteRoot + 'lib/' + repoID + '/file' + Utils.encodePath(path) + '?mode=edit'; + window.open(url); + } + + onNewDraft = (e) => { + e.preventDefault(); + let { path, repoID } = this.props; + seafileAPI.createDraft(repoID, path).then(res => { + window.location.href = siteRoot + 'lib/' + res.data.origin_repo_id + '/file' + res.data.draft_file_path + '?mode=edit'; + }); + } + + goDraftPage = (e) => { + e.preventDefault(); + this.props.goDraftPage(); + } + + goReviewPage = (e) => { + e.preventDefault(); + this.props.goReviewPage(); + } + + render() { + if (this.props.isFileLoadedErr) { + return ( +
{gettext('File does not exist.')}
+ ); + } + return ( +
+ + + {this.props.reviewStatus === 'open' && +
+
+ {gettext('This file is in review stage')} + {gettext('View Review')} +
+
+ } + {(this.props.reviewStatus !== 'open' && !this.props.isDraft && this.props.hasDraft) && +
+
+ {gettext('This file is in draft stage.')} + {gettext('Edit Draft')} +
+
+ } +
+
+
+ ); + } +} + +DirColumnFile.propTypes = propTypes; + +export default DirColumnFile; diff --git a/frontend/src/pages/lib-content-view/lib-content-nav.js b/frontend/src/components/dir-view-mode/dir-column-nav.js similarity index 66% rename from frontend/src/pages/lib-content-view/lib-content-nav.js rename to frontend/src/components/dir-view-mode/dir-column-nav.js index 8360921270..665596e106 100644 --- a/frontend/src/pages/lib-content-view/lib-content-nav.js +++ b/frontend/src/components/dir-view-mode/dir-column-nav.js @@ -1,7 +1,5 @@ import React, { Fragment } 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 Loading from '../../components/loading'; import ModalPortal from '../../components/modal-portal'; @@ -11,11 +9,11 @@ import CreateFolder from '../../components/dialog/create-folder-dialog'; import CreateFile from '../../components/dialog/create-file-dialog'; const propTypes = { + currentPath: PropTypes.string.isRequired, repoPermission: PropTypes.bool.isRequired, - currentPath: PropTypes.string, - currentRepoInfo: PropTypes.object, // Initially not loaded isTreeDataLoading: PropTypes.bool.isRequired, treeData: PropTypes.object.isRequired, + currentNode: PropTypes.object, onNodeClick: PropTypes.func.isRequired, onNodeCollapse: PropTypes.func.isRequired, onNodeExpanded: PropTypes.func.isRequired, @@ -25,16 +23,12 @@ const propTypes = { onAddFolderNode: PropTypes.func.isRequired, }; -class LibContentNav extends React.Component { +class DirColumnNav extends React.Component { constructor(props) { super(props); this.state = { opNode: null, - isLoadFailed: false, - isMenuIconShow: false, - isHeaderMenuShow: false, - isHeaderMenuFreezed: false, isDeleteDialogShow: false, isAddFileDialogShow: false, isAddFolderDialogShow: false, @@ -43,13 +37,8 @@ class LibContentNav extends React.Component { this.isNodeMenuShow = true; } - onDropdownToggleClick = (e) => { - e.preventDefault(); - this.toggleOperationMenu(); - } - - toggleOperationMenu = () => { - this.setState({isHeaderMenuShow: !this.state.isHeaderMenuShow}); + componentWillReceiveProps(nextProps) { + this.setState({opNode: nextProps.currentNode}); } onNodeClick = (node) => { @@ -145,45 +134,22 @@ class LibContentNav extends React.Component { render() { return ( -