NEZ-2520 feat:新增漏斗图图表类型
This commit is contained in:
@@ -647,3 +647,9 @@
|
|||||||
.tickLineFirst{
|
.tickLineFirst{
|
||||||
stroke: $--color-text-primary;;
|
stroke: $--color-text-primary;;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-ellipsis{
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
@@ -134,15 +134,17 @@ export default {
|
|||||||
case 'table' :
|
case 'table' :
|
||||||
case 'stat' :
|
case 'stat' :
|
||||||
case 'gauge' :
|
case 'gauge' :
|
||||||
case 'sankey' :
|
|
||||||
case 'pie' :
|
case 'pie' :
|
||||||
case 'bubble' :
|
|
||||||
case 'treemap' :
|
case 'treemap' :
|
||||||
case 'log' :
|
case 'log' :
|
||||||
case 'hexagon' :
|
case 'hexagon' :
|
||||||
case 'diagram' :
|
case 'diagram' :
|
||||||
case 'url':
|
case 'url':
|
||||||
case 'clock':
|
case 'clock':
|
||||||
|
case 'bubble' :
|
||||||
|
case 'rank' :
|
||||||
|
case 'sankey' :
|
||||||
|
case 'funnel' :
|
||||||
return true
|
return true
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,24 +26,6 @@
|
|||||||
:is-fullscreen="isFullscreen"
|
:is-fullscreen="isFullscreen"
|
||||||
@chartIsNoData="chartIsNoData"
|
@chartIsNoData="chartIsNoData"
|
||||||
></chart-pie>
|
></chart-pie>
|
||||||
<chart-bubble
|
|
||||||
:ref="'chart' + chartInfo.id"
|
|
||||||
v-if="isChartBubble(chartInfo.type)"
|
|
||||||
:chart-data="chartData"
|
|
||||||
:chart-info="chartInfo"
|
|
||||||
:chart-option="chartOption"
|
|
||||||
:is-fullscreen="isFullscreen"
|
|
||||||
@chartIsNoData="chartIsNoData"
|
|
||||||
></chart-bubble>
|
|
||||||
<chart-rank
|
|
||||||
:ref="'chart' + chartInfo.id"
|
|
||||||
v-if="isChartRank(chartInfo.type)"
|
|
||||||
:chart-data="chartData"
|
|
||||||
:chart-info="chartInfo"
|
|
||||||
:chart-option="chartOption"
|
|
||||||
:is-fullscreen="isFullscreen"
|
|
||||||
@chartIsNoData="chartIsNoData"
|
|
||||||
></chart-rank>
|
|
||||||
<chart-bar
|
<chart-bar
|
||||||
:ref="'chart' + chartInfo.id"
|
:ref="'chart' + chartInfo.id"
|
||||||
v-if="isChartBar(chartInfo.type)"
|
v-if="isChartBar(chartInfo.type)"
|
||||||
@@ -117,15 +99,6 @@
|
|||||||
:is-fullscreen="isFullscreen"
|
:is-fullscreen="isFullscreen"
|
||||||
@chartIsNoData="chartIsNoData"
|
@chartIsNoData="chartIsNoData"
|
||||||
></chart-gauge>
|
></chart-gauge>
|
||||||
<chart-sankey
|
|
||||||
:ref="'chart' + chartInfo.id"
|
|
||||||
v-if="isSankey(chartInfo.type)"
|
|
||||||
:chart-data="chartData"
|
|
||||||
:chart-info="chartInfo"
|
|
||||||
:chart-option="chartOption"
|
|
||||||
:is-fullscreen="isFullscreen"
|
|
||||||
@chartIsNoData="chartIsNoData"
|
|
||||||
></chart-sankey>
|
|
||||||
<chart-diagram
|
<chart-diagram
|
||||||
:ref="'chart' + chartInfo.id"
|
:ref="'chart' + chartInfo.id"
|
||||||
v-if="isDiagram(chartInfo.type)"
|
v-if="isDiagram(chartInfo.type)"
|
||||||
@@ -210,6 +183,42 @@
|
|||||||
:is-fullscreen="isFullscreen"
|
:is-fullscreen="isFullscreen"
|
||||||
@chartIsNoData="chartIsNoData"
|
@chartIsNoData="chartIsNoData"
|
||||||
></chart-topology>
|
></chart-topology>
|
||||||
|
<chart-bubble
|
||||||
|
:ref="'chart' + chartInfo.id"
|
||||||
|
v-if="isChartBubble(chartInfo.type)"
|
||||||
|
:chart-data="chartData"
|
||||||
|
:chart-info="chartInfo"
|
||||||
|
:chart-option="chartOption"
|
||||||
|
:is-fullscreen="isFullscreen"
|
||||||
|
@chartIsNoData="chartIsNoData"
|
||||||
|
></chart-bubble>
|
||||||
|
<chart-rank
|
||||||
|
:ref="'chart' + chartInfo.id"
|
||||||
|
v-if="isChartRank(chartInfo.type)"
|
||||||
|
:chart-data="chartData"
|
||||||
|
:chart-info="chartInfo"
|
||||||
|
:chart-option="chartOption"
|
||||||
|
:is-fullscreen="isFullscreen"
|
||||||
|
@chartIsNoData="chartIsNoData"
|
||||||
|
></chart-rank>
|
||||||
|
<chart-sankey
|
||||||
|
:ref="'chart' + chartInfo.id"
|
||||||
|
v-if="isSankey(chartInfo.type)"
|
||||||
|
:chart-data="chartData"
|
||||||
|
:chart-info="chartInfo"
|
||||||
|
:chart-option="chartOption"
|
||||||
|
:is-fullscreen="isFullscreen"
|
||||||
|
@chartIsNoData="chartIsNoData"
|
||||||
|
></chart-sankey>
|
||||||
|
<chart-funnel
|
||||||
|
:ref="'chart' + chartInfo.id"
|
||||||
|
v-if="isFunnel(chartInfo.type)"
|
||||||
|
:chart-data="chartData"
|
||||||
|
:chart-info="chartInfo"
|
||||||
|
:chart-option="chartOption"
|
||||||
|
:is-fullscreen="isFullscreen"
|
||||||
|
@chartIsNoData="chartIsNoData"
|
||||||
|
></chart-funnel>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -223,13 +232,10 @@ import chartClock from './chart/chartClock'
|
|||||||
import chartDiagram from './chart/chartDiagram'
|
import chartDiagram from './chart/chartDiagram'
|
||||||
import chartEndpointInfo from './chart/chartEndpointInfo'
|
import chartEndpointInfo from './chart/chartEndpointInfo'
|
||||||
import chartGauge from './chart/chartGauge'
|
import chartGauge from './chart/chartGauge'
|
||||||
import chartSankey from './chart/chartSankey'
|
|
||||||
import chartGroup from './chart/chartGroup'
|
import chartGroup from './chart/chartGroup'
|
||||||
import chartLog from './chart/chartLog'
|
import chartLog from './chart/chartLog'
|
||||||
import chartNoData from './chart/chartNoData'
|
import chartNoData from './chart/chartNoData'
|
||||||
import chartPie from './chart/chartPie'
|
import chartPie from './chart/chartPie'
|
||||||
import chartBubble from './chart/chartBubble'
|
|
||||||
import chartRank from './chart/chartRank'
|
|
||||||
import chartStat from './chart/chartStat'
|
import chartStat from './chart/chartStat'
|
||||||
import chartTable from './chart/chartTable'
|
import chartTable from './chart/chartTable'
|
||||||
import chartText from './chart/chartText'
|
import chartText from './chart/chartText'
|
||||||
@@ -240,7 +246,11 @@ import chartValue from './chart/chartValue'
|
|||||||
import chartHexagonD3 from './chart/chartHexagonD3'
|
import chartHexagonD3 from './chart/chartHexagonD3'
|
||||||
import chartMap from './chart/chartMap'
|
import chartMap from './chart/chartMap'
|
||||||
import chartTopology from './chart/chartTopology'
|
import chartTopology from './chart/chartTopology'
|
||||||
import { getOption, isTimeSeries, isHexagon, isUrl, isText, isChartPie, isChartBubble, isChartRank, isChartBar, isTreemap, isLog, isStat, isDiagram, isGroup, isAutotopology, isMap, isAssetInfo, isEndpointInfo, isTable, isGauge, isSankey, isClock, isTopology } from './chart/tools'
|
import chartBubble from './chart/chartBubble'
|
||||||
|
import chartRank from './chart/chartRank'
|
||||||
|
import chartSankey from './chart/chartSankey'
|
||||||
|
import chartFunnel from './chart/chartFunnel'
|
||||||
|
import { getOption, isTimeSeries, isHexagon, isUrl, isText, isChartPie, isChartBar, isTreemap, isLog, isStat, isDiagram, isGroup, isAutotopology, isMap, isAssetInfo, isEndpointInfo, isTable, isGauge, isClock, isTopology, isChartBubble, isChartRank, isSankey, isFunnel } from './chart/tools'
|
||||||
import lodash from 'lodash'
|
import lodash from 'lodash'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -254,13 +264,10 @@ export default {
|
|||||||
chartDiagram,
|
chartDiagram,
|
||||||
chartEndpointInfo,
|
chartEndpointInfo,
|
||||||
chartGauge,
|
chartGauge,
|
||||||
chartSankey,
|
|
||||||
chartGroup,
|
chartGroup,
|
||||||
chartLog,
|
chartLog,
|
||||||
chartNoData,
|
chartNoData,
|
||||||
chartPie,
|
chartPie,
|
||||||
chartBubble,
|
|
||||||
chartRank,
|
|
||||||
chartStat,
|
chartStat,
|
||||||
chartTable,
|
chartTable,
|
||||||
chartText,
|
chartText,
|
||||||
@@ -270,7 +277,11 @@ export default {
|
|||||||
chartValue,
|
chartValue,
|
||||||
chartHexagonD3,
|
chartHexagonD3,
|
||||||
chartMap,
|
chartMap,
|
||||||
chartTopology
|
chartTopology,
|
||||||
|
chartBubble,
|
||||||
|
chartRank,
|
||||||
|
chartSankey,
|
||||||
|
chartFunnel
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
chartInfo: Object,
|
chartInfo: Object,
|
||||||
@@ -328,8 +339,6 @@ export default {
|
|||||||
isTimeSeries,
|
isTimeSeries,
|
||||||
isHexagon,
|
isHexagon,
|
||||||
isChartPie,
|
isChartPie,
|
||||||
isChartBubble,
|
|
||||||
isChartRank,
|
|
||||||
isChartBar,
|
isChartBar,
|
||||||
isUrl,
|
isUrl,
|
||||||
isText,
|
isText,
|
||||||
@@ -344,9 +353,12 @@ export default {
|
|||||||
isMap,
|
isMap,
|
||||||
isTable,
|
isTable,
|
||||||
isGauge,
|
isGauge,
|
||||||
isSankey,
|
|
||||||
isClock,
|
isClock,
|
||||||
isTopology,
|
isTopology,
|
||||||
|
isChartBubble,
|
||||||
|
isChartRank,
|
||||||
|
isSankey,
|
||||||
|
isFunnel,
|
||||||
chartIsNoData (flag) {
|
chartIsNoData (flag) {
|
||||||
this.chartChildrenData = flag
|
this.chartChildrenData = flag
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -173,7 +173,10 @@ export default {
|
|||||||
return d.y - d.r
|
return d.y - d.r
|
||||||
})
|
})
|
||||||
.style('font-size', function (d) {
|
.style('font-size', function (d) {
|
||||||
return d.r / 3 > 10 ? d.r / 3 : 0
|
let fontSize
|
||||||
|
fontSize = d.r / 4 > 10 ? d.r / 4 : 0
|
||||||
|
fontSize = fontSize > 30 ? 30 : fontSize
|
||||||
|
return fontSize
|
||||||
})
|
})
|
||||||
.style('border-radius', '50%')
|
.style('border-radius', '50%')
|
||||||
.html((d) => {
|
.html((d) => {
|
||||||
|
|||||||
240
nezha-fronted/src/components/chart/chart/chartFunnel.vue
Normal file
240
nezha-fronted/src/components/chart/chart/chartFunnel.vue
Normal file
@@ -0,0 +1,240 @@
|
|||||||
|
<template>
|
||||||
|
<div
|
||||||
|
ref="funnel-chart-box"
|
||||||
|
class="nz-chart__component"
|
||||||
|
>
|
||||||
|
<div :id="`chart-canvas-${chartId}`" class="chart__canvas" style="display:flex;justify-content: center;align-items: center;"></div>
|
||||||
|
<div :class="`chart-canvas-tooltip-${chartId}`" :id="`chart-canvas-tooltip-${chartId}`" class="chart-canvas-tooltip" :style="{left:tooltip.x+'px',top:tooltip.y+'px'}" v-if="tooltip.show">
|
||||||
|
<div class="chart-canvas-tooltip-title tooltip-title">
|
||||||
|
{{tooltip.title}}
|
||||||
|
</div>
|
||||||
|
<div class="chart-canvas-tooltip-content">
|
||||||
|
<div>value</div>
|
||||||
|
<div>
|
||||||
|
<div v-if="tooltip.mapping && tooltip.mapping.icon" style="display: inline-block">
|
||||||
|
<i :class="tooltip.mapping.icon" :style="{color: tooltip.mapping.color.icon}"></i>
|
||||||
|
</div>
|
||||||
|
<div style="display: inline-block">{{tooltip.value}}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import D3Funnel from './d3-funnel/index.js'
|
||||||
|
import chartMixin from '@/components/chart/chartMixin'
|
||||||
|
import chartFormat from '@/components/chart/chartFormat'
|
||||||
|
import { getMetricTypeValue } from '@/components/common/js/tools'
|
||||||
|
import chartDataFormat from '@/components/chart/chartDataFormat'
|
||||||
|
import { initColor } from '@/components/chart/chart/tools'
|
||||||
|
import { getChart, setChart } from '@/components/common/js/common'
|
||||||
|
import lodash from 'lodash'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'chart-funnel',
|
||||||
|
components: {
|
||||||
|
},
|
||||||
|
mixins: [chartMixin, chartFormat],
|
||||||
|
props: {
|
||||||
|
chartInfo: Object,
|
||||||
|
chartData: Array,
|
||||||
|
chartOption: Object,
|
||||||
|
isFullscreen: Boolean
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
colorList: [],
|
||||||
|
isInit: true, // 是否是初始化,初始化时为true,图表初始化结束后设为false
|
||||||
|
chartId: '',
|
||||||
|
funnelData: [],
|
||||||
|
tooltip: {
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
title: 0,
|
||||||
|
value: 0,
|
||||||
|
mapping: {},
|
||||||
|
show: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
initChart (customAnimate) {
|
||||||
|
this.legends = []
|
||||||
|
this.initData(this.chartInfo, this.chartData)
|
||||||
|
if (this.isNoData) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
/* 使用setTimeout延迟渲染图表,避免样式错乱 */
|
||||||
|
setTimeout(() => {
|
||||||
|
this.drawChart(customAnimate)
|
||||||
|
}, 200)
|
||||||
|
},
|
||||||
|
initData (chartInfo, originalDatas) {
|
||||||
|
this.funnelData = []
|
||||||
|
let colorIndex = 0
|
||||||
|
const decimals = this.chartInfo.param.decimals || 2
|
||||||
|
this.isNoData = true
|
||||||
|
originalDatas.forEach((originalData, expressionIndex) => {
|
||||||
|
originalData.forEach((data, dataIndex) => {
|
||||||
|
this.isNoData = false
|
||||||
|
const value = getMetricTypeValue(data.values, chartInfo.param.statistics)
|
||||||
|
const showValue = chartDataFormat.getUnit(chartInfo.unit ? chartInfo.unit : 2).compute(value, null, -1, decimals)
|
||||||
|
const mapping = this.selectMapping(value, chartInfo.param.valueMapping, chartInfo.param.enable && this.chartInfo.param.enable.valueMapping)
|
||||||
|
const legend = this.handleLegend(chartInfo, data, expressionIndex, dataIndex, colorIndex)
|
||||||
|
this.funnelData.push({
|
||||||
|
value: Number(value),
|
||||||
|
realValue: value,
|
||||||
|
showValue: showValue,
|
||||||
|
name: legend.name,
|
||||||
|
alias: legend.alias,
|
||||||
|
labels: {
|
||||||
|
...data.metric,
|
||||||
|
legend: legend.alias
|
||||||
|
},
|
||||||
|
seriesIndex: expressionIndex,
|
||||||
|
dataIndex: dataIndex,
|
||||||
|
mapping: mapping,
|
||||||
|
backgroundColor: mapping ? mapping.color.bac.substr(0, 7) : this.colorList[colorIndex], // 仅限十六进制
|
||||||
|
label: legend.alias
|
||||||
|
})
|
||||||
|
colorIndex++
|
||||||
|
})
|
||||||
|
})
|
||||||
|
this.$emit('chartIsNoData', this.isNoData)
|
||||||
|
},
|
||||||
|
drawChart (customAnimate) {
|
||||||
|
this.$nextTick(() => {
|
||||||
|
const options = {
|
||||||
|
chart: {
|
||||||
|
width: '85%',
|
||||||
|
height: '85%',
|
||||||
|
bottomPinch: this.funnelData.length > 1 ? 1 : 0,
|
||||||
|
customAnimate: customAnimate === true || this.isInit
|
||||||
|
},
|
||||||
|
block: {
|
||||||
|
dynamicHeight: true,
|
||||||
|
highlight: true
|
||||||
|
},
|
||||||
|
label: {
|
||||||
|
format: this.formatterLabel
|
||||||
|
},
|
||||||
|
events: {
|
||||||
|
mouseenter: {
|
||||||
|
block: this.chartEnter
|
||||||
|
},
|
||||||
|
mousemove: {
|
||||||
|
block: this.chartMove
|
||||||
|
},
|
||||||
|
mouseleave: {
|
||||||
|
block: this.chartLeave
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const myChart = new D3Funnel(document.getElementById(`chart-canvas-${this.chartId}`))
|
||||||
|
const funnelData = lodash.cloneDeep(this.funnelData)
|
||||||
|
myChart.draw(funnelData, options)
|
||||||
|
setChart(this.chartId, myChart)
|
||||||
|
this.isInit = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
// 处理label
|
||||||
|
formatterLabel (label, value, e, data) {
|
||||||
|
let str = ''
|
||||||
|
let valueStr = ''
|
||||||
|
if (this.chartInfo.param.text === 'all') {
|
||||||
|
str += data.alias
|
||||||
|
valueStr = data.mapping && data.mapping.display ? this.handleDisplay(data.mapping.display, { ...data.labels, value: data.showValue }) : data.showValue
|
||||||
|
}
|
||||||
|
if (this.chartInfo.param.text === 'value' || !this.chartInfo.param.text) {
|
||||||
|
valueStr = data.mapping && data.mapping.display ? this.handleDisplay(data.mapping.display, { ...data.labels, value: data.showValue }) : data.showValue
|
||||||
|
}
|
||||||
|
if (this.chartInfo.param.text === 'legend') {
|
||||||
|
str += data.alias
|
||||||
|
}
|
||||||
|
if (this.chartInfo.param.text === 'none') {
|
||||||
|
str += ''
|
||||||
|
}
|
||||||
|
if (str && valueStr) {
|
||||||
|
return `<div style="width:100%;height: 100%;display: flex;align-items: center;justify-content: center;flex-direction: column;cursor: pointer;color:#000000">
|
||||||
|
<p class='text-ellipsis' style="width: 80%;text-align:center;color: ${data.mapping && data.mapping.color && data.mapping.color.text};">
|
||||||
|
<span>${str}</span>
|
||||||
|
</p>
|
||||||
|
<p class='text-ellipsis' style="width: 80%;text-align:center;color: ${data.mapping && data.mapping.color && data.mapping.color.text};">
|
||||||
|
<i class="${data.mapping && data.mapping.icon}" style="color: ${data.mapping && data.mapping.color && data.mapping.color.icon};font-size:1em;"></i>
|
||||||
|
<span>${valueStr}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
} else if (str) {
|
||||||
|
return `<div style="width:100%;height: 100%;display: flex;align-items: center;justify-content: center;flex-direction: column;cursor: pointer;color:#000000">
|
||||||
|
<p class='text-ellipsis' style="width: 80%;text-align:center;color: ${data.mapping && data.mapping.color && data.mapping.color.text};">
|
||||||
|
<i class="${data.mapping && data.mapping.icon}" style="color: ${data.mapping && data.mapping.color && data.mapping.color.icon};font-size:1em;"></i>
|
||||||
|
<span>${str}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
} else if (valueStr) {
|
||||||
|
return `<div style="width:100%;height: 100%;display: flex;align-items: center;justify-content: center;flex-direction: column;cursor: pointer;color:#000000">
|
||||||
|
<p class='text-ellipsis' style="width: 80%;text-align:center;color: ${data.mapping && data.mapping.color && data.mapping.color.text};">
|
||||||
|
<i class="${data.mapping && data.mapping.icon}" style="color: ${data.mapping && data.mapping.color && data.mapping.color.icon};font-size:1em;"></i>
|
||||||
|
<span>${valueStr}</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
resize () {
|
||||||
|
setTimeout(() => {
|
||||||
|
this.drawChart()
|
||||||
|
}, 50)
|
||||||
|
},
|
||||||
|
chartEnter (e, node) {
|
||||||
|
this.tooltip.title = node.data.alias
|
||||||
|
this.tooltip.value = node.data.showValue
|
||||||
|
this.tooltip.mapping = node.data.mapping
|
||||||
|
this.tooltip.show = true
|
||||||
|
this.setPosition(e)
|
||||||
|
},
|
||||||
|
chartMove (e) {
|
||||||
|
this.tooltip.show = true
|
||||||
|
this.setPosition(e)
|
||||||
|
},
|
||||||
|
chartLeave () {
|
||||||
|
this.tooltip.show = false
|
||||||
|
},
|
||||||
|
setPosition (e) {
|
||||||
|
const windowWidth = window.innerWidth// 窗口宽度
|
||||||
|
const windowHeight = window.innerHeight// 窗口高度
|
||||||
|
const box = document.getElementById(`chart-canvas-tooltip-${this.chartId}`)
|
||||||
|
if (box) {
|
||||||
|
const boxWidth = box.offsetWidth
|
||||||
|
const boxHeight = box.offsetHeight
|
||||||
|
if (e.pageX < (windowWidth / 2)) { // 说明鼠标在左边放不下提示框
|
||||||
|
this.tooltip.x = e.pageX + 15
|
||||||
|
} else {
|
||||||
|
this.tooltip.x = e.pageX - boxWidth - 15
|
||||||
|
}
|
||||||
|
if (e.pageY + 50 + boxHeight < windowHeight) { // 说明鼠标上面放不下提示框
|
||||||
|
this.tooltip.y = e.pageY + 15
|
||||||
|
} else {
|
||||||
|
this.tooltip.y = e.pageY - boxHeight - 10
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.tooltip.y = e.pageY + 15
|
||||||
|
this.tooltip.x = e.pageX + 15
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
this.colorList = initColor(20)
|
||||||
|
this.chartInfo.loaded && this.initChart(true)
|
||||||
|
},
|
||||||
|
beforeDestroy () {
|
||||||
|
getChart(this.chartId) && getChart(this.chartId).destroy()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
177
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Colorizer.js
vendored
Normal file
177
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Colorizer.js
vendored
Normal file
@@ -0,0 +1,177 @@
|
|||||||
|
class Colorizer {
|
||||||
|
/**
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
constructor () {
|
||||||
|
this.hexExpression = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i
|
||||||
|
this.instanceId = null
|
||||||
|
this.labelFill = null
|
||||||
|
this.scale = null
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} instanceId
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
setInstanceId (instanceId) {
|
||||||
|
this.instanceId = instanceId
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} fill
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
setLabelFill (fill) {
|
||||||
|
this.labelFill = fill
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {function|Array} scale
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
setScale (scale) {
|
||||||
|
this.scale = scale
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a raw data block, return an appropriate color for the block.
|
||||||
|
*
|
||||||
|
* @param {string} fill
|
||||||
|
* @param {Number} index
|
||||||
|
* @param {string} fillType
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
getBlockFill (fill, index, fillType) {
|
||||||
|
const raw = this.getBlockRawFill(fill, index)
|
||||||
|
|
||||||
|
return {
|
||||||
|
raw,
|
||||||
|
actual: this.getBlockActualFill(raw, index, fillType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the raw hex color for the block.
|
||||||
|
*
|
||||||
|
* @param {string} fill
|
||||||
|
* @param {Number} index
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
getBlockRawFill (fill, index) {
|
||||||
|
// Use the block's color, if set and valid
|
||||||
|
if (this.hexExpression.test(fill)) {
|
||||||
|
return fill
|
||||||
|
}
|
||||||
|
|
||||||
|
// Otherwise, attempt to use the array scale
|
||||||
|
if (Array.isArray(this.scale)) {
|
||||||
|
return this.scale[index]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finally, use a functional scale
|
||||||
|
return this.scale(index)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the actual background for the block.
|
||||||
|
*
|
||||||
|
* @param {string} raw
|
||||||
|
* @param {Number} index
|
||||||
|
* @param {string} fillType
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
getBlockActualFill (raw, index, fillType) {
|
||||||
|
if (fillType === 'solid') {
|
||||||
|
return raw
|
||||||
|
}
|
||||||
|
|
||||||
|
return `url(#${this.getGradientId(index)})`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the gradient ID for the given index.
|
||||||
|
*
|
||||||
|
* @param {Number} index
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
getGradientId (index) {
|
||||||
|
return `${this.instanceId}-gradient-${index}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a raw data block, return an appropriate label color.
|
||||||
|
*
|
||||||
|
* @param {string} labelFill
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
getLabelColor (labelFill) {
|
||||||
|
return this.hexExpression.test(labelFill) ? labelFill : this.labelFill
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shade a color to the given percentage.
|
||||||
|
*
|
||||||
|
* @param {string} color A hex color.
|
||||||
|
* @param {number} shade The shade adjustment. Can be positive or negative.
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
shade (color, shade) {
|
||||||
|
const { R, G, B } = this.hexToRgb(color)
|
||||||
|
const t = shade < 0 ? 0 : 255
|
||||||
|
const p = shade < 0 ? shade * -1 : shade
|
||||||
|
|
||||||
|
const converted = 0x1000000 +
|
||||||
|
((Math.round((t - R) * p) + R) * 0x10000) +
|
||||||
|
((Math.round((t - G) * p) + G) * 0x100) +
|
||||||
|
(Math.round((t - B) * p) + B)
|
||||||
|
|
||||||
|
return `#${converted.toString(16).slice(1)}`
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a hex color to an RGB object.
|
||||||
|
*
|
||||||
|
* @param {string} color
|
||||||
|
*
|
||||||
|
* @returns {{R: Number, G: number, B: number}}
|
||||||
|
*/
|
||||||
|
hexToRgb (color) {
|
||||||
|
let hex = color.slice(1)
|
||||||
|
|
||||||
|
if (hex.length === 3) {
|
||||||
|
hex = this.expandHex(hex)
|
||||||
|
}
|
||||||
|
|
||||||
|
const f = parseInt(hex, 16)
|
||||||
|
|
||||||
|
/* eslint-disable no-bitwise */
|
||||||
|
const R = f >> 16
|
||||||
|
const G = (f >> 8) & 0x00FF
|
||||||
|
const B = f & 0x0000FF
|
||||||
|
/* eslint-enable */
|
||||||
|
|
||||||
|
return { R, G, B }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expands a three character hex code to six characters.
|
||||||
|
*
|
||||||
|
* @param {string} hex
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
expandHex (hex) {
|
||||||
|
return hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Colorizer
|
||||||
1157
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/D3Funnel.js
vendored
Normal file
1157
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/D3Funnel.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
75
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Formatter.js
vendored
Normal file
75
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Formatter.js
vendored
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
class Formatter {
|
||||||
|
/**
|
||||||
|
* Register the format function.
|
||||||
|
*
|
||||||
|
* @param {string|function} format
|
||||||
|
*
|
||||||
|
* @return {function}
|
||||||
|
*/
|
||||||
|
getFormatter (format) {
|
||||||
|
if (typeof format === 'function') {
|
||||||
|
return format
|
||||||
|
}
|
||||||
|
|
||||||
|
return (label, value, formattedValue) => (
|
||||||
|
this.stringFormatter(label, value, formattedValue, format)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format the given value according to the data point or the format.
|
||||||
|
*
|
||||||
|
* @param {string} label
|
||||||
|
* @param {number} value
|
||||||
|
* @param {*} formattedValue
|
||||||
|
* @param {function} formatter
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
format ({ label, value, formattedValue = null }, formatter) {
|
||||||
|
return formatter(label, value, formattedValue, arguments[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Format the string according to a simple expression.
|
||||||
|
*
|
||||||
|
* {l}: label
|
||||||
|
* {v}: raw value
|
||||||
|
* {f}: formatted value
|
||||||
|
*
|
||||||
|
* @param {string} label
|
||||||
|
* @param {number} value
|
||||||
|
* @param {*} formattedValue
|
||||||
|
* @param {string} expression
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
stringFormatter (label, value, formattedValue, expression) {
|
||||||
|
let formatted = formattedValue
|
||||||
|
|
||||||
|
// Attempt to use supplied formatted value
|
||||||
|
// Otherwise, use the default
|
||||||
|
if (formattedValue === null) {
|
||||||
|
formatted = this.getDefaultFormattedValue(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
return expression
|
||||||
|
.split('{l}')
|
||||||
|
.join(label)
|
||||||
|
.split('{v}')
|
||||||
|
.join(value)
|
||||||
|
.split('{f}')
|
||||||
|
.join(formatted)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {number} value
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
getDefaultFormattedValue (value) {
|
||||||
|
return value.toLocaleString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Formatter
|
||||||
245
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Navigator.js
vendored
Normal file
245
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Navigator.js
vendored
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
class Navigator {
|
||||||
|
/**
|
||||||
|
* Given a list of path commands, returns the compiled description.
|
||||||
|
*
|
||||||
|
* @param {Array} commands
|
||||||
|
*
|
||||||
|
* @return {string}
|
||||||
|
*/
|
||||||
|
plot (commands) {
|
||||||
|
let path = ''
|
||||||
|
|
||||||
|
commands.forEach((command) => {
|
||||||
|
path += `${command[0]}${command[1]},${command[2]} `
|
||||||
|
})
|
||||||
|
|
||||||
|
return path.replace(/ +/g, ' ').trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} dimensions
|
||||||
|
* @param {boolean} isValueOverlay
|
||||||
|
*
|
||||||
|
* @return {Array}
|
||||||
|
*/
|
||||||
|
makeCurvedPaths (dimensions, isValueOverlay = false) {
|
||||||
|
const points = this.makeBezierPoints(dimensions)
|
||||||
|
|
||||||
|
if (isValueOverlay) {
|
||||||
|
return this.makeBezierPath(points, dimensions.ratio)
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.makeBezierPath(points)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} centerX
|
||||||
|
* @param {Number} prevLeftX
|
||||||
|
* @param {Number} prevRightX
|
||||||
|
* @param {Number} prevHeight
|
||||||
|
* @param {Number} nextLeftX
|
||||||
|
* @param {Number} nextRightX
|
||||||
|
* @param {Number} nextHeight
|
||||||
|
* @param {Number} curveHeight
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
makeBezierPoints ({
|
||||||
|
centerX,
|
||||||
|
prevLeftX,
|
||||||
|
prevRightX,
|
||||||
|
prevHeight,
|
||||||
|
nextLeftX,
|
||||||
|
nextRightX,
|
||||||
|
nextHeight,
|
||||||
|
curveHeight
|
||||||
|
}) {
|
||||||
|
return {
|
||||||
|
p00: {
|
||||||
|
x: prevLeftX,
|
||||||
|
y: prevHeight
|
||||||
|
},
|
||||||
|
p01: {
|
||||||
|
x: centerX,
|
||||||
|
y: prevHeight + (curveHeight / 2)
|
||||||
|
},
|
||||||
|
p02: {
|
||||||
|
x: prevRightX,
|
||||||
|
y: prevHeight
|
||||||
|
},
|
||||||
|
|
||||||
|
p10: {
|
||||||
|
x: nextLeftX,
|
||||||
|
y: nextHeight
|
||||||
|
},
|
||||||
|
p11: {
|
||||||
|
x: centerX,
|
||||||
|
y: nextHeight + curveHeight
|
||||||
|
},
|
||||||
|
p12: {
|
||||||
|
x: nextRightX,
|
||||||
|
y: nextHeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} p00
|
||||||
|
* @param {Object} p01
|
||||||
|
* @param {Object} p02
|
||||||
|
* @param {Object} p10
|
||||||
|
* @param {Object} p11
|
||||||
|
* @param {Object} p12
|
||||||
|
* @param {Number} ratio
|
||||||
|
*
|
||||||
|
* @return {Array}
|
||||||
|
*/
|
||||||
|
makeBezierPath ({
|
||||||
|
p00,
|
||||||
|
p01,
|
||||||
|
p02,
|
||||||
|
p10,
|
||||||
|
p11,
|
||||||
|
p12
|
||||||
|
}, ratio = 1) {
|
||||||
|
const curve0 = this.getQuadraticBezierCurve(p00, p01, p02, ratio)
|
||||||
|
const curve1 = this.getQuadraticBezierCurve(p10, p11, p12, ratio)
|
||||||
|
|
||||||
|
return [
|
||||||
|
// Top Bezier curve
|
||||||
|
[curve0.p0.x, curve0.p0.y, 'M'],
|
||||||
|
[curve0.p1.x, curve0.p1.y, 'Q'],
|
||||||
|
[curve0.p2.x, curve0.p2.y, ''],
|
||||||
|
// Right line
|
||||||
|
[curve1.p2.x, curve1.p2.y, 'L'],
|
||||||
|
// Bottom Bezier curve
|
||||||
|
[curve1.p2.x, curve1.p2.y, 'M'],
|
||||||
|
[curve1.p1.x, curve1.p1.y, 'Q'],
|
||||||
|
[curve1.p0.x, curve1.p0.y, ''],
|
||||||
|
// Left line
|
||||||
|
[curve0.p0.x, curve0.p0.y, 'L']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} p0
|
||||||
|
* @param {Object} p1
|
||||||
|
* @param {Object} p2
|
||||||
|
* @param {Number} t
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
getQuadraticBezierCurve (p0, p1, p2, t = 1) {
|
||||||
|
// Quadratic Bezier curve syntax: M(P0) Q(P1) P2
|
||||||
|
// Where P0, P2 are the curve endpoints and P1 is the control point
|
||||||
|
|
||||||
|
// More generally, at 0 <= t <= 1, we have the following:
|
||||||
|
// Q0(t), which varies linearly from P0 to P1
|
||||||
|
// Q1(t), which varies linearly from P1 to P2
|
||||||
|
// B(t), which is interpolated linearly between Q0(t) and Q1(t)
|
||||||
|
|
||||||
|
// For an intermediate curve at 0 <= t <= 1:
|
||||||
|
// P1(t) = Q0(t)
|
||||||
|
// P2(t) = B(t)
|
||||||
|
|
||||||
|
return {
|
||||||
|
p0,
|
||||||
|
p1: {
|
||||||
|
x: this.getLinearInterpolation(p0, p1, t, 'x'),
|
||||||
|
y: this.getLinearInterpolation(p0, p1, t, 'y')
|
||||||
|
},
|
||||||
|
p2: {
|
||||||
|
x: this.getQuadraticInterpolation(p0, p1, p2, t, 'x'),
|
||||||
|
y: this.getQuadraticInterpolation(p0, p1, p2, t, 'y')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} p0
|
||||||
|
* @param {Object} p1
|
||||||
|
* @param {Number} t
|
||||||
|
* @param {string} axis
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
*/
|
||||||
|
getLinearInterpolation (p0, p1, t, axis) {
|
||||||
|
return p0[axis] + (t * (p1[axis] - p0[axis]))
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Object} p0
|
||||||
|
* @param {Object} p1
|
||||||
|
* @param {Object} p2
|
||||||
|
* @param {Number} t
|
||||||
|
* @param {string} axis
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
*/
|
||||||
|
getQuadraticInterpolation (p0, p1, p2, t, axis) {
|
||||||
|
return (((1 - t) ** 2) * p0[axis]) +
|
||||||
|
(2 * (1 - t) * t * p1[axis]) +
|
||||||
|
((t ** 2) * p2[axis])
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Number} prevLeftX
|
||||||
|
* @param {Number} prevRightX
|
||||||
|
* @param {Number} prevHeight
|
||||||
|
* @param {Number} nextLeftX
|
||||||
|
* @param {Number} nextRightX
|
||||||
|
* @param {Number} nextHeight
|
||||||
|
* @param {Number} ratio
|
||||||
|
* @param {boolean} isValueOverlay
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
makeStraightPaths ({
|
||||||
|
prevLeftX,
|
||||||
|
prevRightX,
|
||||||
|
prevHeight,
|
||||||
|
nextLeftX,
|
||||||
|
nextRightX,
|
||||||
|
nextHeight,
|
||||||
|
ratio
|
||||||
|
}, isValueOverlay = false) {
|
||||||
|
if (isValueOverlay) {
|
||||||
|
const lengthTop = (prevRightX - prevLeftX)
|
||||||
|
const lengthBtm = (nextRightX - nextLeftX)
|
||||||
|
let rightSideTop = (lengthTop * (ratio || 0)) + prevLeftX
|
||||||
|
let rightSideBtm = (lengthBtm * (ratio || 0)) + nextLeftX
|
||||||
|
|
||||||
|
// Overlay should not be longer than the max length of the path
|
||||||
|
rightSideTop = Math.min(rightSideTop, lengthTop)
|
||||||
|
rightSideBtm = Math.min(rightSideBtm, lengthBtm)
|
||||||
|
|
||||||
|
return [
|
||||||
|
// Start position
|
||||||
|
[prevLeftX, prevHeight, 'M'],
|
||||||
|
// Move to right
|
||||||
|
[rightSideTop, prevHeight, 'L'],
|
||||||
|
// Move down
|
||||||
|
[rightSideBtm, nextHeight, 'L'],
|
||||||
|
// Move to left
|
||||||
|
[nextLeftX, nextHeight, 'L'],
|
||||||
|
// Wrap back to top
|
||||||
|
[prevLeftX, prevHeight, 'L']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [
|
||||||
|
// Start position
|
||||||
|
[prevLeftX, prevHeight, 'M'],
|
||||||
|
// Move to right
|
||||||
|
[prevRightX, prevHeight, 'L'],
|
||||||
|
// Move down
|
||||||
|
[nextRightX, nextHeight, 'L'],
|
||||||
|
// Move to left
|
||||||
|
[nextLeftX, nextHeight, 'L'],
|
||||||
|
// Wrap back to top
|
||||||
|
[prevLeftX, prevHeight, 'L']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Navigator
|
||||||
78
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Utils.js
vendored
Normal file
78
nezha-fronted/src/components/chart/chart/d3-funnel/d3-funnel/Utils.js
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
class Utils {
|
||||||
|
/**
|
||||||
|
* Determine whether the given parameter is an extendable object.
|
||||||
|
*
|
||||||
|
* @param {*} a
|
||||||
|
*
|
||||||
|
* @return {boolean}
|
||||||
|
*/
|
||||||
|
static isExtendableObject (a) {
|
||||||
|
return typeof a === 'object' && a !== null && !Array.isArray(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extends an object with the members of another.
|
||||||
|
*
|
||||||
|
* @param {Object} a The object to be extended.
|
||||||
|
* @param {Object} b The object to clone from.
|
||||||
|
*
|
||||||
|
* @return {Object}
|
||||||
|
*/
|
||||||
|
static extend (a, b) {
|
||||||
|
let result = {}
|
||||||
|
|
||||||
|
// If a is non-trivial, extend the result with it
|
||||||
|
if (Object.keys(a).length > 0) {
|
||||||
|
result = Utils.extend({}, a)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy over the properties in b into a
|
||||||
|
Object.keys(b).forEach((prop) => {
|
||||||
|
if (Utils.isExtendableObject(b[prop])) {
|
||||||
|
if (Utils.isExtendableObject(a[prop])) {
|
||||||
|
result[prop] = Utils.extend(a[prop], b[prop])
|
||||||
|
} else {
|
||||||
|
result[prop] = Utils.extend({}, b[prop])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
result[prop] = b[prop]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the legacy block array to a block object.
|
||||||
|
*
|
||||||
|
* @param {Array} block
|
||||||
|
*
|
||||||
|
* @returns {Object}
|
||||||
|
*/
|
||||||
|
static convertLegacyBlock (block) {
|
||||||
|
return {
|
||||||
|
label: block[0],
|
||||||
|
value: Utils.getRawBlockCount(block),
|
||||||
|
formattedValue: Array.isArray(block[1]) ? block[1][1] : null,
|
||||||
|
backgroundColor: block[2],
|
||||||
|
labelColor: block[3]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Given a raw data block, return its count.
|
||||||
|
*
|
||||||
|
* @param {Array} block
|
||||||
|
*
|
||||||
|
* @return {Number}
|
||||||
|
*/
|
||||||
|
static getRawBlockCount (block) {
|
||||||
|
if (Array.isArray(block)) {
|
||||||
|
return Array.isArray(block[1]) ? block[1][0] : block[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return block.value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Utils
|
||||||
2
nezha-fronted/src/components/chart/chart/d3-funnel/index.js
vendored
Normal file
2
nezha-fronted/src/components/chart/chart/d3-funnel/index.js
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
// Export default to provide support for non-ES6 solutions
|
||||||
|
module.exports = require('./d3-funnel/D3Funnel').default
|
||||||
@@ -130,7 +130,8 @@ export default {
|
|||||||
if (isTimeSeries(this.chartInfo.type) && (this.isConnect && this.isConnect !== 'none')) {
|
if (isTimeSeries(this.chartInfo.type) && (this.isConnect && this.isConnect !== 'none')) {
|
||||||
chart.connect('timeSeriesGroup')
|
chart.connect('timeSeriesGroup')
|
||||||
}
|
}
|
||||||
if (this.chartInfo.type !== 'pie' && this.chartInfo.type !== 'bar' && this.chartInfo.type !== 'treemap') {
|
|
||||||
|
if (this.chartInfo.type == 'line' || this.chartInfo.type == 'area' || this.chartInfo.type == 'point') {
|
||||||
if (this.chartInfo.param.min || this.chartInfo.param.max) {
|
if (this.chartInfo.param.min || this.chartInfo.param.max) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,26 +67,18 @@ export function getOption (type) {
|
|||||||
export function isTimeSeries (type) {
|
export function isTimeSeries (type) {
|
||||||
return type === chartType.line || type === chartType.area || type === chartType.point
|
return type === chartType.line || type === chartType.area || type === chartType.point
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isHexagon (type) {
|
export function isHexagon (type) {
|
||||||
return type === chartType.hexagon
|
return type === chartType.hexagon
|
||||||
}
|
}
|
||||||
export function isChartPie (type) {
|
export function isChartPie (type) {
|
||||||
return type === chartType.pie
|
return type === chartType.pie
|
||||||
}
|
}
|
||||||
export function isChartBubble (type) {
|
|
||||||
return type === chartType.bubble
|
|
||||||
}
|
|
||||||
export function isChartRank (type) {
|
|
||||||
return type === chartType.rank
|
|
||||||
}
|
|
||||||
export function isChartBar (type) {
|
export function isChartBar (type) {
|
||||||
return type === chartType.bar
|
return type === chartType.bar
|
||||||
}
|
}
|
||||||
export function isUrl (type) {
|
export function isUrl (type) {
|
||||||
return type === chartType.url
|
return type === chartType.url
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isText (type) {
|
export function isText (type) {
|
||||||
return type === chartType.text
|
return type === chartType.text
|
||||||
}
|
}
|
||||||
@@ -123,15 +115,25 @@ export function isTable (type) {
|
|||||||
export function isGauge (type) {
|
export function isGauge (type) {
|
||||||
return type === chartType.gauge
|
return type === chartType.gauge
|
||||||
}
|
}
|
||||||
export function isSankey (type) {
|
|
||||||
return type === chartType.sankey
|
|
||||||
}
|
|
||||||
export function isClock (type) {
|
export function isClock (type) {
|
||||||
return type === chartType.clock
|
return type === chartType.clock
|
||||||
}
|
}
|
||||||
export function isTopology (type) {
|
export function isTopology (type) {
|
||||||
return type === chartType.topologyLink
|
return type === chartType.topologyLink
|
||||||
}
|
}
|
||||||
|
export function isChartBubble (type) {
|
||||||
|
return type === chartType.bubble
|
||||||
|
}
|
||||||
|
export function isChartRank (type) {
|
||||||
|
return type === chartType.rank
|
||||||
|
}
|
||||||
|
export function isSankey (type) {
|
||||||
|
return type === chartType.sankey
|
||||||
|
}
|
||||||
|
export function isFunnel (type) {
|
||||||
|
return type === chartType.funnel
|
||||||
|
}
|
||||||
|
|
||||||
export function getGroupHeight (arr) {
|
export function getGroupHeight (arr) {
|
||||||
if (arr.length) {
|
if (arr.length) {
|
||||||
let lastItem = []
|
let lastItem = []
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ export function getChart (key) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function setChart (key, value) {
|
export function setChart (key, value) {
|
||||||
chartCache[`chart${key}`] && chartCache[`chart${key}`].dispose()
|
chartCache[`chart${key}`] && chartCache[`chart${key}`].dispose && chartCache[`chart${key}`].dispose()
|
||||||
chartCache[`chart${key}`] = value
|
chartCache[`chart${key}`] = value
|
||||||
}
|
}
|
||||||
const hexagonCache = {}
|
const hexagonCache = {}
|
||||||
|
|||||||
@@ -263,10 +263,6 @@ export const chart = {
|
|||||||
value: 'gauge',
|
value: 'gauge',
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.gauge.label')
|
label: i18n.t('dashboard.panel.chartForm.typeVal.gauge.label')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
value: 'sankey',
|
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.sankey.label')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
value: 'hexagon',
|
value: 'hexagon',
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.hexagonFigure.label')
|
label: i18n.t('dashboard.panel.chartForm.typeVal.hexagonFigure.label')
|
||||||
@@ -307,7 +303,6 @@ export const chart = {
|
|||||||
value: 'group',
|
value: 'group',
|
||||||
label: i18n.t('dashboard.panel.chartForm.group')
|
label: i18n.t('dashboard.panel.chartForm.group')
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
value: 'logs',
|
value: 'logs',
|
||||||
label: i18n.t('overall.logs')
|
label: i18n.t('overall.logs')
|
||||||
@@ -324,14 +319,6 @@ export const chart = {
|
|||||||
value: 'pie',
|
value: 'pie',
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.pie.label')
|
label: i18n.t('dashboard.panel.chartForm.typeVal.pie.label')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
value: 'bubble',
|
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.bubble.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: 'rank',
|
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.rank.label')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
value: 'log',
|
value: 'log',
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.log.label')
|
label: i18n.t('dashboard.panel.chartForm.typeVal.log.label')
|
||||||
@@ -351,6 +338,22 @@ export const chart = {
|
|||||||
{
|
{
|
||||||
value: 'clock',
|
value: 'clock',
|
||||||
label: i18n.t('dashboard.panel.chartForm.typeVal.clock.label')
|
label: i18n.t('dashboard.panel.chartForm.typeVal.clock.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'bubble',
|
||||||
|
label: i18n.t('dashboard.panel.chartForm.typeVal.bubble.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'rank',
|
||||||
|
label: i18n.t('dashboard.panel.chartForm.typeVal.rank.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'sankey',
|
||||||
|
label: i18n.t('dashboard.panel.chartForm.typeVal.sankey.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
value: 'funnel',
|
||||||
|
label: i18n.t('dashboard.panel.chartForm.typeVal.funnel.label')
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -471,10 +474,7 @@ export const chartType = {
|
|||||||
table: 'table',
|
table: 'table',
|
||||||
stat: 'stat',
|
stat: 'stat',
|
||||||
gauge: 'gauge',
|
gauge: 'gauge',
|
||||||
sankey: 'sankey',
|
|
||||||
pie: 'pie',
|
pie: 'pie',
|
||||||
bubble: 'bubble',
|
|
||||||
rank: 'rank',
|
|
||||||
treemap: 'treemap',
|
treemap: 'treemap',
|
||||||
log: 'log',
|
log: 'log',
|
||||||
text: 'text',
|
text: 'text',
|
||||||
@@ -487,7 +487,11 @@ export const chartType = {
|
|||||||
topology: 'topology',
|
topology: 'topology',
|
||||||
map: 'map',
|
map: 'map',
|
||||||
hexagon: 'hexagon',
|
hexagon: 'hexagon',
|
||||||
topologyLink: 'topologyLink'
|
topologyLink: 'topologyLink',
|
||||||
|
bubble: 'bubble',
|
||||||
|
rank: 'rank',
|
||||||
|
sankey: 'sankey',
|
||||||
|
funnel: 'funnel'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const chartLegendPlacement = {
|
export const chartLegendPlacement = {
|
||||||
|
|||||||
@@ -319,7 +319,7 @@
|
|||||||
<el-form-item
|
<el-form-item
|
||||||
:label="$t('config.assetLabel.display')"
|
:label="$t('config.assetLabel.display')"
|
||||||
class="form-item--half-width"
|
class="form-item--half-width"
|
||||||
prop="param.nullType"
|
prop="param.text"
|
||||||
v-if="isShowText(chartConfig.type)"
|
v-if="isShowText(chartConfig.type)"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
@@ -983,65 +983,7 @@ export default {
|
|||||||
name: this.$t('overall.hidden')
|
name: this.$t('overall.hidden')
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
chartTypeList: [
|
chartTypeList: []
|
||||||
{
|
|
||||||
id: 'line',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.line.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'area',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.stackArea.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'point',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.point.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'stat',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.singleStat.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'hexagon',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.hexagonFigure.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'bar',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bar.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'gauge',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.gauge.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'sankey',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.sankey.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'treemap',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.treemap.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'pie',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.pie.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'bubble',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'rank',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'log',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.log.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'table',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.table.label')
|
|
||||||
}
|
|
||||||
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -1119,7 +1061,8 @@ export default {
|
|||||||
case 'sankey':
|
case 'sankey':
|
||||||
case 'bubble':
|
case 'bubble':
|
||||||
case 'rank':
|
case 'rank':
|
||||||
if (this.oldType === 'stat' || this.oldType === 'gauge' || this.oldType === 'sankey' || this.oldType === 'hexagon' || this.oldType === 'bubble' || this.oldType === 'rank') {
|
case 'funnel':
|
||||||
|
if (this.oldType === 'stat' || this.oldType === 'gauge' || this.oldType === 'sankey' || this.oldType === 'hexagon' || this.oldType === 'bubble' || this.oldType === 'rank' || this.oldType === 'funnel') {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
this.chartConfig.param = {
|
this.chartConfig.param = {
|
||||||
|
|||||||
@@ -55,8 +55,6 @@ export default {
|
|||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
return false
|
return false
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
@@ -77,6 +75,7 @@ export default {
|
|||||||
case 'bubble':
|
case 'bubble':
|
||||||
case 'rank':
|
case 'rank':
|
||||||
case 'sankey':
|
case 'sankey':
|
||||||
|
case 'funnel':
|
||||||
return true
|
return true
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
@@ -94,9 +93,6 @@ export default {
|
|||||||
case 'stat':
|
case 'stat':
|
||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'sankey':
|
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
return false
|
return false
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
@@ -111,11 +107,8 @@ export default {
|
|||||||
case 'stat':
|
case 'stat':
|
||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'sankey':
|
|
||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
case 'bar':
|
case 'bar':
|
||||||
return false
|
return false
|
||||||
default: return false
|
default: return false
|
||||||
@@ -141,11 +134,12 @@ export default {
|
|||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'bar':
|
case 'bar':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'sankey':
|
|
||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
case 'bubble':
|
||||||
case 'rank':
|
case 'rank':
|
||||||
|
case 'sankey':
|
||||||
|
case 'funnel':
|
||||||
return true
|
return true
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
@@ -156,12 +150,9 @@ export default {
|
|||||||
case 'bar':
|
case 'bar':
|
||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
case 'stat':
|
case 'stat':
|
||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'sankey':
|
|
||||||
return false
|
return false
|
||||||
case 'line':
|
case 'line':
|
||||||
case 'area':
|
case 'area':
|
||||||
@@ -176,12 +167,13 @@ export default {
|
|||||||
case 'bar':
|
case 'bar':
|
||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
case 'stat':
|
case 'stat':
|
||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
|
case 'bubble':
|
||||||
|
case 'rank':
|
||||||
case 'sankey':
|
case 'sankey':
|
||||||
|
case 'funnel':
|
||||||
return true
|
return true
|
||||||
case 'line':
|
case 'line':
|
||||||
case 'area':
|
case 'area':
|
||||||
@@ -210,12 +202,13 @@ export default {
|
|||||||
case 'bar':
|
case 'bar':
|
||||||
case 'treemap':
|
case 'treemap':
|
||||||
case 'pie':
|
case 'pie':
|
||||||
case 'bubble':
|
|
||||||
case 'rank':
|
|
||||||
case 'stat':
|
case 'stat':
|
||||||
case 'hexagon':
|
case 'hexagon':
|
||||||
case 'gauge':
|
case 'gauge':
|
||||||
|
case 'bubble':
|
||||||
|
case 'rank':
|
||||||
case 'sankey':
|
case 'sankey':
|
||||||
|
case 'funnel':
|
||||||
return true
|
return true
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,18 +243,6 @@ export default {
|
|||||||
id: 'bar',
|
id: 'bar',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bar.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.bar.label')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'gauge',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.gauge.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'sankey',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.sankey.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'treemap',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.treemap.label')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: 'pie',
|
id: 'pie',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.pie.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.pie.label')
|
||||||
@@ -263,10 +251,26 @@ export default {
|
|||||||
id: 'bubble',
|
id: 'bubble',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'funnel',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.funnel.label')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'rank',
|
id: 'rank',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'sankey',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.sankey.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'gauge',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.gauge.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'treemap',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.treemap.label')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'table',
|
id: 'table',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.table.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.table.label')
|
||||||
@@ -298,18 +302,6 @@ export default {
|
|||||||
id: 'bar',
|
id: 'bar',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bar.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.bar.label')
|
||||||
},
|
},
|
||||||
{
|
|
||||||
id: 'gauge',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.gauge.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'sankey',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.sankey.label')
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 'treemap',
|
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.treemap.label')
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
id: 'pie',
|
id: 'pie',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.pie.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.pie.label')
|
||||||
@@ -318,10 +310,26 @@ export default {
|
|||||||
id: 'bubble',
|
id: 'bubble',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'funnel',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.funnel.label')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'rank',
|
id: 'rank',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'sankey',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.sankey.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'gauge',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.gauge.label')
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: 'treemap',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.treemap.label')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'log',
|
id: 'log',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.log.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.log.label')
|
||||||
|
|||||||
@@ -294,7 +294,7 @@
|
|||||||
<el-form-item
|
<el-form-item
|
||||||
:label="$t('config.assetLabel.display')"
|
:label="$t('config.assetLabel.display')"
|
||||||
class="form-item--half-width"
|
class="form-item--half-width"
|
||||||
prop="param.nullType"
|
prop="param.text"
|
||||||
v-if="isShowText(chartConfig.type)"
|
v-if="isShowText(chartConfig.type)"
|
||||||
>
|
>
|
||||||
<el-select
|
<el-select
|
||||||
@@ -894,6 +894,10 @@ export default {
|
|||||||
id: 'bubble',
|
id: 'bubble',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.bubble.label')
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'funnel',
|
||||||
|
name: this.$t('dashboard.panel.chartForm.typeVal.funnel.label')
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'rank',
|
id: 'rank',
|
||||||
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
name: this.$t('dashboard.panel.chartForm.typeVal.rank.label')
|
||||||
@@ -966,7 +970,8 @@ export default {
|
|||||||
case 'gauge':
|
case 'gauge':
|
||||||
case 'bubble':
|
case 'bubble':
|
||||||
case 'rank':
|
case 'rank':
|
||||||
if (this.oldType === 'stat' || this.oldType === 'gauge' || this.oldType === 'hexagon' || this.oldType === 'bubble' || this.oldType === 'rank') {
|
case 'funnel':
|
||||||
|
if (this.oldType === 'stat' || this.oldType === 'gauge' || this.oldType === 'hexagon' || this.oldType === 'bubble' || this.oldType === 'rank' || this.oldType === 'funnel') {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
this.chartConfig.param = {
|
this.chartConfig.param = {
|
||||||
|
|||||||
Reference in New Issue
Block a user