1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-03 16:10:26 +00:00

Merge branch '7.0'

This commit is contained in:
lian
2019-06-19 12:11:40 +08:00
33 changed files with 1160 additions and 55 deletions

View File

@@ -0,0 +1,46 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';
import { gettext } from '../../utils/constants';
const propTypes = {
restoreRepo: PropTypes.func.isRequired,
toggle: PropTypes.func.isRequired
};
class ConfirmRestoreRepo extends Component {
constructor(props) {
super(props);
this.state = {
btnDisabled: false
};
}
action = () => {
this.setState({
btnDisabled: true
});
this.props.restoreRepo();
}
render() {
const {formActionURL, csrfToken, toggle} = this.props;
return (
<Modal centered={true} isOpen={true} toggle={toggle}>
<ModalHeader toggle={toggle}>{gettext('Restore Library')}</ModalHeader>
<ModalBody>
<p>{gettext('Are you sure you want to restore this library?')}</p>
</ModalBody>
<ModalFooter>
<Button color="secondary" onClick={toggle}>{gettext('Cancel')}</Button>
<Button color="primary" onClick={this.action} disabled={this.state.btnDisabled}>{gettext('Restore')}</Button>
</ModalFooter>
</Modal>
);
}
}
ConfirmRestoreRepo.propTypes = propTypes;
export default ConfirmRestoreRepo;

View File

@@ -33,6 +33,7 @@ const propTypes = {
onItemMove: PropTypes.func.isRequired,
onItemCopy: PropTypes.func.isRequired,
selectedDirentList: PropTypes.array.isRequired,
onItemsMove: PropTypes.func.isRequired,
};
class DirColumnNav extends React.Component {
@@ -276,6 +277,7 @@ class DirColumnNav extends React.Component {
onItemMove={this.props.onItemMove}
currentRepoInfo={this.props.currentRepoInfo}
selectedDirentList={this.props.selectedDirentList}
onItemsMove={this.props.onItemsMove}
/>)
}
</div>

View File

@@ -171,6 +171,7 @@ class DirColumnView extends React.Component {
onItemMove={this.props.onItemMove}
onItemCopy={this.props.onItemCopy}
selectedDirentList={this.props.selectedDirentList}
onItemsMove={this.props.onItemsMove}
/>
<div className="dir-content-resize" onMouseDown={this.onResizeMouseDown}></div>
<div className="dir-content-main" style={{userSelect: select, flex: mainFlex}}>

View File

@@ -189,7 +189,7 @@ class DirentDetail extends React.Component {
}
render() {
let { dirent } = this.props;
let { dirent, repoID, path } = this.props;
let { folderDirent } = this.state;
if (!dirent && !folderDirent) {
return '';
@@ -198,7 +198,7 @@ class DirentDetail extends React.Component {
let bigIconUrl = dirent ? Utils.getDirentIcon(dirent, true) : Utils.getDirentIcon(folderDirent, true);
const isImg = dirent ? Utils.imageCheck(dirent.name) : Utils.imageCheck(folderDirent.name);
if (isImg) {
bigIconUrl = siteRoot + 'thumbnail/' + this.props.repoID + '/1024/' + dirent.name;
bigIconUrl = `${siteRoot}thumbnail/${repoID}/1024` + Utils.encodePath(`${path === '/' ? '' : path}/${dirent.name}`);
}
let direntName = dirent ? dirent.name : folderDirent.name;

View File

@@ -49,6 +49,7 @@ const propTypes = {
onFileTagChanged: PropTypes.func,
enableDirPrivateShare: PropTypes.bool.isRequired,
showDirentDetail: PropTypes.func.isRequired,
onItemsMove: PropTypes.func.isRequired,
};
class DirentListItem extends React.Component {
@@ -349,15 +350,28 @@ class DirentListItem extends React.Component {
if (Utils.isIEBrower()) {
return false;
}
let nodeRootPath = '';
nodeRootPath = this.props.path === '/' ? `${this.props.path}${this.props.dirent.name}` : `${this.props.path}/${this.props.dirent.name}`;
let dragStartItemData = {nodeDirent: this.props.dirent, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
dragStartItemData = JSON.stringify(dragStartItemData);
e.dataTransfer.effectAllowed = 'move';
if (e.dataTransfer && e.dataTransfer.setDragImage) {
e.dataTransfer.setDragImage(this.refs.drag_icon, 15, 15);
}
let { selectedDirentList } = this.props;
if (selectedDirentList.length > 0 && selectedDirentList.includes(this.props.dirent)) { // drag items and selectedDirentList include item
let selectedList = selectedDirentList.map(item => {
let nodeRootPath = this.getDirentPath(item);
let dragStartItemData = {nodeDirent: item, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
return dragStartItemData;
});
selectedList = JSON.stringify(selectedList);
e.dataTransfer.setData('applicaiton/drag-item-info', selectedList);
return ;
}
let nodeRootPath = this.getDirentPath(this.props.dirent);
let dragStartItemData = {nodeDirent: this.props.dirent, nodeParentPath: this.props.path, nodeRootPath: nodeRootPath};
dragStartItemData = JSON.stringify(dragStartItemData);
e.dataTransfer.setData('applicaiton/drag-item-info', dragStartItemData);
}
@@ -395,7 +409,22 @@ class DirentListItem extends React.Component {
}
let dragStartItemData = e.dataTransfer.getData('applicaiton/drag-item-info');
dragStartItemData = JSON.parse(dragStartItemData);
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartItemData;
if (Array.isArray(dragStartItemData)) { //move items
let direntPaths = dragStartItemData.map(draggedItem => {
return draggedItem.nodeRootPath
});
let selectedPath = Utils.joinPath(this.props.path, this.props.dirent.name);
if (direntPaths.some(direntPath => { return direntPath === selectedPath;})) { //eg; A/B, A/C --> A/B
return;
}
this.props.onItemsMove(this.props.currentRepoInfo, selectedPath);
return ;
}
let { nodeDirent, nodeParentPath, nodeRootPath } = dragStartItemData;
let dropItemData = this.props.dirent;
if (nodeDirent.name === dropItemData.name) {

View File

@@ -577,6 +577,11 @@ class DirentListView extends React.Component {
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartItemData;
if (e.target.className === 'table-container table-drop-active') {
if (Array.isArray(dragStartItemData)) { //selected items
return;
}
if (nodeRootPath === this.props.path || nodeParentPath === this.props.path) {
return;
}
@@ -664,6 +669,7 @@ class DirentListView extends React.Component {
onFileTagChanged={this.props.onFileTagChanged}
getDirentItemMenuList={this.getDirentItemMenuList}
showDirentDetail={this.props.showDirentDetail}
onItemsMove={this.props.onItemsMove}
/>
);
})}

View File

@@ -417,8 +417,13 @@ class FileUploader extends React.Component {
let repoID = this.props.repoID;
seafileAPI.getUploadLink(repoID, this.props.path).then(res => {
this.resumable.opts.target = res.data;
this.uploadInput.current.click();
if (Utils.isIEBrower()) {
this.uploadInput.current.click();
}
});
if (!Utils.isIEBrower()) {
this.uploadInput.current.click();
}
}
onFolderUpload = () => {
@@ -426,8 +431,13 @@ class FileUploader extends React.Component {
let repoID = this.props.repoID;
seafileAPI.getUploadLink(repoID, this.props.path).then(res => {
this.resumable.opts.target = res.data;
this.uploadInput.current.click();
if (Utils.isIEBrower()) {
this.uploadInput.current.click();
}
});
if (!Utils.isIEBrower()) {
this.uploadInput.current.click();
}
}
onDragStart = () => {

View File

@@ -18,6 +18,7 @@ const propTypes = {
onItemMove: PropTypes.func,
currentRepoInfo: PropTypes.object,
selectedDirentList: PropTypes.array,
onItemsMove: PropTypes.func,
};
const PADDING_LEFT = 20;
@@ -91,6 +92,20 @@ class TreeView extends React.Component {
let {nodeDirent, nodeParentPath, nodeRootPath} = dragStartNodeData;
let dropNodeData = node;
if (Array.isArray(dragStartNodeData)) { //move items
if (!dropNodeData) { //move items to root
if (dragStartNodeData[0].nodeParentPath === '/') {
this.setState({isTreeViewDropTipShow: false});
return;
}
this.props.onItemsMove(this.props.currentRepoInfo, '/');
this.setState({isTreeViewDropTipShow: false});
return;
}
this.onMoveItems(dragStartNodeData, dropNodeData, this.props.currentRepoInfo, dropNodeData.path);
return;
}
if (!dropNodeData) {
if (nodeParentPath === '/') {
this.setState({isTreeViewDropTipShow: false});
@@ -119,7 +134,8 @@ class TreeView extends React.Component {
// copy the dirent to it's child. eg: A/B -> A/B/C
if (dropNodeData.object.type === 'dir' && nodeDirent.type === 'dir') {
if (dropNodeData.parentNode.path !== nodeParentPath) {
if (dropNodeData.path.indexOf(nodeRootPath) !== -1) {
let paths = Utils.getPaths(dropNodeData.path);
if (paths.includes(nodeRootPath)) {
return;
}
}
@@ -128,6 +144,39 @@ class TreeView extends React.Component {
this.onItemMove(this.props.currentRepoInfo, nodeDirent, dropNodeData.path, nodeParentPath);
}
onMoveItems = (dragStartNodeData, dropNodeData, destRepo, destDirentPath) => {
let direntPaths = [];
let paths = Utils.getPaths(destDirentPath);
dragStartNodeData.forEach(dirent => {
let path = dirent.nodeRootPath;
direntPaths.push(path);
});
if (dropNodeData.object.type !== 'dir') {
return;
}
// move dirents to one of them. eg: A/B, A/C -> A/B
if (direntPaths.some(direntPath => { return direntPath === destDirentPath;})) {
return;
}
// move dirents to current path
if (dragStartNodeData[0].nodeParentPath && dragStartNodeData[0].nodeParentPath === dropNodeData.path ) {
return;
}
// move dirents to one of their child. eg: A/B, A/D -> A/B/C
let isChildPath = direntPaths.some(direntPath => {
return paths.includes(direntPath);
});
if (isChildPath) {
return;
}
this.props.onItemsMove(destRepo, destDirentPath);
}
freezeItem = () => {
this.setState({isItemFreezed: true});
}