This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nezha-nezha-fronted/nezha-fronted/src/components/common/detailView/nzDetailView.vue

304 lines
9.7 KiB
Vue
Raw Normal View History

<template>
2021-11-01 17:23:01 +08:00
<div :class="from" class="list-page detail-view">
<!-- 主页面 -->
<div class="main-list">
<!-- 顶部工具栏 -->
<div class="main-modal"></div>
<div class="main-container">
<div class="top-tools">
<div class="top-tool-left" style="min-width: 300px">
<slot name="top-tool-left"></slot>
2021-10-12 12:25:20 +08:00
<div v-if="showLayout.indexOf('searchInput') > -1" class="top-tool-search margin-r-20" :class="{'project-search alert-table asset-table endpoint-table': searchRight}">
<search-input ref="searchInput" :from="from" :position="from" :inTransform="bottomBox.inTransform" :searchMsg="searchMsg" @search="search"></search-input>
2021-10-12 12:25:20 +08:00
</div>
</div>
<div :class="{'top-tool-main-right-to-left': bottomBox.showSubList}" class="top-tool-right">
<slot name="top-tool-right"></slot>
<el-dropdown
type="primary"
v-if="showLayout.indexOf('detailViewSet') > -1"
2021-10-25 17:59:17 +08:00
trigger="click"
@command="changeDetailType">
<button class="top-tool-btn table-column-setting"
type="button" :title="$t('overall.switchView')">
<i class="nz-icon nz-icon-detail-view" />
</button>
<el-dropdown-menu slot="dropdown" class="right-box-select-top right-public-box-dropdown-top">
2021-10-14 14:45:06 +08:00
<el-dropdown-item :command="'list'" :class="detailType === 'list' ? 'active' : ''">{{$t('asset.detail.list')}}</el-dropdown-item>
<el-dropdown-item :command="'view'" :class="detailType === 'view' ? 'active' : ''">{{$t('asset.detail.detail')}}</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!-- 顶部分页组件当打开底部上滑框时出现 -->
<!-- <div v-if="showLayout.indexOf('pagination') > -1" class="pagination-top pagination-top-hide display-none"></div>-->
</div>
<div :style="{ height: nzTableHeight }" class="nz-detail-view" :class="dataLength?'':'nz-detail-view-no-data'">
2022-03-01 15:19:43 +08:00
<div class="nz-detail-view-left" v-show="dataLength">
<slot name="nz-detail-view-list"></slot>
<div v-if="showLayout.indexOf('pagination') > -1" class="nz-detail-view-pagination">
<slot name="pagination"></slot>
</div>
</div>
2022-03-01 15:19:43 +08:00
<div v-if="!dataLength" class="no-data">
<svg class="icon" aria-hidden="true">
<use xlink:href="#nz-icon-no-data-list"></use>
</svg>
2021-10-28 17:53:27 +08:00
<div class="table-no-data__title">No results found</div>
</div>
<div class="nz-detail-view-right" v-if="detailViewRightObj">
2021-10-14 14:45:06 +08:00
<detailViewRight
@getTableData = 'getTableData'
ref="detailViewRight"
v-if="detailViewRightObj"
:from="from"
:obj="detailViewRightObj"
2023-03-15 15:39:06 +08:00
:target-tab="'dashboardTab'"
2021-10-14 14:45:06 +08:00
/>
</div>
</div>
</div>
</div>
<!-- 全屏查看 -->
<el-dialog
v-if="topologyShow"
:visible.sync="topologyShow"
:show-close="false"
class="nz-dialog chart-fullscreen"
destroy-on-close
fullscreen
:modal-append-to-body="false"
>
<panel-chart
:ref="'chart-fullscreen' + topologyChartInfo.id"
:chart-info="topologyChartInfo"
:close-on-click-modal="false"
:from="from"
:time-range="timeRange"
:is-fullscreen="true"
@showFullscreen="showFullscreen"
></panel-chart>
</el-dialog>
<delete-button
ref="deleteButton"
:from="triggerFrom"
:forceDeleteShow="forceDeleteShow"
:deleteTitle="deleteTitle"
type=''
:title="$t('overall.delete')"
:api="api"
:single="single"
:delete-objs="singleDelete"
@before="delFlag=true"
></delete-button>
<diagnosis-tab
ref="diagnosisTab"
:diagnosisTabData ="diagnosisTabData"
></diagnosis-tab>
<config-sync ref="configSync" type="single" :from="triggerFrom" :batch-objs="syncObj"></config-sync>
</div>
</template>
<script>
import { fromRoute } from '@/components/common/js/constants'
import { bottomBoxWindow } from '@/components/common/js/tools'
import detailViewRight from '@/components/common/detailView/view/detailViewRight'
import panelChart from '@/components/chart/panelChart'
import deleteButton from '@/components/common/deleteButton'
import diagnosisTab from '@/components/common/diagnosisTab'
import configSync from '@/components/common/configSync'
export default {
name: 'nzDataList',
components: {
detailViewRight,
panelChart,
deleteButton,
diagnosisTab,
configSync
},
props: {
from: {
type: String,
default: ''
},
tableTitle: {
type: Array
},
detailType: {
type: String,
default: ''
},
customTableTitle: {
type: Array
},
dataLength: {
type: Number,
default: 1
},
layout: {
type: Array,
default () { return [] }
},
searchMsg: {
type: Object
},
nzTableHeightOffset: Number,
searchRight: Boolean,
operationRecord: Boolean,
detailViewRightObj: {}
},
computed: {
nzTableHeight () {
if (this.nzTableHeightOffset) {
if (this.layout.indexOf('clickSearch') > -1) {
return `calc(100% - ${this.nzTableHeightOffset}px`
}
}
return ''
},
topologyShow () {
return this.$store.getters.getTopologyShow
},
topologyChartInfo () {
return this.$store.getters.getTopologyChartInfo
},
showDeleteTableRel () {
return this.$store.getters.getShowDeleteTableRel
},
deleteTableRel () {
return this.$store.getters.getDeleteTableRel
},
diagnosisTab () {
return this.$store.getters.getDiagnosisTab
},
showConfigSync () {
return this.$store.getters.getShowConfigSync
},
configSync () {
return this.$store.getters.getConfigSync
}
},
data () {
return {
fromRoute: fromRoute,
/* 二级页面相关 */
bottomBox: {
object: {},
mainResizeShow: true, // dom高度改变时是否展示|隐藏
subResizeShow: true,
isFullScreen: false, // 全屏状态
showSubList: false, // 是否显示二级列表
targetTab: '', // 显示二级列表中的哪个页签
inTransform: false // 搜索框相关搜索条件下拉框是否在transform里
},
tools: {
toTopBtnTop: this.$tableHeight.toTopBtnTop, // to-top按钮的top属性
tableHover: false, // 控制滚动条和top按钮同时出现
showCustomTableTitle: false // 自定义列弹框是否显示
},
showLayout: [],
timeRange: [new Date(), new Date()],
single: true,
deleteTitle: '',
forceDeleteShow: false,
singleDelete: [],
diagnosisTabData: {},
// 配置同步数据
syncObj: [],
triggerFrom: ''
}
},
methods: {
updateCustomTableTitle (custom) {
this.$emit('update:customTableTitle', custom)
},
// 全屏
fullScreen () {
const vm = this
bottomBoxWindow.fullScreen(vm)
},
// 退出全屏
exitFullScreen () {
const vm = this
bottomBoxWindow.exitFullScreen(vm)
},
// 鼠标拖动二级列表
listResize (e) {
const vm = this
bottomBoxWindow.listResize(vm, e)
},
showBottomBox (targetTab, row) {
this.bottomBox.targetTab = targetTab
this.bottomBox.object = JSON.parse(JSON.stringify(row))
this.bottomBox.showSubList = true
},
search (searchObj) {
this.$emit('search', searchObj)
},
getTableData () {
this.$emit('getTableData')
},
changeDetailType (item) {
this.$emit('changeDetailType', item)
},
showFullscreen (flag) {
this.$store.commit('setTopologyShow', flag)
},
configSyncRow (row, from) {
this.triggerFrom = from || this.from
this.syncObj = [row]
this.$nextTick(() => {
this.$refs.configSync.showDialog()
})
},
delTableRelRow (url, row, forceDeleteShow = false, single = false, deleteTitle = '', from) {
this.triggerFrom = from || this.from
this.api = url
this.singleDelete = [row]
this.forceDeleteShow = forceDeleteShow
this.single = single
this.deleteTitle = deleteTitle
this.$refs.deleteButton.batchDelete()
},
delTableRow (ids) { // 接收一个 删除的id数组 判断当前底部弹窗id 是否包含 包含则关闭当前弹窗
if (ids.indexOf(this.bottomBox.object.id) !== -1) {
this.bottomBox = {
object: {},
mainResizeShow: true, // dom高度改变时是否展示|隐藏
subResizeShow: true,
isFullScreen: false, // 全屏状态
showSubList: false, // 是否显示二级列表
targetTab: '', // 显示二级列表中的哪个页签
inTransform: false // 搜索框相关搜索条件下拉框是否在transform里
}
}
}
},
watch: {
'bottomBox.showSubList': function (n) {
const vm = this
bottomBoxWindow.showSubListWatch(vm, n)
},
layout: {
immediate: true,
deep: true,
handler (n) {
this.showLayout = [...n]
}
},
showDeleteTableRel (n) {
if (n) {
this.delTableRelRow(this.deleteTableRel.url, this.deleteTableRel.row, this.deleteTableRel.forceDeleteShow, this.deleteTableRel.single, this.deleteTableRel.deleteTitle, this.deleteTableRel.from)
}
},
diagnosisTab (n) {
this.diagnosisTabData = n
},
showConfigSync (n) {
if (n) {
this.configSyncRow(this.configSync.row, this.configSync.from)
}
}
}
}
</script>