From 320682d44706ce6390bda21bcc6def4075301cee Mon Sep 17 00:00:00 2001 From: dataeaseShu Date: Thu, 16 May 2024 17:58:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=9F=A5=E8=AF=A2=E7=BB=84=E4=BB=B6):=20?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E5=88=97=E8=A1=A8=E9=80=89=E9=A1=B9=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core-frontend/src/api/dataset.ts | 1 + .../src/custom-component/v-query/Select.vue | 81 ++++++++++++++++--- 2 files changed, 73 insertions(+), 9 deletions(-) diff --git a/core/core-frontend/src/api/dataset.ts b/core/core-frontend/src/api/dataset.ts index b3f3dc0021..b491de7f14 100644 --- a/core/core-frontend/src/api/dataset.ts +++ b/core/core-frontend/src/api/dataset.ts @@ -16,6 +16,7 @@ export interface EnumValue { displayId?: string sortId?: string sort?: string + searchText: string } interface Fields { diff --git a/core/core-frontend/src/custom-component/v-query/Select.vue b/core/core-frontend/src/custom-component/v-query/Select.vue index f809259329..87112317d2 100644 --- a/core/core-frontend/src/custom-component/v-query/Select.vue +++ b/core/core-frontend/src/custom-component/v-query/Select.vue @@ -9,6 +9,7 @@ import { nextTick, computed, inject, + onUnmounted, Ref } from 'vue' import { enumValueObj, type EnumValue, getEnumValue } from '@/api/dataset' @@ -84,11 +85,15 @@ const setDefaultMapValue = arr => { } }) Object.values(defaultMapValue).forEach(ele => { - defaultValue = [...defaultValue, ...(ele as unknown as string[])] + defaultValue = [...new Set([...defaultValue, ...(ele as unknown as string[])])] }) return defaultValue } +onUnmounted(() => { + enumValueArr = [] +}) + const handleValueChange = () => { const value = Array.isArray(selectValue.value) ? [...selectValue.value] : selectValue.value if (!props.isConfig) { @@ -144,27 +149,57 @@ const handleFieldIdDefaultChange = (val: string[]) => { }) } +const setOldMapValue = arr => { + const { displayId } = config.value + if (!displayId) { + return [] + } + let defaultMapValue = {} + let defaultValue = [] + arr.forEach(ele => { + defaultMapValue[ele] = [] + }) + enumValueArr.forEach(ele => { + if (defaultMapValue[ele[displayId]]) { + defaultMapValue[ele[displayId]].push(ele) + } + }) + Object.values(defaultMapValue).forEach(ele => { + defaultValue = [...defaultValue, ...(ele as unknown as string[])] + }) + return defaultValue +} + const handleFieldIdChange = (val: EnumValue) => { - enumValueArr = [] loading.value = true enumValueObj(val) .then(res => { - enumValueArr = res || [] + let oldArr = [] + let oldEnumValueArr = [] + if (selectValue.value?.length && config.value.multiple) { + oldArr = [...selectValue.value] + oldEnumValueArr = setOldMapValue(oldArr) + } + enumValueArr = [...res, ...oldEnumValueArr] || [] options.value = [ ...new Set( - (res || []).map(ele => { - return ele[val.displayId || val.queryId] - }) + (res || []) + .map(ele => { + return ele[val.displayId || val.queryId] + }) + .concat(oldArr) ) ].map(ele => { return { label: ele, - value: ele + value: ele, + checked: oldArr.includes(ele) } }) }) .finally(() => { loading.value = false + if (isFromRemote.value) return if (config.value.defaultValueCheck) { selectValue.value = Array.isArray(config.value.defaultValue) ? [...config.value.defaultValue] @@ -199,6 +234,11 @@ const visible = ref(false) const visibleChange = (val: boolean) => { setTimeout(() => { visible.value = !val + if (!val) { + isFromRemote.value = false + searchText.value = '' + remoteMethod('') + } }, 50) } @@ -310,6 +350,19 @@ watch( } ) +const searchText = ref('') +const isFromRemote = ref(false) +const clear = () => { + remoteMethod('') +} + +const remoteMethod = (query: string) => { + if (config.value.optionValueSource !== 1) return + isFromRemote.value = true + searchText.value = query + debounceOptions(1) +} + watch( () => config.value.valueSource, () => { @@ -342,7 +395,13 @@ const setOptions = (num: number) => { break case 1: if (field.id) { - handleFieldIdChange({ queryId: field.id, displayId: displayId || field.id, sort, sortId }) + handleFieldIdChange({ + queryId: field.id, + displayId: displayId || field.id, + sort, + sortId, + searchText: searchText.value + }) } else { options.value = [] } @@ -414,9 +473,10 @@ defineExpose({ multiple show-checked clearable - radio :style="selectStyle" collapse-tags + :remote="config.optionValueSource === 1" + :remote-method="remoteMethod" :options="options" collapse-tags-tooltip > @@ -430,6 +490,9 @@ defineExpose({ ref="single" :style="selectStyle" filterable + @clear="clear" + :remote="config.optionValueSource === 1" + :remote-method="remoteMethod" radio @visible-change="visibleChange" :popper-class="