penguinmod-editor / src /components /monitor /list-monitor-scroller.jsx
soiz1's picture
Upload 1525 files
f2bee8a verified
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;