diff options
author | Maximilian Hils <git@maximilianhils.com> | 2014-11-28 20:03:04 +0100 |
---|---|---|
committer | Maximilian Hils <git@maximilianhils.com> | 2014-11-28 20:03:04 +0100 |
commit | dd1a45140c8a6cb3f6c5d7247120c05fa37cdf24 (patch) | |
tree | 88b171c7be75fe408ab647d8f5d3d74d5ae833b5 /web/src/js/components/virtualscroll.jsx.js | |
parent | c39b6e4277357c9da1dfd5e3e8c41b5b3427e0ce (diff) | |
download | mitmproxy-dd1a45140c8a6cb3f6c5d7247120c05fa37cdf24.tar.gz mitmproxy-dd1a45140c8a6cb3f6c5d7247120c05fa37cdf24.tar.bz2 mitmproxy-dd1a45140c8a6cb3f6c5d7247120c05fa37cdf24.zip |
web: add virtualscroll mixin
Diffstat (limited to 'web/src/js/components/virtualscroll.jsx.js')
-rw-r--r-- | web/src/js/components/virtualscroll.jsx.js | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/web/src/js/components/virtualscroll.jsx.js b/web/src/js/components/virtualscroll.jsx.js new file mode 100644 index 00000000..ec3daa41 --- /dev/null +++ b/web/src/js/components/virtualscroll.jsx.js @@ -0,0 +1,54 @@ +var VirtualScrollMixin = { + getInitialState: function () { + return { + start: 0, + stop: 0 + } + }, + getPlaceholderTop: function () { + var style = { + height: this.state.start * this.props.rowHeight + }; + var spacer = <tr key="placeholder-top" style={style}></tr>; + + if (this.state.start % 2 === 1) { + // fix even/odd rows + return [spacer, <tr key="placeholder-top-2"></tr>]; + } else { + return spacer; + } + }, + getPlaceholderBottom: function (total) { + var style = { + height: Math.max(0, total - this.state.stop) * this.props.rowHeight + }; + return <tr key="placeholder-bottom" style={style}></tr>; + }, + onScroll: function () { + var viewport = this.getDOMNode(); + var top = viewport.scrollTop; + var height = viewport.offsetHeight; + var start = Math.floor(top / this.props.rowHeight); + var stop = start + Math.ceil(height / this.props.rowHeight); + this.setState({ + start: start, + stop: stop + }); + }, + scrollRowIntoView: function(index, head_height){ + + var row_top = (index * this.props.rowHeight) + head_height; + var row_bottom = row_top + this.props.rowHeight; + + var viewport = this.getDOMNode(); + var viewport_top = viewport.scrollTop; + var viewport_bottom = viewport_top + viewport.offsetHeight; + + // Account for pinned thead + if (row_top - head_height < viewport_top) { + viewport.scrollTop = row_top - head_height; + } else if (row_bottom > viewport_bottom) { + viewport.scrollTop = row_bottom - viewport.offsetHeight; + } + }, +};
\ No newline at end of file |