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

305 lines
9.8 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<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>
<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>
</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"
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">
<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'">
<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>
<div v-if="!dataLength" class="no-data">
<svg class="icon" aria-hidden="true">
<use xlink:href="#nz-icon-no-data-list"></use>
</svg>
<div class="table-no-data__title">No results found</div>
</div>
<div class="nz-detail-view-right" v-if="detailViewRightObj">
<detailViewRight
@getTableData = 'getTableData'
ref="detailViewRight"
v-if="detailViewRightObj"
:from="from"
:obj="detailViewRightObj"
:target-tab="'dashboardTab'"
/>
</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" @getTableData="getTableData"></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: 'nzDetailView',
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,
/* 二级页面相关 */
api: '',
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>