@zhsz/cool-design-dv
Version:
83 lines (82 loc) • 2.73 kB
JavaScript
import { isObject } from "lodash-es";
import { getLabelFormatter } from "./util.mjs";
function getLabelConfig(label, dimension) {
const formatter = getLabelFormatter(dimension, "{@value}");
return isObject(label) ? { ...formatter, ...label, show: true } : { ...formatter, position: label, show: true };
}
function injectLabel(series = [], label, dimensions) {
if (!label)
return;
if (Array.isArray(label)) {
series.forEach((item, index) => {
const dimension = dimensions.slice(1)[index];
const labelItem = label[index];
if (labelItem) {
item.label = getLabelConfig(labelItem, dimension);
}
});
} else {
series.forEach((item, index) => {
const dimension = dimensions.slice(1)[index];
item.label = getLabelConfig(label, dimension);
});
}
}
function getStackName(stack, dimension) {
if (!stack)
return null;
if (Array.isArray(stack)) {
const match = !!stack.find((name) => {
return [dimension.name, dimension.displayName, dimension].includes(name);
});
return match ? "stack" : null;
} else if (isObject(stack)) {
const match = Object.values(stack).find((names) => {
return !!names.find((name) => {
return [dimension.name, dimension.displayName, dimension].includes(
name
);
});
});
return match ? match[0] : null;
}
}
function baseSeries(type, layout, dimensions, settings) {
const shouldChangeTypes = type === "line" ? settings.bars ? [].concat(settings.bars) : [] : settings.lines ? [].concat(settings.lines) : [];
const valueAxis = settings.valueAxis ? [].concat(settings.valueAxis) : [];
const direction = settings.direction;
const axisIndexName = direction === "x" ? "yAxisIndex" : "xAxisIndex";
return dimensions.slice(1).map((dimension) => {
let index = 0;
if (valueAxis.length) {
index = valueAxis.findIndex((item) => {
const axis = isObject(item) ? item : { name: item };
return [dimension.name, dimension.displayName].includes(axis.name);
});
}
index = Math.max(0, index);
const chartType = type === "line" ? shouldChangeTypes.includes(dimension.name) ? "bar" : type : shouldChangeTypes.includes(dimension.name) ? "line" : type;
const stack = getStackName(settings.stack, dimension);
return {
type: chartType,
stack,
areaStyle: stack ? {} : null,
seriesLayoutBy: layout,
[axisIndexName]: index
};
});
}
function createSeries({
type,
layout = "column",
dimensions,
settings
}) {
const series = baseSeries(type, layout, dimensions, settings);
injectLabel(series, settings.label, dimensions);
return series;
}
export {
baseSeries,
createSeries
};