import moment from 'moment';
export const CHART_COLOR_LIST = [
'#556ee6',
'#94BEF2',
'#95e7ff',
'#9DDEEB',
'#A7B1EB',
'#C2D0E3',
'#CCABF1',
'#F9D77B',
'#F5C993',
'#A7E6C7',
'#F19FC9',
'#F5B6B3',
'#C9E795',
];
export const UNIT_MAP = {
TB: Math.pow(1024, 4),
GB: Math.pow(1024, 3),
MB: Math.pow(1024, 2),
KB: 1024,
};
export const DATA_NUMBER_MAP = {
十亿: Math.pow(1000, 3),
百万: Math.pow(1000, 2),
千: 1000,
};
export const getUnit = (value: number) => Object.entries(UNIT_MAP).find(([, size]) => value / size >= 1) || ['Byte', 1];
export const getDataNumberUnit = (value: number) => Object.entries(DATA_NUMBER_MAP).find(([, size]) => value / size >= 1) || ['', 1];
// 图表 tooltip 基础展示样式
const tooltipFormatter = (date: any, arr: any, tooltip: any) => {
// 从大到小排序
// arr = arr.sort((a: any, b: any) => b.value - a.value);
const str = arr
.map(
(item: any) => `
${item.seriesName}
${parseFloat(Number(item.value[1]).toFixed(3))}
`
)
.join('');
return ``;
};
// 折线图基础主题配置,返回 echarts 配置项。详见 https://echarts.apache.org/zh/option.html
export const getBasicChartConfig = (props: any = {}) => {
const { title = {}, grid = {}, legend = {}, xAxis = {}, yAxis = {}, tooltip = {}, ...restConfig } = props;
return {
title: {
show: true,
text: '示例标题',
textStyle: {
fontSize: 14,
fontFamily: 'HelveticaNeue-Medium',
color: '#212529',
letterSpacing: 0.5,
lineHeight: 16,
rich: {
unit: {
fontSize: 12,
fontFamily: 'HelveticaNeue-Medium',
color: '#495057',
lineHeight: 16,
},
},
},
top: 12,
left: 16,
zlevel: 1,
...title,
},
// 图表整体布局
grid: {
zlevel: 0,
top: 60,
left: 22,
right: 16,
bottom: 40,
containLabel: true,
...grid,
},
// 图例配置
legend: {
zlevel: 1,
type: 'scroll',
orient: 'horizontal',
left: 20,
top: 'auto',
bottom: 12,
icon: 'rect',
itemHeight: 2,
itemWidth: 8,
itemGap: 8,
textStyle: {
// width: 85,
// overflow: 'truncate',
// ellipsis: '...',
fontSize: 11,
color: '#74788D',
},
pageIcons: {
horizontal: [
'path://M474.496 512l151.616 151.616a9.6 9.6 0 0 1 0 13.568l-31.68 31.68a9.6 9.6 0 0 1-13.568 0l-190.08-190.08a9.6 9.6 0 0 1 0-13.568l190.08-190.08a9.6 9.6 0 0 1 13.568 0l31.68 31.68a9.6 9.6 0 0 1 0 13.568L474.496 512z',
'path://M549.504 512L397.888 360.384a9.6 9.6 0 0 1 0-13.568l31.68-31.68a9.6 9.6 0 0 1 13.568 0l190.08 190.08a9.6 9.6 0 0 1 0 13.568l-190.08 190.08a9.6 9.6 0 0 1-13.568 0l-31.68-31.68a9.6 9.6 0 0 1 0-13.568L549.504 512z',
],
},
pageIconColor: '#495057',
pageIconInactiveColor: '#ADB5BC',
pageIconSize: 6,
tooltip: false,
...legend,
},
// 横坐标配置
xAxis: {
type: 'category',
boundaryGap: true,
axisLine: {
lineStyle: {
color: '#c5c5c5',
width: 1,
},
},
axisLabel: {
formatter: (value: number) => {
value = Number(value);
return [`{date|${moment(value).format('MM-DD')}}`, `{time|${moment(value).format('HH:mm')}}`].join('\n');
},
padding: 0,
rich: {
date: {
color: '#495057',
fontSize: 11,
lineHeight: 18,
fontFamily: 'HelveticaNeue',
},
time: {
color: '#ADB5BC',
fontSize: 11,
lineHeight: 11,
fontFamily: 'HelveticaNeue',
},
},
},
...xAxis,
},
// 纵坐标配置
yAxis: {
type: 'value',
axisLabel: {
color: '#495057',
fontSize: 12,
},
splitLine: {
show: true,
lineStyle: {
width: 1,
type: 'dashed',
color: ['#E4E7ED'],
},
},
...yAxis,
},
// 提示框浮层配置
tooltip: {
position: function (pos: any, params: any, el: any, elRect: any, size: any) {
const tooltipWidth = el.offsetWidth || 120;
const result =
tooltipWidth + pos[0] < size.viewSize[0]
? {
top: 10,
left: pos[0] + 30,
}
: {
top: 10,
left: pos[0] - tooltipWidth - 30,
};
return result;
},
formatter: function (params: any) {
let res = '';
if (params != null && params.length > 0) {
// 传入tooltip是为了便于拿到外部传入的控制这个自定义浮层的样式
// 例如tooltip里写customWidth: 200,则tooltipFormatter里可以取出这个宽度使用
res += tooltipFormatter(moment(Number(params[0].axisValue)).format('YYYY-MM-DD HH:mm'), params, tooltip);
}
return res;
},
extraCssText:
'padding: 0;box-shadow: 0 -2px 4px 0 rgba(0,0,0,0.02), 0 2px 6px 6px rgba(0,0,0,0.02), 0 2px 6px 0 rgba(0,0,0,0.06);border-radius: 8px;',
axisPointer: {
type: 'line',
},
...tooltip,
},
...restConfig,
};
};