lambo-design-bi 0.0.228 → 0.0.230
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -200,6 +200,25 @@ export default {
|
|
|
200
200
|
link.click();
|
|
201
201
|
document.body.removeChild(link);
|
|
202
202
|
},
|
|
203
|
+
getRankIcon(rank) {
|
|
204
|
+
if (rank === 1) return '🥇'
|
|
205
|
+
if (rank === 2) return '🥈'
|
|
206
|
+
if (rank === 3) return '🥉'
|
|
207
|
+
return rank
|
|
208
|
+
},
|
|
209
|
+
getRankTableIndex(index, row) {
|
|
210
|
+
const rowIndex = typeof index === 'number' ? index : row._index
|
|
211
|
+
const table = this.$refs.table || {}
|
|
212
|
+
const pageSize = Number(table.limitNumber || this.widget.options.pageSize) || 0
|
|
213
|
+
const currentPage = table.currentPage || 1
|
|
214
|
+
return pageSize ? (currentPage - 1) * pageSize + rowIndex + 1 : rowIndex + 1
|
|
215
|
+
},
|
|
216
|
+
isRankTable() {
|
|
217
|
+
return String(this.widget.options.tableType) === '2'
|
|
218
|
+
},
|
|
219
|
+
isRankColumn(column) {
|
|
220
|
+
return this.isRankTable() && (column.type === 'index' || column.key === 'index' || column.title === '序号')
|
|
221
|
+
},
|
|
203
222
|
renderCellContent(h, params) {
|
|
204
223
|
const key = params.column.key
|
|
205
224
|
const children = [params.row[key]]
|
|
@@ -222,6 +241,238 @@ export default {
|
|
|
222
241
|
}
|
|
223
242
|
return children
|
|
224
243
|
},
|
|
244
|
+
isTrendChartsColumn(column) {
|
|
245
|
+
const isTrendCharts = column && (column.isTrendCharts === true || column.isTrendCharts === '1')
|
|
246
|
+
if (isTrendCharts) {
|
|
247
|
+
console.log("BiPagingTable -- isTrendChartsColumn -- 命中趋势图列:", column)
|
|
248
|
+
}
|
|
249
|
+
return isTrendCharts
|
|
250
|
+
},
|
|
251
|
+
stringifyTrendChartsValue(value) {
|
|
252
|
+
if (value === null || value === undefined) {
|
|
253
|
+
return ''
|
|
254
|
+
}
|
|
255
|
+
if (typeof value === 'object') {
|
|
256
|
+
try {
|
|
257
|
+
return JSON.stringify(value)
|
|
258
|
+
} catch (e) {
|
|
259
|
+
return String(value)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return String(value)
|
|
263
|
+
},
|
|
264
|
+
parseTrendChartsValue(value) {
|
|
265
|
+
if (Array.isArray(value)) {
|
|
266
|
+
return value
|
|
267
|
+
}
|
|
268
|
+
if (typeof value === 'string') {
|
|
269
|
+
const trimValue = value.trim()
|
|
270
|
+
if (trimValue.indexOf('[') === 0 && trimValue.lastIndexOf(']') === trimValue.length - 1) {
|
|
271
|
+
try {
|
|
272
|
+
const parseValue = JSON.parse(trimValue)
|
|
273
|
+
if (Array.isArray(parseValue)) {
|
|
274
|
+
console.log("BiPagingTable -- parseTrendChartsValue -- 字符串数组解析成功:", {
|
|
275
|
+
value,
|
|
276
|
+
parseValue
|
|
277
|
+
})
|
|
278
|
+
return parseValue
|
|
279
|
+
}
|
|
280
|
+
} catch (e) {
|
|
281
|
+
console.log("BiPagingTable -- parseTrendChartsValue -- 字符串数组解析失败:", {
|
|
282
|
+
value,
|
|
283
|
+
error: e
|
|
284
|
+
})
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return value
|
|
289
|
+
},
|
|
290
|
+
renderTrendChartsCell(h, params) {
|
|
291
|
+
const key = params.column.key
|
|
292
|
+
const value = params.row[key]
|
|
293
|
+
const chartValue = this.parseTrendChartsValue(value)
|
|
294
|
+
console.log("BiPagingTable -- renderTrendChartsCell -- 渲染趋势图单元格:", {
|
|
295
|
+
key,
|
|
296
|
+
title: params.column.title,
|
|
297
|
+
rowIndex: params.index,
|
|
298
|
+
value,
|
|
299
|
+
chartValue,
|
|
300
|
+
isArray: Array.isArray(chartValue)
|
|
301
|
+
})
|
|
302
|
+
if (!Array.isArray(chartValue)) {
|
|
303
|
+
console.log("BiPagingTable -- renderTrendChartsCell -- 当前值不是数组,按字符串展示:", {
|
|
304
|
+
key,
|
|
305
|
+
value,
|
|
306
|
+
stringValue: this.stringifyTrendChartsValue(value)
|
|
307
|
+
})
|
|
308
|
+
return h('span', this.stringifyTrendChartsValue(value))
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
const width = Number(params.column.trendChartWidth) || 240
|
|
312
|
+
const height = Number(params.column.trendChartHeight) || 48
|
|
313
|
+
return h('canvas', {
|
|
314
|
+
class: 'bi-trend-canvas',
|
|
315
|
+
attrs: {
|
|
316
|
+
width,
|
|
317
|
+
height
|
|
318
|
+
},
|
|
319
|
+
style: {
|
|
320
|
+
display: 'block',
|
|
321
|
+
margin: '0',
|
|
322
|
+
width: width + 'px',
|
|
323
|
+
height: height + 'px'
|
|
324
|
+
},
|
|
325
|
+
hook: {
|
|
326
|
+
insert: vnode => {
|
|
327
|
+
console.log("BiPagingTable -- renderTrendChartsCell -- canvas 已插入DOM,准备绘制:", {
|
|
328
|
+
key: params.column.key,
|
|
329
|
+
rowIndex: params.index,
|
|
330
|
+
width,
|
|
331
|
+
height,
|
|
332
|
+
dataLength: chartValue.length
|
|
333
|
+
})
|
|
334
|
+
this.drawTrendCharts(vnode.elm, chartValue, width, height, params.column)
|
|
335
|
+
},
|
|
336
|
+
postpatch: (...args) => {
|
|
337
|
+
const vnode = args[1]
|
|
338
|
+
console.log("BiPagingTable -- renderTrendChartsCell -- canvas 更新,重新绘制:", {
|
|
339
|
+
key: params.column.key,
|
|
340
|
+
rowIndex: params.index,
|
|
341
|
+
width,
|
|
342
|
+
height,
|
|
343
|
+
dataLength: chartValue.length
|
|
344
|
+
})
|
|
345
|
+
this.drawTrendCharts(vnode.elm, chartValue, width, height, params.column)
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
})
|
|
349
|
+
},
|
|
350
|
+
getTrendChartsSmooth() {
|
|
351
|
+
return true
|
|
352
|
+
},
|
|
353
|
+
drawTrendChartsLine(ctx, points, smooth) {
|
|
354
|
+
ctx.beginPath()
|
|
355
|
+
points.forEach((point, index) => {
|
|
356
|
+
if (index === 0) {
|
|
357
|
+
ctx.moveTo(point.x, point.y)
|
|
358
|
+
} else if (smooth) {
|
|
359
|
+
const prevPoint = points[index - 1]
|
|
360
|
+
const midX = (prevPoint.x + point.x) / 2
|
|
361
|
+
ctx.bezierCurveTo(midX, prevPoint.y, midX, point.y, point.x, point.y)
|
|
362
|
+
} else {
|
|
363
|
+
ctx.lineTo(point.x, point.y)
|
|
364
|
+
}
|
|
365
|
+
})
|
|
366
|
+
},
|
|
367
|
+
drawTrendChartsArea(ctx, points, smooth, bottomY) {
|
|
368
|
+
ctx.beginPath()
|
|
369
|
+
ctx.moveTo(points[0].x, bottomY)
|
|
370
|
+
points.forEach((point, index) => {
|
|
371
|
+
if (index === 0) {
|
|
372
|
+
ctx.lineTo(point.x, point.y)
|
|
373
|
+
} else if (smooth) {
|
|
374
|
+
const prevPoint = points[index - 1]
|
|
375
|
+
const midX = (prevPoint.x + point.x) / 2
|
|
376
|
+
ctx.bezierCurveTo(midX, prevPoint.y, midX, point.y, point.x, point.y)
|
|
377
|
+
} else {
|
|
378
|
+
ctx.lineTo(point.x, point.y)
|
|
379
|
+
}
|
|
380
|
+
})
|
|
381
|
+
ctx.lineTo(points[points.length - 1].x, bottomY)
|
|
382
|
+
ctx.closePath()
|
|
383
|
+
},
|
|
384
|
+
drawTrendCharts(canvas, data, width, height, column) {
|
|
385
|
+
if (!canvas) {
|
|
386
|
+
console.log("BiPagingTable -- drawTrendCharts -- canvas 不存在,无法绘制", { data, width, height })
|
|
387
|
+
return
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const chartData = data.map(item => Number(item))
|
|
391
|
+
if (!chartData.length || chartData.some(item => isNaN(item))) {
|
|
392
|
+
console.log("BiPagingTable -- drawTrendCharts -- 数据为空或存在非数字,无法绘制:", {
|
|
393
|
+
data,
|
|
394
|
+
chartData,
|
|
395
|
+
hasNaN: chartData.some(item => isNaN(item))
|
|
396
|
+
})
|
|
397
|
+
return
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
const ctx = canvas.getContext('2d')
|
|
401
|
+
console.log("BiPagingTable -- drawTrendCharts -- 开始绘制趋势图:", {
|
|
402
|
+
data,
|
|
403
|
+
chartData,
|
|
404
|
+
width,
|
|
405
|
+
height,
|
|
406
|
+
canvasClientWidth: canvas.clientWidth,
|
|
407
|
+
canvasClientHeight: canvas.clientHeight
|
|
408
|
+
})
|
|
409
|
+
const ratio = window.devicePixelRatio || 1
|
|
410
|
+
canvas.width = width * ratio
|
|
411
|
+
canvas.height = height * ratio
|
|
412
|
+
canvas.style.width = width + 'px'
|
|
413
|
+
canvas.style.height = height + 'px'
|
|
414
|
+
ctx.setTransform(ratio, 0, 0, ratio, 0, 0)
|
|
415
|
+
ctx.clearRect(0, 0, width, height)
|
|
416
|
+
|
|
417
|
+
const padding = { top: 6, right: 6, bottom: 6, left: 6 }
|
|
418
|
+
const chartW = width - padding.left - padding.right
|
|
419
|
+
const chartH = height - padding.top - padding.bottom
|
|
420
|
+
const max = Math.max(...chartData)
|
|
421
|
+
const min = Math.min(...chartData)
|
|
422
|
+
const range = max - min || 1
|
|
423
|
+
const points = chartData.map((val, index) => ({
|
|
424
|
+
x: chartData.length === 1 ? width / 2 : padding.left + (index / (chartData.length - 1)) * chartW,
|
|
425
|
+
y: padding.top + chartH - ((val - min) / range) * chartH
|
|
426
|
+
}))
|
|
427
|
+
const smooth = this.getTrendChartsSmooth()
|
|
428
|
+
console.log("BiPagingTable -- drawTrendCharts -- 趋势图线条类型:", {
|
|
429
|
+
key: column && column.key,
|
|
430
|
+
pointCount: points.length,
|
|
431
|
+
smooth
|
|
432
|
+
})
|
|
433
|
+
|
|
434
|
+
const gradient = ctx.createLinearGradient(0, padding.top, 0, height)
|
|
435
|
+
gradient.addColorStop(0, 'rgba(45, 140, 240, 0.25)')
|
|
436
|
+
gradient.addColorStop(0.5, 'rgba(45, 140, 240, 0.1)')
|
|
437
|
+
gradient.addColorStop(1, 'rgba(45, 140, 240, 0.02)')
|
|
438
|
+
|
|
439
|
+
this.drawTrendChartsArea(ctx, points, smooth, height - padding.bottom)
|
|
440
|
+
ctx.fillStyle = gradient
|
|
441
|
+
ctx.fill()
|
|
442
|
+
|
|
443
|
+
this.drawTrendChartsLine(ctx, points, smooth)
|
|
444
|
+
ctx.strokeStyle = '#2d8cf0'
|
|
445
|
+
ctx.lineWidth = 1.8
|
|
446
|
+
ctx.lineJoin = 'round'
|
|
447
|
+
ctx.lineCap = 'round'
|
|
448
|
+
ctx.stroke()
|
|
449
|
+
|
|
450
|
+
points.forEach((point, index) => {
|
|
451
|
+
if (index === 0 || index === points.length - 1 || index % 3 === 0) {
|
|
452
|
+
ctx.beginPath()
|
|
453
|
+
ctx.arc(point.x, point.y, 2.5, 0, Math.PI * 2)
|
|
454
|
+
ctx.fillStyle = '#fff'
|
|
455
|
+
ctx.fill()
|
|
456
|
+
ctx.strokeStyle = '#2d8cf0'
|
|
457
|
+
ctx.lineWidth = 1.5
|
|
458
|
+
ctx.stroke()
|
|
459
|
+
}
|
|
460
|
+
})
|
|
461
|
+
|
|
462
|
+
const lastPoint = points[points.length - 1]
|
|
463
|
+
ctx.beginPath()
|
|
464
|
+
ctx.arc(lastPoint.x, lastPoint.y, 4, 0, Math.PI * 2)
|
|
465
|
+
ctx.fillStyle = 'rgba(45, 140, 240, 0.2)'
|
|
466
|
+
ctx.fill()
|
|
467
|
+
ctx.strokeStyle = '#2d8cf0'
|
|
468
|
+
ctx.lineWidth = 2
|
|
469
|
+
ctx.stroke()
|
|
470
|
+
console.log("BiPagingTable -- drawTrendCharts -- 趋势图绘制完成", {
|
|
471
|
+
pointCount: points.length,
|
|
472
|
+
min,
|
|
473
|
+
max
|
|
474
|
+
})
|
|
475
|
+
},
|
|
225
476
|
onClose() {
|
|
226
477
|
this.boxShow = false
|
|
227
478
|
},
|
|
@@ -262,7 +513,16 @@ export default {
|
|
|
262
513
|
try {
|
|
263
514
|
columns = JSON.parse(this.widget.options.columns)
|
|
264
515
|
columns.forEach((column) => {
|
|
265
|
-
if (column
|
|
516
|
+
if (this.isRankColumn(column)) {
|
|
517
|
+
column.type = 'index'
|
|
518
|
+
column.indexMethod = (row, index) => this.getRankIcon(this.getRankTableIndex(index, row))
|
|
519
|
+
}
|
|
520
|
+
if (this.isTrendChartsColumn(column)) {
|
|
521
|
+
let self = this
|
|
522
|
+
column.render = function (h, params) {
|
|
523
|
+
return self.renderTrendChartsCell(h, params)
|
|
524
|
+
}
|
|
525
|
+
} else if (column.detailName) {
|
|
266
526
|
let self = this
|
|
267
527
|
column.render = function (h, params) {
|
|
268
528
|
return h(
|
package/package.json
CHANGED
|
@@ -204,6 +204,9 @@ export default {
|
|
|
204
204
|
</script>
|
|
205
205
|
<style scoped lang="less">
|
|
206
206
|
.ivu-number-info-value-lambo {
|
|
207
|
+
font-family: var("DIN Alternate", "Roboto Mono", Menlo, Consolas, monospace);
|
|
208
|
+
font-variant-numeric: tabular-nums;
|
|
209
|
+
font-feature-settings: "tnum";
|
|
207
210
|
margin-top: 4px;
|
|
208
211
|
overflow: hidden;
|
|
209
212
|
font-size: 0;
|