CN-671 Dashboard - 多维度表格优化:列数值和环比靠中间对齐;表格增加“show more”,接口请求50条,默认展示10条,点击show more加载全部;增加列排序功能;

This commit is contained in:
hanyuxia
2022-08-26 16:26:31 +08:00
parent 11b1941146
commit 15eb858602
3 changed files with 125 additions and 91 deletions

View File

@@ -1,7 +1,7 @@
.tabs {
$blue: #2C72C6;
$grey: #353636;
height:100%;
height:calc(100% - 64px);
font-size:12px;
.tab-hide{
margin-top:40px;
@@ -12,7 +12,7 @@
height:100%;
border: 1px solid #E2E5EC;;
padding:1px;
border-radius: 4px;
border-radius: 4px 4px 0 0;
.tab-table {
border:0px;
.data-click:hover{
@@ -21,12 +21,22 @@
}
.data-total{
display: flex !important;
justify-content:center;
}
.data-value{
display: flex !important;
justify-content:right;
width:50%;
}
.data-trend{
display: flex;
width:50%;
}
.data-total-trend {
display: flex;
justify-content:left;
margin-left: 6px;
align-items: center;
justify-content: center;
margin-top: 2px;
border-radius: 10px;
font-weight:500;
@@ -92,10 +102,15 @@
height: calc(100% - 40px);
border:none;
.el-table__body-wrapper {
height: calc(100% - 32px) !important;
height: calc(100% - 34px) !important;
}
}
}
.cn-chart__tabs-hide-tab {
.el-tabs__content {
height: 100% !important;
}
}
.tab-search {
position:absolute;
height:40px;
@@ -270,3 +285,33 @@
right:200px !important;
transform: translateY(126px) !important;*/
}
.fixed-row {
display:flex;
justify-content: flex-start;
align-items: center;
margin-top: 2px;
width: 100%;
height:40px;
border:solid 1px #E2E5EC;
padding-left:10px !important;
text-align: left;
border-top:0px;
border-radius:0 0 4px 4px;
color:#046eca;
.fixed-button {
display:flex;
justify-content: center;
padding:7px 10px;
align-items: center;
height: 30px;
}
.fixed-button:hover {
cursor:pointer;
background: #e6f4ff;
box-shadow: 0 2px 4px 0 rgba(51,51,51,0.02);
border-radius: 4px;
}
}
.btn-up{
margin-top:40px;
}

View File

@@ -695,6 +695,8 @@ export const networkTable = {
}
}
export const networkDefaultLimit = 50
export const dnsServerRole = {
RTDNS: 'RTDNS',
TLDNS: 'TLDNS',

View File

@@ -1,8 +1,7 @@
<template>
<div class="tabs">
<div class="tabs" :style="showTabs?'':'height: calc(100% - 104px);'">
<el-tabs v-model="activeTab"
class="cn-chart__tabs"
:class="showTabs?'':'tab-hide'"
:class="showTabs?'cn-chart__tabs':'tab-hide cn-chart__tabs cn-chart__tabs-hide-tab'"
@tab-click="handleClick"
>
<template v-for="(tab,index) in list">
@@ -18,17 +17,21 @@
<el-table
:id="`tabTable_${index}`"
:ref="`dataTable_${index}`"
:data="tableData"
:data="tableData.slice(0,showRecordNum)"
border
:cell-style="tableCellStyle"
:header-cell-style="tableHeaderCellStyle"
class="tab-table"
height="100%"
:default-sort="{ prop: 'date', order: 'descending' }"
empty-text=" "
>
<template v-for="(item,index) in customTableTitles">
<el-table-column
v-if="item.checked"
sortable
align="center"
:prop="item.prop"
class="data-column"
>
<template #header>
@@ -37,7 +40,10 @@
<template #default="scope" :column="item">
<template v-if="item.columnType === tableColumnType.chainRatio" >
<div class="data-total" >
<div class="data-value">
{{scope.row[item.prop]?((scope.row[item.prop][0]||scope.row[item.prop][0]===0)? unitConvert(scope.row[item.prop][0], unitTypes.number).join(' ') : '-'):'' }}
</div>
<div class="data-trend">
<template v-if="scope.row[item.prop]">
<div v-if="scope.row[item.prop][1] === 'up'" class="data-total-trend data-total-trend-red">
<i class="cn-icon-rise1 cn-icon"></i><span>{{scope.row[item.prop][2]}}</span>
@@ -53,6 +59,7 @@
-
</template>
</div>
</div>
</template>
<template v-else-if="item.columnType === tableColumnType.dillDown" >
<div class="data-click" @click="handleTabValue(item.label,scope.row['tab'])">{{scope.row['tab']}}</div>
@@ -72,10 +79,9 @@
</div>
</template>
</el-table>
</el-tab-pane>
</template>
</template>
</el-tabs>
<div class="tab-search" >
<div class="search-select" v-if="hasMetricSearch">
@@ -151,13 +157,14 @@
</el-tabs>
</el-popover>
</div>
</div>
<div class="fixed-row">
<div class="fixed-button" :class="showTabs?'':''" @click="showMore" >{{$t('network.showTop50Results')}}</div>
</div>
</template>
<script>
import { ref } from 'vue'
import { operationType, unitTypes, networkTable, tableColumnType } from '@/utils/constants'
import { operationType, unitTypes, networkTable, tableColumnType, networkDefaultLimit } from '@/utils/constants'
import { get } from '@/utils/http'
import unitConvert from '@/utils/unit-convert'
import { getChainRatio, computeScore } from '@/utils/tools'
@@ -197,6 +204,7 @@ export default {
networkTabList: [], // 原始状态列表
showBackground: false,
tableData: [],
showRecordNum: 10,
showTabs: true,
columnNameGroup: {},
cycleColumnNameGroup: {},
@@ -234,14 +242,14 @@ export default {
const curTab = this.getCurTab()
let queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop
}
const condition = this.$store.getters.getQueryCondition
if (condition) {
queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop,
q: condition
}
@@ -252,6 +260,14 @@ export default {
},
mixins: [chartMixin],
methods: {
showMore () {
this.showRecordNum = 50
},
rowClass (row, column, rowIndex, columnIndex) {
if (rowIndex === 49) {
return 'fixed-row'
}
},
changeMetric () {
const beforeType = this.$store.getters.getTabOperationBeforeType
if (beforeType != operationType.thirdMenu) {
@@ -329,14 +345,14 @@ export default {
}
let queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop
}
const condition = this.$store.getters.getQueryCondition
if (condition) {
queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop,
q: condition
}
@@ -357,6 +373,22 @@ export default {
return tabObjGroup = this.networkTabList.filter(item => item.checked)[0]
}
},
// 隐藏tabs的标题
hideTabs (curTab) {
// 此处的id为tab-name
this.list.forEach(item => {
const tabDom = document.getElementById('tab-' + item.label)
const paneDom = document.getElementById('pane-' + item.label)
if (tabDom) {
tabDom.style.display = 'none'
}
if (paneDom) {
if (curTab.label === item.label) {
paneDom.style.display = ''
}
}
})
},
initData () {
const curTab = this.getCurTab()
const columnName = this.$store.getters.getBreadcrumbColumnName
@@ -377,19 +409,7 @@ export default {
}
this.showTabs = true
} else if (curOperationType === operationType.thirdMenu) { // 点击的为第三级菜单
// 此处的id为tab-name
this.list.forEach(item => {
const tabDom = document.getElementById('tab-' + item.label)
const paneDom = document.getElementById('pane-' + item.label)
if (tabDom) {
tabDom.style.display = 'none'
}
if (paneDom) {
if (curTab.label === item.label) {
paneDom.style.display = ''
}
}
})
this.hideTabs(curTab)
this.customTableTitles[0].label = curTab.label
this.showTabs = false
} else if (curOperationType === operationType.fourthMenu) { // 点击的为第四级菜单
@@ -411,36 +431,14 @@ export default {
} else if (curOperationType === operationType.changeMetric) { // 切换metric
const beforeOperationType = this.$store.getters.getTabOperationBeforeType
if (beforeOperationType === operationType.thirdMenu) {
this.list.forEach(item => {
const tabDom = document.getElementById('tab-' + item.label)
const paneDom = document.getElementById('pane-' + item.label)
if (tabDom) {
tabDom.style.display = 'none'
}
if (paneDom) {
if (curTab.label === item.label) {
paneDom.style.display = ''
}
}
})
this.hideTabs(curTab)
this.customTableTitles[0].label = curTab.label
this.showTabs = false
}
} else if (curOperationType === operationType.customize) { // customize
const beforeOperationType = this.$store.getters.getTabOperationBeforeType
if (beforeOperationType === operationType.thirdMenu) {
this.list.forEach(item => {
const tabDom = document.getElementById('tab-' + item.label)
const paneDom = document.getElementById('pane-' + item.label)
if (tabDom) {
tabDom.style.display = 'none'
}
if (paneDom) {
if (curTab.label === item.label) {
paneDom.style.display = ''
}
}
})
this.hideTabs(curTab)
this.customTableTitles[0].label = curTab.label
this.showTabs = false
} else {
@@ -671,14 +669,14 @@ export default {
let queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: tabList[0].prop
}
const condition = this.$store.getters.getQueryCondition
if (condition) {
queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: tabList[0].prop,
q: condition
}
@@ -842,14 +840,14 @@ export default {
let queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop
}
const condition = this.$store.getters.getQueryCondition
if (condition) {
queryParams = {
orderBy: this.orderBy,
limit: 10,
limit: networkDefaultLimit,
type: curTab.prop,
q: condition
}
@@ -970,7 +968,7 @@ export default {
extraParams = {
type: queryType || this.networkTabList[0].prop,
orderBy: this.orderBy ? this.orderBy : 'bytesTotal',
limit: 10
limit: networkDefaultLimit
}
const condition = this.$store.getters.getQueryCondition
if (condition) {
@@ -1033,18 +1031,7 @@ export default {
this.customTableTitles[0].label = curTab.label
this.showTabs = false
this.$nextTick(() => {
this.list.forEach(item => {
const tabDom = document.getElementById('tab-' + item.label)
const paneDom = document.getElementById('pane-' + item.label)
if (tabDom) {
tabDom.style.display = 'none'
}
if (paneDom) {
if (curTab.label === item.label) {
paneDom.style.display = ''
}
}
})
this.hideTabs(curTab)
})
}
this.$nextTick(() => {