@visactor/vchart
Version:
charts lib based @visactor/VGrammar
44 lines (38 loc) • 3.43 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.funnelTransform = exports.funnel = void 0;
const vutils_1 = require("@visactor/vutils"), resolveOptionValue = option => (0,
vutils_1.isFunction)(option) ? option() : option, funnel = (originData, op) => {
var _a, _b, _c, _d;
const data = originData.map((datum => Object.assign({}, datum)));
if (!data || 0 === data.length) return data;
const {asTransformRatio: asTransformRatio, asReachRatio: asReachRatio, asHeightRatio: asHeightRatio, asValueRatio: asValueRatio, asNextValueRatio: asNextValueRatio, asLastValueRatio: asLastValueRatio, asLastValue: asLastValue, asCurrentValue: asCurrentValue, asNextValue: asNextValue} = op, valueField = resolveOptionValue(op.valueField), heightVisual = null !== (_a = resolveOptionValue(op.heightVisual)) && void 0 !== _a && _a, isCone = null === (_b = resolveOptionValue(op.isCone)) || void 0 === _b || _b, range = resolveOptionValue(op.range), max = data.reduce(((m, d) => {
const value = Number.parseFloat(d[valueField]);
return (0, vutils_1.isValidNumber)(value) ? Math.max(m, value) : m;
}), -1 / 0), rangeMin = null !== (_c = null == range ? void 0 : range.min) && void 0 !== _c ? _c : 0, rangeMax = null !== (_d = null == range ? void 0 : range.max) && void 0 !== _d ? _d : max, getValueRatio = value => (0,
vutils_1.isValidNumber)(value) && (0, vutils_1.isValidNumber)(rangeMin) && (0, vutils_1.isValidNumber)(rangeMax) ? rangeMin === rangeMax ? value < rangeMin ? 0 : 1 : (0,
vutils_1.clamp)((value - rangeMin) / (rangeMax - rangeMin), 0, 1) : 0;
return data.forEach(((d, i) => {
var _a, _b;
const currentValue = Number.parseFloat(d[valueField]), lastValue = Number.parseFloat(null === (_a = data[i - 1]) || void 0 === _a ? void 0 : _a[valueField]), nextValue = Number.parseFloat(null === (_b = data[i + 1]) || void 0 === _b ? void 0 : _b[valueField]), transformRatio = (0,
vutils_1.isValidNumber)(nextValue * currentValue) && 0 !== currentValue ? nextValue / currentValue : 0, reachRatio = (0,
vutils_1.isValidNumber)(currentValue * lastValue) && 0 !== lastValue ? currentValue / lastValue : 0, valueRatio = getValueRatio(currentValue);
asLastValue && (d[asLastValue] = lastValue), asNextValue && (d[asNextValue] = nextValue),
asTransformRatio && (d[asTransformRatio] = transformRatio), asReachRatio && (d[asReachRatio] = 0 === i ? 1 : reachRatio),
asHeightRatio && (d[asHeightRatio] = !0 === heightVisual ? transformRatio : 1 / data.length),
asValueRatio && (d[asValueRatio] = valueRatio), asNextValueRatio && (d[asNextValueRatio] = i === data.length - 1 ? isCone ? 0 : d[asValueRatio] : getValueRatio(nextValue)),
asLastValueRatio && (d[asLastValueRatio] = 0 === i ? 1 : getValueRatio(lastValue)),
asCurrentValue && (d[asCurrentValue] = currentValue);
})), data;
};
exports.funnel = funnel;
const funnelTransform = (originData, op) => {
var _a, _b;
const data = null === (_b = null === (_a = originData[0]) || void 0 === _a ? void 0 : _a.latestData) || void 0 === _b ? void 0 : _b.map((datum => Object.assign({}, datum)));
return data && 0 !== data.length ? (data.shift(), data.forEach((d => {
d[op.asIsTransformLevel] = !0;
})), data) : data;
};
exports.funnelTransform = funnelTransform;
//# sourceMappingURL=funnel.js.map