<script lang="ts" setup>
|
import icon_add_outlined from '@/assets/svg/icon_add_outlined.svg'
|
import icon_deleteTrash_outlined from '@/assets/svg/icon_delete-trash_outlined.svg'
|
import { guid } from '@/views/visualized/data/dataset/form/util.js'
|
import { useI18n } from '@/hooks/web/useI18n'
|
import { ElMessage } from 'element-plus-secondary'
|
import { ref, shallowRef, computed } from 'vue'
|
import { cloneDeep } from 'lodash-es'
|
|
const dialogVisible = ref(false)
|
const treeList = ref([])
|
const datasetMap = shallowRef([])
|
const emits = defineEmits(['saveTree'])
|
const { t } = useI18n()
|
const addCascadeItem = () => {
|
treeList.value.push({
|
field: {
|
id: ''
|
},
|
id: guid()
|
})
|
}
|
const handleBeforeClose = () => {
|
dialogVisible.value = false
|
}
|
const init = (arr, treeArr) => {
|
datasetMap.value = cloneDeep(arr)
|
treeList.value = cloneDeep(treeArr).map(ele => ({ field: ele, id: ele.id }))
|
dialogVisible.value = true
|
}
|
|
const disableFieldArr = computed(() => {
|
return treeList.value.map(ele => ele.field).map(ele => ele.id)
|
})
|
|
const cancelClick = () => {
|
handleBeforeClose()
|
}
|
const setCascadeArrBack = () => {
|
let isError = false
|
const arr = cloneDeep(treeList.value).map(item => {
|
if (!item.field?.id) {
|
isError = true
|
}
|
return item.field
|
})
|
|
return {
|
arr,
|
isError
|
}
|
}
|
const confirmClick = () => {
|
const { isError, arr } = setCascadeArrBack()
|
if (isError) {
|
ElMessage.error(t('v_query.select_a_field'))
|
return
|
}
|
emits('saveTree', arr)
|
handleBeforeClose()
|
}
|
const indexNumCascade = [
|
t('visualization.number1'),
|
t('visualization.number2'),
|
t('visualization.number3'),
|
t('visualization.number4'),
|
t('visualization.number5')
|
]
|
|
const deleteCascade = idx => {
|
treeList.value.splice(idx, 1)
|
}
|
|
defineExpose({
|
init
|
})
|
</script>
|
|
<template>
|
<el-dialog
|
v-model="dialogVisible"
|
width="600"
|
modal-class="tree-field_dialog"
|
:before-close="handleBeforeClose"
|
@mousedown.stop
|
@mousedup.stop
|
:title="t('v_query.tree_structure_design')"
|
>
|
<div class="cascade-content">
|
<div style="display: flex; align-items: center; justify-content: space-between">
|
<el-button :disabled="treeList.length === 5" text @click="addCascadeItem">
|
<template #icon>
|
<Icon name="icon_add_outlined"><icon_add_outlined class="svg-icon" /></Icon>
|
</template>
|
{{ t('v_query.add_level') }}
|
</el-button>
|
</div>
|
<div class="cascade-item">
|
<div class="label">{{ t('visualization.level') }}</div>
|
<div class="item-name">{{ t('v_query.tree_query_field') }}</div>
|
</div>
|
<div class="cascade-item" v-for="(ele, idx) in treeList" :key="ele.id">
|
<div class="label">{{ t('visualization.level') }}{{ indexNumCascade[idx] }}</div>
|
<div class="item-name">
|
<el-select value-key="id" v-model="ele.field" style="width: 300px">
|
<el-option
|
:disabled="disableFieldArr.includes(item.id)"
|
v-for="item in datasetMap"
|
:key="item.id"
|
:label="item.name"
|
:value="item"
|
/>
|
</el-select>
|
</div>
|
<el-button @click="deleteCascade(idx)" class="cascade-delete" text>
|
<template #icon>
|
<Icon name="icon_delete-trash_outlined"
|
><icon_deleteTrash_outlined class="svg-icon"
|
/></Icon>
|
</template>
|
</el-button>
|
</div>
|
</div>
|
<template #footer>
|
<div class="dialog-footer">
|
<el-button secondary @click="cancelClick">{{ t('common.cancel') }}</el-button>
|
<el-button type="primary" @click="confirmClick"> {{ t('pblink.sure_bt') }} </el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</template>
|
|
<style lang="less">
|
.tree-field_dialog {
|
.cascade-content {
|
box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.12);
|
border: 1px solid #e4e7ed;
|
padding: 24px;
|
padding-top: 8px;
|
margin-top: 8px;
|
|
.cascade-item {
|
display: flex;
|
align-items: center;
|
width: 100%;
|
height: 40px;
|
.label {
|
width: 100px;
|
}
|
|
.item-name {
|
width: 300px;
|
}
|
}
|
|
.cascade-delete-block,
|
.cascade-delete {
|
width: 40px;
|
font-size: 20px;
|
color: #646a73;
|
margin-left: 20px;
|
}
|
}
|
}
|
</style>
|