feat(dict): 优化字典选择组件并添加清空功能

- 在 dict.vue 中更新字典选择框的占位符为国际化文本
- 在 vue-select.vue 中添加清空选择的功能和相关样式
- 更新中文翻译文件,添加新的占位符文本
This commit is contained in:
user 2025-03-14 22:32:30 +08:00
parent 599897ae85
commit a6b4a4fa6c
3 changed files with 41 additions and 4 deletions

View File

@ -34,7 +34,7 @@
v-model="filterParams.number"
:options="numberOptions"
:is-loading="isLoadingNumberOptions"
placeholder="请选择或输入父级字典"
:placeholder="$t('jewpmsApp.dict.parentPlaceholder')"
@search="loadNumberOptions"
@select="option => (filterParams.number = option.value)"
/>

View File

@ -18,7 +18,14 @@
<span v-if="isLoading" class="v-select-loading">
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>
</span>
<span v-else class="v-select-arrow" :class="{ 'is-open': isOpen }">
<span v-else-if="isOpen" class="v-select-clear" @mousedown.stop.prevent="clearSelection">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24">
<path
d="M12 2C6.47 2 2 6.47 2 12s4.47 10 10 10 10-4.47 10-10S17.53 2 12 2zm5 13.59L15.59 17 12 13.41 8.41 17 7 15.59 10.59 12 7 8.41 8.41 7 12 10.59 15.59 7 17 8.41 13.41 12 17 15.59z"
/>
</svg>
</span>
<span class="v-select-arrow" :class="{ 'is-open': isOpen }" @mousedown.stop.prevent="onDropdown">
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="10" viewBox="0 0 14 10">
<path
d="M9.211364 7.59931l4.48338-4.867229c.407008-.441854.407008-1.158247 0-1.60046l-.73712-.80023c-.407008-.441854-1.066904-.441854-1.474243 0L7 5.198617 2.51662.33139c-.407008-.441853-1.066904-.441853-1.474243 0l-.737121.80023c-.407008.441854-.407008 1.158248 0 1.600461l4.48338 4.867228L7 10l2.211364-2.40069z"
@ -96,6 +103,7 @@ export default defineComponent({
const highlightedIndex = ref(-1);
const closeTimeout = ref<number | null>(null);
const focusTriggered = ref(false);
const cleanTriggered = ref(false);
//
const selectedLabel = computed(() => {
@ -135,6 +143,7 @@ export default defineComponent({
//
watch(isOpen, newValue => {
//console.log('isOpen changed', newValue);
if (newValue) {
emit('open');
nextTick(() => {
@ -158,9 +167,11 @@ export default defineComponent({
//
const toggleDropdown = () => {
// focus
if (focusTriggered.value) {
if (focusTriggered.value || cleanTriggered.value) {
cleanTriggered.value = false;
focusTriggered.value = false;
} else {
//console.log('toggleDropdown',isOpen.value);
isOpen.value = !isOpen.value;
}
};
@ -227,6 +238,19 @@ export default defineComponent({
};
});
//
const clearSelection = () => {
cleanTriggered.value = true;
emit('update:modelValue', null);
searchQuery.value = '';
emit('select', searchQuery.value);
};
//
const onDropdown = () => {
//console.log('onDropdown');
};
return {
isOpen,
searchQuery,
@ -240,6 +264,8 @@ export default defineComponent({
highlightNext,
highlightPrev,
selectHighlighted,
clearSelection,
onDropdown,
};
},
});
@ -319,4 +345,14 @@ export default defineComponent({
.v-select-loading {
margin-right: 8px;
}
.v-select-clear {
margin-right: 8px;
cursor: pointer;
color: #6c757d;
}
.v-select-clear:hover {
color: #dc3545;
}
</style>

View File

@ -31,7 +31,8 @@
"createdDate": "创建时间",
"updatedBy": "更新人",
"updatedDate": "更新时间",
"version": "版本号"
"version": "版本号",
"parentPlaceholder": "请选择或输入父级字典"
}
}
}