react-cms
Version:
For personal use. Not production.
471 lines (334 loc) • 9.17 kB
JavaScript
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import { DragDropContext } from 'react-dnd';
import HTML5Backend from 'react-dnd-html5-backend';
import Button from 'material-ui/Button';
import Grid from 'material-ui/Grid';
import AddIcon from 'material-ui-icons/Add';
import Uploader from '../Component';
import '../styles/styles.less';
import GalleryImageWrapper from '../Image/wrapper';
class Gallery extends Component{
static propTypes = {
// onSelectContactImage: PropTypes.func.isRequired,
// updateItem: PropTypes.func.isRequired,
updateItem: PropTypes.func,
onUpload: PropTypes.func.isRequired,
item: PropTypes.object.isRequired,
};
static contextTypes = {
connector_url: PropTypes.string.isRequired,
// localQuery: PropTypes.func.isRequired,
};
constructor(props){
super(props);
this.state = {
expanded: false,
}
}
componentWillMount(){
}
componentDidMount(){
}
componentDidUpdate(){
if(this.props.debug){
}
}
updateItem(data){
const {
item,
updateItem,
} = this.props;
updateItem(item, data);
}
uploadImageCallBack = (file) => {
let {
// store,
item,
} = this.props;
let {
connector_url,
// localQuery,
} = this.context;
const {
id,
} = item;
return new Promise(
(resolve, reject) => {
var body = new FormData();
body.append('file', file);
fetch(connector_url +'?pub_action=images/upload',{
credentials: 'same-origin',
method: "POST",
body: body,
})
.then(function (response) {
return response.json()
})
.then( data => {
if(data.success){
if(data.object && data.object.url){
let link = data.object.url;
resolve({
data: {
link: link,
}
});
// this.setState({
// url: data.object.url,
// })
// store.getDispatcher().dispatch(store.actions['CREATE'], {
// src: data.object.url,
// });
// const {
// item,
// } = this.props;
// localQuery({
// operationName: "addCompanyGalleryImage",
// variables: {
// companyId: id,
// image: link,
// },
// });
const {
onUpload,
} = this.props;
this.setState({
expanded: false,
}, () => {
onUpload && onUpload({
image: link,
});
});
}
}
})
.catch(error => {
console.error('Request failed', error);
// alert("Ошибка выполнения запроса");
});
}
);
}
onSelectImage = (event, checked, image) => {
let {
// onSelectContactImage,
item,
} = this.props;
let {
_selectedImages,
} = item;
_selectedImages = _selectedImages || [];
if(checked){
_selectedImages.push(image.src);
}
else{
// let selectedImage = _selectedImages.indexOf(i => {return i === image});
let selectedImage = _selectedImages.indexOf(image);
if(selectedImage != -1){
_selectedImages.splice(selectedImage, 1);
}
}
// onSelectContactImage(image);
this.updateItem({
_selectedImages,
}, true);
this.forceUpdate();
}
handleDelete(event, index){
const {
item,
} = this.props;
if(!item){
return false;
}
let {
gallery,
} = item;
if(!gallery){
return;
}
// const index = gallery.indexOf(image);
if(index !== -1){
gallery.splice(index, 1);
this.updateItem({
gallery,
});
}
}
render(){
let {
classes,
// store,
item,
// onSelectContactImage,
updateItem,
onUpload,
...other
} = this.props;
if(!item){
return null;
}
// return <div>sdfsdf</div>;
let {
expanded,
draggableImage,
hoveredImage,
positionIndex,
} = this.state;
let newIndex;
if(positionIndex !== undefined && positionIndex != -1){
newIndex = positionIndex;
}
let images = [];
let {
// extended,
gallery,
_selectedImages,
} = item;
_selectedImages = _selectedImages || [];
// let {
// gallery,
// } = extended || {};
let imagesArray = [];
gallery && gallery.map(n => {
const {
imageFormats,
} = n;
const {
slider_thumb: image,
} = imageFormats || {};
imagesArray.push({
src: image,
});
});
/*
Если элемент двигается, то перемещаем его в массиве
*/
if(newIndex !== undefined && imagesArray && imagesArray.length){
let oldIndex = imagesArray.findIndex(n => n.src == draggableImage);
// let newIndex = imagesArray.indexOf(hoveredImage);
if(oldIndex != -1){
let movedItem = imagesArray.splice(oldIndex, 1)[0];
imagesArray.splice(newIndex, 0, movedItem);
}
}
imagesArray.map((image, index) => {
images.push(<GalleryImageWrapper
// key={image.src || images.length}
key={index}
image={image}
onSelectImage={this.onSelectImage}
checked={_selectedImages.find(i => {return i == image.src}) ? true : false}
draggableImage={draggableImage}
onStartDrag={(image) => {
this.setState({
draggableImage: image.src,
});
}}
handleDelete={event => {
this.handleDelete(event, index);
}}
onEndDrag={(image) => {
/*
Если новый индекс отличается от реального, сохраняем состояние
*/
if(newIndex !== undefined){
// Определяем оригинальный индекс перемещаемой картинки
// let originalIndex = store.getState().indexOf(draggableImage);
let originalIndex = gallery.indexOf(n => n === draggableImage);
if(newIndex != originalIndex){
gallery.splice(newIndex, 0, gallery.splice(index, 1)[0]);
this.updateItem({
gallery,
});
}
}
this.setState({
draggableImage: null,
hoveredImage: null,
positionIndex: undefined,
});
}}
onDdHover={(image) => {
if(draggableImage != image.src){
// let positionIndex = store.getState().indexOf(image);
let positionIndex = imagesArray.indexOf(image);
this.setState({
// hoveredImage: image,
positionIndex
});
}
// this.setState({
// hoveredImage: image,
// });
// this.forceUpdate();
}}
isDragging2={draggableImage && draggableImage == image.src}
>
</GalleryImageWrapper>);
});
return <div
{...other}
>
<Uploader
expanded={expanded}
config={{
uploadEnabled: true,
urlEnabled: false,
defaultSize: {
height: 'auto',
width: 'auto',
},
uploadCallback: this.uploadImageCallBack,
}}
onExpandEvent={() => {
}}
doCollapse={() => {
this.setState({
expanded: !this.state.expanded,
});
}}
translations = {{
'generic.add': 'Добавить',
'generic.cancel': 'Отменить',
'components.controls.image.fileUpload': 'Файлы',
'components.controls.image.byURL': 'URL',
'components.controls.image.dropFileText': 'Переместите в эту область файлы или кликните для загрузки',
}}
>
<Button
fab
accent
raised
// className={classes.createButton}
style={{
height: 30,
width: 30,
marginRight: 5,
}}
onClick={() => this.setState({
expanded: true,
})}
>
<AddIcon
/>
</Button> <span
style={{
cursor: "pointer",
}}
onClick={() => this.setState({
expanded: true,
})}
>Добавить изображение</span>
</Uploader>
<Grid
container
className="gallery-wrapper"
>
{images}
</Grid>
</div>;
}
}
export default DragDropContext(HTML5Backend)(Gallery);