<script setup lang="ts">
|
import { computed, reactive, ref } from 'vue'
|
import { queryTreeApi } from '@/api/visualization/dataVisualization'
|
import { filterEmptyFolderTree } from '@/utils/canvasUtils'
|
const dialogVisible = ref(false)
|
import dvDashboardSpine from '@/assets/svg/dv-dashboard-spine.svg'
|
import dvFolder from '@/assets/svg/dv-folder.svg'
|
import { useI18n } from '@/hooks/web/useI18n'
|
const closeHandler = () => {
|
dialogVisible.value = false
|
}
|
const { t } = useI18n()
|
const emits = defineEmits(['selectConfirm'])
|
|
const state = reactive({
|
panelList: [],
|
dvSelectProps: {
|
label: 'name',
|
children: 'children',
|
value: 'id',
|
isLeaf: 'leaf',
|
disabled: 'disabled'
|
},
|
curScreenId: null,
|
dvType: 'dashboard'
|
})
|
const canvasTypeName = computed(() =>
|
state.dvType === 'dataV' ? t('work_branch.big_data_screen') : t('work_branch.dashboard')
|
)
|
|
const init = param => {
|
const { dvType, screenId } = param
|
state.dvType = dvType
|
dialogVisible.value = true
|
state.curScreenId = screenId
|
loadRTree(dvType)
|
}
|
|
const loadRTree = dvType => {
|
const request = { busiFlag: dvType, resourceTable: 'core' }
|
queryTreeApi(request).then(rsp => {
|
if (rsp && rsp[0]?.id === '0') {
|
state.panelList = rsp[0].children
|
} else {
|
state.panelList = rsp
|
}
|
state.panelList = filterEmptyFolderTree(state.panelList)
|
})
|
}
|
|
const dvNodeClick = data => {
|
if (data.leaf && data.id !== state.curScreenId) {
|
state.curScreenId = data.id
|
}
|
}
|
|
const close = () => {
|
dialogVisible.value = false
|
}
|
|
const confirm = () => {
|
emits('selectConfirm', state.curScreenId)
|
close()
|
}
|
|
defineExpose({
|
init
|
})
|
</script>
|
|
<template>
|
<el-dialog
|
v-model="dialogVisible"
|
:show-close="true"
|
:close-on-click-modal="false"
|
:title="t('visualization.select_resource', [canvasTypeName])"
|
append-to-body
|
@close="closeHandler"
|
width="400"
|
>
|
<el-form-item style="position: relative" prop="rid">
|
<el-tree-select
|
v-model="state.curScreenId"
|
:data="state.panelList"
|
:props="state.dvSelectProps"
|
:render-after-expand="false"
|
filterable
|
@node-click="dvNodeClick"
|
class="dv-selector"
|
>
|
<template #default="{ node, data }">
|
<div class="label-content-details">
|
<el-icon size="18px" style="display: inline-block" v-if="data.leaf">
|
<Icon name="dv-dashboard-spine"><dvDashboardSpine class="svg-icon" /></Icon>
|
</el-icon>
|
<el-icon size="18px" style="display: inline-block" v-else>
|
<Icon name="dv-folder"><dvFolder class="svg-icon" /></Icon>
|
</el-icon>
|
<span style="margin-left: 8px; font-size: 14px" :title="node.label">{{
|
node.label
|
}}</span>
|
</div>
|
</template>
|
</el-tree-select>
|
</el-form-item>
|
<template #footer>
|
<span class="m-dialog-footer">
|
<el-button secondary @click="close">{{ t('commons.close') }}</el-button>
|
<el-button type="primary" @click="confirm">{{ t('commons.confirm') }}</el-button>
|
</span>
|
</template>
|
</el-dialog>
|
</template>
|
|
<style scoped lang="less">
|
.m-dialog-footer {
|
display: flex;
|
flex-direction: row;
|
align-items: center;
|
justify-content: center;
|
}
|
</style>
|