@bigfishtv/cockpit
Version:
86 lines (78 loc) • 2.49 kB
JavaScript
import PropTypes from 'prop-types'
import React, { Component } from 'react'
import ImmutablePropTypes from 'react-immutable-proptypes'
import { DragLayer } from 'react-dnd'
import { getChildByIdImmutable } from '../../utils/treeUtils'
/**
* Wrapper for TreeItem being dragged
*/
(monitor => ({
item: monitor.getItem(),
itemType: monitor.getItemType(),
initialOffset: monitor.getInitialSourceClientOffset(),
currentOffset: monitor.getSourceClientOffset(),
}))
export default class TreeDragLayer extends Component {
static propTypes = {
/** disregard - provided by react-dnd */
initialOffset: PropTypes.shape({
x: PropTypes.number.isRequired,
y: PropTypes.number.isRequired,
}),
/** disregard - provided by react-dnd */
currentOffset: PropTypes.shape({
x: PropTypes.number.isRequired,
y: PropTypes.number.isRequired,
}),
/** if item is being dragged */
dragging: PropTypes.bool,
/** list of ids for selected items */
selectedIds: PropTypes.array,
/** immutable tree, list of maps of list of maps etc. */
InflatedTree: ImmutablePropTypes.listOf(ImmutablePropTypes.map),
}
constructor() {
super()
this.state = {
title: '',
count: 0,
}
}
componentWillUpdate(nextProps, nextState) {
if (!this.props.dragging && nextProps.dragging) {
const { selectedIds, InflatedTree } = nextProps
let title = ''
let count = 0
if (selectedIds.length == 1) {
const item = getChildByIdImmutable(selectedIds[0], InflatedTree).toObject()
title = item.title || item.name
} else if (selectedIds.length > 1) {
const titles = selectedIds.map(id => {
const item = getChildByIdImmutable(id, InflatedTree).toObject()
return item.title || item.name
})
count = selectedIds.length
title = titles.join(', ')
}
this.setState({ title, count })
}
}
render() {
const { initialOffset, currentOffset, dragging } = this.props
if (!dragging || !initialOffset || !currentOffset) return null
const { title } = this.state
const { count } = this.state
const transform = 'translate(' + currentOffset.x + 'px, ' + currentOffset.y + 'px)'
const styles = { transform: transform, WebkitTransform: transform }
return (
<div className="tree-overlay">
<div className="tree-node" style={styles}>
<div className="tree-cell">
{count > 1 && <div className="tree-cell-count">{count}</div>}
<div className="tree-cell-title">{title}</div>
</div>
</div>
</div>
)
}
}