Spaces:
Running
Running
import React from 'react'; | |
import PropTypes from 'prop-types'; | |
import classNames from 'classnames'; | |
import bindAll from 'lodash.bindall'; | |
import {FormattedMessage} from 'react-intl'; | |
import styles from './monitor.css'; | |
import {List} from 'react-virtualized'; | |
import DOMElementRenderer from '../../containers/dom-element-renderer.jsx'; | |
class ListMonitorScroller extends React.Component { | |
constructor (props) { | |
super(props); | |
bindAll(this, [ | |
'rowRenderer', | |
'noRowsRenderer', | |
'handleEventFactory' | |
]); | |
} | |
handleEventFactory (index) { | |
return () => this.props.onActivate(index); | |
} | |
noRowsRenderer () { | |
return ( | |
<div className={classNames(styles.listRow, styles.listEmpty)}> | |
<FormattedMessage | |
defaultMessage="(empty)" | |
description="Text shown on a list monitor when a list is empty" | |
id="gui.monitor.listMonitor.empty" | |
/> | |
</div> | |
); | |
} | |
rowRenderer ({index, key, style}) { | |
const item = this.props.values[index]; | |
const renderedValue = item.toListItem | |
? item.toListItem() | |
: item.toMonitorContent | |
? item.toMonitorContent() | |
: item.toReporterContent | |
? item.toReporterContent() | |
: item; | |
const value = item.isHTML | |
? (<DOMElementRenderer domElement={renderedValue} />) | |
: String(item); | |
return ( | |
<div | |
className={styles.listRow} | |
key={key} | |
style={style} | |
> | |
<div className={styles.listIndex}>{index + 1 /* one indexed */}</div> | |
<div | |
className={styles.listValue} | |
dataIndex={index} | |
style={{background: this.props.categoryColor}} | |
onClick={this.props.draggable ? this.handleEventFactory(index) : null} | |
> | |
{this.props.draggable && this.props.activeIndex === index ? ( | |
<div className={styles.inputWrapper}> | |
<input | |
autoFocus | |
autoComplete={false} | |
className={classNames(styles.listInput, 'no-drag')} | |
spellCheck={false} | |
type="text" | |
value={this.props.activeValue} | |
onBlur={this.props.onDeactivate} | |
onChange={this.props.onInput} | |
onFocus={this.props.onFocus} | |
onKeyDown={this.props.onKeyPress} // key down to get ahead of blur | |
/> | |
<div | |
className={styles.removeButton} | |
onMouseDown={this.props.onRemove} // mousedown to get ahead of blur | |
> | |
{'✖︎'} | |
</div> | |
</div> | |
) : ( | |
<div className={styles.valueInner}>{value}</div> | |
)} | |
</div> | |
</div> | |
); | |
} | |
render () { | |
const {height, values, width, activeIndex, activeValue} = this.props; | |
// Keep the active index in view if defined, else must be undefined for List component | |
const scrollToIndex = activeIndex === null ? undefined : activeIndex; /* eslint-disable-line no-undefined */ | |
return ( | |
<List | |
activeIndex={activeIndex} | |
activeValue={activeValue} | |
height={(height) - 42 /* Header/footer size, approx */} | |
noRowsRenderer={this.noRowsRenderer} | |
rowCount={values.length} | |
rowHeight={24 /* Row size is same for all rows */} | |
rowRenderer={this.rowRenderer} | |
scrollToIndex={scrollToIndex} /* eslint-disable-line no-undefined */ | |
values={values} | |
width={width} | |
/> | |
); | |
} | |
} | |
ListMonitorScroller.propTypes = { | |
activeIndex: PropTypes.number, | |
activeValue: PropTypes.string, | |
categoryColor: PropTypes.string, | |
draggable: PropTypes.bool, | |
height: PropTypes.number, | |
onActivate: PropTypes.func, | |
onDeactivate: PropTypes.func, | |
onFocus: PropTypes.func, | |
onInput: PropTypes.func, | |
onKeyPress: PropTypes.func, | |
onRemove: PropTypes.func, | |
values: PropTypes.arrayOf(PropTypes.oneOfType([ | |
PropTypes.string, | |
PropTypes.number | |
])), | |
width: PropTypes.number | |
}; | |
export default ListMonitorScroller; | |