@opentiny/vue-renderless
Version:
An enterprise-class UI component library, support both Vue.js 2 and Vue.js 3, as well as PC and mobile.
167 lines (166 loc) • 7.14 kB
JavaScript
import {
__spreadValues
} from "../chunk-G2ADBYYC.js";
import { getFormated, getStackMap, getLegend, hexToRgb, set } from "../chart-core/deps/utils";
import { isNull } from "@opentiny/utils";
import { itemPoint, itemLabel, itemContent, SAAS_DEFAULT_COLORS } from "../chart-core/deps/constants";
const getLineXAxis = (args) => {
const { xAxisType, dimension, rows, xAxisName, axisVisible } = args;
return dimension.map((item, idx) => ({
nameLocation: "middle",
type: xAxisType,
name: xAxisName[idx] || "",
nameGap: 22,
show: axisVisible,
data: rows.map((row) => row[item]),
axisTick: { show: true, lineStyle: { color: "#191919", opacity: 0.1, width: 2 }, alignWithLabel: true },
axisLine: { show: true, lineStyle: { color: "#191919", opacity: 0.1, width: 2 } },
axisPointer: { show: true, type: "line", lineStyle: { color: "#191919", opacity: 0.3, type: "solid" } }
}));
};
const getAreaSeries = ({ color, seriesItem }) => {
const colorStops = [
{ offset: 0, color: `rgba(${hexToRgb(color)}, 0.5)` },
{ offset: 1, color: `rgba(${hexToRgb(color)}, 0.1)` }
];
seriesItem.areaStyle = { color: { type: "linear", x: 0, y: 0, x2: 0, y2: 1, colorStops } };
};
const setSingLineSeries = ({ defaultSeriesItem, seriesItem }) => {
defaultSeriesItem.showSymbol = true;
set(defaultSeriesItem, "emphasis.itemStyle.color", SAAS_DEFAULT_COLORS[0]);
seriesItem.label = __spreadValues({ show: true }, seriesItem.label);
seriesItem.itemStyle = __spreadValues({ color: "transparent" }, seriesItem.itemStyle);
seriesItem.lineStyle = __spreadValues({ color: SAAS_DEFAULT_COLORS[0] }, seriesItem.lineStyle);
seriesItem.animation = seriesItem.animation || false;
};
const getLineSeries = (args) => {
const { areaStyle, axisSite, area, dimension, itemStyle, label } = args;
const { labelMap, lineStyle, metrics, nullAddZero, rows, stack, color, smooth } = args;
const dataTempObj = {};
const stackMapData = stack && getStackMap(stack);
let series = [];
metrics.forEach((item) => dataTempObj[item] = []);
rows.forEach((row) => {
metrics.forEach((item) => {
let value = null;
if (!isNull(row[item])) {
value = row[item];
} else if (nullAddZero) {
value = 0;
}
dataTempObj[item].push([row[dimension[0]], value]);
});
});
metrics.forEach((item, i) => {
let name = !isNull(labelMap[item]) ? labelMap[item] : item;
const isSmooth = !(smooth === false);
let seriesItem = { smooth: isSmooth, name, type: "line", data: dataTempObj[item] };
const emphasis = { itemStyle: { borderColor: "#fff", borderWidth: 2 } };
let defaultSeriesItem = { symbol: "circle", symbolSize: 8, showSymbol: false, emphasis };
area && getAreaSeries({ color: color[i], seriesItem });
metrics.length === 1 && !isSmooth && setSingLineSeries({ defaultSeriesItem, seriesItem });
seriesItem = Object.assign(defaultSeriesItem, seriesItem);
axisSite.right && (seriesItem.yAxisIndex = ~axisSite.right.indexOf(item) ? 1 : 0);
stack && stackMapData[item] && (seriesItem.stack = stackMapData[item]);
label && (seriesItem.label = label);
itemStyle && (seriesItem.itemStyle = itemStyle);
lineStyle && (seriesItem.lineStyle = lineStyle);
areaStyle && (seriesItem.areaStyle = areaStyle);
series.push(seriesItem);
});
return series;
};
const getLineYAxis = (args) => {
const { yAxisType, yAxisName, scale, axisVisible, max, min, digit } = args;
const yAxisBase = {
type: "value",
show: axisVisible,
axisTick: {
show: false
}
};
let yAxis = [];
for (let k = 0; k < 2; k++) {
if (yAxisType[k]) {
yAxis[k] = Object.assign({}, yAxisBase, {
axisLabel: {
formatter(val) {
return getFormated(val, yAxisType[k], digit);
}
}
});
} else {
yAxis[k] = Object.assign({}, yAxisBase);
}
yAxis[k].name = yAxisName[k] || "";
yAxis[k].scale = scale[k] || false;
yAxis[k].min = min[k] || null;
yAxis[k].max = max[k] || null;
}
return yAxis;
};
const getLineTooltip = (args) => {
const { axisSite, yAxisType, digit, labelMap, tooltipFormatter } = args;
const rightItemsArr = axisSite.right || [];
const rightListArr = labelMap ? rightItemsArr.map((item) => labelMap[item] === void 0 ? item : labelMap[item]) : rightItemsArr;
return {
formatter(items) {
if (tooltipFormatter) {
return tooltipFormatter.apply(null, arguments);
}
let template = [];
const { name, axisValueLabel } = items[0];
const title = name || axisValueLabel;
template.push(`${title}<br>`);
items.forEach(({ seriesName, data, color }) => {
if (color === "transparent" && items.length === 1) {
color = SAAS_DEFAULT_COLORS[0];
}
let showData = null;
const type = ~rightListArr.indexOf(seriesName) ? yAxisType[1] : yAxisType[0];
const itemData = Array.isArray(data) ? data[1] : data;
showData = getFormated(itemData, type, digit);
template.push(itemPoint(color));
template.push(`${itemLabel(seriesName)}${itemContent(showData)}`);
template.push("<br>");
});
return template.join("");
},
trigger: "axis"
};
};
const line = (columns, rows, settings, extra) => {
rows = Array.isArray(rows) ? rows : [];
columns = Array.isArray(columns) ? columns : [];
const { axisSite = {}, yAxisType = ["normal", "normal"], xAxisType = "category", yAxisName = [] } = settings;
const { dimension = [columns[0]], xAxisName = [], axisVisible = true, area, stack } = settings;
const { scale = [false, false], min = [null, null], max = [null, null], nullAddZero = false, digit = 2 } = settings;
const { legendName = {}, labelMap = {}, label, itemStyle, lineStyle, areaStyle, smooth } = settings;
const { tooltipVisible, legendVisible, tooltipFormatter, color } = extra;
let metrics = columns.slice();
if (axisSite.right && axisSite.left) {
metrics = axisSite.left.concat(axisSite.right);
} else if (settings.metrics) {
metrics = settings.metrics;
} else if (axisSite.left && !axisSite.right) {
metrics = axisSite.left;
} else {
metrics.splice(columns.indexOf(dimension[0]), 1);
}
let legendItemStyle;
if (metrics.length === 1) {
legendItemStyle = { itemStyle: { color: SAAS_DEFAULT_COLORS[0] } };
}
const legend = legendVisible && getLegend({ legendName, metrics, labelMap, legendItemStyle });
const tooltip = tooltipVisible && getLineTooltip({ axisSite, digit, labelMap, tooltipFormatter, xAxisType, yAxisType });
const xAxis = getLineXAxis({ axisVisible, dimension, xAxisName, xAxisType, rows });
const yAxis = getLineYAxis({ axisVisible, digit, max, min, scale, yAxisType, yAxisName });
const seriesParam = { areaStyle, area, axisSite, dimension, itemStyle, lineStyle };
Object.assign(seriesParam, { label, labelMap, metrics, nullAddZero, rows, xAxisType, stack, color, smooth });
const series = getLineSeries(seriesParam);
let options = { legend, xAxis, series, yAxis, tooltip };
return options;
};
export {
line
};