diff --git a/frontend/src/components/dialog/copy-dirent-dialog.js b/frontend/src/components/dialog/copy-dirent-dialog.js index 61c6b1af55..501321109a 100644 --- a/frontend/src/components/dialog/copy-dirent-dialog.js +++ b/frontend/src/components/dialog/copy-dirent-dialog.js @@ -124,7 +124,7 @@ class CopyDirent extends React.Component { return; } - this.props.onItemCopy(repo, direntPath, selectedPath); + this.props.onItemCopy(repo, this.props.dirent, selectedPath); this.toggle(); } diff --git a/frontend/src/components/dialog/move-dirent-dialog.js b/frontend/src/components/dialog/move-dirent-dialog.js index 10cfc50529..afd6032dae 100644 --- a/frontend/src/components/dialog/move-dirent-dialog.js +++ b/frontend/src/components/dialog/move-dirent-dialog.js @@ -124,7 +124,7 @@ class MoveDirent extends React.Component { return; } - this.props.onItemMove(repo, direntPath, selectedPath); + this.props.onItemMove(repo, this.props.dirent, selectedPath); this.toggle(); } diff --git a/frontend/src/components/dir-view/dir-panel.js b/frontend/src/components/dir-view/dir-panel.js new file mode 100644 index 0000000000..cc7ce5a04a --- /dev/null +++ b/frontend/src/components/dir-view/dir-panel.js @@ -0,0 +1,208 @@ +import React, { Fragment } from 'react'; +import PropTypes from 'prop-types'; +import cookie from 'react-cookies'; +import { gettext, siteRoot } from '../../utils/constants'; +import { seafileAPI } from '../../utils/seafile-api'; +import CommonToolbar from '../toolbar/common-toolbar'; +import ViewModeToolbar from '../toolbar/view-mode-toolbar'; +import DirOperationToolBar from '../toolbar/dir-operation-toolbar'; +import MutipleDirOperationToolbar from '../toolbar/mutilple-dir-operation-toolbar'; +import CurDirPath from '../cur-dir-path'; +import DirentListView from '../dirent-list-view/dirent-list-view'; +import DirentDetail from '../dirent-detail/dirent-details'; +import FileUploader from '../file-uploader/file-uploader'; + +const propTypes = { + currentRepo: PropTypes.object, + path: PropTypes.string.isRequired, + repoID: PropTypes.string.isRequired, + repoName: PropTypes.string.isRequired, + pathExist: PropTypes.bool.isRequired, + permission: PropTypes.bool.isRequired, + isDirentListLoading: PropTypes.bool.isRequired, + isDirentSelected: PropTypes.bool.isRequired, + isAllDirentSelected: PropTypes.bool.isRequired, + direntList: PropTypes.array.isRequired, + selectedDirentList: PropTypes.array.isRequired, + onItemClick: PropTypes.func.isRequired, + onAddFile: PropTypes.func.isRequired, + onAddFolder: PropTypes.func.isRequired, + onItemMove: PropTypes.func.isRequired, + onItemCopy: PropTypes.func.isRequired, + onItemRename: PropTypes.func.isRequired, + onItemDelete: PropTypes.func.isRequired, + onItemSelected: PropTypes.func.isRequired, + onItemsCopy: PropTypes.func.isRequired, + onItemsMove: PropTypes.func.isRequired, + onItemsDelete: PropTypes.func.isRequired, + onAllItemSelected: PropTypes.func.isRequired, + onFileTagChanged: PropTypes.func.isRequired, + onMenuClick: PropTypes.func.isRequired, + onPathClick: PropTypes.func.isRequired, + updateDirent: PropTypes.func.isRequired, + onSearchedClick: PropTypes.func.isRequired, + onFileUploadSuccess: PropTypes.func.isRequired, +}; + +class DirPanel extends React.Component { + + constructor(props) { + super(props); + this.state = { + currentDirent: null, + currentMode: 'list', + isDirentDetailShow: false, + isRepoOwner: true, + }; + } + + componentDidMount() { + let currentRepo = this.props.currentRepo; + if (currentRepo) { + seafileAPI.getAccountInfo().then(res => { + let user_email = res.data.email; + let isRepoOwner = currentRepo.owner_email === user_email; + this.setState({isRepoOwner: isRepoOwner}); + }); + } + } + + onItemDetails = (dirent) => { + this.setState({ + currentDirent: dirent, + isDirentDetailShow: true, + }); + } + + onItemDetailsClose = () => { + this.setState({isDirentDetailShow: false}); + } + + onUploadFile = (e) => { + e.nativeEvent.stopImmediatePropagation(); + this.uploader.onFileUpload(); + } + + onUploadFolder = (e) => { + e.nativeEvent.stopImmediatePropagation(); + this.uploader.onFolderUpload(); + } + + switchViewMode = (mode) => { + let { path, repoID } = this.props; + if (mode === this.state.currentMode) { + return; + } + if (mode === 'wiki') { + var url = siteRoot + 'wiki/lib/' + repoID + path; + window.location = url; + } + cookie.save('view_mode', mode, { path: '/' }); + + this.setState({currentMode: mode}); + } + + render() { + const ErrMessage = (
-
|
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 8c4337bc3c..999f814bcf 100644 --- a/frontend/src/components/dirent-list-view/dirent-list-view.js +++ b/frontend/src/components/dirent-list-view/dirent-list-view.js @@ -7,7 +7,6 @@ import DirentListItem from './dirent-list-item'; const propTypes = { path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, - serviceUrl: PropTypes.string.isRequired, isRepoOwner: PropTypes.bool, currentRepo: PropTypes.object, isAllItemSelected: PropTypes.bool.isRequired, @@ -45,8 +44,8 @@ class DirentListView extends React.Component { this.onFreezedItem(); } - onItemDetails = (dirent, direntPath) => { - this.props.onItemDetails(dirent, direntPath); + onItemDetails = (dirent) => { + this.props.onItemDetails(dirent); } render() { @@ -81,7 +80,6 @@ class DirentListView extends React.Component { dirent={dirent} path={this.props.path} repoID={this.props.repoID} - serviceUrl={this.props.serviceUrl} currentRepo={this.props.currentRepo} isRepoOwner={this.props.isRepoOwner} onItemClick={this.props.onItemClick} diff --git a/frontend/src/components/file-uploader/file-uploader.js b/frontend/src/components/file-uploader/file-uploader.js index 6f3387d3e9..1031d3d396 100644 --- a/frontend/src/components/file-uploader/file-uploader.js +++ b/frontend/src/components/file-uploader/file-uploader.js @@ -26,7 +26,7 @@ const propTypes = { fileTypeErrorCallback: PropTypes.func, dragAndDrop: PropTypes.bool.isRequired, path: PropTypes.string.isRequired, - onFileSuccess: PropTypes.func.isRequired, + onFileUploadSuccess: PropTypes.func.isRequired, }; class FileUploader extends React.Component { @@ -97,7 +97,7 @@ class FileUploader extends React.Component { this.resumable.on('fileAdded', this.onFileAdded); this.resumable.on('filesAddedComplete', this.filesAddedComplete); this.resumable.on('fileProgress', this.onFileProgress); - this.resumable.on('fileSuccess', this.onFileSuccess); + this.resumable.on('fileSuccess', this.onFileUploadSuccess); this.resumable.on('progress', this.onProgress); this.resumable.on('complete', this.onComplete); this.resumable.on('pause', this.onPause); @@ -205,7 +205,7 @@ class FileUploader extends React.Component { this.setState({uploadFileList: uploadFileList}); } - onFileSuccess = (file) => { + onFileUploadSuccess = (file) => { // todos, update uploadList or updateList; } diff --git a/frontend/src/components/search/search.js b/frontend/src/components/search/search.js index b87187f7b0..72034daf28 100644 --- a/frontend/src/components/search/search.js +++ b/frontend/src/components/search/search.js @@ -179,7 +179,7 @@ class Search extends Component { for (let key in queryData) { params += key + '=' + queryData[key] + '&'; } - window.location = siteRoot + '/search/?' + params.slice(0, params.length - 1); + window.location = siteRoot + 'search/?' + params.slice(0, params.length - 1); } renderSearchResult() { diff --git a/frontend/src/components/toolbar/dir-operation-toolbar.js b/frontend/src/components/toolbar/dir-operation-toolbar.js index c4ee406420..483a3a0c6d 100644 --- a/frontend/src/components/toolbar/dir-operation-toolbar.js +++ b/frontend/src/components/toolbar/dir-operation-toolbar.js @@ -1,17 +1,16 @@ import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { Utils } from '../../utils/utils'; -import { gettext } from '../../utils/constants'; +import { gettext, siteRoot } from '../../utils/constants'; import ModalPortal from '../modal-portal'; import CreateFolder from '../../components/dialog/create-folder-dialog'; import CreateFile from '../../components/dialog/create-file-dialog'; const propTypes = { - isViewFile: PropTypes.bool, + isViewFile: PropTypes.bool, // just for view file, + permission: PropTypes.string, //just for view fileļ¼ and premission is file permission path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, - serviceUrl: PropTypes.string.isRequired, - permission: PropTypes.string.isRequired, onAddFile: PropTypes.func.isRequired, onAddFolder: PropTypes.func.isRequired, onUploadFile: PropTypes.func.isRequired, @@ -58,8 +57,8 @@ class DirOperationToolbar extends React.Component { onEditClick = (e) => { e.preventDefault(); - let { path, repoID, serviceUrl } = this.props; - window.location.href= serviceUrl + '/lib/' + repoID + '/file' + path + '?mode=edit'; + let { path, repoID } = this.props; + window.location.href= siteRoot + 'lib/' + repoID + '/file' + path + '?mode=edit'; } onUploadClick = (e) => { diff --git a/frontend/src/components/tree-dir-view/tree-dir-list.js b/frontend/src/components/tree-dir-view/tree-dir-list.js index eb986370d6..dea36fe84c 100644 --- a/frontend/src/components/tree-dir-view/tree-dir-list.js +++ b/frontend/src/components/tree-dir-view/tree-dir-list.js @@ -1,6 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; -import { serviceUrl } from '../../utils/constants'; +import { siteRoot } from '../../utils/constants'; const propTypes = { node: PropTypes.object.isRequired, @@ -35,7 +35,7 @@ class TreeDirList extends React.Component { return ( | |
- |
{node.name} | {node.size} | diff --git a/frontend/src/components/tree-view/node.js b/frontend/src/components/tree-view/node.js index 1e89693ba6..42bbb8f9e9 100644 --- a/frontend/src/components/tree-view/node.js +++ b/frontend/src/components/tree-view/node.js @@ -65,6 +65,9 @@ class Node { } isMarkdown() { + if (this.isDir()) { + return false; + } let index = this.name.lastIndexOf('.'); if (index == -1) { return false; diff --git a/frontend/src/css/layout.css b/frontend/src/css/layout.css index 1adfce6cf8..056d7df755 100644 --- a/frontend/src/css/layout.css +++ b/frontend/src/css/layout.css @@ -121,6 +121,7 @@ display: flex; flex: 1; flex-direction: column; + min-height: 0; } .header { diff --git a/frontend/src/pages/dashboard/files-activities.js b/frontend/src/pages/dashboard/files-activities.js index 53862d0b45..9b49f8683c 100644 --- a/frontend/src/pages/dashboard/files-activities.js +++ b/frontend/src/pages/dashboard/files-activities.js @@ -1,4 +1,4 @@ -import React, { Component } from 'react'; +import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, siteRoot } from '../../utils/constants'; @@ -17,7 +17,7 @@ class FileActivitiesContent extends Component { return
{error_msg}
: ''} -