added flot tickrotor
This commit is contained in:
parent
0f7b18c260
commit
8b19ad4754
@ -26,8 +26,9 @@
|
|||||||
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.time.min.js')?>"></script>
|
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.time.min.js')?>"></script>
|
||||||
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.categories.min.js')?>"></script>
|
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.categories.min.js')?>"></script>
|
||||||
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.pie.min.js')?>"></script>
|
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.pie.min.js')?>"></script>
|
||||||
|
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.pie.min.js')?>"></script>
|
||||||
|
<script type="text/javascript" src="<?=base_url_make('/js/jquery.flot.tickrotor.js')?>"></script>
|
||||||
|
|
||||||
<script type="text/javascript" src="<?=base_url_make('/js/Chart.js')?>"></script>
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
function show_commits_per_month_graph(log)
|
function show_commits_per_month_graph(log)
|
||||||
@ -249,7 +250,6 @@ function show_commits_per_user_graph(log)
|
|||||||
{
|
{
|
||||||
label: "Commits Per User",
|
label: "Commits Per User",
|
||||||
data: commits_per_user_data
|
data: commits_per_user_data
|
||||||
//color: "#FF0000"
|
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
@ -269,7 +269,8 @@ function show_commits_per_user_graph(log)
|
|||||||
|
|
||||||
xaxes: [
|
xaxes: [
|
||||||
{ mode: "categories",
|
{ mode: "categories",
|
||||||
autoscaleMargin: 0.05
|
autoscaleMargin: 0.05,
|
||||||
|
rotateTicks: ((commits_per_user_data.length >= 8)? 135: 0)
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
||||||
@ -313,10 +314,6 @@ function show_all_graphs (response)
|
|||||||
|
|
||||||
show_commits_per_month_graph (log);
|
show_commits_per_month_graph (log);
|
||||||
show_commits_per_user_graph (log);
|
show_commits_per_user_graph (log);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function render_graphs()
|
function render_graphs()
|
||||||
|
@ -21,6 +21,7 @@ www_DATA = \
|
|||||||
jquery.flot.threshold.min.js \
|
jquery.flot.threshold.min.js \
|
||||||
jquery.flot.time.min.js \
|
jquery.flot.time.min.js \
|
||||||
excanvas.min.js \
|
excanvas.min.js \
|
||||||
|
jquery.flot.tickrotor.js \
|
||||||
Chart.js
|
Chart.js
|
||||||
|
|
||||||
EXTRA_DIST = $(www_DATA)
|
EXTRA_DIST = $(www_DATA)
|
||||||
|
187
codepot/src/js/jquery.flot.tickrotor.js
Normal file
187
codepot/src/js/jquery.flot.tickrotor.js
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||||
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* flot-tickrotor: flot plugin to display angled X-axis tick labels.
|
||||||
|
*
|
||||||
|
* Requires flot 0.7 or higher and a browser supporting <canvas>.
|
||||||
|
*
|
||||||
|
* To activate, just set xaxis.rotateTicks to an angle in degrees. Labels
|
||||||
|
* are rotated clockwise, so if you want the labels to angle up and to the
|
||||||
|
* right (/) you need to provide an angle > 90. The text will be flipped so
|
||||||
|
* that it is still right-side-up.
|
||||||
|
* Angles greater than or equal to 180 are ignored.
|
||||||
|
*/
|
||||||
|
(function ($) {
|
||||||
|
var options = { };
|
||||||
|
|
||||||
|
function init(plot) {
|
||||||
|
// Taken from flot-axislabels.
|
||||||
|
// This is kind of a hack. There are no hooks in Flot between
|
||||||
|
// the creation and measuring of the ticks (setTicks, measureTickLabels
|
||||||
|
// in setupGrid() ) and the drawing of the ticks and plot box
|
||||||
|
// (insertAxisLabels in setupGrid() ).
|
||||||
|
//
|
||||||
|
// Therefore, we use a trick where we run the draw routine twice:
|
||||||
|
// the first time to get the tick measurements, so that we can change
|
||||||
|
// them, and then have it draw it again.
|
||||||
|
|
||||||
|
var ticks = []; // preserve between draw() calls.
|
||||||
|
var font;
|
||||||
|
var secondPass = false;
|
||||||
|
var rotateTicks, rotateTicksRads, radsAboveHoriz;
|
||||||
|
|
||||||
|
plot.hooks.draw.push(function (plot, ctx) {
|
||||||
|
var xaxis; // for convenience
|
||||||
|
if (!secondPass) {
|
||||||
|
var opts = plot.getAxes().xaxis.options;
|
||||||
|
if (opts.rotateTicks === undefined) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rotateTicks = parseInt(opts.rotateTicks, 10);
|
||||||
|
if (rotateTicks.toString() != opts.rotateTicks || rotateTicks == 0 || rotateTicks >= 180) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
rotateTicksRads = rotateTicks * Math.PI/180;
|
||||||
|
if (rotateTicks > 90) {
|
||||||
|
radsAboveHoriz = Math.PI - rotateTicksRads;
|
||||||
|
} else {
|
||||||
|
radsAboveHoriz = Math.PI/2 - rotateTicksRads;
|
||||||
|
}
|
||||||
|
|
||||||
|
font = opts.rotateTicksFont;
|
||||||
|
if (!font) {
|
||||||
|
font = $('.tickLabel').css('font');
|
||||||
|
}
|
||||||
|
if (!font) {
|
||||||
|
font = 'smaller sans-serif';
|
||||||
|
}
|
||||||
|
|
||||||
|
var elem, maxLabelWidth = 0, maxLabelHeight = 0, minX = 0, maxX = 0;
|
||||||
|
|
||||||
|
// We have to clear the ticks option so that flot core
|
||||||
|
// doesn't draw ticks superimposed with ours, but we preserve
|
||||||
|
// the tick data as xaxis.rotatedTicks so that external code
|
||||||
|
// can still get to it.
|
||||||
|
|
||||||
|
// FIXME: It would obviously be better to just interrupt
|
||||||
|
// the drawing of the ticks and preserve the 'ticks'
|
||||||
|
// property. That probably requires another hook.
|
||||||
|
|
||||||
|
xaxis = plot.getAxes().xaxis;
|
||||||
|
ticks = plot.getAxes().xaxis.ticks;
|
||||||
|
xaxis.rotatedTicks = ticks;
|
||||||
|
opts.ticks = []; // we'll make our own
|
||||||
|
|
||||||
|
var x;
|
||||||
|
for (var i = 0; i < ticks.length; i++) {
|
||||||
|
elem = $('<span style="font:' + font + '">' + ticks[i].label + '</span>');
|
||||||
|
plot.getPlaceholder().append(elem);
|
||||||
|
ticks[i].height = elem.outerHeight(true);
|
||||||
|
ticks[i].width = elem.outerWidth(true);
|
||||||
|
elem.remove();
|
||||||
|
if (ticks[i].height > maxLabelHeight) {
|
||||||
|
maxLabelHeight = ticks[i].height;
|
||||||
|
}
|
||||||
|
if (ticks[i].width > maxLabelWidth) {
|
||||||
|
maxLabelWidth = ticks[i].width;
|
||||||
|
}
|
||||||
|
var tick = ticks[i];
|
||||||
|
// See second-draw code below for explanation of offsets.
|
||||||
|
if (rotateTicks > 90) {
|
||||||
|
// See if any labels are too long and require increased left
|
||||||
|
// padding.
|
||||||
|
x = Math.round(plot.getPlotOffset().left + xaxis.p2c(tick.v))
|
||||||
|
- Math.ceil(Math.cos(radsAboveHoriz) * tick.height)
|
||||||
|
- Math.ceil(Math.cos(radsAboveHoriz) * tick.width);
|
||||||
|
if (x < minX) {
|
||||||
|
minX = x;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// See if any labels are too long and require increased right
|
||||||
|
// padding.
|
||||||
|
x = Math.round(plot.getPlotOffset().left + xaxis.p2c(tick.v))
|
||||||
|
+ Math.ceil(Math.cos(radsAboveHoriz) * tick.height)
|
||||||
|
+ Math.ceil(Math.cos(radsAboveHoriz) * tick.width);
|
||||||
|
if (x > maxX) {
|
||||||
|
maxX = x;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate maximum label height after rotating.
|
||||||
|
if (rotateTicks > 90) {
|
||||||
|
var acuteRads = rotateTicksRads - Math.PI/2;
|
||||||
|
opts.labelHeight = Math.ceil(Math.sin(acuteRads) * maxLabelWidth)
|
||||||
|
+ Math.ceil(Math.sin(acuteRads) * maxLabelHeight);
|
||||||
|
} else {
|
||||||
|
var acuteRads = Math.PI/2 - rotateTicksRads;
|
||||||
|
// Center such that the top of the label is at the center of the tick.
|
||||||
|
opts.labelHeight = Math.ceil(Math.sin(rotateTicksRads) * maxLabelWidth)
|
||||||
|
+ Math.ceil(Math.sin(acuteRads) * maxLabelHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (minX < 0) {
|
||||||
|
plot.getAxes().yaxis.options.labelWidth = -1 * minX;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Doesn't seem to work if there are no values using the
|
||||||
|
// second y axis.
|
||||||
|
//if (maxX > xaxis.box.left + xaxis.box.width) {
|
||||||
|
// plot.getAxes().y2axis.options.labelWidth = maxX - xaxis.box.left - xaxis.box.width;
|
||||||
|
//}
|
||||||
|
|
||||||
|
// re-draw with new label widths and heights
|
||||||
|
secondPass = true;
|
||||||
|
plot.setupGrid();
|
||||||
|
plot.draw();
|
||||||
|
} else {
|
||||||
|
if (ticks.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
xaxis = plot.getAxes().xaxis;
|
||||||
|
var box = xaxis.box;
|
||||||
|
var tick, label, xoffset, yoffset;
|
||||||
|
for (var i = 0; i < ticks.length; i++) {
|
||||||
|
tick = ticks[i];
|
||||||
|
if (!tick.label) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ctx.save();
|
||||||
|
ctx.font = font;
|
||||||
|
if (rotateTicks <= 90) {
|
||||||
|
// Center such that the top of the label is at the center of the tick.
|
||||||
|
xoffset = -Math.ceil(Math.cos(radsAboveHoriz) * tick.height);
|
||||||
|
yoffset = Math.ceil(Math.sin(radsAboveHoriz) * tick.height);
|
||||||
|
ctx.translate(Math.round(plot.getPlotOffset().left + xaxis.p2c(tick.v)) + xoffset,
|
||||||
|
box.top + box.padding + plot.getOptions().grid.labelMargin + yoffset);
|
||||||
|
ctx.rotate(rotateTicksRads);
|
||||||
|
} else {
|
||||||
|
// We want the text to facing up, so we have to
|
||||||
|
// rotate counterclockwise, which means the label
|
||||||
|
// has to *end* at the center of the tick.
|
||||||
|
xoffset = Math.ceil(Math.cos(radsAboveHoriz) * tick.height)
|
||||||
|
- Math.ceil(Math.cos(radsAboveHoriz) * tick.width);
|
||||||
|
yoffset = Math.ceil(Math.sin(radsAboveHoriz) * tick.width)
|
||||||
|
+ Math.ceil(Math.sin(radsAboveHoriz) * tick.height);
|
||||||
|
ctx.translate(Math.round(plot.getPlotOffset().left + xaxis.p2c(tick.v) + xoffset),
|
||||||
|
box.top + box.padding + plot.getOptions().grid.labelMargin + yoffset);
|
||||||
|
ctx.rotate(-radsAboveHoriz);
|
||||||
|
}
|
||||||
|
ctx.fillText(tick.label, 0, 0);
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$.plot.plugins.push({
|
||||||
|
init: init,
|
||||||
|
options: options,
|
||||||
|
name: 'tickRotor',
|
||||||
|
version: '1.0'
|
||||||
|
});
|
||||||
|
})(jQuery);
|
Loading…
x
Reference in New Issue
Block a user