<script lang="ts" setup>
import {
toRefs,
onBeforeMount,
ref,
onMounted,
onBeforeUnmount,
type PropType,
type Ref,
inject,
computed,
nextTick
} from 'vue'
import { dvMainStoreWithOut } from '@/store/modules/data-visualization/dvMain'
import eventBus from '@/utils/eventBus'
import { storeToRefs } from 'pinia'
import { useI18n } from '@/hooks/web/useI18n'
interface SelectConfig {
id: string
conditionValueOperatorF: string
conditionValueF: string
queryConditionWidth: string
hideConditionSwitching: boolean
conditionValueOperatorS: string
conditionValueS: string
placeholder: string
defaultConditionValueOperatorF: string
defaultConditionValueF: string
defaultConditionValueOperatorS: string
defaultConditionValueS: string
conditionType: number
}
const placeholder: Ref = inject('placeholder')
const { t } = useI18n()
const placeholderText = computed(() => {
if (placeholder?.value?.placeholderShow) {
return props.config.placeholder
}
return ' '
})
const operators = [
{
label: t('v_query.exact_match'),
value: 'eq'
},
{
label: t('v_query.fuzzy_match'),
value: 'like'
}
]
const dvMainStore = dvMainStoreWithOut()
const { dvInfo } = storeToRefs(dvMainStore)
const props = defineProps({
config: {
type: Object as PropType<SelectConfig>,
default: () => {
return {
id: '',
conditionType: 0,
queryConditionWidth: 0,
conditionValueOperatorF: 'eq',
conditionValueF: '',
conditionValueOperatorS: 'like',
conditionValueS: '',
defaultConditionValueOperatorF: 'eq',
defaultConditionValueF: '',
defaultConditionValueOperatorS: 'like',
defaultConditionValueS: ''
}
}
},
isConfig: {
type: Boolean,
default: false
}
})
const { config } = toRefs(props)
const setParams = () => {
const {
defaultConditionValueOperatorF,
defaultConditionValueF,
defaultConditionValueOperatorS,
defaultConditionValueS
} = config.value
config.value.conditionValueOperatorF = defaultConditionValueOperatorF
config.value.conditionValueF = defaultConditionValueF
config.value.conditionValueOperatorS = defaultConditionValueOperatorS
config.value.conditionValueS = defaultConditionValueS
}
onBeforeMount(() => {
setParams()
})
const queryConditionWidth = inject('com-width', Function, true)
const customStyle = inject<{ background: string; border: string }>('$custom-style-filter')
const isConfirmSearch = inject('is-confirm-search', Function, true)
const getCustomWidth = () => {
if (placeholder?.value?.placeholderShow) {
if (props.config.queryConditionWidth === undefined) {
return queryConditionWidth()
}
return props.config.queryConditionWidth
}
return 227
}
const selectStyle = computed(() => {
return { width: getCustomWidth() + 'px' }
})
const handleValueChange = () => {
if (!props.isConfig) {
nextTick(() => {
isConfirmSearch(config.value.id)
})
return
}
}
const lineWidth = computed(() => {
return { width: getCustomWidth() - 15 + 'px', background: customStyle.border }
})
const handleKeyEnter = ($event: any = {}) => {
if ($event?.isComposing) {
return
}
handleValueChange()
}
const handleInnerMouseDown = e => {
e.stopPropagation()
}
const pre = ref()
const next = ref()
const componentClick = () => {
pre.value?.blur()
next.value?.blur()
}
onMounted(() => {
eventBus.on('componentClick', componentClick)
})
onBeforeUnmount(() => {
eventBus.off('componentClick', componentClick)
})
</script>
<template>
<div
@mousedown="handleInnerMouseDown"
class="text-search-select"
:style="{ background: customStyle.background }"
>
<div class="condition-type">
<el-select
class="condition-value-select"
v-if="!config.hideConditionSwitching"
@change="handleValueChange"
:effect="dvInfo.type === 'dataV' ? 'dark' : ''"
popper-class="condition-value-select-popper"
v-model="config.conditionValueOperatorF"
>
<el-option v-for="ele in operators" :key="ele.value" :label="ele.label" :value="ele.value">
</el-option>
</el-select>
<el-input
:style="selectStyle"
:placeholder="placeholderText"
@blur="handleValueChange"
ref="pre"
@keydown.enter.exact.prevent="($event: any) => handleKeyEnter($event)"
class="condition-value-input"
v-model="config.conditionValueF"
/>
<div :style="lineWidth" class="bottom-line"></div>
</div>
<div class="condition-type" v-if="[1, 2].includes(config.conditionType)">
<span class="condition-type-tip">{{
config.conditionType === 1 ? t('chart.and') : t('chart.or')
}}</span>
<el-select
v-if="!config.hideConditionSwitching"
class="condition-value-select"
@change="handleValueChange"
:effect="dvInfo.type === 'dataV' ? 'dark' : ''"
popper-class="condition-value-select-popper"
v-model="config.conditionValueOperatorS"
>
<el-option v-for="ele in operators" :key="ele.value" :label="ele.label" :value="ele.value">
</el-option>
</el-select>
<el-input
:style="selectStyle"
@blur="handleValueChange"
ref="next"
:placeholder="placeholderText"
@keydown.enter.exact.prevent="($event: any) => handleKeyEnter($event)"
class="condition-value-input"
v-model="config.conditionValueS"
/>
<div :style="lineWidth" class="bottom-line next-line"></div>
</div>
</div>
</template>
<style lang="less" scoped>
.text-search-select {
display: flex;
align-items: center;
.condition-type {
display: flex;
position: relative;
:deep(.ed-input__wrapper),
:deep(.ed-select__wrapper) {
border: none;
border-radius: 0;
box-shadow: none !important;
height: 32px;
word-wrap: break-word;
text-align: left;
color: rgba(0, 0, 0, 0.65);
list-style: none;
user-select: none;
cursor: pointer;
line-height: 32px;
box-sizing: border-box;
max-width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
opacity: 1;
}
:deep(.ed-select .ed-input.is-focus .ed-input__wrapper),
:deep(.ed-select:hover:not(.ed-select--disabled) .ed-input__wrapper),
:deep(.ed-select .ed-input__wrapper.is-focus) {
box-shadow: none !important;
}
:deep(.ed-select) {
width: 120px;
.ed-input__wrapper {
padding: 0;
}
}
.condition-type-tip {
font-size: 12px;
color: #646a73;
line-height: 32px;
margin-right: 8px;
}
.bottom-line {
box-sizing: border-box;
height: 1px;
background-color: #bbbfc4;
position: absolute;
right: 5px;
bottom: 3px;
z-index: 10;
}
}
}
</style>
<style lang="less">
.condition-value-select-popper {
.ed-select-dropdown__item.selected::after {
display: none;
}
}
</style>