@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.
131 lines (130 loc) • 5 kB
JavaScript
import {
__spreadValues
} from "../chunk-G2ADBYYC.js";
import { getFormated, htmlHandler, getLegend } from "../chart-core/deps/utils";
import { itemPoint, itemLabel, itemContent } from "../chart-core/deps/constants";
const getXAxis = (args) => {
const { columns, xAxisName, axisVisible, xAxisType } = args;
return [
{
type: xAxisType,
nameLocation: "middle",
nameGap: 22,
name: xAxisName || "",
axisTick: { show: true, lineStyle: { color: "#eee" } },
data: columns,
show: axisVisible
}
];
};
const getSeries = (args) => {
const { area, areaStyle, itemStyle, label, lineStyle, outliers = [], rows } = args;
let { series = [], arr = ["boxplot", "scatter"] } = {};
arr.forEach((item) => {
if (item === "scatter" && !outliers.length) {
return;
}
let data = item === "boxplot" ? rows : outliers;
let seriesItem = { name: "", type: item, data };
area && (seriesItem.areaStyle = {});
label && (seriesItem.label = label);
lineStyle && (seriesItem.lineStyle = lineStyle);
itemStyle && (seriesItem.itemStyle = itemStyle);
areaStyle && (seriesItem.areaStyle = areaStyle);
series.push(seriesItem);
});
return series;
};
const factoryFmt = ({ yAxisType, i, digit }) => (val) => getFormated(val, yAxisType[i], digit);
const getYAxis = (args) => {
const { axisVisible, digit, max, min, scale, yAxisName, yAxisType } = args;
const yAxisBase = { type: "value", axisTick: { show: false }, show: axisVisible };
let { yAxis = [], len = yAxisType.length >= 2 ? 2 : 1, i = 0 } = {};
for (; i < len; i++) {
if (!yAxisType[i]) {
yAxis[i] = __spreadValues({}, yAxisBase);
} else {
let formatter = factoryFmt({ yAxisType, i, digit });
let yAxisAdv = { axisLabel: { formatter } };
yAxis[i] = __spreadValues(__spreadValues({}, yAxisBase), yAxisAdv);
let name = yAxisName[i] || "";
Object.assign(yAxis[i], { name, scale: scale[i] || false, min: min[i] || null, max: max[i] || null });
}
}
return yAxis;
};
const tooltipTemplate = ({ data, seriesType, seriesName, color, value, name }, tooltipLabel) => {
let tpl = [];
if (seriesType === "boxplot") {
const tips = [];
tooltipLabel.forEach((label, idx) => {
tips.push(`${itemPoint(color)}${itemLabel(label)}${itemContent(data[idx + 1])}`);
});
tpl.push(tips.join("<br/>"));
} else {
tpl.push(itemPoint(color));
if (Array.isArray(value)) {
tpl.push(value.join(": "));
} else {
tpl.push(`${seriesName || name}: `);
tpl.push(value);
}
tpl.push("<br>");
}
return tpl;
};
const getTooltip = (args) => {
const { tooltipFormatter, tooltipLabel } = args;
return {
trigger: "item",
// axis item
formatter(items) {
if (tooltipFormatter) {
return tooltipFormatter.apply(null, arguments);
}
let tpl = [];
const { name, axisValueLabel } = items[0] || {};
const title = name || axisValueLabel;
title && tpl.push(`${title}<br>`);
if (Array.isArray(items)) {
items.forEach((item) => {
tpl = tpl.concat(tooltipTemplate(item, tooltipLabel));
});
} else {
tpl = tooltipTemplate(items, tooltipLabel);
}
return tpl.join("");
}
};
};
const boxplot = (columns, rows, settings, extra) => {
rows = Array.isArray(rows) ? rows : [];
columns = Array.isArray(columns) ? columns : [];
const { axisSite = {}, yAxisType = ["normal"], xAxisType = "category", yAxisName = "", xAxisName = "" } = settings;
const { axisVisible = true, area, scale = [false, false], min = [null, null], max = [null, null] } = settings;
const { nullAddZero = false, digit = 2, legendName = {}, labelMap = {}, label, itemStyle } = settings;
const { lineStyle, areaStyle, tooltipLabel = ["lower", "Q1", "median", "Q3", "upper"] } = settings;
const { legendVisible, outliers, tooltipFormatter, tooltipVisible } = extra;
let metrics = columns.slice();
if (axisSite.right && axisSite.left) {
metrics = axisSite.left.concat(axisSite.right);
} else if (!axisSite.right && axisSite.left) {
metrics = axisSite.left;
} else if (settings.metrics) {
metrics = settings.metrics;
}
const legend = legendVisible && getLegend({ metrics, legendName, labelMap });
const getParams = () => ({ tooltipFormatter, tooltipLabel: htmlHandler(tooltipLabel), digit });
const tooltip = tooltipVisible && getTooltip(getParams());
const xAxis = getXAxis({ columns, xAxisName, axisVisible, xAxisType });
const yAxisParams = { yAxisName, yAxisType, axisVisible };
Object.assign(yAxisParams, { scale, min, max, digit });
const yAxis = getYAxis(yAxisParams);
const seriesParams = { rows, axisSite, metrics, area, nullAddZero, labelMap, label };
Object.assign(seriesParams, { itemStyle, lineStyle, areaStyle, xAxisType, outliers });
const series = getSeries(seriesParams);
return { legend, xAxis, series, yAxis, tooltip };
};
export {
boxplot
};