@fmdevui/fm-dev
Version:
Page level components developed based on Element Plus.
204 lines (199 loc) • 5.88 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var vue = require('vue');
var useChart = require('../../../hook/useChart.js');
var echarts = require('../../../plugins/echarts.js');
var _sfc_main = /* @__PURE__ */ vue.defineComponent({
...{ name: "FmHBarChart" },
__name: "index",
props: {
// 基础配置
height: {
type: Number,
default: () => useChart.useChartOps().chartHeight
},
loading: {
type: Boolean,
default: false
},
isEmpty: {
type: Boolean,
default: false
},
colors: {
type: Array,
default: () => useChart.useChartOps().colors
},
// 数据配置
data: {
type: Array,
default: () => [0, 0, 0, 0, 0, 0, 0]
},
xAxisData: {
type: Array,
default: () => []
},
barWidth: {
type: String,
default: "36%"
},
stack: {
type: Boolean,
default: false
},
// 轴线显示配置
showAxisLabel: { type: Boolean, default: true },
showAxisLine: { type: Boolean, default: true },
showSplitLine: { type: Boolean, default: true },
// 交互配置
showTooltip: { type: Boolean, default: true },
showLegend: { type: Boolean, default: false },
legendPosition: {
type: String,
default: "bottom"
}
},
setup(__props) {
const props = __props;
const isMultipleData = vue.computed(() => {
return Array.isArray(props.data) && props.data.length > 0 && typeof props.data[0] === "object" && "name" in props.data[0];
});
const getColor = (customColor, index) => {
if (customColor) return customColor;
if (index !== void 0) {
return props.colors[index % props.colors.length];
}
return new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 0,
color: "#4ABEFF"
},
{
offset: 1,
color: "#00E4E5"
}
]);
};
const createGradientColor = (color) => {
return new echarts.graphic.LinearGradient(0, 0, 1, 0, [
{
offset: 0,
color
},
{
offset: 1,
color
}
]);
};
const getBaseItemStyle = (color) => ({
borderRadius: 4,
color: typeof color === "string" ? createGradientColor(color) : color
});
const createSeriesItem = (config) => {
const animationConfig = getAnimationConfig();
return {
name: config.name,
data: config.data,
type: "bar",
stack: config.stack,
itemStyle: getBaseItemStyle(config.color),
barWidth: config.barWidth || props.barWidth,
...animationConfig
};
};
const {
chartRef,
getAxisLineStyle,
getAxisLabelStyle,
getAxisTickStyle,
getSplitLineStyle,
getAnimationConfig,
getTooltipStyle,
getLegendStyle,
getGridWithLegend
} = useChart.useChartComponent({
props,
checkEmpty: () => {
if (Array.isArray(props.data) && typeof props.data[0] === "number") {
const singleData = props.data;
return !singleData.length || singleData.every((val) => val === 0);
}
if (Array.isArray(props.data) && typeof props.data[0] === "object") {
const multiData = props.data;
return !multiData.length || multiData.every((item) => !item.data?.length || item.data.every((val) => val === 0));
}
return true;
},
watchSources: [() => props.data, () => props.xAxisData, () => props.colors],
generateOptions: () => {
const options = {
grid: getGridWithLegend(props.showLegend && isMultipleData.value, props.legendPosition, {
top: 15,
right: 0,
left: 0
}),
tooltip: props.showTooltip ? getTooltipStyle() : void 0,
xAxis: {
type: "value",
axisTick: getAxisTickStyle(),
axisLine: getAxisLineStyle(props.showAxisLine),
axisLabel: getAxisLabelStyle(props.showAxisLabel),
splitLine: getSplitLineStyle(props.showSplitLine)
},
yAxis: {
type: "category",
data: props.xAxisData,
axisTick: getAxisTickStyle(),
axisLabel: getAxisLabelStyle(props.showAxisLabel),
axisLine: getAxisLineStyle(props.showAxisLine)
}
};
if (props.showLegend && isMultipleData.value) {
options.legend = getLegendStyle(props.legendPosition);
}
if (isMultipleData.value) {
const multiData = props.data;
options.series = multiData.map((item, index) => {
const computedColor = getColor(props.colors[index], index);
return createSeriesItem({
name: item.name,
data: item.data,
color: computedColor,
barWidth: item.barWidth,
stack: props.stack ? item.stack || "total" : void 0
});
});
} else {
const singleData = props.data;
const computedColor = getColor();
options.series = [
createSeriesItem({
data: singleData,
color: computedColor
})
];
}
return options;
}
});
return (_ctx, _cache) => {
const _directive_loading = vue.resolveDirective("loading");
return vue.withDirectives((vue.openBlock(), vue.createElementBlock(
"div",
{
ref_key: "chartRef",
ref: chartRef,
class: "relative w-full",
style: vue.normalizeStyle({ height: props.height })
},
null,
4
/* STYLE */
)), [
[_directive_loading, props.loading]
]);
};
}
});
exports.default = _sfc_main;