@qn-pandora/pandora-visualization
Version:
Pandora 通用可视化库
299 lines (298 loc) • 13.2 kB
JavaScript
;
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getLineDisplayName = exports.updateSeriesData = exports.isValueSeries = exports.calcPercentageSumData = exports.getOriginData = exports.getSeriesFromDataset = exports.getSeriesFromDatasetWithoutGroup = exports.getMainAxisValues = exports.getMainAxisUniqValues = void 0;
var lodash_1 = require("lodash");
var utils_1 = require("../../../base-pandora-visualization/services/chart-style/utils");
var chart_style_1 = require("../../../constants/chart-style");
function getMainAxisUniqValues(dataset, mainAxisField, isCompare) {
if (isCompare === void 0) { isCompare = false; }
return lodash_1.uniq(utils_1.getDataOfField(mainAxisField, dataset, isCompare)) || [];
}
exports.getMainAxisUniqValues = getMainAxisUniqValues;
function getMainAxisValues(dataset, mainAxisField, isCompare) {
if (isCompare === void 0) { isCompare = false; }
return utils_1.getDataOfField(mainAxisField, dataset, isCompare) || [];
}
exports.getMainAxisValues = getMainAxisValues;
// 从fieldIndexMap 获取某个field 的index
function getIndex(fieldIndexMap, field) {
return fieldIndexMap[field] !== undefined ? fieldIndexMap[field] : -1;
}
function getSeriesFromDatasetWithoutGroup(dataset, mainAxisField, // x轴
crossAxisFields, // y轴
displayFields, needCombina // 是否需要合并数据(比如在组合图中有分组的情况下,)
) {
var fields = dataset.fields;
var data = getOriginData(dataset);
if (data.length === 0 || !mainAxisField || crossAxisFields.length === 0) {
return [];
}
var fieldIndexMap = fields.reduce(function (pre, cur, curIndex) {
pre[cur.key] = curIndex;
return pre;
}, {});
var mainFieldIndex = getIndex(fieldIndexMap, mainAxisField);
var mainAxisValues = getMainAxisValues(dataset, mainAxisField);
var realMainAxisValues = needCombina === true ? lodash_1.uniq(mainAxisValues) : mainAxisValues;
var uniqMetrics = lodash_1.uniq(crossAxisFields);
var sery = [];
uniqMetrics.map(function (metric) {
var metricIndex = getIndex(fieldIndexMap, metric);
var onePieceSeries = [];
realMainAxisValues.map(function (key, index) {
var _a;
var rows = data;
var displayFieldsIndex = [];
var display = {};
displayFields.forEach(function (field) {
var displayIndex = getIndex(fieldIndexMap, field);
if (displayIndex !== -1) {
displayFieldsIndex.push(displayIndex);
display[fields[displayIndex].key] = lodash_1.get(rows[index], displayIndex);
}
});
var serie = (_a = {},
// 如果x 轴选择的是name,会被下面的name 覆盖掉
_a[mainAxisField === 'name' ? mainAxisField + "_1" : mainAxisField] = key,
_a.key = key,
_a.name = metric + chart_style_1.OVERLAP_LINE_SUFFIX,
_a.metricName = metric + chart_style_1.OVERLAP_LINE_SUFFIX,
_a.metricValue = null,
_a.fieldType = '',
_a.display = display,
_a);
var row = rows
.slice(index)
.find(function (item) { return lodash_1.get(item, mainFieldIndex) === key; });
var metricValue = lodash_1.get(row, metricIndex);
onePieceSeries.push(__assign(__assign({}, serie), { metricValue: metricValue }));
});
sery.push(onePieceSeries);
});
return sery;
}
exports.getSeriesFromDatasetWithoutGroup = getSeriesFromDatasetWithoutGroup;
function getSeriesFromDataset(dataset, colorFields, mainAxisField, crossAxisFields, displayFields, showMetricInName) {
if (displayFields === void 0) { displayFields = []; }
var fields = dataset.fields;
var data = getOriginData(dataset);
if (data.length === 0 || !mainAxisField || crossAxisFields.length === 0) {
return [];
}
var fieldIndexMap = fields.reduce(function (pre, cur, curIndex) {
pre[cur.key] = curIndex;
return pre;
}, {});
var sourceColorFieldsData = [];
var colorFieldsSet = new Set();
var mainFieldIndex = getIndex(fieldIndexMap, mainAxisField);
var mainFieldValues = [];
data.forEach(function (item) {
// 获取x轴数据
mainFieldValues.push(item[mainFieldIndex] || null);
// 分组数据
if (colorFields.length > 0) {
var group_1 = colorFields.reduce(function (pre, curField) {
pre[curField] = lodash_1.get(item, fieldIndexMap[curField]);
return pre;
}, {});
var isEmpty = Object.keys(group_1).every(function (key) { return lodash_1.isNil(group_1[key]); });
var groupKey_1 = '';
Object.keys(group_1).forEach(function (key) { return (groupKey_1 = key); });
var groupField = fieldIndexMap[groupKey_1] || undefined;
sourceColorFieldsData.push({
group: group_1,
isEmpty: isEmpty,
groupValuesString: isEmpty ? '' : lodash_1.values(group_1).join(' '),
groupField: groupField
});
if (!isEmpty) {
colorFieldsSet.add(group_1);
}
}
});
// 颜色分组字段值的排列组合
var uniqColorFieldCombine = new Array(colorFieldsSet);
var uniqMetrics = lodash_1.uniq(crossAxisFields);
var metricIndexMap = uniqMetrics.reduce(function (pre, cur) {
pre[cur] = {
index: getIndex(fieldIndexMap, cur),
metricField: utils_1.getField(cur, fields)
};
return pre;
}, {});
// x 轴的值
var needCombined = uniqColorFieldCombine.length == 0 ? false : true;
var uniqMainFieldValues = needCombined
? lodash_1.uniq(mainFieldValues)
: mainFieldValues;
var displayFieldsIndex = displayFields
.map(function (field) { return getIndex(fieldIndexMap, field); })
.filter(function (index) { return index !== -1; });
var res = new Map();
data.forEach(function (dataItem, dataIndex) {
// 获取当前的分组信息
var _a = sourceColorFieldsData[dataIndex] || {}, _b = _a.group, group = _b === void 0 ? {} : _b, _c = _a.groupValuesString, groupValuesString = _c === void 0 ? '' : _c, groupField = _a.groupField;
var display = displayFieldsIndex.reduce(function (pre, displayIndex) {
pre[fields[displayIndex].key] = dataItem[displayIndex];
return pre;
}, {});
uniqMetrics.forEach(function (metric) {
var _a;
var _b = metricIndexMap[metric] || {}, _c = _b.index, metricIndex = _c === void 0 ? -1 : _c, metricField = _b.metricField;
var nameWithGroupValues = showMetricInName
? metric + " " + groupValuesString
: groupValuesString;
var metricValue = lodash_1.get(dataItem, metricIndex);
var key = lodash_1.get(dataItem, mainFieldIndex);
var name = groupValuesString ? nameWithGroupValues : "" + metric;
var serie = __assign(__assign({}, group), { key: '', name: name, metricName: metric, metricValue: null, fieldType: groupValuesString && showMetricInName
? 'string'
: groupValuesString && groupField
? groupField.fieldType || ''
: metricField
? metricField.fieldType || ''
: '' });
if (!res.get(name)) {
var array = uniqMainFieldValues.map(function (mainFieldValue) {
var _a, _b;
if (mainFieldValue === key) {
return __assign(__assign({}, serie), (_a = { key: key,
metricValue: metricValue,
display: display }, _a[mainAxisField === 'name'
? mainAxisField + "_1"
: mainAxisField] = key, _a));
}
return __assign(__assign({}, serie), (_b = {}, _b[mainAxisField === 'name'
? mainAxisField + "_1"
: mainAxisField] = mainFieldValue, _b));
});
res.set(name, array);
return;
}
var current = res.get(name) || [];
var findIndex = -1;
if (needCombined) {
findIndex = current.findIndex(function (item) { return (item === null || item === void 0 ? void 0 : item.key) === key; });
if (findIndex === -1) {
findIndex = uniqMainFieldValues.findIndex(function (item) { return item === key; });
}
}
else {
findIndex = uniqMainFieldValues.findIndex(function (item) { return item === key; });
}
current[findIndex] = __assign(__assign({}, serie), (_a = { key: key,
metricValue: metricValue,
display: display }, _a[mainAxisField === 'name' ? mainAxisField + "_1" : mainAxisField] = key, _a));
});
});
return lodash_1.toArray(res.values());
}
exports.getSeriesFromDataset = getSeriesFromDataset;
// 根据是否为对比类型, 获取相应的数据结构
function getOriginData(dataset) {
var rows = dataset.rows;
var data = [];
rows.forEach(function (row) {
var row2 = row.map(function (col) { return col[0]; });
if (!row2.every(function (item) { return lodash_1.isNil(item); })) {
data.push(row2);
}
});
return data;
}
exports.getOriginData = getOriginData;
function calcPercentageSumData(series) {
var maxDataLength = lodash_1.max(series.map(function (sery) { return lodash_1.get(sery, ['data', 'length'], 0); }));
// let maxDataLength = 0
// series.forEach(sery => {
// const length = get(sery, 'data') ? get(sery, 'data').length : 0
// if (length > maxDataLength) {
// maxDataLength = length
// }
// })
var sumValus = [];
var _loop_1 = function (i) {
// let sum = 0
var sum = series.reduce(function (pre, cur) {
var value = lodash_1.get(cur, ['data', i], 0);
var num = lodash_1.toNumber(value);
if (!isNaN(num)) {
return pre + num;
}
return pre;
}, [0]);
// series.forEach(item => {
// if (item.data && item.data[i]) {
// sum += isNaN(toNumber(item.data[i].value))
// ? 0
// : toNumber(item.data[i].value)
// }
// })
sumValus.push(sum);
};
for (var i = 0; i < maxDataLength; i++) {
_loop_1(i);
}
return sumValus;
}
exports.calcPercentageSumData = calcPercentageSumData;
function isValueSeries(series) {
if (series.length === 0) {
return true;
}
if (series[0].data &&
lodash_1.isArray(series[0].data) &&
lodash_1.isNumber(series[0].data[0].value)) {
return true;
}
return false;
}
exports.isValueSeries = isValueSeries;
/**
* 如果x轴为线性或者指数的话,
* 需要将数据 data:[0, 1, 2, 3] => data: [[x1, 0], [x2, 1], [x3, 2], [x4, 3]]
* TODO: 后期统一处理数据
*/
function updateSeriesData(series, xAxis) {
var _a = xAxis.type, type = _a === void 0 ? 'category' : _a, _b = xAxis.data, data = _b === void 0 ? [] : _b;
if (data.length === 0 || (type !== 'value' && type !== 'log')) {
return series;
}
return series.map(function (serie) {
serie.data = (serie.data || []).map(function (item, index) {
var xAxisValue = data.length > index ? data[index] : undefined;
if (item && lodash_1.isArray(item)) {
return item;
}
if (item && typeof item === 'object') {
var value = lodash_1.isNil(item.value) ? undefined : item.value;
return [xAxisValue, value];
}
return [xAxisValue, item];
});
return serie;
});
}
exports.updateSeriesData = updateSeriesData;
// 获取真正的折线的name, 如果是叠加折线,去挑添加的后缀(添加后缀是为了跟同名的柱形区分)
function getLineDisplayName(name, isOverlap) {
if (isOverlap === void 0) { isOverlap = false; }
var index = name.indexOf(chart_style_1.OVERLAP_LINE_SUFFIX);
if (isOverlap && index !== -1) {
return name.slice(0, index);
}
return name;
}
exports.getLineDisplayName = getLineDisplayName;