c3
Version:
D3-based reusable chart library
84 lines (82 loc) • 2.6 kB
text/typescript
import CLASS from './class'
import { Chart } from './core'
import { isDefined } from './util'
Chart.prototype.selected = function(targetId) {
var $$ = this.internal,
d3 = $$.d3
return $$.main
.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(targetId))
.selectAll('.' + CLASS.shape)
.filter(function() {
return d3.select(this).classed(CLASS.SELECTED)
})
.nodes()
.map(function(d) {
var data = d.__data__
return data.data ? data.data : data
})
}
Chart.prototype.select = function(ids, indices, resetOther) {
var $$ = this.internal,
d3 = $$.d3,
config = $$.config
if (!config.data_selection_enabled) {
return
}
$$.main
.selectAll('.' + CLASS.shapes)
.selectAll('.' + CLASS.shape)
.each(function(d, i) {
var shape = d3.select(this),
id = d.data ? d.data.id : d.id,
toggle = $$.getToggle(this, d).bind($$),
isTargetId =
config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
isTargetIndex = !indices || indices.indexOf(i) >= 0,
isSelected = shape.classed(CLASS.SELECTED)
// line/area selection not supported yet
if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {
return
}
if (isTargetId && isTargetIndex) {
if (config.data_selection_isselectable(d) && !isSelected) {
toggle(true, shape.classed(CLASS.SELECTED, true), d, i)
}
} else if (isDefined(resetOther) && resetOther) {
if (isSelected) {
toggle(false, shape.classed(CLASS.SELECTED, false), d, i)
}
}
})
}
Chart.prototype.unselect = function(ids, indices) {
var $$ = this.internal,
d3 = $$.d3,
config = $$.config
if (!config.data_selection_enabled) {
return
}
$$.main
.selectAll('.' + CLASS.shapes)
.selectAll('.' + CLASS.shape)
.each(function(d, i) {
var shape = d3.select(this),
id = d.data ? d.data.id : d.id,
toggle = $$.getToggle(this, d).bind($$),
isTargetId =
config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
isTargetIndex = !indices || indices.indexOf(i) >= 0,
isSelected = shape.classed(CLASS.SELECTED)
// line/area selection not supported yet
if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {
return
}
if (isTargetId && isTargetIndex) {
if (config.data_selection_isselectable(d)) {
if (isSelected) {
toggle(false, shape.classed(CLASS.SELECTED, false), d, i)
}
}
}
})
}