mirror of
https://github.com/fugary/simple-element-plus-template.git
synced 2025-12-31 03:17:49 +00:00
search表单
This commit is contained in:
@@ -97,6 +97,10 @@ html, body, #app, .index-container {
|
|||||||
padding-top: 20px;
|
padding-top: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.common-form.el-form--inline .el-input{
|
||||||
|
--el-input-width: 220px;
|
||||||
|
}
|
||||||
|
|
||||||
.form-edit-width-70 {
|
.form-edit-width-70 {
|
||||||
width:70%
|
width:70%
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
* @property {string} labelKey label字段名
|
* @property {string} labelKey label字段名
|
||||||
* @property {number} debounceTime 防抖时间
|
* @property {number} debounceTime 防抖时间
|
||||||
* @property {string} autocompleteWidth 宽度
|
* @property {string} autocompleteWidth 宽度
|
||||||
|
* @property {string} inputWidth input宽度
|
||||||
* @property {CommonSelectPageOption} selectPageConfig 分页
|
* @property {CommonSelectPageOption} selectPageConfig 分页
|
||||||
* @property {Number} colSize 显示几列
|
* @property {Number} colSize 显示几列
|
||||||
* @property {string} loadingText 加载提示loading
|
* @property {string} loadingText 加载提示loading
|
||||||
@@ -36,7 +37,7 @@
|
|||||||
* @property {Object} inputAttrs 输入框配置项
|
* @property {Object} inputAttrs 输入框配置项
|
||||||
*/
|
*/
|
||||||
import { computed, nextTick, onMounted, ref, watch } from 'vue'
|
import { computed, nextTick, onMounted, ref, watch } from 'vue'
|
||||||
import { debounce } from 'lodash'
|
import { debounce, isObject } from 'lodash'
|
||||||
import { onClickOutside, onKeyStroke, useVModel } from '@vueuse/core'
|
import { onClickOutside, onKeyStroke, useVModel } from '@vueuse/core'
|
||||||
import chunk from 'lodash/chunk'
|
import chunk from 'lodash/chunk'
|
||||||
|
|
||||||
@@ -80,6 +81,10 @@ const props = defineProps({
|
|||||||
type: String,
|
type: String,
|
||||||
default: '500px'
|
default: '500px'
|
||||||
},
|
},
|
||||||
|
inputWidth: {
|
||||||
|
type: String,
|
||||||
|
default: '220px'
|
||||||
|
},
|
||||||
autocompleteConfig: {
|
autocompleteConfig: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true
|
required: true
|
||||||
@@ -122,7 +127,7 @@ const props = defineProps({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['update:modelValue', 'onSelectData', 'update:defaultLabel'])
|
const emit = defineEmits(['update:modelValue', 'change', 'update:defaultLabel'])
|
||||||
// 关键字搜索
|
// 关键字搜索
|
||||||
const keywords = ref(props.defaultLabel)
|
const keywords = ref(props.defaultLabel)
|
||||||
// 上次搜索记录
|
// 上次搜索记录
|
||||||
@@ -214,15 +219,32 @@ watch(() => popoverVisible.value, (val) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
watch(() => props.modelValue, (value) => {
|
||||||
|
console.info('=====================value', value)
|
||||||
|
if (!props.useIdModel) {
|
||||||
|
setAutocompleteLabel(value && isObject(value) ? value[labelProp.value] : '')
|
||||||
|
}
|
||||||
|
vModel.value = value
|
||||||
|
})
|
||||||
|
|
||||||
|
watch(() => props.defaultLabel, (label) => {
|
||||||
|
setAutocompleteLabel(label)
|
||||||
|
})
|
||||||
|
|
||||||
//* ********************数据选择*********************
|
//* ********************数据选择*********************
|
||||||
|
|
||||||
const vModel = useVModel(props, 'modelValue', emit)
|
const vModel = useVModel(props, 'modelValue', emit)
|
||||||
const vAutocompleteLabel = useVModel(props, 'defaultLabel', emit)
|
const vDefaultLabel = useVModel(props, 'defaultLabel', emit)
|
||||||
|
|
||||||
|
const setAutocompleteLabel = label => {
|
||||||
|
keywords.value = label
|
||||||
|
vDefaultLabel.value = label
|
||||||
|
lastAutocompleteLabel.value = label
|
||||||
|
}
|
||||||
|
|
||||||
const onSelectData = (row) => {
|
const onSelectData = (row) => {
|
||||||
popoverVisible.value = false
|
popoverVisible.value = false
|
||||||
if (!vModel.value && !row) {
|
if (!vModel.value && !row) {
|
||||||
console.info('==================', row)
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let label = ''
|
let label = ''
|
||||||
@@ -231,11 +253,9 @@ const onSelectData = (row) => {
|
|||||||
label = row[labelProp.value]
|
label = row[labelProp.value]
|
||||||
value = props.useIdModel ? row[idProp.value] : row
|
value = props.useIdModel ? row[idProp.value] : row
|
||||||
}
|
}
|
||||||
keywords.value = label
|
setAutocompleteLabel(label)
|
||||||
vAutocompleteLabel.value = label
|
|
||||||
lastAutocompleteLabel.value = label
|
|
||||||
vModel.value = value
|
vModel.value = value
|
||||||
emit('onSelectData', row)
|
emit('change', row)
|
||||||
}
|
}
|
||||||
|
|
||||||
// =======================按键处理===================
|
// =======================按键处理===================
|
||||||
@@ -316,7 +336,6 @@ const selectPagePaginationChange = (tab, pageNumber) => {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
|
||||||
<el-popover
|
<el-popover
|
||||||
ref="autocompletePopover"
|
ref="autocompletePopover"
|
||||||
:visible="popoverVisible"
|
:visible="popoverVisible"
|
||||||
@@ -332,6 +351,7 @@ const selectPagePaginationChange = (tab, pageNumber) => {
|
|||||||
:placeholder="placeholder||title"
|
:placeholder="placeholder||title"
|
||||||
:disabled="disabled"
|
:disabled="disabled"
|
||||||
:readonly="readonly"
|
:readonly="readonly"
|
||||||
|
:style="{width: inputWidth}"
|
||||||
v-bind="inputAttrs"
|
v-bind="inputAttrs"
|
||||||
@input="onInputKeywords(true)"
|
@input="onInputKeywords(true)"
|
||||||
@click="onInputKeywords(false)"
|
@click="onInputKeywords(false)"
|
||||||
@@ -423,7 +443,6 @@ const selectPagePaginationChange = (tab, pageNumber) => {
|
|||||||
</common-table>
|
</common-table>
|
||||||
</template>
|
</template>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@@ -31,6 +31,10 @@ const props = defineProps({
|
|||||||
type: Object,
|
type: Object,
|
||||||
default: null
|
default: null
|
||||||
},
|
},
|
||||||
|
validateOnRuleChange: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
showButtons: {
|
showButtons: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true
|
default: true
|
||||||
@@ -99,10 +103,9 @@ const emit = defineEmits(['submitForm', 'update:model'])
|
|||||||
const formModel = useVModel(props, 'model', emit)
|
const formModel = useVModel(props, 'model', emit)
|
||||||
|
|
||||||
watch(() => props.options, (options) => {
|
watch(() => props.options, (options) => {
|
||||||
console.info('=================options', options)
|
|
||||||
options.forEach(option => {
|
options.forEach(option => {
|
||||||
if (formModel.value && option.value) {
|
if (formModel.value) {
|
||||||
formModel.value[option.prop] = option.value
|
formModel.value[option.prop] = option.value || undefined
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
rules.value = initRules()
|
rules.value = initRules()
|
||||||
@@ -121,10 +124,12 @@ defineExpose({
|
|||||||
<template>
|
<template>
|
||||||
<el-form
|
<el-form
|
||||||
ref="form"
|
ref="form"
|
||||||
|
class="common-form"
|
||||||
:model="formModel"
|
:model="formModel"
|
||||||
:rules="rules"
|
:rules="rules"
|
||||||
:label-width="labelWidth"
|
:label-width="labelWidth"
|
||||||
v-bind="$attrs"
|
v-bind="$attrs"
|
||||||
|
:validate-on-rule-change="validateOnRuleChange"
|
||||||
>
|
>
|
||||||
<common-form-control
|
<common-form-control
|
||||||
v-for="(option,index) in options"
|
v-for="(option,index) in options"
|
||||||
|
|||||||
@@ -1,10 +1,23 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { ref } from 'vue'
|
import { computed, ref } from 'vue'
|
||||||
import { useCityAutocompleteConfig, useCitySelectPageConfig } from '@/services/city/CityService'
|
import { useCityAutocompleteConfig, useCitySelectPageConfig } from '@/services/city/CityService'
|
||||||
|
import { $i18nMsg } from '@/messages'
|
||||||
|
|
||||||
|
const defaultCity = ref({})
|
||||||
|
|
||||||
|
setTimeout(() => {
|
||||||
|
defaultCity.value = {
|
||||||
|
code: 'SHA',
|
||||||
|
nameCn: '上海',
|
||||||
|
nameEn: 'Shanghai'
|
||||||
|
}
|
||||||
|
}, 1000)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @type {[CommonFormOption]}
|
* @type {[CommonFormOption]}
|
||||||
*/
|
*/
|
||||||
const formOptions = ref([{
|
const formOptions = computed(() => {
|
||||||
|
return [{
|
||||||
label: '用户名',
|
label: '用户名',
|
||||||
prop: 'userName',
|
prop: 'userName',
|
||||||
value: '',
|
value: '',
|
||||||
@@ -17,7 +30,7 @@ const formOptions = ref([{
|
|||||||
message: '用户名在2-6位之间'
|
message: '用户名在2-6位之间'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
label: '密码',
|
label: '密码',
|
||||||
prop: 'userPassword',
|
prop: 'userPassword',
|
||||||
value: '',
|
value: '',
|
||||||
@@ -27,14 +40,14 @@ const formOptions = ref([{
|
|||||||
attrs: {
|
attrs: {
|
||||||
showPassword: true
|
showPassword: true
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
label: '出生日期',
|
label: '出生日期',
|
||||||
type: 'date-picker',
|
type: 'date-picker',
|
||||||
prop: 'birthday',
|
prop: 'birthday',
|
||||||
value: '',
|
value: '',
|
||||||
placeholder: '选择出生日期',
|
placeholder: '选择出生日期',
|
||||||
required: true
|
required: true
|
||||||
}, {
|
}, {
|
||||||
label: '兴趣爱好',
|
label: '兴趣爱好',
|
||||||
type: 'checkbox-group',
|
type: 'checkbox-group',
|
||||||
prop: 'hobby',
|
prop: 'hobby',
|
||||||
@@ -54,7 +67,7 @@ const formOptions = ref([{
|
|||||||
value: 'sleep'
|
value: 'sleep'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
label: '职业',
|
label: '职业',
|
||||||
type: 'select',
|
type: 'select',
|
||||||
prop: 'career',
|
prop: 'career',
|
||||||
@@ -74,7 +87,7 @@ const formOptions = ref([{
|
|||||||
value: 'teacher'
|
value: 'teacher'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
label: '性别',
|
label: '性别',
|
||||||
type: 'radio-group',
|
type: 'radio-group',
|
||||||
prop: 'gender',
|
prop: 'gender',
|
||||||
@@ -94,32 +107,48 @@ const formOptions = ref([{
|
|||||||
value: 'unknown'
|
value: 'unknown'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}, {
|
}, {
|
||||||
label: '图标',
|
label: '图标',
|
||||||
prop: 'icon',
|
prop: 'icon',
|
||||||
value: '',
|
value: '',
|
||||||
type: 'common-icon-select',
|
type: 'common-icon-select',
|
||||||
required: true
|
required: true
|
||||||
}, {
|
}, {
|
||||||
label: '城市',
|
label: '城市',
|
||||||
prop: 'city',
|
prop: 'city',
|
||||||
value: 'SHA',
|
value: defaultCity.value?.code,
|
||||||
type: 'common-autocomplete',
|
type: 'common-autocomplete',
|
||||||
required: true,
|
required: true,
|
||||||
placeholder: '请选择城市',
|
placeholder: '请选择城市',
|
||||||
|
change: (city) => {
|
||||||
|
defaultCity.value = city
|
||||||
|
},
|
||||||
attrs: {
|
attrs: {
|
||||||
defaultLabel: '上海市',
|
defaultLabel: $i18nMsg(defaultCity.value?.nameCn, defaultCity.value?.nameEn),
|
||||||
autocompleteConfig: useCityAutocompleteConfig(),
|
autocompleteConfig: useCityAutocompleteConfig(),
|
||||||
selectPageConfig: useCitySelectPageConfig()
|
selectPageConfig: useCitySelectPageConfig()
|
||||||
}
|
}
|
||||||
}, {
|
}, {
|
||||||
|
label: '城市1',
|
||||||
|
prop: 'city1',
|
||||||
|
value: defaultCity,
|
||||||
|
type: 'common-autocomplete',
|
||||||
|
required: true,
|
||||||
|
placeholder: '请选择城市1',
|
||||||
|
attrs: {
|
||||||
|
useIdModel: false,
|
||||||
|
autocompleteConfig: useCityAutocompleteConfig(),
|
||||||
|
selectPageConfig: useCitySelectPageConfig()
|
||||||
|
}
|
||||||
|
}, {
|
||||||
label: '地址',
|
label: '地址',
|
||||||
prop: 'address',
|
prop: 'address',
|
||||||
value: '',
|
value: '',
|
||||||
attrs: {
|
attrs: {
|
||||||
type: 'textarea'
|
type: 'textarea'
|
||||||
}
|
}
|
||||||
}])
|
}]
|
||||||
|
})
|
||||||
const userDto = ref({
|
const userDto = ref({
|
||||||
userName: '',
|
userName: '',
|
||||||
userPassword: ''
|
userPassword: ''
|
||||||
|
|||||||
@@ -82,20 +82,22 @@ const searchFormOptions = computed(() => {
|
|||||||
{
|
{
|
||||||
label: '用户名',
|
label: '用户名',
|
||||||
prop: 'nameCn'
|
prop: 'nameCn'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '关键字',
|
||||||
|
prop: 'keywords'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '地址',
|
||||||
|
prop: 'address'
|
||||||
}, {
|
}, {
|
||||||
label: $i18nMsg('性别', 'Gender'),
|
label: $i18nMsg('性别', 'Gender'),
|
||||||
type: 'select',
|
type: 'select',
|
||||||
prop: 'gender',
|
prop: 'gender',
|
||||||
children: [{
|
children: [{
|
||||||
type: 'option',
|
|
||||||
value: '',
|
|
||||||
label: '请选择'
|
|
||||||
}, {
|
|
||||||
type: 'option',
|
|
||||||
value: 'male',
|
value: 'male',
|
||||||
label: $i18nMsg('男', 'Male')
|
label: $i18nMsg('男', 'Male')
|
||||||
}, {
|
}, {
|
||||||
type: 'option',
|
|
||||||
value: 'female',
|
value: 'female',
|
||||||
label: $i18nMsg('女', 'Female')
|
label: $i18nMsg('女', 'Female')
|
||||||
}]
|
}]
|
||||||
@@ -106,9 +108,9 @@ const doSearch = form => {
|
|||||||
console.info('=================searchParam', searchParam.value)
|
console.info('=================searchParam', searchParam.value)
|
||||||
}
|
}
|
||||||
/** *************用户编辑**************/
|
/** *************用户编辑**************/
|
||||||
const currentUser = ref({})
|
const currentUser = ref(null)
|
||||||
const showEdit = ref(false)
|
const showEdit = ref(false)
|
||||||
const userFormOptions = ref(useUserFormOptions())
|
const userFormOptions = computed(() => useUserFormOptions())
|
||||||
const toEditUser = user => {
|
const toEditUser = user => {
|
||||||
currentUser.value = { ...user }
|
currentUser.value = { ...user }
|
||||||
showEdit.value = true
|
showEdit.value = true
|
||||||
@@ -171,6 +173,7 @@ const submitForm = () => {
|
|||||||
title="用户编辑"
|
title="用户编辑"
|
||||||
>
|
>
|
||||||
<common-form
|
<common-form
|
||||||
|
v-if="currentUser"
|
||||||
ref="formRef"
|
ref="formRef"
|
||||||
class="form-edit-width-100"
|
class="form-edit-width-100"
|
||||||
:model="currentUser"
|
:model="currentUser"
|
||||||
|
|||||||
Reference in New Issue
Block a user