import {config} from './config';
/**
* Start a transition on a selection if transitions are globally enabled
* ({@link disableTransitions} is false) and the duration is greater than zero; otherwise return
* the selection. Since most operations are the same on a d3 selection and a d3 transition, this
* allows a common code path for both cases.
* @function transition
* @param {d3.selection} selection - the selection to be transitioned
* @param {Number|Function} [duration=250] - the duration of the transition in milliseconds, a
* function returning the duration, or 0 for no transition
* @param {Number|Function} [delay] - the delay of the transition in milliseconds, or a function
* returning the delay, or 0 for no delay
* @param {String} [name] - the name of the transition (if concurrent transitions on the same
* elements are needed)
* @returns {d3.transition|d3.selection}
*/
export const transition = function (selection, duration, delay, name) {
if (config.disableTransitions || duration <= 0) {
return selection;
}
let s = selection.transition(name);
if (duration >= 0 || duration !== undefined) {
s = s.duration(duration);
}
if (delay >= 0 || delay !== undefined) {
s = s.delay(delay);
}
return s;
};
/* somewhat silly, but to avoid duplicating logic */
export const optionalTransition = function (enable, duration, delay, name) {
if (enable) {
return function (selection) {
return transition(selection, duration, delay, name);
};
} else {
return function (selection) {
return selection;
};
}
};
// See http://stackoverflow.com/a/20773846
export const afterTransition = function (_transition, callback) {
if (_transition.empty() || !_transition.duration) {
callback.call(_transition);
} else {
let n = 0;
_transition
.each(() => { ++n; })
.on('end', () => {
if (!--n) {
callback.call(_transition);
}
});
}
};
export const renderlet = function (_) {
if (!arguments.length) {
return config._renderlet;
}
config._renderlet = _;
return null;
};
export const instanceOfChart = function (o) {
return o instanceof Object && o.__dcFlag__ && true;
};