@visactor/vchart
Version:
charts lib based @visactor/VGrammar
312 lines (303 loc) • 13.4 kB
JavaScript
import { BaseSeries } from "../base/base-series";
import { STACK_FIELD_END, STACK_FIELD_END_PERCENT, STACK_FIELD_END_OffsetSilhouette, STACK_FIELD_START, STACK_FIELD_START_PERCENT, STACK_FIELD_START_OffsetSilhouette } from "../../constant/data";
import { array, isValid } from "@visactor/vutils";
import { isContinuous } from "@visactor/vscale";
import { sortDataInAxisHelper } from "../util/utils";
import { ComponentTypeEnum } from "../../component/interface/type";
import { ChartEvent } from "../../constant/event";
import { PREFIX } from "../../constant/base";
export class CartesianSeries extends BaseSeries {
constructor() {
super(...arguments), this.coordinate = "cartesian", this._bandPosition = .5, this._scaleConfig = {
bandPosition: this._bandPosition
}, this._direction = "vertical", this._sortDataByAxis = !1, this._getPositionXEncoder = () => {
var _a;
return null === (_a = this._positionXEncoder) || void 0 === _a ? void 0 : _a.bind(this);
}, this._setPositionXEncoder = encoder => {
this._positionXEncoder = encoder.bind(this);
}, this._getPositionYEncoder = () => {
var _a;
return null === (_a = this._positionYEncoder) || void 0 === _a ? void 0 : _a.bind(this);
}, this._setPositionYEncoder = encoder => {
this._positionYEncoder = encoder.bind(this);
};
}
_buildScaleConfig() {
this._scaleConfig = {
bandPosition: this._bandPosition
};
}
get fieldX() {
return this._fieldX;
}
setFieldX(f) {
this._fieldX = array(f);
}
get fieldY() {
return this._fieldY;
}
setFieldY(f) {
this._fieldY = array(f);
}
get fieldZ() {
return this._fieldZ;
}
setFieldZ(f) {
this._fieldZ = f && array(f);
}
get fieldX2() {
return this._fieldX2;
}
setFieldX2(f) {
this._fieldX2 = f;
}
get fieldY2() {
return this._fieldY2;
}
setFieldY2(f) {
this._fieldY2 = f;
}
get direction() {
return this._direction;
}
get scaleX() {
return this._scaleX;
}
setScaleX(s) {
this._scaleX = s;
}
get scaleY() {
return this._scaleY;
}
setScaleY(s) {
this._scaleY = s;
}
get scaleZ() {
return this._scaleZ;
}
setScaleZ(s) {
this._scaleZ = s;
}
getXAxisHelper() {
return this._xAxisHelper;
}
setXAxisHelper(h) {
this._xAxisHelper = h, this.onXAxisHelperUpdate();
}
getYAxisHelper() {
return this._yAxisHelper;
}
setYAxisHelper(h) {
this._yAxisHelper = h, this.onYAxisHelperUpdate();
}
getZAxisHelper() {
return this._zAxisHelper;
}
setZAxisHelper(h) {
this._zAxisHelper = h, this.onYAxisHelperUpdate();
}
get sortDataByAxis() {
return this._sortDataByAxis;
}
getStatisticFields() {
const fields = [];
return [ {
axisHelper: this.getXAxisHelper(),
fields: this._fieldX2 ? [ ...this._fieldX, this._fieldX2 ] : this._fieldX
}, {
axisHelper: this.getYAxisHelper(),
fields: this._fieldY2 ? [ ...this._fieldY, this._fieldY2 ] : this._fieldY
}, {
axisHelper: this.getZAxisHelper(),
fields: this._fieldZ
} ].forEach((axisOption => {
axisOption.axisHelper && axisOption.axisHelper.getScale && axisOption.fields && axisOption.fields.forEach((f => {
const result = {
key: f,
operations: []
}, scale = axisOption.axisHelper.getScale(0);
isContinuous(scale.type) ? (result.operations = [ "max", "min" ], "log" === scale.type && (result.filter = fv => fv > 0)) : result.operations = [ "values" ],
fields.push(result);
}));
})), this.getStack() && fields.push({
key: this.getStackValueField(),
operations: [ "allValid" ]
}), fields;
}
getGroupFields() {
return "vertical" === this.direction ? this._fieldX : this._fieldY;
}
getStackGroupFields() {
return this.getGroupFields();
}
getStackValue() {
var _a, _b;
const axisId = null === (_a = "horizontal" === this.direction ? this.getXAxisHelper() : this.getYAxisHelper()) || void 0 === _a ? void 0 : _a.getAxisId();
return null !== (_b = this._spec.stackValue) && void 0 !== _b ? _b : `${PREFIX}_series_${this.type}_${axisId}`;
}
getStackValueField() {
return "horizontal" === this.direction ? array(this._spec.xField)[0] : array(this._spec.yField)[0];
}
setValueFieldToStack() {
"horizontal" === this.direction ? (this.setFieldX(STACK_FIELD_END), this.setFieldX2(STACK_FIELD_START)) : (this.setFieldY(STACK_FIELD_END),
this.setFieldY2(STACK_FIELD_START));
}
setValueFieldToPercent() {
"horizontal" === this.direction ? (this.setFieldX(STACK_FIELD_END_PERCENT), this.setFieldX2(STACK_FIELD_START_PERCENT)) : (this.setFieldY(STACK_FIELD_END_PERCENT),
this.setFieldY2(STACK_FIELD_START_PERCENT));
}
setValueFieldToStackOffsetSilhouette() {
"horizontal" === this.direction ? (this.setFieldX(STACK_FIELD_END_OffsetSilhouette),
this.setFieldX2(STACK_FIELD_START_OffsetSilhouette)) : (this.setFieldY(STACK_FIELD_END_OffsetSilhouette),
this.setFieldY2(STACK_FIELD_START_OffsetSilhouette));
}
onXAxisHelperUpdate() {
this.onMarkPositionUpdate();
}
onYAxisHelperUpdate() {
this.onMarkPositionUpdate();
}
onZAxisHelperUpdate() {
this.onMarkPositionUpdate();
}
setAttrFromSpec() {
var _a, _b;
super.setAttrFromSpec(), this.setFieldX(this._spec.xField), this.setFieldY(this._spec.yField),
this.setFieldZ(this._spec.zField), this._specXField = array(this._spec.xField),
this._specYField = array(this._spec.yField), isValid(this._spec.direction) && (this._direction = this._spec.direction),
this.setFieldX2(null === (_a = this._spec) || void 0 === _a ? void 0 : _a.x2Field),
this.setFieldY2(null === (_b = this._spec) || void 0 === _b ? void 0 : _b.y2Field),
this.getStack() && this.setValueFieldToStack(), this.getPercent() && this.setValueFieldToPercent(),
this.getStackOffsetSilhouette() && this.setValueFieldToStackOffsetSilhouette(),
isValid(this._spec.sortDataByAxis) && (this._sortDataByAxis = !0 === this._spec.sortDataByAxis);
}
dataToPosition(datum, checkInViewData) {
return datum ? checkInViewData && !this.isDatumInViewData(datum) ? null : {
x: this.dataToPositionX(datum),
y: this.dataToPositionY(datum)
} : null;
}
_buildMarkAttributeContext() {
super._buildMarkAttributeContext(), this._markAttributeContext.valueToX = this.valueToPositionX.bind(this),
this._markAttributeContext.valueToY = this.valueToPositionY.bind(this), this._markAttributeContext.xBandwidth = (depth = 0) => {
var _a, _b, _c;
return null !== (_c = null === (_b = (_a = this.getXAxisHelper()).getBandwidth) || void 0 === _b ? void 0 : _b.call(_a, depth)) && void 0 !== _c ? _c : 0;
}, this._markAttributeContext.yBandwidth = (depth = 0) => {
var _a, _b, _c;
return null !== (_c = null === (_b = (_a = this.getYAxisHelper()).getBandwidth) || void 0 === _b ? void 0 : _b.call(_a, depth)) && void 0 !== _c ? _c : 0;
}, this._markAttributeContext.valueToPosition = this.valueToPosition.bind(this);
}
valueToPosition(xValue, yValue) {
return {
x: this.valueToPositionX(xValue),
y: this.valueToPositionY(yValue)
};
}
_axisPosition(helper, value, datum) {
return this._scaleConfig.datum = datum, helper.isContinuous ? helper.valueToPosition(value, this._scaleConfig) : helper.dataToPosition(array(value), this._scaleConfig);
}
valueToPositionX(value, datum) {
return this._axisPosition(this._xAxisHelper, value, datum);
}
valueToPositionY(value, datum) {
return this._axisPosition(this._yAxisHelper, value, datum);
}
_dataToPosition(datum, axisHelper, field, scaleDepth, getEncoder, setEncoder) {
const encoder = getEncoder();
if (encoder) return encoder(datum);
if (!axisHelper) return setEncoder((datum => Number.NaN)), Number.NaN;
const fields = (axisHelper.getFields ? axisHelper.getFields() : field).slice(0, scaleDepth);
return fields && 0 !== fields.length ? (axisHelper.isContinuous ? setEncoder((datum => (this._scaleConfig.datum = datum,
axisHelper.valueToPosition(this.getDatumPositionValue(datum, fields[0]), this._scaleConfig)))) : setEncoder((datum => (this._scaleConfig.datum = datum,
axisHelper.dataToPosition(array(this.getDatumPositionValues(datum, fields)), this._scaleConfig)))),
getEncoder()(datum)) : (setEncoder((datum => null)), null);
}
dataToPositionX(datum) {
return this._dataToPosition(datum, this._xAxisHelper, this.fieldX, void 0, this._getPositionXEncoder, this._setPositionXEncoder);
}
dataToPositionY(datum) {
return this._dataToPosition(datum, this._yAxisHelper, this.fieldY, void 0, this._getPositionYEncoder, this._setPositionYEncoder);
}
dataToPositionZ(datum) {
if (!this._zAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._zAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fieldZ), {
bandPosition: this._bandPosition
});
}
dataToPositionX1(datum) {
return this._xAxisHelper ? this._fieldX2 && this._fieldX2 in datum ? this.valueToPositionX(this.getDatumPositionValues(datum, this._fieldX2)) : this.valueToPositionX(0) : Number.NaN;
}
dataToPositionY1(datum) {
return this._yAxisHelper ? this._fieldY2 && this._fieldY2 in datum ? this.valueToPositionY(this.getDatumPositionValues(datum, this._fieldY2)) : this.valueToPositionY(0) : Number.NaN;
}
positionToData(p) {
return p ? {
x: this.positionToDataX(p.x),
y: this.positionToDataY(p.y)
} : null;
}
positionToDataX(xPos) {
return this._scaleX ? this._scaleX.invert(xPos) : null;
}
positionToDataY(yPos) {
return this._scaleY ? this._scaleY.invert(yPos) : null;
}
getRegionRectLeft() {
if (!this._xAxisHelper) return Number.NaN;
const {getScale: getScale} = this._xAxisHelper;
return getScale(0).range()[0];
}
getRegionRectRight() {
if (!this._xAxisHelper) return Number.NaN;
const {getScale: getScale} = this._xAxisHelper;
return getScale(0).range()[1];
}
afterInitMark() {
super.afterInitMark(), this.setFieldX(this._fieldX), this.setFieldY(this._fieldY),
this._buildScaleConfig();
}
getDimensionField() {
return "horizontal" === this._direction ? this._specYField : this._specXField;
}
getDimensionContinuousField() {
return "horizontal" === this._direction ? [ this.fieldY[0], this.fieldY2 ] : [ this.fieldX[0], this.fieldX2 ];
}
getMeasureField() {
return "horizontal" === this._direction ? this._specXField : this._specYField;
}
initEvent() {
super.initEvent(), this.sortDataByAxis && this.event.on(ChartEvent.scaleDomainUpdate, {
filter: param => {
var _a;
return param.model.id === (null === (_a = "horizontal" === this._direction ? this._yAxisHelper : this._xAxisHelper) || void 0 === _a ? void 0 : _a.getAxisId());
}
}, (() => {
this._sortDataInAxisDomain();
}));
}
_sortDataInAxisDomain() {
var _a, _b, _c;
(null === (_b = null === (_a = this.getViewData()) || void 0 === _a ? void 0 : _a.latestData) || void 0 === _b ? void 0 : _b.length) && (sortDataInAxisHelper("horizontal" === this._direction ? this._yAxisHelper : this._xAxisHelper, "horizontal" === this._direction ? this._fieldY[0] : this._fieldX[0], this.getViewData().latestData),
null === (_c = this._data) || void 0 === _c || _c.updateData(!0));
}
getInvalidCheckFields() {
const fields = [];
if (this._xAxisHelper && this._xAxisHelper.isContinuous && this._xAxisHelper.getAxisType() !== ComponentTypeEnum.geoCoordinate) {
(this._xAxisHelper.getFields ? this._xAxisHelper.getFields() : this._specXField).forEach((f => {
fields.push(f);
}));
}
if (this._yAxisHelper && this._yAxisHelper.isContinuous && this._yAxisHelper.getAxisType() !== ComponentTypeEnum.geoCoordinate) {
(this._yAxisHelper.getFields ? this._yAxisHelper.getFields() : this._specYField).forEach((f => {
fields.push(f);
}));
}
return fields;
}
reInit(spec) {
this._positionXEncoder && (this._positionXEncoder = null), this._positionYEncoder && (this._positionYEncoder = null),
super.reInit(spec);
}
}
//# sourceMappingURL=cartesian.js.map