@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.
169 lines (168 loc) • 7.88 kB
JavaScript
import {
__spreadValues
} from "../chunk-G2ADBYYC.js";
import { getFormated, getBmap, getAmap, getMapJSON } from "../chart-core/deps/utils";
import { HEAT_MAP_COLOR, HEAT_DEFAULT_COLOR, itemPoint, itemLabel, itemContent } from "../chart-core/deps/constants";
const getAxisList = (rows, label) => {
const result = [];
rows.forEach((row) => !result.includes(row[label]) && result.push(row[label]));
return result;
};
const getData = (args) => {
const { extraMetrics, innerXAxisList, innerYAxisList, metrics, rows, type, xDim, yDim } = args;
let result = null;
if (type !== "cartesian") {
result = rows.map((row) => ({ value: [row[xDim], row[yDim], metrics ? row[metrics] : 1] }));
} else {
result = rows.map((row) => {
let { xIndex, yIndex, value, extra } = {};
yIndex = innerYAxisList.indexOf(row[yDim]);
xIndex = innerXAxisList.indexOf(row[xDim]);
extra = extraMetrics.map((m) => row[m] || "-");
value = metrics ? row[metrics] : 1;
return { value: [xIndex, yIndex, value].concat(extra) };
});
}
return result;
};
let getAxis = (list, name, type) => ({
data: list,
name,
nameLocation: "end",
type: "category",
splitArea: { show: false },
splitLine: { show: true, lineStyle: { color: "#6d8ff0" } },
axisLabel: { show: true, color: "#4E4E4E" },
offset: type === "y" ? 25 : 5,
zlevel: 1
});
const getVisualMap = (args) => {
const { innerMin: min, innerMax: max, type, heatColor, series, visualMapConfig } = args;
let { extra } = {};
if (type === "map") {
extra = {};
!series[0].data.length && (extra.show = false);
} else if (type === "bmap" || type === "amap") {
extra = { show: false };
} else {
extra = { dimension: 2 };
}
const visualMapColor = visualMapConfig && visualMapConfig.color;
const defaultColor = type === "map" || type === "bmap" || type === "amap" ? HEAT_MAP_COLOR : visualMapColor || HEAT_DEFAULT_COLOR;
let result = Object.assign(extra, {
min,
max,
calculable: true,
left: "right",
bottom: "center",
orient: "vertical",
align: "left",
borderColor: "#6D8FF0",
inverse: true
});
if (type !== "cartesian" || !visualMapColor) {
Object.assign(result, {
inRange: { color: heatColor || defaultColor }
});
}
return Object.assign(result, visualMapConfig);
};
const getSeries = (args) => [{ type: "heatmap", data: args.chartData, label: { show: true, color: "#191919" } }];
const getTooltip = (args) => {
const { dataType, innerXAxisList, innerYAxisList, digit, extraMetrics, metrics } = args;
function formatter({ color, data }) {
let { value: dataVal } = data;
let [xDim, yDim, value, ...extraData] = dataVal;
const tplt = [itemContent(`${innerXAxisList[xDim]} ~ ${innerYAxisList[yDim]}<br>`)];
extraMetrics.forEach((m, index) => tplt.push(`${m}: ${extraData[index]}<br>`));
tplt.push(`${itemPoint(color)}${itemLabel(metrics)}${itemContent(getFormated(value, dataType, digit))}<br>`);
return tplt.join("");
}
return { trigger: "item", formatter };
};
const fixParam = ({ type, rows, dimension, metrics, extraMetrics, chartData, innerXAxisList, innerYAxisList }) => {
let chartDataParams;
if (type !== "cartesian") {
chartDataParams = { rows, xDim: dimension[0], yDim: dimension[1] };
Object.assign(chartDataParams, { metrics, type, extraMetrics });
chartData = getData(chartDataParams);
} else {
let flag = !innerXAxisList || !innerXAxisList.length;
flag && (innerXAxisList = getAxisList(rows, dimension[0]));
flag = !innerYAxisList || !innerYAxisList.length;
flag && (innerYAxisList = getAxisList(rows, dimension[1]));
chartDataParams = { xDim: dimension[0], yDim: dimension[1], rows };
Object.assign(chartDataParams, { innerXAxisList, innerYAxisList, metrics, type, extraMetrics });
chartData = getData(chartDataParams);
}
return { chartData, innerXAxisList, innerYAxisList };
};
const getResult = (args) => {
let { type, options, pointSize, blurSize, res, key, v, url, bmap, mapOrigin, geo, beforeRegisterMap } = args;
let { echarts, specialAreas, position, positionJsonLink, beforeRegisterMapOnce } = args;
let { mapURLProfix, amap, tooltip, xAxis, yAxis } = args;
if (type === "bmap") {
Object.assign(options.series[0], { coordinateSystem: "bmap", pointSize, blurSize });
res = getBmap({ key, version: v, url }).then(() => __spreadValues({ bmap }, options));
} else if (type === "map") {
options.series[0].coordinateSystem = "geo";
let jsonStr = JSON.stringify(mapOrigin);
if (jsonStr) {
const geoAttr = __spreadValues({ map: jsonStr }, geo);
beforeRegisterMap && (jsonStr = beforeRegisterMap(mapOrigin));
echarts.registerMap(jsonStr, { geoJSON: mapOrigin }, specialAreas);
res = new Promise((resolve) => resolve(__spreadValues({ geo: geoAttr }, options)));
} else {
let params = { position, positionJsonLink, beforeRegisterMapOnce, mapURLProfix };
res = getMapJSON(params).then((json) => {
const geoAttr = __spreadValues({ map: position }, geo);
beforeRegisterMap && (json = beforeRegisterMap(json));
echarts.registerMap(position, { geoJSON: json }, specialAreas);
return __spreadValues({ geo: geoAttr }, options);
});
}
} else if (type === "amap") {
Object.assign(options.series[0], { coordinateSystem: "amap", pointSize, blurSize });
res = getAmap(key, v).then(() => __spreadValues({ amap }, options));
} else {
res = __spreadValues({ tooltip, xAxis, yAxis }, options);
}
return res;
};
const heatmap = (columns, rows, settings, extra, extend) => {
const { type = "cartesian" } = settings;
const { dimension = [columns[0], columns[1]] } = settings;
const { dataType = "normal", min, max, digit, bmap, amap, geo, key, v = "2.0", url } = settings;
const { position, mapOrigin, positionJsonLink, beforeRegisterMap, pointSize = 10, blurSize = 5 } = settings;
const { heatColor, yAxisName, xAxisName, beforeRegisterMapOnce, specialAreas = {} } = settings;
const { metrics = columns[2], mapURLProfix = "https://unpkg.com/echarts@3.6.2/map/json/" } = settings;
const { tooltipVisible, echartsLib: echarts } = extra;
const visualMapConfig = extend && extend.visualMap;
let { xAxisList: innerXAxisList, yAxisList: innerYAxisList } = settings;
let { chartData = [], extraMetrics = [], mainColumn = dimension.concat([metrics]) } = {};
columns.forEach((column) => !~mainColumn.indexOf(column) && extraMetrics.push(column));
let ret = fixParam({ type, rows, dimension, metrics, extraMetrics, chartData, innerXAxisList, innerYAxisList });
chartData = ret.chartData;
innerXAxisList = ret.innerXAxisList;
innerYAxisList = ret.innerYAxisList;
let metricsList = metrics ? rows.map((row) => row[metrics]) : [0, 5];
!metricsList.length && (metricsList = [0]);
const innerMin = min || Math.min.apply(null, metricsList);
const innerMax = max || Math.max.apply(null, metricsList);
const xAxis = getAxis(innerXAxisList, xAxisName, "x");
const yAxis = getAxis(innerYAxisList, yAxisName, "y");
const series = getSeries({ chartData });
const visualMap = getVisualMap({ innerMin, innerMax, type, heatColor, series, visualMapConfig });
const tooltipParams = { dataType, innerXAxisList, innerYAxisList, digit, extraMetrics, metrics };
const tooltip = tooltipVisible && getTooltip(tooltipParams);
const options = { visualMap, series, grid: { left: 25, right: 80, width: "auto", height: "auto" } };
let res;
let args = { type, options, pointSize, blurSize, res, key, v, url, bmap, mapOrigin, geo, beforeRegisterMap };
Object.assign(args, { echarts, specialAreas, position, positionJsonLink, beforeRegisterMapOnce });
Object.assign(args, { mapURLProfix, amap, tooltip, xAxis, yAxis });
res = getResult(args);
return res;
};
export {
heatmap
};