import React, { Fragment } from 'react'; import PropTypes from 'prop-types'; import { gettext, siteRoot, mediaUrl } from '../../utils/constants'; import { Utils } from '../../utils/utils'; const propTypes = { path: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired, dirent: PropTypes.object.isRequired, onItemClick: PropTypes.func.isRequired, showImagePopup: PropTypes.func.isRequired, onGridItemContextMenu: PropTypes.func.isRequired, onGridItemClick: PropTypes.func.isRequired, activeDirent: PropTypes.object, onGridItemMouseDown: PropTypes.func, currentRepoInfo: PropTypes.object, onItemMove: PropTypes.func.isRequired, }; class DirentGridItem extends React.Component { constructor(props) { super(props); this.state = { isGridSelected: false, isGridDropTipShow: false, }; } componentWillReceiveProps(nextProps) { this.setState({isGridSelected: false}, () => { if (nextProps.activeDirent && nextProps.activeDirent.name === nextProps.dirent.name) { this.setState({isGridSelected: true}); } }); } onItemMove = (destRepo, dirent, selectedPath, currentPath) => { this.props.onItemMove(destRepo, dirent, selectedPath, currentPath); } onItemClick = (e) => { e.preventDefault(); e.stopPropagation(); const dirent = this.props.dirent; if (this.props.dirent === this.props.activeDirent) { this.setState({isGridSelected: false}); if (Utils.imageCheck(dirent.name)) { this.props.showImagePopup(dirent); } else { this.props.onItemClick(dirent); } } else { this.setState({isGridSelected: false}); this.props.onGridItemClick(this.props.dirent); } } onItemLinkClick = (e) => { e.preventDefault(); const dirent = this.props.dirent; if (Utils.imageCheck(dirent.name)) { this.props.showImagePopup(dirent); } else { this.props.onItemClick(dirent); } } onGridItemDragStart = (e) => { let dragStartItemData = {nodeDirent: this.props.dirent, nodeParentPath: this.props.path}; dragStartItemData = JSON.stringify(dragStartItemData); e.dataTransfer.effectAllowed = 'move'; e.dataTransfer.setData('applicaiton/drag-item-info', dragStartItemData); } onGridItemDragEnter = (e) => { if (this.props.dirent.type === 'dir') { this.setState({isGridDropTipShow: true}); } } onGridItemDragOver = (e) => { e.preventDefault(); e.dataTransfer.dropEffect = 'move'; } onGridItemDragLeave = (e) => { this.setState({isGridDropTipShow: false}); } onGridItemDragDrop = (e) => { this.setState({isGridDropTipShow: false}); if (e.dataTransfer.files.length) { // uploaded files return; } let dragStartItemData = e.dataTransfer.getData('applicaiton/drag-item-info'); dragStartItemData = JSON.parse(dragStartItemData); let {nodeDirent, nodeParentPath} = dragStartItemData; let dropItemData = this.props.dirent; if (nodeDirent.name === dropItemData.name) { return; } if (dropItemData.type !== 'dir') { return; } let selectedPath = Utils.joinPath(this.props.path, this.props.dirent.name); this.onItemMove(this.props.currentRepoInfo, nodeDirent, selectedPath, nodeParentPath); } onGridItemMouseDown = (event) =>{ this.props.onGridItemMouseDown(event); } getFileUrl = (url) => { let fileUrlArr = url.split('/'); if (fileUrlArr.indexOf('48') !== -1) { fileUrlArr.splice(fileUrlArr.indexOf('48'), 1, '192'); } let fileUrl = fileUrlArr.join('/'); return fileUrl; } onGridItemContextMenu = (event) => { let dirent = this.props.dirent; this.props.onGridItemContextMenu(event, dirent); } render() { let { dirent, path } = this.props; let direntPath = Utils.joinPath(path, dirent.name); let iconUrl = Utils.getDirentIcon(dirent); let fileUrl = dirent.encoded_thumbnail_src ? this.getFileUrl(dirent.encoded_thumbnail_src) : ''; let dirHref = ''; if (this.props.currentRepoInfo) { dirHref = siteRoot + 'library/' + this.props.repoID + '/' + this.props.currentRepoInfo.repo_name + Utils.encodePath(direntPath); } let fileHref = siteRoot + 'lib/' + this.props.repoID + '/file' + Utils.encodePath(direntPath); let gridClass = 'grid-file-img-link cursor-pointer'; gridClass += this.state.isGridSelected ? ' grid-selected-active' : ' '; gridClass += this.state.isGridDropTipShow ? ' grid-drop-show' : ' '; let lockedInfo = gettext('locked by {name}'); lockedInfo = lockedInfo.replace('{name}', dirent.lock_owner_name); return(
  • {dirent.encoded_thumbnail_src ? : } {dirent.is_locked && {gettext('locked')}}
    {dirent.name}
  • ); } } DirentGridItem.propTypes = propTypes; export default DirentGridItem;