morrisjs-rails 0.4.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/morrisjs-rails/version.rb +1 -1
- data/vendor/assets/javascripts/morris.js +248 -111
- data/vendor/assets/stylesheets/morris.css +2 -0
- metadata +3 -2
@@ -107,6 +107,11 @@
|
|
107
107
|
_this.fire('hover', touch.pageX - offset.left, touch.pageY - offset.top);
|
108
108
|
return touch;
|
109
109
|
});
|
110
|
+
this.el.bind('click', function(evt) {
|
111
|
+
var offset;
|
112
|
+
offset = _this.el.offset();
|
113
|
+
return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top);
|
114
|
+
});
|
110
115
|
if (this.postInit) {
|
111
116
|
this.postInit();
|
112
117
|
}
|
@@ -138,7 +143,7 @@
|
|
138
143
|
};
|
139
144
|
|
140
145
|
Grid.prototype.setData = function(data, redraw) {
|
141
|
-
var e, idx, index, maxGoal, minGoal, ret, row, total, ykey, ymax, ymin, yval;
|
146
|
+
var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval;
|
142
147
|
if (redraw == null) {
|
143
148
|
redraw = true;
|
144
149
|
}
|
@@ -247,11 +252,22 @@
|
|
247
252
|
}
|
248
253
|
this.ymax += 1;
|
249
254
|
}
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
+
if (this.options.axes === true || this.options.grid === true) {
|
256
|
+
if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) {
|
257
|
+
this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines);
|
258
|
+
this.ymin = Math.min(this.ymin, this.grid[0]);
|
259
|
+
this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]);
|
260
|
+
} else {
|
261
|
+
step = (this.ymax - this.ymin) / (this.options.numLines - 1);
|
262
|
+
this.grid = (function() {
|
263
|
+
var _i, _ref, _ref1, _results;
|
264
|
+
_results = [];
|
265
|
+
for (y = _i = _ref = this.ymin, _ref1 = this.ymax; _ref <= _ref1 ? _i <= _ref1 : _i >= _ref1; y = _i += step) {
|
266
|
+
_results.push(y);
|
267
|
+
}
|
268
|
+
return _results;
|
269
|
+
}).call(this);
|
270
|
+
}
|
255
271
|
}
|
256
272
|
this.dirty = true;
|
257
273
|
if (redraw) {
|
@@ -285,8 +301,47 @@
|
|
285
301
|
}
|
286
302
|
};
|
287
303
|
|
304
|
+
Grid.prototype.autoGridLines = function(ymin, ymax, nlines) {
|
305
|
+
var gmax, gmin, grid, smag, span, step, unit, y, ymag;
|
306
|
+
span = ymax - ymin;
|
307
|
+
ymag = Math.floor(Math.log(span) / Math.log(10));
|
308
|
+
unit = Math.pow(10, ymag);
|
309
|
+
gmin = Math.floor(ymin / unit) * unit;
|
310
|
+
gmax = Math.ceil(ymax / unit) * unit;
|
311
|
+
step = (gmax - gmin) / (nlines - 1);
|
312
|
+
if (unit === 1 && step > 1 && Math.ceil(step) !== step) {
|
313
|
+
step = Math.ceil(step);
|
314
|
+
gmax = gmin + step * (nlines - 1);
|
315
|
+
}
|
316
|
+
if (gmin < 0 && gmax > 0) {
|
317
|
+
gmin = Math.floor(ymin / step) * step;
|
318
|
+
gmax = Math.ceil(ymax / step) * step;
|
319
|
+
}
|
320
|
+
if (step < 1) {
|
321
|
+
smag = Math.floor(Math.log(step) / Math.log(10));
|
322
|
+
grid = (function() {
|
323
|
+
var _i, _results;
|
324
|
+
_results = [];
|
325
|
+
for (y = _i = gmin; gmin <= gmax ? _i <= gmax : _i >= gmax; y = _i += step) {
|
326
|
+
_results.push(parseFloat(y.toFixed(1 - smag)));
|
327
|
+
}
|
328
|
+
return _results;
|
329
|
+
})();
|
330
|
+
} else {
|
331
|
+
grid = (function() {
|
332
|
+
var _i, _results;
|
333
|
+
_results = [];
|
334
|
+
for (y = _i = gmin; gmin <= gmax ? _i <= gmax : _i >= gmax; y = _i += step) {
|
335
|
+
_results.push(y);
|
336
|
+
}
|
337
|
+
return _results;
|
338
|
+
})();
|
339
|
+
}
|
340
|
+
return grid;
|
341
|
+
};
|
342
|
+
|
288
343
|
Grid.prototype._calc = function() {
|
289
|
-
var h,
|
344
|
+
var gridLine, h, w, yLabelWidths;
|
290
345
|
w = this.el.width();
|
291
346
|
h = this.el.height();
|
292
347
|
if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) {
|
@@ -298,12 +353,21 @@
|
|
298
353
|
this.top = this.options.padding;
|
299
354
|
this.bottom = this.elementHeight - this.options.padding;
|
300
355
|
if (this.options.axes) {
|
301
|
-
|
302
|
-
|
356
|
+
yLabelWidths = (function() {
|
357
|
+
var _i, _len, _ref, _results;
|
358
|
+
_ref = this.grid;
|
359
|
+
_results = [];
|
360
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
361
|
+
gridLine = _ref[_i];
|
362
|
+
_results.push(this.measureText(this.yAxisFormat(gridLine), this.options.gridTextSize).width);
|
363
|
+
}
|
364
|
+
return _results;
|
365
|
+
}).call(this);
|
366
|
+
this.left += Math.max.apply(Math, yLabelWidths);
|
303
367
|
this.bottom -= 1.5 * this.options.gridTextSize;
|
304
368
|
}
|
305
|
-
this.width = this.right - this.left;
|
306
|
-
this.height = this.bottom - this.top;
|
369
|
+
this.width = Math.max(1, this.right - this.left);
|
370
|
+
this.height = Math.max(1, this.bottom - this.top);
|
307
371
|
this.dx = this.width / (this.xmax - this.xmin);
|
308
372
|
this.dy = this.height / (this.ymax - this.ymin);
|
309
373
|
if (this.calc) {
|
@@ -367,18 +431,17 @@
|
|
367
431
|
};
|
368
432
|
|
369
433
|
Grid.prototype.drawGrid = function() {
|
370
|
-
var
|
434
|
+
var lineY, y, _i, _len, _ref, _results;
|
371
435
|
if (this.options.grid === false && this.options.axes === false) {
|
372
436
|
return;
|
373
437
|
}
|
374
|
-
|
375
|
-
lastY = this.ymax;
|
438
|
+
_ref = this.grid;
|
376
439
|
_results = [];
|
377
|
-
for (
|
378
|
-
|
379
|
-
y = this.transY(
|
440
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
441
|
+
lineY = _ref[_i];
|
442
|
+
y = this.transY(lineY);
|
380
443
|
if (this.options.axes) {
|
381
|
-
this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(
|
444
|
+
this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY));
|
382
445
|
}
|
383
446
|
if (this.options.grid) {
|
384
447
|
_results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width)));
|
@@ -562,6 +625,8 @@
|
|
562
625
|
this.onHoverOut = __bind(this.onHoverOut, this);
|
563
626
|
|
564
627
|
this.onHoverMove = __bind(this.onHoverMove, this);
|
628
|
+
|
629
|
+
this.onGridClick = __bind(this.onGridClick, this);
|
565
630
|
if (!(this instanceof Morris.Line)) {
|
566
631
|
return new Morris.Line(options);
|
567
632
|
}
|
@@ -580,7 +645,8 @@
|
|
580
645
|
parent: this.el
|
581
646
|
});
|
582
647
|
this.on('hovermove', this.onHoverMove);
|
583
|
-
|
648
|
+
this.on('hoverout', this.onHoverOut);
|
649
|
+
return this.on('gridclick', this.onGridClick);
|
584
650
|
}
|
585
651
|
};
|
586
652
|
|
@@ -656,6 +722,12 @@
|
|
656
722
|
return index;
|
657
723
|
};
|
658
724
|
|
725
|
+
Line.prototype.onGridClick = function(x, y) {
|
726
|
+
var index;
|
727
|
+
index = this.hitTest(x, y);
|
728
|
+
return this.fire('click', index, this.options.data[index], x, y);
|
729
|
+
};
|
730
|
+
|
659
731
|
Line.prototype.onHoverMove = function(x, y) {
|
660
732
|
var index;
|
661
733
|
index = this.hitTest(x, y);
|
@@ -682,15 +754,14 @@
|
|
682
754
|
Line.prototype.hoverContentForRow = function(index) {
|
683
755
|
var content, j, row, y, _i, _len, _ref;
|
684
756
|
row = this.data[index];
|
757
|
+
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
758
|
+
_ref = row.y;
|
759
|
+
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
760
|
+
y = _ref[j];
|
761
|
+
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
762
|
+
}
|
685
763
|
if (typeof this.options.hoverCallback === 'function') {
|
686
|
-
content = this.options.hoverCallback(index, this.options);
|
687
|
-
} else {
|
688
|
-
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
689
|
-
_ref = row.y;
|
690
|
-
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
691
|
-
y = _ref[j];
|
692
|
-
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
693
|
-
}
|
764
|
+
content = this.options.hoverCallback(index, this.options, content);
|
694
765
|
}
|
695
766
|
return [content, row._x, row._ymax];
|
696
767
|
};
|
@@ -793,42 +864,42 @@
|
|
793
864
|
};
|
794
865
|
|
795
866
|
Line.prototype.drawSeries = function() {
|
796
|
-
var
|
867
|
+
var i, _i, _j, _ref, _ref1, _results;
|
868
|
+
this.seriesPoints = [];
|
797
869
|
for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) {
|
798
|
-
|
799
|
-
if (path !== null) {
|
800
|
-
this.drawLinePath(path, this.colorFor(row, i, 'line'));
|
801
|
-
}
|
870
|
+
this._drawLineFor(i);
|
802
871
|
}
|
803
|
-
this.seriesPoints = (function() {
|
804
|
-
var _j, _ref1, _results;
|
805
|
-
_results = [];
|
806
|
-
for (i = _j = 0, _ref1 = this.options.ykeys.length; 0 <= _ref1 ? _j < _ref1 : _j > _ref1; i = 0 <= _ref1 ? ++_j : --_j) {
|
807
|
-
_results.push([]);
|
808
|
-
}
|
809
|
-
return _results;
|
810
|
-
}).call(this);
|
811
872
|
_results = [];
|
812
873
|
for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) {
|
813
|
-
_results.push((
|
814
|
-
var _k, _len, _ref2, _results1;
|
815
|
-
_ref2 = this.data;
|
816
|
-
_results1 = [];
|
817
|
-
for (_k = 0, _len = _ref2.length; _k < _len; _k++) {
|
818
|
-
row = _ref2[_k];
|
819
|
-
if (row._y[i] != null) {
|
820
|
-
circle = this.drawLinePoint(row._x, row._y[i], this.options.pointSize, this.colorFor(row, i, 'point'), i);
|
821
|
-
} else {
|
822
|
-
circle = null;
|
823
|
-
}
|
824
|
-
_results1.push(this.seriesPoints[i].push(circle));
|
825
|
-
}
|
826
|
-
return _results1;
|
827
|
-
}).call(this));
|
874
|
+
_results.push(this._drawPointFor(i));
|
828
875
|
}
|
829
876
|
return _results;
|
830
877
|
};
|
831
878
|
|
879
|
+
Line.prototype._drawPointFor = function(index) {
|
880
|
+
var circle, row, _i, _len, _ref, _results;
|
881
|
+
this.seriesPoints[index] = [];
|
882
|
+
_ref = this.data;
|
883
|
+
_results = [];
|
884
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
885
|
+
row = _ref[_i];
|
886
|
+
circle = null;
|
887
|
+
if (row._y[index] != null) {
|
888
|
+
circle = this.drawLinePoint(row._x, row._y[index], this.options.pointSize, this.colorFor(row, index, 'point'), index);
|
889
|
+
}
|
890
|
+
_results.push(this.seriesPoints[index].push(circle));
|
891
|
+
}
|
892
|
+
return _results;
|
893
|
+
};
|
894
|
+
|
895
|
+
Line.prototype._drawLineFor = function(index) {
|
896
|
+
var path;
|
897
|
+
path = this.paths[index];
|
898
|
+
if (path !== null) {
|
899
|
+
return this.drawLinePath(path, this.colorFor(null, index, 'line'));
|
900
|
+
}
|
901
|
+
};
|
902
|
+
|
832
903
|
Line.createPath = function(coords, smooth, bottom) {
|
833
904
|
var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len;
|
834
905
|
path = "";
|
@@ -994,7 +1065,7 @@
|
|
994
1065
|
return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes()));
|
995
1066
|
},
|
996
1067
|
incr: function(d) {
|
997
|
-
return d.
|
1068
|
+
return d.setUTCMinutes(d.getUTCMinutes() + interval);
|
998
1069
|
}
|
999
1070
|
};
|
1000
1071
|
};
|
@@ -1009,7 +1080,7 @@
|
|
1009
1080
|
return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds()));
|
1010
1081
|
},
|
1011
1082
|
incr: function(d) {
|
1012
|
-
return d.
|
1083
|
+
return d.setUTCSeconds(d.getUTCSeconds() + interval);
|
1013
1084
|
}
|
1014
1085
|
};
|
1015
1086
|
};
|
@@ -1079,15 +1150,26 @@
|
|
1079
1150
|
Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"];
|
1080
1151
|
|
1081
1152
|
Morris.Area = (function(_super) {
|
1153
|
+
var areaDefaults;
|
1082
1154
|
|
1083
1155
|
__extends(Area, _super);
|
1084
1156
|
|
1157
|
+
areaDefaults = {
|
1158
|
+
fillOpacity: 'auto',
|
1159
|
+
behaveLikeLine: false
|
1160
|
+
};
|
1161
|
+
|
1085
1162
|
function Area(options) {
|
1163
|
+
var areaOptions;
|
1086
1164
|
if (!(this instanceof Morris.Area)) {
|
1087
1165
|
return new Morris.Area(options);
|
1088
1166
|
}
|
1089
|
-
|
1090
|
-
|
1167
|
+
areaOptions = $.extend({}, areaDefaults, options);
|
1168
|
+
this.cumulative = !areaOptions.behaveLikeLine;
|
1169
|
+
if (areaOptions.fillOpacity === 'auto') {
|
1170
|
+
areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1;
|
1171
|
+
}
|
1172
|
+
Area.__super__.constructor.call(this, areaOptions);
|
1091
1173
|
}
|
1092
1174
|
|
1093
1175
|
Area.prototype.calcPoints = function() {
|
@@ -1104,36 +1186,63 @@
|
|
1104
1186
|
_results1 = [];
|
1105
1187
|
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
|
1106
1188
|
y = _ref1[_j];
|
1107
|
-
|
1108
|
-
|
1189
|
+
if (this.options.behaveLikeLine) {
|
1190
|
+
_results1.push(this.transY(y));
|
1191
|
+
} else {
|
1192
|
+
total += y || 0;
|
1193
|
+
_results1.push(this.transY(total));
|
1194
|
+
}
|
1109
1195
|
}
|
1110
1196
|
return _results1;
|
1111
1197
|
}).call(this);
|
1112
|
-
_results.push(row._ymax =
|
1198
|
+
_results.push(row._ymax = Math.max.apply(Math, row._y));
|
1113
1199
|
}
|
1114
1200
|
return _results;
|
1115
1201
|
};
|
1116
1202
|
|
1117
1203
|
Area.prototype.drawSeries = function() {
|
1118
|
-
var i,
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
|
1204
|
+
var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2;
|
1205
|
+
this.seriesPoints = [];
|
1206
|
+
if (this.options.behaveLikeLine) {
|
1207
|
+
range = (function() {
|
1208
|
+
_results = [];
|
1209
|
+
for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); }
|
1210
|
+
return _results;
|
1211
|
+
}).apply(this);
|
1212
|
+
} else {
|
1213
|
+
range = (function() {
|
1214
|
+
_results1 = [];
|
1215
|
+
for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); }
|
1216
|
+
return _results1;
|
1217
|
+
}).apply(this);
|
1218
|
+
}
|
1219
|
+
_results2 = [];
|
1220
|
+
for (_k = 0, _len = range.length; _k < _len; _k++) {
|
1221
|
+
i = range[_k];
|
1222
|
+
this._drawFillFor(i);
|
1223
|
+
this._drawLineFor(i);
|
1224
|
+
_results2.push(this._drawPointFor(i));
|
1225
|
+
}
|
1226
|
+
return _results2;
|
1227
|
+
};
|
1228
|
+
|
1229
|
+
Area.prototype._drawFillFor = function(index) {
|
1230
|
+
var path;
|
1231
|
+
path = this.paths[index];
|
1232
|
+
if (path !== null) {
|
1233
|
+
path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z");
|
1234
|
+
return this.drawFilledPath(path, this.fillForSeries(index));
|
1125
1235
|
}
|
1126
|
-
return Area.__super__.drawSeries.call(this);
|
1127
1236
|
};
|
1128
1237
|
|
1129
1238
|
Area.prototype.fillForSeries = function(i) {
|
1130
1239
|
var color;
|
1131
1240
|
color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line'));
|
1132
|
-
return Raphael.hsl(color.h, Math.min(255, color.s * 0.75), Math.min(255, color.l * 1.25));
|
1241
|
+
return Raphael.hsl(color.h, Math.min(255, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75), Math.min(255, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25));
|
1133
1242
|
};
|
1134
1243
|
|
1135
1244
|
Area.prototype.drawFilledPath = function(path, fill) {
|
1136
|
-
return this.raphael.path(path).attr('fill', fill).attr('stroke-width', 0);
|
1245
|
+
return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke-width', 0);
|
1137
1246
|
};
|
1138
1247
|
|
1139
1248
|
return Area;
|
@@ -1148,6 +1257,8 @@
|
|
1148
1257
|
this.onHoverOut = __bind(this.onHoverOut, this);
|
1149
1258
|
|
1150
1259
|
this.onHoverMove = __bind(this.onHoverMove, this);
|
1260
|
+
|
1261
|
+
this.onGridClick = __bind(this.onGridClick, this);
|
1151
1262
|
if (!(this instanceof Morris.Bar)) {
|
1152
1263
|
return new Morris.Bar(options);
|
1153
1264
|
}
|
@@ -1163,7 +1274,8 @@
|
|
1163
1274
|
parent: this.el
|
1164
1275
|
});
|
1165
1276
|
this.on('hovermove', this.onHoverMove);
|
1166
|
-
|
1277
|
+
this.on('hoverout', this.onHoverOut);
|
1278
|
+
return this.on('gridclick', this.onGridClick);
|
1167
1279
|
}
|
1168
1280
|
};
|
1169
1281
|
|
@@ -1308,6 +1420,12 @@
|
|
1308
1420
|
return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length)));
|
1309
1421
|
};
|
1310
1422
|
|
1423
|
+
Bar.prototype.onGridClick = function(x, y) {
|
1424
|
+
var index;
|
1425
|
+
index = this.hitTest(x, y);
|
1426
|
+
return this.fire('click', index, this.options.data[index], x, y);
|
1427
|
+
};
|
1428
|
+
|
1311
1429
|
Bar.prototype.onHoverMove = function(x, y) {
|
1312
1430
|
var index, _ref;
|
1313
1431
|
index = this.hitTest(x, y);
|
@@ -1322,16 +1440,15 @@
|
|
1322
1440
|
|
1323
1441
|
Bar.prototype.hoverContentForRow = function(index) {
|
1324
1442
|
var content, j, row, x, y, _i, _len, _ref;
|
1443
|
+
row = this.data[index];
|
1444
|
+
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
1445
|
+
_ref = row.y;
|
1446
|
+
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
1447
|
+
y = _ref[j];
|
1448
|
+
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
1449
|
+
}
|
1325
1450
|
if (typeof this.options.hoverCallback === 'function') {
|
1326
|
-
content = this.options.hoverCallback(index, this.options);
|
1327
|
-
} else {
|
1328
|
-
row = this.data[index];
|
1329
|
-
content = "<div class='morris-hover-row-label'>" + row.label + "</div>";
|
1330
|
-
_ref = row.y;
|
1331
|
-
for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) {
|
1332
|
-
y = _ref[j];
|
1333
|
-
content += "<div class='morris-hover-point' style='color: " + (this.colorFor(row, j, 'label')) + "'>\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n</div>";
|
1334
|
-
}
|
1451
|
+
content = this.options.hoverCallback(index, this.options, content);
|
1335
1452
|
}
|
1336
1453
|
x = this.left + (index + 0.5) * this.width / this.data.length;
|
1337
1454
|
return [content, x];
|
@@ -1350,7 +1467,9 @@
|
|
1350
1467
|
|
1351
1468
|
})(Morris.Grid);
|
1352
1469
|
|
1353
|
-
Morris.Donut = (function() {
|
1470
|
+
Morris.Donut = (function(_super) {
|
1471
|
+
|
1472
|
+
__extends(Donut, _super);
|
1354
1473
|
|
1355
1474
|
Donut.prototype.defaults = {
|
1356
1475
|
colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'],
|
@@ -1361,6 +1480,10 @@
|
|
1361
1480
|
|
1362
1481
|
function Donut(options) {
|
1363
1482
|
this.select = __bind(this.select, this);
|
1483
|
+
|
1484
|
+
this.click = __bind(this.click, this);
|
1485
|
+
|
1486
|
+
var row;
|
1364
1487
|
if (!(this instanceof Morris.Donut)) {
|
1365
1488
|
return new Morris.Donut(options);
|
1366
1489
|
}
|
@@ -1377,35 +1500,46 @@
|
|
1377
1500
|
return;
|
1378
1501
|
}
|
1379
1502
|
this.data = options.data;
|
1503
|
+
this.values = (function() {
|
1504
|
+
var _i, _len, _ref, _results;
|
1505
|
+
_ref = this.data;
|
1506
|
+
_results = [];
|
1507
|
+
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1508
|
+
row = _ref[_i];
|
1509
|
+
_results.push(parseFloat(row.value));
|
1510
|
+
}
|
1511
|
+
return _results;
|
1512
|
+
}).call(this);
|
1380
1513
|
this.redraw();
|
1381
1514
|
}
|
1382
1515
|
|
1383
1516
|
Donut.prototype.redraw = function() {
|
1384
|
-
var C, cx, cy,
|
1517
|
+
var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results;
|
1385
1518
|
this.el.empty();
|
1386
1519
|
this.raphael = new Raphael(this.el[0]);
|
1387
1520
|
cx = this.el.width() / 2;
|
1388
1521
|
cy = this.el.height() / 2;
|
1389
1522
|
w = (Math.min(cx, cy) - 10) / 3;
|
1390
1523
|
total = 0;
|
1391
|
-
_ref = this.
|
1524
|
+
_ref = this.values;
|
1392
1525
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1393
|
-
|
1394
|
-
total +=
|
1526
|
+
value = _ref[_i];
|
1527
|
+
total += value;
|
1395
1528
|
}
|
1396
1529
|
min = 5 / (2 * w);
|
1397
1530
|
C = 1.9999 * Math.PI - min * this.data.length;
|
1398
1531
|
last = 0;
|
1399
1532
|
idx = 0;
|
1400
1533
|
this.segments = [];
|
1401
|
-
_ref1 = this.
|
1402
|
-
for (_j = 0, _len1 = _ref1.length; _j < _len1; _j
|
1403
|
-
|
1404
|
-
next = last + min + C * (
|
1405
|
-
seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.options.colors[idx % this.options.colors.length], this.options.backgroundColor,
|
1534
|
+
_ref1 = this.values;
|
1535
|
+
for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) {
|
1536
|
+
value = _ref1[i];
|
1537
|
+
next = last + min + C * (value / total);
|
1538
|
+
seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael);
|
1406
1539
|
seg.render();
|
1407
1540
|
this.segments.push(seg);
|
1408
1541
|
seg.on('hover', this.select);
|
1542
|
+
seg.on('click', this.click);
|
1409
1543
|
last = next;
|
1410
1544
|
idx += 1;
|
1411
1545
|
}
|
@@ -1413,20 +1547,20 @@
|
|
1413
1547
|
this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14);
|
1414
1548
|
max_value = Math.max.apply(null, (function() {
|
1415
1549
|
var _k, _len2, _ref2, _results;
|
1416
|
-
_ref2 = this.
|
1550
|
+
_ref2 = this.values;
|
1417
1551
|
_results = [];
|
1418
1552
|
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
|
1419
|
-
|
1420
|
-
_results.push(
|
1553
|
+
value = _ref2[_k];
|
1554
|
+
_results.push(value);
|
1421
1555
|
}
|
1422
1556
|
return _results;
|
1423
1557
|
}).call(this));
|
1424
1558
|
idx = 0;
|
1425
|
-
_ref2 = this.
|
1559
|
+
_ref2 = this.values;
|
1426
1560
|
_results = [];
|
1427
1561
|
for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
|
1428
|
-
|
1429
|
-
if (
|
1562
|
+
value = _ref2[_k];
|
1563
|
+
if (value === max_value) {
|
1430
1564
|
this.select(idx);
|
1431
1565
|
break;
|
1432
1566
|
}
|
@@ -1435,20 +1569,21 @@
|
|
1435
1569
|
return _results;
|
1436
1570
|
};
|
1437
1571
|
|
1572
|
+
Donut.prototype.click = function(idx) {
|
1573
|
+
return this.fire('click', idx, this.data[idx]);
|
1574
|
+
};
|
1575
|
+
|
1438
1576
|
Donut.prototype.select = function(idx) {
|
1439
|
-
var s, segment, _i, _len, _ref;
|
1577
|
+
var row, s, segment, _i, _len, _ref;
|
1440
1578
|
_ref = this.segments;
|
1441
1579
|
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
1442
1580
|
s = _ref[_i];
|
1443
1581
|
s.deselect();
|
1444
1582
|
}
|
1445
|
-
|
1446
|
-
segment = this.segments[idx];
|
1447
|
-
} else {
|
1448
|
-
segment = idx;
|
1449
|
-
}
|
1583
|
+
segment = this.segments[idx];
|
1450
1584
|
segment.select();
|
1451
|
-
|
1585
|
+
row = this.data[idx];
|
1586
|
+
return this.setLabels(row.label, this.options.formatter(row.value, row));
|
1452
1587
|
};
|
1453
1588
|
|
1454
1589
|
Donut.prototype.setLabels = function(label1, label2) {
|
@@ -1488,20 +1623,20 @@
|
|
1488
1623
|
|
1489
1624
|
return Donut;
|
1490
1625
|
|
1491
|
-
})();
|
1626
|
+
})(Morris.EventEmitter);
|
1492
1627
|
|
1493
1628
|
Morris.DonutSegment = (function(_super) {
|
1494
1629
|
|
1495
1630
|
__extends(DonutSegment, _super);
|
1496
1631
|
|
1497
|
-
function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor,
|
1632
|
+
function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) {
|
1498
1633
|
this.cx = cx;
|
1499
1634
|
this.cy = cy;
|
1500
1635
|
this.inner = inner;
|
1501
1636
|
this.outer = outer;
|
1502
1637
|
this.color = color;
|
1503
1638
|
this.backgroundColor = backgroundColor;
|
1504
|
-
this.
|
1639
|
+
this.index = index;
|
1505
1640
|
this.raphael = raphael;
|
1506
1641
|
this.deselect = __bind(this.deselect, this);
|
1507
1642
|
|
@@ -1538,7 +1673,9 @@
|
|
1538
1673
|
var _this = this;
|
1539
1674
|
this.arc = this.drawDonutArc(this.hilight, this.color);
|
1540
1675
|
return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() {
|
1541
|
-
return _this.fire('hover', _this);
|
1676
|
+
return _this.fire('hover', _this.index);
|
1677
|
+
}, function() {
|
1678
|
+
return _this.fire('click', _this.index);
|
1542
1679
|
});
|
1543
1680
|
};
|
1544
1681
|
|
@@ -1550,12 +1687,12 @@
|
|
1550
1687
|
});
|
1551
1688
|
};
|
1552
1689
|
|
1553
|
-
DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction) {
|
1690
|
+
DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) {
|
1554
1691
|
return this.raphael.path(path).attr({
|
1555
1692
|
fill: fillColor,
|
1556
1693
|
stroke: strokeColor,
|
1557
1694
|
'stroke-width': 3
|
1558
|
-
}).hover(hoverFunction);
|
1695
|
+
}).hover(hoverFunction).click(clickFunction);
|
1559
1696
|
};
|
1560
1697
|
|
1561
1698
|
DonutSegment.prototype.select = function() {
|
@@ -0,0 +1,2 @@
|
|
1
|
+
.morris-hover{position:absolute;z-index:1000;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#666;background:rgba(255, 255, 255, 0.8);border:solid 2px rgba(230, 230, 230, 0.8);font-family:sans-serif;font-size:12px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;}
|
2
|
+
.morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: morrisjs-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-04-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: railties
|
@@ -37,6 +37,7 @@ files:
|
|
37
37
|
- lib/morrisjs-rails/version.rb
|
38
38
|
- lib/morrisjs-rails.rb
|
39
39
|
- vendor/assets/javascripts/morris.js
|
40
|
+
- vendor/assets/stylesheets/morris.css
|
40
41
|
- README.md
|
41
42
|
homepage: https://github.com/beanieboi/morrisjs-rails
|
42
43
|
licenses: []
|