|
11 | 11 |
|
12 | 12 | var Lib = require('../../lib');
|
13 | 13 | var helpers = require('./helpers');
|
| 14 | +var Axes = require('../../plots/cartesian/axes'); |
14 | 15 | var axisIds = require('../../plots/cartesian/axis_ids');
|
15 | 16 |
|
16 | 17 | exports.moduleType = 'transform';
|
@@ -57,11 +58,11 @@ function makeTrace(traceIn, state, direction) {
|
57 | 58 | connectgaps: false,
|
58 | 59 |
|
59 | 60 | visible: traceIn.visible,
|
60 |
| - hoverinfo: traceIn.hoverinfo, |
61 | 61 | opacity: traceIn.opacity,
|
62 | 62 | xaxis: traceIn.xaxis,
|
63 | 63 | yaxis: traceIn.yaxis,
|
64 | 64 |
|
| 65 | + hoverinfo: makeHoverInfo(traceIn), |
65 | 66 | transforms: helpers.makeTransform(traceIn, state, direction)
|
66 | 67 | };
|
67 | 68 |
|
@@ -94,43 +95,98 @@ function makeTrace(traceIn, state, direction) {
|
94 | 95 | return traceOut;
|
95 | 96 | }
|
96 | 97 |
|
| 98 | +// let scatter hoverPoint format 'x' coordinates, if desired |
| 99 | +function makeHoverInfo(traceIn) { |
| 100 | + var hoverinfo = traceIn.hoverinfo; |
| 101 | + |
| 102 | + if(hoverinfo === 'all') return 'x+text'; |
| 103 | + |
| 104 | + var parts = hoverinfo.split('+'), |
| 105 | + hasX = parts.indexOf('x') !== -1, |
| 106 | + hasText = parts.indexOf('text') !== -1; |
| 107 | + |
| 108 | + if(hasX) { |
| 109 | + if(hasText) return 'x+text'; |
| 110 | + else return 'x'; |
| 111 | + |
| 112 | + } |
| 113 | + else return 'text'; |
| 114 | +} |
| 115 | + |
97 | 116 | exports.calcTransform = function calcTransform(gd, trace, opts) {
|
98 | 117 | var direction = opts.direction,
|
99 |
| - filterFn = helpers.getFilterFn(direction), |
100 |
| - ax = axisIds.getFromTrace(gd, trace, 'x'), |
101 |
| - tickWidth = convertTickWidth(trace.x, ax, trace._fullInput.tickwidth); |
| 118 | + filterFn = helpers.getFilterFn(direction); |
| 119 | + |
| 120 | + var xa = axisIds.getFromTrace(gd, trace, 'x'), |
| 121 | + ya = axisIds.getFromTrace(gd, trace, 'y'), |
| 122 | + tickWidth = convertTickWidth(trace.x, xa, trace._fullInput.tickwidth); |
102 | 123 |
|
103 | 124 | var open = trace.open,
|
104 | 125 | high = trace.high,
|
105 | 126 | low = trace.low,
|
106 |
| - close = trace.close; |
| 127 | + close = trace.close, |
| 128 | + textIn = trace.text; |
107 | 129 |
|
108 | 130 | var len = open.length,
|
109 | 131 | x = [],
|
110 |
| - y = []; |
| 132 | + y = [], |
| 133 | + textOut = []; |
| 134 | + |
| 135 | + var getXItem = trace._fullInput.x ? |
| 136 | + function(i) { return xa.d2c(trace.x[i]); } : |
| 137 | + function(i) { return i; }; |
111 | 138 |
|
112 |
| - var appendX = trace._fullInput.x ? |
113 |
| - function(i) { |
114 |
| - var v = ax.d2c(trace.x[i]); |
115 |
| - x.push(v - tickWidth, v, v, v, v, v + tickWidth, null); |
116 |
| - } : |
117 |
| - function(i) { |
118 |
| - x.push(i - tickWidth, i, i, i, i, i + tickWidth, null); |
119 |
| - }; |
| 139 | + var getTextItem = Array.isArray(textIn) ? |
| 140 | + function(i) { return textIn[i] || ''; } : |
| 141 | + function() { return textIn; }; |
| 142 | + |
| 143 | + var appendX = function(i) { |
| 144 | + var v = getXItem(i); |
| 145 | + x.push(v - tickWidth, v, v, v, v, v + tickWidth, null); |
| 146 | + }; |
120 | 147 |
|
121 | 148 | var appendY = function(o, h, l, c) {
|
122 | 149 | y.push(o, o, h, l, c, c, null);
|
123 | 150 | };
|
124 | 151 |
|
| 152 | + var format = function(ax, val) { |
| 153 | + return Axes.tickText(ax, ax.c2l(val), 'hover').text; |
| 154 | + }; |
| 155 | + |
| 156 | + var hoverinfo = trace._fullInput.hoverinfo, |
| 157 | + hoverParts = hoverinfo.split('+'), |
| 158 | + hasAll = hoverinfo === 'all', |
| 159 | + hasY = hasAll || hoverParts.indexOf('y') !== -1, |
| 160 | + hasText = hasAll || hoverParts.indexOf('text') !== -1; |
| 161 | + |
| 162 | + var appendText = function(i, o, h, l, c) { |
| 163 | + var t = []; |
| 164 | + |
| 165 | + if(hasY) { |
| 166 | + t.push('Open: ' + format(ya, o)); |
| 167 | + t.push('High: ' + format(ya, h)); |
| 168 | + t.push('Low: ' + format(ya, l)); |
| 169 | + t.push('Close: ' + format(ya, c)); |
| 170 | + } |
| 171 | + |
| 172 | + if(hasText) t.push(getTextItem(i)); |
| 173 | + |
| 174 | + var _t = t.join('<br>'); |
| 175 | + |
| 176 | + textOut.push(_t, _t, _t, _t, _t, _t, null); |
| 177 | + }; |
| 178 | + |
125 | 179 | for(var i = 0; i < len; i++) {
|
126 | 180 | if(filterFn(open[i], close[i])) {
|
127 | 181 | appendX(i);
|
128 | 182 | appendY(open[i], high[i], low[i], close[i]);
|
| 183 | + appendText(i, open[i], high[i], low[i], close[i]); |
129 | 184 | }
|
130 | 185 | }
|
131 | 186 |
|
132 | 187 | trace.x = x;
|
133 | 188 | trace.y = y;
|
| 189 | + trace.text = textOut; |
134 | 190 | };
|
135 | 191 |
|
136 | 192 | function convertTickWidth(coords, ax, tickWidth) {
|
|
0 commit comments