Skip to content

Commit 1998f90

Browse files
committedFeb 13, 2018
fixup + 🔒 (un)selected fallbacks
1 parent 51c3128 commit 1998f90

File tree

2 files changed

+148
-12
lines changed

2 files changed

+148
-12
lines changed
 

‎src/traces/scattermapbox/convert.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ function makeCircleOpts(calcTrace) {
189189
if(colorFn) props.mcc = calcPt.mcc = colorFn(calcPt.mc);
190190
if(sizeFn) props.mrc = calcPt.mrc = sizeFn(calcPt.ms);
191191
if(opacityFn) props.mo = opacityFn(calcPt.mo);
192-
if(selectedpoints) props.selected = calcPt.selected;
192+
if(selectedpoints) props.selected = calcPt.selected || 0;
193193

194194
features.push({
195195
type: 'Feature',
@@ -207,15 +207,18 @@ function makeCircleOpts(calcTrace) {
207207

208208
var mo2 = fns.opacityFn(d);
209209
if(mo2 !== undefined) d.mo = addTraceOpacity(mo2);
210+
else if(d.mo === undefined) d.mo = addTraceOpacity(marker.opacity);
210211

211212
if(fns.colorFn) {
212213
var mc2 = fns.colorFn(d);
213214
if(mc2) d.mcc = mc2;
215+
else if(!d.mcc) d.mcc = marker.color;
214216
}
215217

216218
if(fns.sizeFn) {
217219
var mrc2 = fns.sizeFn(d);
218220
if(mrc2 !== undefined) d.mrc = mrc2;
221+
else if(d.mrc === undefined) d.mrc = size2radius(marker.size);
219222
}
220223
}
221224
}

‎test/jasmine/tests/scattermapbox_test.js

+144-11
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ describe('scattermapbox convert', function() {
212212
], 'geojson feature properties');
213213
});
214214

215-
it('should fill circle-opacity correctly during selections', function() {
215+
it('should fill circle props correctly during selections', function() {
216216
var _base = {
217217
type: 'scattermapbox',
218218
mode: 'markers',
@@ -222,46 +222,179 @@ describe('scattermapbox convert', function() {
222222
};
223223

224224
var specs = [{
225+
msg: 'base case',
225226
patch: {
226227
selectedpoints: [1, 2]
227228
},
228-
expected: [0.2, 1, 1]
229+
expected: {
230+
opacity: [0.2, 1, 1]
231+
}
229232
}, {
233+
msg: 'with set trace opacity',
230234
patch: {
231235
opacity: 0.5,
232236
selectedpoints: [1, 2]
233237
},
234-
expected: [0.1, 0.5, 0.5]
238+
expected: {
239+
opacity: [0.1, 0.5, 0.5]
240+
}
235241
}, {
242+
msg: 'with set scalar marker.opacity',
236243
patch: {
237244
marker: {opacity: 0.6},
238245
selectedpoints: [1, 2]
239246
},
240-
expected: [0.12, 0.6, 0.6]
247+
expected: {
248+
opacity: [0.12, 0.6, 0.6]
249+
}
241250
}, {
251+
msg: 'width set array marker.opacity',
242252
patch: {
243253
marker: {
244254
opacity: [0.5, 1, 0.6],
245255
},
246256
selectedpoints: [0, 2]
247257
},
248-
expected: [0.5, 0.2, 0.6]
258+
expected: {
259+
opacity: [0.5, 0.2, 0.6]
260+
}
249261
}, {
262+
msg: 'with set array marker.opacity including invalid items',
250263
patch: {
251264
marker: {opacity: [2, null, -0.6]},
252265
selectedpoints: [0, 1, 2]
253266
},
254-
expected: [1, 0, 0]
267+
expected: {
268+
opacity: [1, 0, 0]
269+
}
270+
}, {
271+
msg: 'with set selected & unselected styles',
272+
patch: {
273+
selected: {
274+
marker: {
275+
opacity: 1,
276+
color: 'green',
277+
size: 20
278+
}
279+
},
280+
unselected: {
281+
marker: {
282+
opacity: 0,
283+
color: 'red',
284+
size: 5
285+
}
286+
},
287+
selectedpoints: [0, 2]
288+
},
289+
expected: {
290+
opacity: [1, 0, 1],
291+
color: ['green', 'red', 'green'],
292+
size: [10, 2.5, 10]
293+
}
294+
}, {
295+
msg: 'with set selected styles only',
296+
patch: {
297+
selected: {
298+
marker: {
299+
opacity: 1,
300+
color: 'green',
301+
size: 20
302+
}
303+
},
304+
selectedpoints: [0, 2]
305+
},
306+
expected: {
307+
opacity: [1, 0.2, 1],
308+
color: ['green', '#1f77b4', 'green'],
309+
size: [10, 3, 10]
310+
}
311+
}, {
312+
msg: 'with set selected styles only + array items',
313+
patch: {
314+
marker: {
315+
opacity: [0.5, 0.6, 0.7],
316+
color: ['blue', 'yellow', 'cyan'],
317+
size: [50, 60, 70]
318+
},
319+
selected: {
320+
marker: {
321+
opacity: 1,
322+
color: 'green',
323+
size: 20
324+
}
325+
},
326+
selectedpoints: [0, 2]
327+
},
328+
expected: {
329+
opacity: [1, 0.12, 1],
330+
color: ['green', 'yellow', 'green'],
331+
size: [10, 30, 10]
332+
}
333+
}, {
334+
msg: 'with set unselected styles only',
335+
patch: {
336+
unselected: {
337+
marker: {
338+
opacity: 0,
339+
color: 'red',
340+
size: 5
341+
}
342+
},
343+
selectedpoints: [0, 2]
344+
},
345+
expected: {
346+
opacity: [1, 0, 1],
347+
color: ['#1f77b4', 'red', '#1f77b4'],
348+
size: [3, 2.5, 3]
349+
350+
}
351+
}, {
352+
msg: 'with set unselected styles only + array items',
353+
patch: {
354+
marker: {
355+
opacity: [0.5, 0.6, 0.7],
356+
color: ['blue', 'yellow', 'cyan'],
357+
size: [50, 60, 70]
358+
},
359+
unselected: {
360+
marker: {
361+
opacity: 0,
362+
color: 'red',
363+
size: 5
364+
}
365+
},
366+
selectedpoints: [0, 2]
367+
},
368+
expected: {
369+
opacity: [0.5, 0, 0.7],
370+
color: ['blue', 'red', 'cyan'],
371+
size: [25, 2.5, 35]
372+
}
255373
}];
256374

257375
specs.forEach(function(s, i) {
258-
var msg0 = '- case ' + i + ' ';
376+
var msg0 = s.msg + ' - case ' + i + '- ';
259377
var opts = _convert(Lib.extendDeep({}, _base, s.patch));
378+
var features = opts.circle.geojson.features;
379+
380+
function _assert(kProp, kExp) {
381+
var actual = features.map(function(f) { return f.properties[kProp]; });
382+
var expected = s.expected[kExp];
383+
var msg = msg0 + ' marker.' + kExp;
384+
385+
if(Array.isArray(expected)) {
386+
expect(actual).toEqual(expected, msg);
387+
} else {
388+
actual.forEach(function(a) {
389+
expect(a).toBe(undefined, msg);
390+
});
391+
}
392+
}
260393

261-
var props = opts.circle.geojson.features.map(function(f) {
262-
return f.properties.mo;
263-
});
264-
expect(props).toEqual(s.expected, msg0 + 'props');
394+
_assert('mo', 'opacity');
395+
_assert('mcc', 'color');
396+
// N.B. sizes in props should be half of the input values
397+
_assert('mrc', 'size');
265398
});
266399
});
267400

0 commit comments

Comments
 (0)