Fix datatable scrollbars, and handle window resizes correctly.
If you set gviz's options.height property - even, ironically, if you set it
redundantly to the height of the container, which ought to have been obvious
- then gviz will make the headers fixed at the top of the container even
when you're scrolling, which is what we want (ie. like "freeze rows" in a
spreadsheet).
We also add a listener on resize events and elegantly auto-resize the chart
or table when it happens.
diff --git a/render.html b/render.html
index 669ae78..d71eed7 100644
--- a/render.html
+++ b/render.html
@@ -22,8 +22,13 @@
div#editmenu a:hover {
background: #aaa;
}
- #vizchart {
+ #vizchart, #viztable {
+ position: relative;
overflow: hidden;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
}
#vizlog {
white-space: pre;
diff --git a/render.js b/render.js
index 73cf9a9..4673ce1 100644
--- a/render.js
+++ b/render.js
@@ -1239,7 +1239,7 @@
function addRenderers(queue, args) {
var trace = args.get('trace');
var chartops = args.get('chart');
- var t, datatable;
+ var t, datatable, resizeTimer;
var options = {};
var intensify = args.get('intensify');
if (intensify == '') {
@@ -1249,6 +1249,13 @@
intensify: intensify
};
+ var el;
+ if (chartops) {
+ el = document.getElementById('vizchart');
+ } else {
+ el = document.getElementById('viztable');
+ }
+
enqueue(queue, 'gentable', function(grid, done) {
if (chartops) {
var chartbits = chartops.split(',');
@@ -1262,7 +1269,6 @@
grid = fillNullsWithZero(grid);
}
grid = limitDecimalPrecision(grid);
- var el = document.getElementById('vizchart');
if (args.get('title')) {
options.title = args.get('title');
}
@@ -1316,20 +1322,15 @@
} else {
throw new Error('unknown chart type "' + charttype + '"');
}
- $(el).height(window.innerHeight);
gridoptions.show_only_lastseg = true;
gridoptions.bool_to_num = true;
} else {
- var el = document.getElementById('viztable');
t = new google.visualization.Table(el);
gridoptions.allowHtml = true;
options.allowHtml = true;
}
datatable = dataToGvizTable(grid, gridoptions);
- var wantwidth = trace ? window.innerWidth - 40 : window.innerWidth;
- $(el).width(wantwidth);
-
var dateformat = new google.visualization.DateFormat({
pattern: 'yyyy-MM-dd'
});
@@ -1349,9 +1350,19 @@
enqueue(queue, chartops ? 'chart=' + chartops : 'view',
function(grid, done) {
if (grid.data.length) {
- t.draw(datatable, options);
+ var doRender = function() {
+ var wantwidth = trace ? window.innerWidth - 40 : window.innerWidth;
+ $(el).width(wantwidth);
+ $(el).height(window.innerHeight);
+ options.height = window.innerHeight;
+ t.draw(datatable, options);
+ }
+ doRender();
+ $(window).resize(function() {
+ clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(doRender, 200);
+ });
} else {
- var el = document.getElementById('vizchart');
el.innerHTML = 'Empty dataset.';
}
done(grid);