1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-07 01:41:39 +00:00

Open the current image viewer (#3106)

This commit is contained in:
zxj96
2019-03-15 15:48:16 +08:00
committed by Daniel Pan
parent 2c09332b79
commit 9530e94fe1
3 changed files with 112 additions and 2 deletions

View File

@@ -7,9 +7,12 @@ import Delete from '../../components/dialog/delete-dialog';
import Rename from '../../components/dialog/rename-dialog';
import CreateFolder from '../../components/dialog/create-folder-dialog';
import CreateFile from '../../components/dialog/create-file-dialog';
import { siteRoot } from '../../utils/constants';
import { siteRoot, gettext, thumbnailSizeForOriginal } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import Lightbox from 'react-image-lightbox';
import 'react-image-lightbox/style.css';
const propTypes = {
currentPath: PropTypes.string.isRequired,
repoPermission: PropTypes.bool.isRequired,
@@ -26,6 +29,7 @@ const propTypes = {
repoID: PropTypes.string.isRequired,
navRate: PropTypes.number,
inResizing: PropTypes.bool.isRequired,
currentRepoInfo: PropTypes.object.isRequired,
};
class DirColumnNav extends React.Component {
@@ -38,6 +42,9 @@ class DirColumnNav extends React.Component {
isAddFileDialogShow: false,
isAddFolderDialogShow: false,
isRenameDialogShow: false,
isNodeImagePopupOpen: false,
imageNodeItems: [],
imageIndex: 0,
};
this.isNodeMenuShow = true;
}
@@ -48,6 +55,10 @@ class DirColumnNav extends React.Component {
onNodeClick = (node) => {
this.setState({opNode: node});
if (Utils.imageCheck(node.object.name)) {
this.showNodeImagePopup(node);
return;
}
this.props.onNodeClick(node);
}
@@ -144,9 +155,88 @@ class DirColumnNav extends React.Component {
return isDuplicated;
}
showNodeImagePopup = (node) => {
let childrenNode = node.parentNode.children;
let items = childrenNode.filter((item) => {
return Utils.imageCheck(item.object.name);
});
let imageNames = items.map((item) => {
return item.object.name;
})
this.setState({
isNodeImagePopupOpen: true,
imageNodeItems: this.prepareImageItems(node),
imageIndex: imageNames.indexOf(node.object.name)
});
}
prepareImageItems = (node) => {
let childrenNode = node.parentNode.children;
let items = childrenNode.filter((item) => {
return Utils.imageCheck(item.object.name);
});
const useThumbnail = !this.props.currentRepoInfo.encrypted;
let prepareItem = (item) => {
const name = item.object.name;
const path = Utils.encodePath(Utils.joinPath(node.parentNode.path, name));
const fileExt = name.substr(name.lastIndexOf('.') + 1).toLowerCase();
const isGIF = fileExt === 'gif';
const repoID = this.props.repoID;
let src = '';
if (useThumbnail && !isGIF) {
src = `${siteRoot}thumbnail/${repoID}/${thumbnailSizeForOriginal}${path}`;
} else {
src = `${siteRoot}repo/${repoID}/raw${path}`;
}
return {
'name': name,
'url': `${siteRoot}lib/${repoID}/file${path}`,
'src': src
};
};
return items.map((item) => { return prepareItem(item); });
}
closeNodeImagePopup = () => {
this.setState({
isNodeImagePopupOpen: false
});
}
moveToPrevImage = () => {
const imageItemsLength = this.state.imageNodeItems.length;
this.setState((prevState) => ({
imageIndex: (prevState.imageIndex + imageItemsLength - 1) % imageItemsLength
}));
}
moveToNextImage = () => {
const imageItemsLength = this.state.imageNodeItems.length;
this.setState((prevState) => ({
imageIndex: (prevState.imageIndex + 1) % imageItemsLength
}));
}
render() {
let flex = this.props.navRate ? '0 0 ' + this.props.navRate * 100 + '%' : '0 0 25%';
const select = this.props.inResizing ? 'none' : '';
const imageNodeItems = this.state.imageNodeItems;
const imageIndex = this.state.imageIndex;
const imageItemsLength = imageNodeItems.length;
const imageCaption = imageItemsLength && (
<Fragment>
<span>{gettext('%curr% of %total%').replace('%curr%', imageIndex + 1).replace('%total%', imageItemsLength)}</span>
<br />
<a href={imageNodeItems[imageIndex].url} target="_blank">{gettext('Open in New Tab')}</a>
</Fragment>
);
return (
<Fragment>
<div className="dir-content-nav" role="navigation" style={{flex: (flex), userSelect: select}}>
@@ -205,6 +295,25 @@ class DirColumnNav extends React.Component {
/>
</ModalPortal>
)}
{this.state.isNodeImagePopupOpen && (
<Lightbox
mainSrc={imageNodeItems[imageIndex].src}
imageCaption={imageCaption}
imageTitle={imageNodeItems[imageIndex].name}
nextSrc={imageNodeItems[(imageIndex + 1) % imageItemsLength].src}
prevSrc={imageNodeItems[(imageIndex + imageItemsLength - 1) % imageItemsLength].src}
onCloseRequest={this.closeNodeImagePopup}
onMovePrevRequest={this.moveToPrevImage}
onMoveNextRequest={this.moveToNextImage}
imagePadding={70}
imageLoadErrorMessage={gettext('The image could not be loaded.')}
prevLabel={gettext('Previous (Left arrow key)')}
nextLabel={gettext('Next (Right arrow key)')}
closeLabel={gettext('Close (Esc)')}
zoomInLabel={gettext('Zoom in')}
zoomOutLabel={gettext('Zoom out')}
/>
)}
</Fragment>
);
}

View File

@@ -162,6 +162,7 @@ class DirColumnView extends React.Component {
repoID={this.props.repoID}
navRate={this.state.navRate}
inResizing={this.state.inResizing}
currentRepoInfo={this.props.currentRepoInfo}
/>
<div className="dir-content-resize" onMouseDown={this.onResizeMouseDown}></div>
<div className="dir-content-main" style={{userSelect: select, flex: mainFlex}}>

View File

@@ -362,7 +362,7 @@ class DirentListItem extends React.Component {
<td className="text-center">
<div className="dir-icon">
{dirent.encoded_thumbnail_src ?
<img src={`${siteRoot}${dirent.encoded_thumbnail_src}`} className="thumbnail" alt="" /> :
<img src={`${siteRoot}${dirent.encoded_thumbnail_src}`} className="thumbnail cursor-pointer" onClick={this.onItemClick} alt="" /> :
<img src={iconUrl} width="24" alt='' />
}
{dirent.is_locked && <img className="locked" src={mediaUrl + 'img/file-locked-32.png'} alt={gettext('locked')} title={dirent.lock_owner_name}/>}