@antv/f2
Version:
Charts for mobile visualization.
354 lines (353 loc) • 11.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _createSuper2 = _interopRequireDefault(require("@babel/runtime/helpers/createSuper"));
var _util = require("@antv/util");
var _component = _interopRequireDefault(require("../base/component"));
var _equal = _interopRequireDefault(require("../base/equal"));
var _children = _interopRequireDefault(require("../children"));
var _layout = _interopRequireDefault(require("../controller/layout"));
var _coord = _interopRequireDefault(require("../controller/coord"));
var _scale = _interopRequireDefault(require("../controller/scale"));
// types
// 统计图表
var Chart = /*#__PURE__*/function (_Component) {
(0, _inherits2.default)(Chart, _Component);
var _super = (0, _createSuper2.default)(Chart);
function Chart(props, context, updater) {
var _this;
(0, _classCallCheck2.default)(this, Chart);
_this = _super.call(this, props, context, updater);
_this.componentsPosition = [];
var data = props.data,
coordOption = props.coord,
_props$scale = props.scale,
scale = _props$scale === void 0 ? [] : _props$scale;
_this.layoutController = new _layout.default();
_this.coordController = new _coord.default();
_this.scaleController = new _scale.default(data);
_this.scale = _this.scaleController;
var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this),
layoutController = _assertThisInitialize.layoutController,
coordController = _assertThisInitialize.coordController,
scaleController = _assertThisInitialize.scaleController;
// 布局
var style = _this.getStyle(props, context);
_this.layout = layoutController.create(style);
// 坐标系
_this.coord = coordController.create(coordOption, _this.layout);
// scale
scaleController.create(scale);
_this.data = data;
// state
_this.state = {
filters: {}
};
return _this;
}
// props 更新
(0, _createClass2.default)(Chart, [{
key: "willReceiveProps",
value: function willReceiveProps(nextProps, context) {
var layoutController = this.layoutController,
coordController = this.coordController,
scaleController = this.scaleController,
lastProps = this.props;
var nextStyle = nextProps.style,
nextData = nextProps.data,
nextScale = nextProps.scale;
var lastStyle = lastProps.style,
lastData = lastProps.data,
lastScale = lastProps.scale;
// 布局
if (!(0, _equal.default)(nextStyle, lastStyle) || context !== this.context) {
var style = this.getStyle(nextProps, context);
this.layout = layoutController.create(style);
coordController.updateLayout(this.layout);
}
if (nextData !== lastData) {
scaleController.changeData(nextData);
}
// scale
if (!(0, _equal.default)(nextScale, lastScale)) {
scaleController.update(nextScale);
}
}
}, {
key: "willUpdate",
value: function willUpdate() {
var coordController = this.coordController,
props = this.props;
// render 时要重置 coord 范围,重置后需要让所有子组件都重新render
// 所以这里不比较是否有差异,每次都新建,让所有子组件重新render
this.coord = coordController.create(props.coord, this.layout);
}
}, {
key: "getStyle",
value: function getStyle(props, context) {
var theme = context.theme,
px2hd = context.px2hd,
left = context.left,
top = context.top,
width = context.width,
height = context.height;
var style = props.style;
return px2hd((0, _objectSpread3.default)((0, _objectSpread3.default)({
left: left,
top: top,
width: width,
height: height
}, theme.chart), style));
}
// 给需要显示的组件留空
}, {
key: "layoutCoord",
value: function layoutCoord(layout) {
var coord = this.coord,
props = this.props;
var position = layout.position,
boxWidth = layout.width,
boxHeight = layout.height;
var left = coord.left,
top = coord.top,
width = coord.width,
height = coord.height;
switch (position) {
case 'left':
left += boxWidth;
width = Math.max(0, width - boxWidth);
break;
case 'right':
width = Math.max(0, width - boxWidth);
break;
case 'top':
top += boxHeight;
height = Math.max(0, height - boxHeight);
break;
case 'bottom':
height = Math.max(0, height - boxHeight);
break;
}
coord.update((0, _objectSpread3.default)((0, _objectSpread3.default)({}, props.coord), {}, {
left: left,
top: top,
width: width,
height: height
}));
}
}, {
key: "resetCoordLayout",
value: function resetCoordLayout() {
var coord = this.coord,
layout = this.layout;
coord.update(layout);
}
}, {
key: "updateCoordLayout",
value: function updateCoordLayout(layout) {
var _this2 = this;
if ((0, _util.isArray)(layout)) {
layout.forEach(function (item) {
_this2.layoutCoord(item);
});
return;
}
this.layoutCoord(layout);
}
}, {
key: "updateCoordFor",
value: function updateCoordFor(component, layout) {
var _this3 = this;
if (!layout) return;
var componentsPosition = this.componentsPosition;
var componentPosition = {
component: component,
layout: layout
};
var existIndex = (0, _util.findIndex)(componentsPosition, function (item) {
return item.component === component;
});
// 说明是已经存在的组件
if (existIndex > -1) {
componentsPosition.splice(existIndex, 1, componentPosition);
// 先重置,然后整体重新算一次
this.resetCoordLayout();
componentsPosition.forEach(function (componentPosition) {
var layout = componentPosition.layout;
_this3.updateCoordLayout(layout);
});
return;
}
// 是新组件,直接添加
componentsPosition.push(componentPosition);
this.updateCoordLayout(layout);
}
}, {
key: "getGeometrys",
value: function getGeometrys() {
var children = this.children;
var geometrys = [];
// @ts-ignore
_children.default.toArray(children).forEach(function (element) {
if (!element) return false;
var component = element.component;
if (component && component.isGeometry) {
geometrys.push(component);
}
});
return geometrys;
}
/**
* calculate dataset's position on canvas
* @param {Object} record the dataset
* @return {Object} return the position
*/
}, {
key: "getPosition",
value: function getPosition(record) {
var coord = this.getCoord();
var xScale = this.getXScales()[0];
var xField = xScale.field;
var yScales = this.getYScales();
// default first
var yScale = yScales[0];
var yField = yScale.field;
for (var i = 0, len = yScales.length; i < len; i++) {
var scale = yScales[i];
var field = scale.field;
if (record[field]) {
yScale = scale;
yField = field;
break;
}
}
var x = xScale.scale(record[xField]);
var y = yScale.scale(record[yField]);
return coord.convertPoint({
x: x,
y: y
});
}
}, {
key: "getSnapRecords",
value: function getSnapRecords(point, inCoordRange) {
var geometrys = this.getGeometrys();
if (!geometrys.length) return;
// @ts-ignore
return geometrys[0].getSnapRecords(point, inCoordRange);
}
}, {
key: "getRecords",
value: function getRecords(data, field) {
var geometrys = this.getGeometrys();
if (!geometrys.length) return;
// @ts-ignore
return geometrys[0].getRecords(data, field);
}
}, {
key: "getLegendItems",
value: function getLegendItems(point) {
var geometrys = this.getGeometrys();
if (!geometrys.length) return;
// @ts-ignore
return geometrys[0].getLegendItems(point);
}
}, {
key: "setScale",
value: function setScale(field, option) {
this.scaleController.setScale(field, option);
}
}, {
key: "getScale",
value: function getScale(field) {
return this.scaleController.getScale(field);
}
}, {
key: "getScales",
value: function getScales() {
return this.scaleController.getScales();
}
}, {
key: "getXScales",
value: function getXScales() {
var geometrys = this.getGeometrys();
return geometrys.map(function (component) {
// @ts-ignore
return component.getXScale();
});
}
}, {
key: "getYScales",
value: function getYScales() {
var geometrys = this.getGeometrys();
return geometrys.map(function (component) {
// @ts-ignore
return component.getYScale();
});
}
}, {
key: "getCoord",
value: function getCoord() {
return this.coord;
}
}, {
key: "filter",
value: function filter(field, condition) {
var filters = this.state.filters;
this.setState({
filters: (0, _objectSpread3.default)((0, _objectSpread3.default)({}, filters), {}, (0, _defineProperty2.default)({}, field, condition))
});
}
}, {
key: "_getRenderData",
value: function _getRenderData() {
var props = this.props,
state = this.state;
var data = props.data;
var filters = state.filters;
if (!filters || !Object.keys(filters).length) {
return data;
}
var filteredData = data;
(0, _util.each)(filters, function (condition, field) {
if (!condition) return;
filteredData = filteredData.filter(function (record) {
return condition(record[field], record);
});
});
return filteredData;
}
}, {
key: "render",
value: function render() {
var _this4 = this;
var props = this.props,
layout = this.layout,
coord = this.coord;
var children = props.children,
originData = props.data;
if (!originData) return null;
var data = this._getRenderData();
return _children.default.map(children, function (child) {
return _children.default.cloneElement(child, {
chart: _this4,
coord: coord,
data: data,
layout: layout
});
});
}
}]);
return Chart;
}(_component.default);
var _default = Chart;
exports.default = _default;