Skip to content

Commit 7fa4dc5

Browse files
committed
texttemplate: add support for scattergl
1 parent 7d21680 commit 7fa4dc5

File tree

5 files changed

+59
-7
lines changed

5 files changed

+59
-7
lines changed

src/traces/scattergl/attributes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,4 @@ var attrs = module.exports = overrideAll({
9898

9999
attrs.x.editType = attrs.y.editType = attrs.x0.editType = attrs.y0.editType = 'calc+clearAxisTypes';
100100
attrs.hovertemplate = scatterAttrs.hovertemplate;
101+
attrs.texttemplate = scatterAttrs.texttemplate;

src/traces/scattergl/convert.js

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ var TEXTOFFSETSIGN = {
2828
start: 1, left: 1, end: -1, right: -1, middle: 0, center: 0, bottom: 1, top: -1
2929
};
3030

31+
var appendArrayPointValue = require('../../components/fx/helpers').appendArrayPointValue;
32+
3133
function convertStyle(gd, trace) {
3234
var i;
3335

@@ -111,7 +113,26 @@ function convertTextStyle(trace) {
111113
var optsOut = {};
112114
var i;
113115

114-
optsOut.text = trace.text;
116+
var texttemplate = trace.texttemplate;
117+
if(texttemplate) {
118+
optsOut.text = [];
119+
var pt;
120+
if(Array.isArray(texttemplate)) {
121+
for(i = 0; i < texttemplate.length; i++) {
122+
pt = {};
123+
appendArrayPointValue(pt, trace, i);
124+
optsOut.text.push(Lib.texttemplateString(texttemplate[i], pt, function() {}, pt));
125+
}
126+
} else {
127+
for(i = 0; i < trace.x.length; i++) {
128+
pt = {};
129+
appendArrayPointValue(pt, trace, i);
130+
optsOut.text.push(Lib.texttemplateString(texttemplate, pt, function() {}, pt));
131+
}
132+
}
133+
} else {
134+
optsOut.text = trace.text;
135+
}
115136
optsOut.opacity = trace.opacity;
116137
optsOut.font = {};
117138
optsOut.align = [];

src/traces/scattergl/defaults.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3636
var defaultMode = len < constants.PTS_LINESONLY ? 'lines+markers' : 'lines';
3737

3838
coerce('text');
39+
coerce('texttemplate');
3940
coerce('hovertext');
4041
coerce('hovertemplate');
4142
coerce('mode', defaultMode);

test/jasmine/assets/check_texttemplate.js

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
var Plotly = require('@lib/index');
2+
var Registry = require('@src/registry');
3+
24
var Lib = require('@src/lib');
35
var failTest = require('../assets/fail_test');
46
var createGraphDiv = require('../assets/create_graph_div');
@@ -8,6 +10,8 @@ var supplyAllDefaults = require('../assets/supply_defaults');
810
'use strict';
911

1012
module.exports = function checkTextTemplate(mock, selector, tests) {
13+
var isGL = Registry.traceIs(mock[0].type, 'gl');
14+
1115
it('should not coerce textinfo when texttemplate', function() {
1216
var gd = {};
1317
gd.data = Lib.extendDeep(mock, {});
@@ -27,17 +31,30 @@ module.exports = function checkTextTemplate(mock, selector, tests) {
2731
tests.push(['%{customdata}', customdata]);
2832

2933
tests.forEach(function(test) {
30-
it('should support texttemplate', function(done) {
34+
it(isGL ? '@gl' : '' + 'should support texttemplate', function(done) {
3135
var gd = createGraphDiv();
3236
var mockCopy = Lib.extendDeep(mock, {});
3337
mockCopy[0].texttemplate = test[0];
3438
Plotly.newPlot(gd, mockCopy)
3539
.then(function() {
36-
var pts = Plotly.d3.selectAll(selector);
37-
expect(pts.size()).toBe(test[1].length);
38-
pts.each(function() {
39-
expect(test[1]).toContain(Plotly.d3.select(this).text());
40-
});
40+
if(isGL) {
41+
var glText = gd._fullLayout._plots.xy._scene.glText;
42+
expect(glText.length).toEqual(1);
43+
expect(glText[0].textOffsets.length).toEqual(test[1].length);
44+
for(var i = 0; i < glText[0].textOffsets.length - 1; i++) {
45+
var from = glText[0].textOffsets[i];
46+
var to = glText[0].textOffsets[i + 1];
47+
48+
var text = glText[0].text.slice(from, to);
49+
expect(text).toEqual(test[1][i]);
50+
}
51+
} else {
52+
var pts = Plotly.d3.selectAll(selector);
53+
expect(pts.size()).toBe(test[1].length);
54+
pts.each(function() {
55+
expect(test[1]).toContain(Plotly.d3.select(this).text());
56+
});
57+
}
4158
})
4259
.catch(failTest)
4360
.finally(destroyGraphDiv)

test/jasmine/tests/scattergl_test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var destroyGraphDiv = require('../assets/destroy_graph_div');
88
var failTest = require('../assets/fail_test');
99
var delay = require('../assets/delay');
1010
var readPixel = require('../assets/read_pixel');
11+
var checkTextTemplate = require('../assets/check_texttemplate');
1112

1213
describe('end-to-end scattergl tests', function() {
1314
var gd;
@@ -37,6 +38,17 @@ describe('end-to-end scattergl tests', function() {
3738
}).catch(failTest).then(done);
3839
});
3940

41+
checkTextTemplate([{
42+
type: 'scattergl',
43+
mode: 'text+lines',
44+
x: [1, 2, 3, 4],
45+
y: [2, 3, 4, 5],
46+
text: ['A', 'B', 'C', 'D'],
47+
}], '@gl', [
48+
['%{text}: %{x}, %{y}', ['A: 1, 2', 'B: 2, 3', 'C: 3, 4', 'D: 4, 5']],
49+
[['%{x}', '%{x}', '%{text}', '%{y}'], ['1', '2', 'C', '5']]
50+
]);
51+
4052
it('@gl should update a plot with text labels', function(done) {
4153
Plotly.react(gd, [{
4254
type: 'scattergl',

0 commit comments

Comments
 (0)