11 changed files with 409 additions and 183 deletions
@ -0,0 +1,192 @@ |
|||||
|
<template> |
||||
|
<div class="from-content" style="width: 100%"> |
||||
|
<div class="InputSearch input" v-if="params && types == 'input'"> |
||||
|
<ElInput |
||||
|
style="width: 100%" |
||||
|
v-model="value" |
||||
|
:placeholder="placeholder" |
||||
|
@change="handleSearch" |
||||
|
></ElInput> |
||||
|
<img src="./search.svg" @click="handleFormShow" /> |
||||
|
</div> |
||||
|
<ElPopover |
||||
|
v-else |
||||
|
ref="PopoverRef" |
||||
|
placement="bottom" |
||||
|
popper-class="global-input-search-popover" |
||||
|
:popperOptions="popperOptions" |
||||
|
:visibleArrow="false" |
||||
|
:width="this.width" |
||||
|
trigger="click" |
||||
|
@show="handleShow" |
||||
|
style="width: 100%" |
||||
|
> |
||||
|
<div class="InputSearch" slot="reference" ref="ReferenceInputRef"> |
||||
|
<span>{{ placeholder }}</span> |
||||
|
<img src="./search.svg" @click="handleFormShow" /> |
||||
|
</div> |
||||
|
|
||||
|
<div style="width: 100%; max-height: 360px"> |
||||
|
<slot> |
||||
|
<Form |
||||
|
v-if="formList && formList.length" |
||||
|
class="form" |
||||
|
ref="FormConfigRef" |
||||
|
:formList="formList" |
||||
|
v-bind="getFormConfigOptions" |
||||
|
/> |
||||
|
<!-- <ElEmpty v-else description="暂无搜索内容"></ElEmpty> --> |
||||
|
<div v-else class="no-data">暂无数据</div> |
||||
|
</slot> |
||||
|
|
||||
|
<div class="footer"> |
||||
|
<Button |
||||
|
style="background-color: rgba(0, 179, 204, 0.3)" |
||||
|
@click.native="handleResetForm" |
||||
|
> |
||||
|
重置 |
||||
|
</Button> |
||||
|
<Button @click.native="handleSearch"> 搜索 </Button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</ElPopover> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import Button from "@screen/components/Buttons/Button.vue"; |
||||
|
import Form from "@screen/components/FormConfig"; |
||||
|
import { cloneDeep } from "lodash"; |
||||
|
|
||||
|
export default { |
||||
|
name: "InputSearch", |
||||
|
components: { |
||||
|
Button, |
||||
|
Form, |
||||
|
}, |
||||
|
props: { |
||||
|
type: { |
||||
|
type: String, |
||||
|
default: "form", |
||||
|
}, |
||||
|
placeholder: { |
||||
|
type: String, |
||||
|
default: "请点击右侧图标筛选", |
||||
|
}, |
||||
|
valueData: { |
||||
|
type: String, |
||||
|
}, |
||||
|
params: { |
||||
|
type: String, |
||||
|
}, |
||||
|
queryParams: { |
||||
|
type: Array, |
||||
|
}, |
||||
|
formConfigOptions: { |
||||
|
type: Object, |
||||
|
default: null, |
||||
|
}, |
||||
|
formList: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
types: this.type, |
||||
|
value: this.valueData, |
||||
|
width: null, |
||||
|
popperOptions: { |
||||
|
popHideCallBack: () => { |
||||
|
// console.log("---") |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
}, |
||||
|
emit: ["handleSearch"], |
||||
|
computed: { |
||||
|
getFormConfigOptions() { |
||||
|
return { |
||||
|
column: "1", |
||||
|
labelWidth: "120px", |
||||
|
...this.formConfigOptions, |
||||
|
}; |
||||
|
}, |
||||
|
}, |
||||
|
methods: { |
||||
|
handleFormShow() { |
||||
|
console.log(this.params, this.types); |
||||
|
if (this.params) { |
||||
|
if (this.types == "form") { |
||||
|
this.types = "input"; |
||||
|
} else { |
||||
|
this.types = "form"; |
||||
|
} |
||||
|
} else { |
||||
|
this.types = "form"; |
||||
|
} |
||||
|
console.log(this.params, this.types); |
||||
|
}, |
||||
|
handleShow() { |
||||
|
if (this.width) return; |
||||
|
|
||||
|
this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width; |
||||
|
}, |
||||
|
handleResetForm() { |
||||
|
this.$refs.FormConfigRef?.reset(); |
||||
|
|
||||
|
this.$refs.PopoverRef.doClose(); |
||||
|
|
||||
|
this.$emit("handleSearch", cloneDeep(this.$refs.FormConfigRef?.formData)); |
||||
|
}, |
||||
|
handleSearch() { |
||||
|
if (this.types == "form") { |
||||
|
this.$refs.FormConfigRef.validate() |
||||
|
.then((result) => { |
||||
|
this.$refs.PopoverRef.doClose(); |
||||
|
this.$emit("handleSearch", result); |
||||
|
}) |
||||
|
.catch((err) => { |
||||
|
console.log("catch"); |
||||
|
}); |
||||
|
} else { |
||||
|
let params = {}; |
||||
|
params[this.params] = this.value; |
||||
|
this.$emit("handleSearch", params); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.InputSearch { |
||||
|
width: 100%; |
||||
|
height: 26px; |
||||
|
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%) !important; |
||||
|
color: #fff; |
||||
|
border-radius: 2px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding: 3px 15px; |
||||
|
padding-right: 9px; |
||||
|
cursor: pointer; |
||||
|
|
||||
|
font-size: 12px; |
||||
|
font-family: PingFang SC, PingFang SC; |
||||
|
font-weight: 400; |
||||
|
color: #ffffff; |
||||
|
line-height: 14px; |
||||
|
} |
||||
|
.input ::v-deep .el-input__inner { |
||||
|
background: none; |
||||
|
height: auto !important; |
||||
|
font-size: 12px; |
||||
|
padding: 0px 0; |
||||
|
line-height: 14px; |
||||
|
} |
||||
|
::v-deep .el-input__inner::placeholder { |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
</style> |
Loading…
Reference in new issue