diff --git a/core/core-frontend/src/custom-component/v-query/QueryCascade.vue b/core/core-frontend/src/custom-component/v-query/QueryCascade.vue index b6deb440d8..2a5fc0da61 100644 --- a/core/core-frontend/src/custom-component/v-query/QueryCascade.vue +++ b/core/core-frontend/src/custom-component/v-query/QueryCascade.vue @@ -15,6 +15,7 @@ interface Cascade { queryId: string deType: string fieldId: string + isTree: boolean } type cascadeMap = Record @@ -68,6 +69,7 @@ const init = (cascadeMap: cascadeMap, arr) => { cascadeList.value = cloneDeep(arr) datasetMap.value = Object.values(cascadeMap).map(ele => ({ label: ele.name, + isTree: ele.isTree, deType: ele.deType, value: `${ele.datasetId}--${ele.queryId}--${ele.fieldId}` })) @@ -256,7 +258,7 @@ defineExpose({ style="width: 300px" > { const setCascadeDefault = val => { conditions.value.forEach(ele => { if ( - ele.optionValueSource === 1 && - [0, 2, 5].includes(+ele.displayType) && - val.includes(ele.id) + (ele.optionValueSource === 1 && + [0, 2, 5].includes(+ele.displayType) && + val.includes(ele.id)) || + [9].includes(+ele.displayType) ) { ele.selectValue = Array.isArray(ele.selectValue) ? [] : undefined ele.defaultValue = Array.isArray(ele.defaultValue) ? [] : undefined @@ -1176,21 +1177,26 @@ const CascadeDialog = defineAsyncComponent(() => import('./QueryCascade.vue')) const cascadeDialog = ref() const openCascadeDialog = () => { const cascadeMap = conditions.value - .filter( - ele => - [0, 2, 5].includes(+ele.displayType) && - ele.optionValueSource === 1 && - !!ele.checkedFields?.length && - !!Object.values(ele.checkedFieldsMap).filter(item => !!item).length - ) + .filter(ele => { + return ( + ([0, 2, 5].includes(+ele.displayType) && + ele.optionValueSource === 1 && + !!ele.checkedFields?.length && + !!Object.values(ele.checkedFieldsMap).filter(item => !!item).length) || + ([9].includes(+ele.displayType) && ele.treeFieldList?.length) + ) + }) .reduce((pre, next) => { + const isTree = [9].includes(+next.displayType) + const fieldId = isTree ? next.treeFieldList[0].id : next.field.id pre[next.id] = { datasetId: next.dataset.id, + isTree, name: next.name, queryId: next.id, - fieldId: next.field.id, + fieldId: fieldId, deType: (datasetMap[next.dataset.id]?.fields?.dimensionList || next.dataset.fields).find( - ele => ele.id === next.field.id + ele => ele.id === fieldId )?.deType } return pre diff --git a/core/core-frontend/src/custom-component/v-query/Tree.vue b/core/core-frontend/src/custom-component/v-query/Tree.vue index b2f8f65a59..b6179d1422 100644 --- a/core/core-frontend/src/custom-component/v-query/Tree.vue +++ b/core/core-frontend/src/custom-component/v-query/Tree.vue @@ -9,8 +9,10 @@ import { computed, inject, Ref, + onBeforeMount, shallowRef } from 'vue' +import { useEmitt } from '@/hooks/web/useEmitt' import { cloneDeep, debounce } from 'lodash-es' import { getFieldTree } from '@/api/dataset' import colorFunctions from 'less/lib/less/functions/color.js' @@ -40,6 +42,7 @@ interface SelectConfig { } const customStyle: any = inject('$custom-style-filter') +const cascadeList = inject('cascade-list', Function, true) const props = defineProps({ config: { type: Object as PropType, @@ -235,14 +238,64 @@ const dfs = arr => { return { ...ele, value: ele.id, label: ele.text, children } }) } - +const cascade = computed(() => { + return cascadeList() || [] +}) const loading = ref(false) +const getCascadeFieldId = () => { + const filter = [] + cascade.value.forEach(ele => { + let condition = null + ele.forEach(item => { + const [_, queryId, fieldId] = item.datasetId.split('--') + if (queryId === config.value.id && condition) { + if (item.fieldId) { + condition.fieldId = item.fieldId + } + filter.push(condition) + } else { + if (props.isConfig) { + if (!!item.selectValue?.length) { + condition = { + fieldId: fieldId, + operator: 'in', + value: [...item.selectValue] + } + } + } else { + if (!!item.currentSelectValue?.length) { + condition = { + fieldId: fieldId, + operator: 'in', + value: [...item.currentSelectValue] + } + } + } + } + }) + }) + return filter +} +const getOptionFromCascade = () => { + config.value.selectValue = config.value.multiple ? [] : undefined + treeValue.value = config.value.multiple ? [] : undefined + getTreeOption() +} + +onBeforeMount(() => { + useEmitt({ + name: `${config.value.id}-select`, + callback: getOptionFromCascade + }) +}) + const getTreeOption = debounce(() => { loading.value = true getFieldTree({ fieldIds: props.config.treeFieldList.map(ele => ele.id), - resultMode: config.value.resultMode || 0 + resultMode: config.value.resultMode || 0, + filter: getCascadeFieldId() }) .then(res => { treeOptionList.value = dfs(res)