UNPKG

@qn-pandora/pandora-visualization

Version:

Pandora 通用可视化库

299 lines (298 loc) 13.2 kB
"use strict"; 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;