aboutsummaryrefslogtreecommitdiffstats
path: root/web/src/js/components/virtualscroll.jsx.js
diff options
context:
space:
mode:
authorMaximilian Hils <git@maximilianhils.com>2014-11-28 20:03:04 +0100
committerMaximilian Hils <git@maximilianhils.com>2014-11-28 20:03:04 +0100
commitdd1a45140c8a6cb3f6c5d7247120c05fa37cdf24 (patch)
tree88b171c7be75fe408ab647d8f5d3d74d5ae833b5 /web/src/js/components/virtualscroll.jsx.js
parentc39b6e4277357c9da1dfd5e3e8c41b5b3427e0ce (diff)
downloadmitmproxy-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.js54
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