UNPKG

4.4 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.getMaxScale = exports.getDefaultCategoryScaleRange = exports.getName = exports.syncScale = exports.createScaleByField = void 0;
4var tslib_1 = require("tslib");
5var util_1 = require("@antv/util");
6var dependents_1 = require("../dependents");
7var coordinate_1 = require("./coordinate");
8var dateRegex = /^(?:(?!0000)[0-9]{4}([-/.]+)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]+)0?2\2(?:29))(\s+([01]|([01][0-9]|2[0-3])):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]))?$/;
9/**
10 * 获取字段对应数据的类型
11 * @param field 数据字段名
12 * @param data 数据源
13 * @returns default type 返回对应的数据类型
14 */
15function getDefaultType(value) {
16 var type = 'linear';
17 if (dateRegex.test(value)) {
18 type = 'timeCat';
19 }
20 else if (util_1.isString(value)) {
21 type = 'cat';
22 }
23 return type;
24}
25/**
26 * @ignore
27 * 为指定的 `field` 字段数据创建 scale
28 * @param field 字段名
29 * @param [data] 数据集,可为空
30 * @param [scaleDef] 列定义,可为空
31 * @returns scale 返回创建的 Scale 实例
32 */
33function createScaleByField(field, data, scaleDef) {
34 var validData = data || [];
35 if (util_1.isNumber(field) || (util_1.isNil(util_1.firstValue(validData, field)) && util_1.isEmpty(scaleDef))) {
36 var Identity = dependents_1.getScale('identity');
37 return new Identity({
38 field: field.toString(),
39 values: [field],
40 });
41 }
42 var values = util_1.valuesOfKey(validData, field);
43 // 如果已经定义过这个度量
44 var type = util_1.get(scaleDef, 'type', getDefaultType(values[0]));
45 var ScaleCtor = dependents_1.getScale(type);
46 return new ScaleCtor(tslib_1.__assign({ field: field,
47 values: values }, scaleDef));
48}
49exports.createScaleByField = createScaleByField;
50/**
51 * @ignore
52 * 同步 scale
53 * @todo 是否可以通过 scale.update() 方法进行更新
54 * @param scale 需要同步的 scale 实例
55 * @param newScale 同步源 Scale
56 */
57function syncScale(scale, newScale) {
58 if (scale.type !== 'identity' && newScale.type !== 'identity') {
59 var obj = {};
60 for (var k in newScale) {
61 if (Object.prototype.hasOwnProperty.call(newScale, k)) {
62 obj[k] = newScale[k];
63 }
64 }
65 scale.change(obj);
66 }
67}
68exports.syncScale = syncScale;
69/**
70 * @ignore
71 * get the scale name, if alias exist, return alias, or else field
72 * @param scale
73 * @returns the name of field
74 */
75function getName(scale) {
76 return scale.alias || scale.field;
77}
78exports.getName = getName;
79/**
80 * 根据 scale values 和 coordinate 获取分类默认 range
81 * @param scale 需要获取的 scale 实例
82 * @param coordinate coordinate 实例
83 * @param theme theme
84 */
85function getDefaultCategoryScaleRange(scale, coordinate, theme) {
86 var values = scale.values;
87 var count = values.length;
88 var range;
89 if (count === 1) {
90 range = [0.5, 1]; // 只有一个分类时,防止计算出现 [0.5,0.5] 的状态
91 }
92 else {
93 var widthRatio = 1;
94 var offset = 0;
95 if (coordinate_1.isFullCircle(coordinate)) {
96 if (!coordinate.isTransposed) {
97 range = [0, 1 - 1 / count];
98 }
99 else {
100 widthRatio = util_1.get(theme, 'widthRatio.multiplePie', 1 / 1.3);
101 offset = (1 / count) * widthRatio;
102 range = [offset / 2, 1 - offset / 2];
103 }
104 }
105 else {
106 offset = 1 / count / 2; // 两边留下分类空间的一半
107 range = [offset, 1 - offset]; // 坐标轴最前面和最后面留下空白防止绘制柱状图时
108 }
109 }
110 return range;
111}
112exports.getDefaultCategoryScaleRange = getDefaultCategoryScaleRange;
113/**
114 * @function y轴scale的max
115 * @param {yScale}
116 */
117function getMaxScale(scale) {
118 // 过滤values[]中 NaN/undefined/null 等
119 var values = scale.values.filter(function (item) { return !util_1.isNil(item) && !isNaN(item); });
120 return Math.max.apply(Math, tslib_1.__spreadArrays(values, [util_1.isNil(scale.max) ? -Infinity : scale.max]));
121}
122exports.getMaxScale = getMaxScale;
123//# sourceMappingURL=scale.js.map
\No newline at end of file