bugfix
This commit is contained in:
parent
99f61ae8fe
commit
9e8ea7ba15
@ -11,7 +11,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \
|
|||||||
llm.js websocket.js datarow.js tabular.js continueaudio.js \
|
llm.js websocket.js datarow.js tabular.js continueaudio.js \
|
||||||
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
||||||
keypress.js asr.js webspeech.js countdown.js progressbar.js \
|
keypress.js asr.js webspeech.js countdown.js progressbar.js \
|
||||||
qaframe.js svg.js videoplayer.js "
|
qaframe.js svg.js videoplayer.js sctter.js radar.js kline.js heatmap.js map.js"
|
||||||
echo ${SOURCES}
|
echo ${SOURCES}
|
||||||
cat ${SOURCES} > ../dist/bricks.js
|
cat ${SOURCES} > ../dist/bricks.js
|
||||||
# uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js
|
# uglifyjs --compress --mangle -- ../dist/bricks.js > ../dist/bricks.min.js
|
||||||
|
|||||||
73
bricks/heatmap.js
Normal file
73
bricks/heatmap.js
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.ChartHeatmap = class extends bricks.EchartsExt {
|
||||||
|
/*
|
||||||
|
数据格式:
|
||||||
|
[
|
||||||
|
{ x: '周一', y: '上午', value: 120 },
|
||||||
|
{ x: '周二', y: '下午', value: 90 }, ...
|
||||||
|
]
|
||||||
|
|
||||||
|
参数:
|
||||||
|
{
|
||||||
|
data_url,
|
||||||
|
xField: 'x', // X 轴字段
|
||||||
|
yField: 'y', // Y 轴字段
|
||||||
|
valueField: 'value'
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
setup_options(data) {
|
||||||
|
const xField = this.xField || 'x';
|
||||||
|
const yField = this.yField || 'y';
|
||||||
|
const valueField = this.valueField || 'value';
|
||||||
|
|
||||||
|
const xs = [...new Set(data.map(d => d[xField]))];
|
||||||
|
const ys = [...new Set(data.map(d => d[yField]))];
|
||||||
|
|
||||||
|
const map = {};
|
||||||
|
ys.forEach(y => map[y] = {});
|
||||||
|
data.forEach(d => {
|
||||||
|
map[d[yField]][d[xField]] = d[valueField];
|
||||||
|
});
|
||||||
|
|
||||||
|
const heatmapData = [];
|
||||||
|
for (let j = 0; j < ys.length; j++) {
|
||||||
|
const y = ys[j];
|
||||||
|
for (let i = 0; i < xs.length; i++) {
|
||||||
|
const x = xs[i];
|
||||||
|
heatmapData.push([i, j, map[y][x] || 0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
tooltip: { position: 'top' },
|
||||||
|
grid: { height: '80%', top: '10%' },
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: xs,
|
||||||
|
splitArea: { show: true }
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: ys,
|
||||||
|
splitArea: { show: true }
|
||||||
|
},
|
||||||
|
visualMap: {
|
||||||
|
min: 0,
|
||||||
|
max: Math.max(...data.map(d => d[valueField])),
|
||||||
|
calculable: true,
|
||||||
|
orient: 'horizontal',
|
||||||
|
left: 'center',
|
||||||
|
bottom: '5%'
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
type: 'heatmap',
|
||||||
|
data: heatmapData,
|
||||||
|
label: { show: false },
|
||||||
|
emphasis: { itemStyle: { shadowBlur: 10, shadowColor: 'rgba(0,0,0,0.5)' } }
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bricks.Factory.register('ChartHeatmap', bricks.ChartHeatmap);
|
||||||
49
bricks/kline.js
Normal file
49
bricks/kline.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.ChartKLine = class extends bricks.EchartsExt {
|
||||||
|
/*
|
||||||
|
数据格式:
|
||||||
|
[
|
||||||
|
{ name: '2025-04-01', open: 2100, close: 2150, low: 2080, high: 2160 },
|
||||||
|
...
|
||||||
|
]
|
||||||
|
|
||||||
|
参数:
|
||||||
|
{
|
||||||
|
data_url,
|
||||||
|
nameField: 'name', // 时间轴字段
|
||||||
|
valueFields: ['open','close','low','high']
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
setup_options(data) {
|
||||||
|
const { nameField } = this;
|
||||||
|
const categories = data.map(d => d[nameField]);
|
||||||
|
const kData = data.map(d => [d.open, d.close, d.low, d.high]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: { type: 'cross' }
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'category',
|
||||||
|
data: categories,
|
||||||
|
scale: true
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
scale: true
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
type: 'candlestick',
|
||||||
|
data: kData
|
||||||
|
}],
|
||||||
|
dataZoom: [
|
||||||
|
{ type: 'inside' },
|
||||||
|
{ type: 'slider' }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bricks.Factory.register('ChartKLine', bricks.ChartKLine);
|
||||||
65
bricks/map.js
Normal file
65
bricks/map.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.ChartMap = class extends bricks.EchartsExt {
|
||||||
|
/*
|
||||||
|
数据格式:
|
||||||
|
[
|
||||||
|
{ name: '北京', value: 120 },
|
||||||
|
{ name: '上海', value: 90 }, ...
|
||||||
|
]
|
||||||
|
|
||||||
|
参数:
|
||||||
|
{
|
||||||
|
data_url,
|
||||||
|
nameField: 'name',
|
||||||
|
valueField: 'value',
|
||||||
|
map_name: 'china', // 对应 echarts.registerMap 注册的地图名
|
||||||
|
map_options: {} // 可选自定义样式
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
async setup_options(data) {
|
||||||
|
const { nameField, valueField = 'value', map_name = 'china', map_options } = this;
|
||||||
|
|
||||||
|
const mapData = data.map(d => ({
|
||||||
|
name: d[nameField],
|
||||||
|
value: d[valueField]
|
||||||
|
}));
|
||||||
|
|
||||||
|
return {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item',
|
||||||
|
formatter: '{b}: {c}'
|
||||||
|
},
|
||||||
|
visualMap: {
|
||||||
|
min: 0,
|
||||||
|
max: Math.max(...mapData.map(d => d.value)),
|
||||||
|
left: 'left',
|
||||||
|
top: 'bottom',
|
||||||
|
text: ['高', '低'],
|
||||||
|
calculable: true
|
||||||
|
},
|
||||||
|
series: [{
|
||||||
|
name: '数据',
|
||||||
|
type: 'map',
|
||||||
|
map: map_name,
|
||||||
|
roam: false,
|
||||||
|
label: { show: true, color: '#fff' },
|
||||||
|
itemStyle: {
|
||||||
|
areaColor: '#eee',
|
||||||
|
borderColor: '#444'
|
||||||
|
},
|
||||||
|
emphasis: {
|
||||||
|
label: { color: '#fff' },
|
||||||
|
itemStyle: { areaColor: '#e09191' }
|
||||||
|
},
|
||||||
|
data: mapData
|
||||||
|
}],
|
||||||
|
...(map_options || {})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bricks.Factory.register('ChartMap', bricks.ChartMap);
|
||||||
|
/*
|
||||||
|
💡 使用前需通过 `echarts.registerMap('china', geoJson)` 注册地图数据。
|
||||||
|
*/
|
||||||
54
bricks/radar.js
Normal file
54
bricks/radar.js
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.ChartRadar = class extends bricks.EchartsExt {
|
||||||
|
/*
|
||||||
|
数据格式示例:
|
||||||
|
[
|
||||||
|
{ name: '张三', indicator1: 80, indicator2: 60, ... },
|
||||||
|
{ name: '李四', indicator1: 70, indicator2: 90, ... }
|
||||||
|
]
|
||||||
|
|
||||||
|
参数:
|
||||||
|
{
|
||||||
|
data_url,
|
||||||
|
data_params,
|
||||||
|
nameField: 'name',
|
||||||
|
valueFields: ['indicator1', 'indicator2', ...],
|
||||||
|
radar_options: { // 自定义雷达配置
|
||||||
|
indicator: [
|
||||||
|
{ name: '销售', max: 100 },
|
||||||
|
{ name: '管理', max: 100 }, ...
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
setup_options(data) {
|
||||||
|
const { nameField, valueFields } = this;
|
||||||
|
const series = [];
|
||||||
|
const indicator = this.radar_options?.indicator || valueFields.map(f => ({ name: f, max: 100 }));
|
||||||
|
|
||||||
|
data.forEach(item => {
|
||||||
|
series.push({
|
||||||
|
name: item[nameField],
|
||||||
|
type: 'radar',
|
||||||
|
data: [
|
||||||
|
{
|
||||||
|
value: valueFields.map(f => item[f]),
|
||||||
|
name: item[nameField]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
tooltip: { trigger: 'item' },
|
||||||
|
legend: { data: data.map(d => d[nameField]) },
|
||||||
|
radar: { indicator },
|
||||||
|
series
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
bricks.Factory.register('ChartRadar', bricks.ChartRadar);
|
||||||
|
/*
|
||||||
|
*/
|
||||||
98
bricks/scatter.js
Normal file
98
bricks/scatter.js
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.ChartScatter = class extends bricks.EchartsExt {
|
||||||
|
/*
|
||||||
|
* opts:
|
||||||
|
* {
|
||||||
|
* data_url,
|
||||||
|
* data_params,
|
||||||
|
* method,
|
||||||
|
* user_data,
|
||||||
|
* nameField: 可选,用于标签
|
||||||
|
* xField: X坐标字段
|
||||||
|
* yField: Y坐标字段
|
||||||
|
* sizeField?: 气泡大小字段(可选)
|
||||||
|
* categoryField?: 分组字段(用于不同颜色)
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
|
||||||
|
setup_options(data) {
|
||||||
|
let seriesMap = {};
|
||||||
|
|
||||||
|
if (this.categoryField) {
|
||||||
|
// 按 categoryField 分组
|
||||||
|
data.forEach(item => {
|
||||||
|
const cat = item[this.categoryField] || 'default';
|
||||||
|
if (!seriesMap[cat]) {
|
||||||
|
seriesMap[cat] = {
|
||||||
|
name: cat,
|
||||||
|
type: 'scatter',
|
||||||
|
data: []
|
||||||
|
};
|
||||||
|
}
|
||||||
|
seriesMap[cat].data.push([
|
||||||
|
item[this.xField],
|
||||||
|
item[this.yField],
|
||||||
|
item[this.nameField] || null,
|
||||||
|
item[this.sizeField] || 1
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// 单一系列
|
||||||
|
const seriesData = data.map(item => [
|
||||||
|
item[this.xField],
|
||||||
|
item[this.yField],
|
||||||
|
item[this.nameField] || null,
|
||||||
|
item[this.sizeField] || 1
|
||||||
|
]);
|
||||||
|
|
||||||
|
seriesMap['scatter'] = {
|
||||||
|
type: 'scatter',
|
||||||
|
data: seriesData
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const series = Object.values(seriesMap);
|
||||||
|
const xAxisName = this.xField;
|
||||||
|
const yAxisName = this.yField;
|
||||||
|
|
||||||
|
return {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
formatter: function(params) {
|
||||||
|
const p = params[0];
|
||||||
|
return `${p.seriesName}<br/>${xAxisName}: ${p.value[0]}<br/>${yAxisName}: ${p.value[1]}`;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: Object.keys(seriesMap)
|
||||||
|
},
|
||||||
|
xAxis: {
|
||||||
|
type: 'value',
|
||||||
|
name: xAxisName
|
||||||
|
},
|
||||||
|
yAxis: {
|
||||||
|
type: 'value',
|
||||||
|
name: yAxisName
|
||||||
|
},
|
||||||
|
series: series
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 注册工厂
|
||||||
|
bricks.Factory.register('ChartScatter', bricks.ChartScatter);
|
||||||
|
|
||||||
|
/*
|
||||||
|
new bricks.ChartScatter({
|
||||||
|
user_data: [
|
||||||
|
{ x: 10, y: 20, size: 30, group: 'Group A', label: 'Point 1' },
|
||||||
|
{ x: 15, y: 25, size: 40, group: 'Group B', label: 'Point 2' }
|
||||||
|
],
|
||||||
|
xField: 'x',
|
||||||
|
yField: 'y',
|
||||||
|
sizeField: 'size',
|
||||||
|
categoryField: 'group',
|
||||||
|
nameField: 'label'
|
||||||
|
});
|
||||||
|
*/
|
||||||
Loading…
x
Reference in New Issue
Block a user