You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
226 lines
5.0 KiB
226 lines
5.0 KiB
<script>
|
|
export default {
|
|
props:{
|
|
|
|
},
|
|
data() {
|
|
return {
|
|
isShowSelector:false,
|
|
width:300,
|
|
left:0,
|
|
}
|
|
},
|
|
methods: {
|
|
initStyle(){
|
|
const header = document.querySelector('.v-header').getBoundingClientRect()
|
|
this.width = header.width
|
|
const select = document.querySelector('.xy-selectors').getBoundingClientRect()
|
|
this.left = select.left - header.left
|
|
|
|
this.$forceUpdate()
|
|
},
|
|
|
|
showSelector(){
|
|
this.isShowSelector =! this.isShowSelector
|
|
},
|
|
renderAdd(){
|
|
return (<Button
|
|
class="xy-selectors-btn__item"
|
|
type='primary'
|
|
on={{
|
|
['click']:()=>this.$emit('add')
|
|
}}>
|
|
新增
|
|
</Button>)
|
|
}
|
|
},
|
|
mounted() {
|
|
this.initStyle()
|
|
|
|
window.onresize = this.initStyle
|
|
},
|
|
destroyed() {
|
|
window.onresize = null
|
|
},
|
|
render(h) {
|
|
let {isShowSelector,showSelector,$scopedSlots} = this
|
|
|
|
return (
|
|
<div class="xy-selectors">
|
|
<div v-show={isShowSelector} style={{'width':'100vw','height':'100vh','position':'fixed','top':0,'left':0,'z-index':1}} on={{['click']:()=>this.isShowSelector = false}}></div>
|
|
<Button
|
|
icon='md-arrow-dropdown'
|
|
ghost={isShowSelector}
|
|
class={isShowSelector ? 'xy-selectors-btn__item xy-selectors-btn__select xy-selectors-btn-active__select' : 'xy-selectors-btn__item xy-selectors-btn__select"'}
|
|
type='primary'
|
|
on={{
|
|
['click']:() => showSelector()
|
|
}}>
|
|
高级搜索
|
|
</Button>
|
|
|
|
<transition
|
|
enter-active-class="scale-enter"
|
|
leave-to-class="scale-leave">
|
|
<div class="xy-selectors-card" style={{'width':`${this.width}px`,'left':`-${this.left}px`}} v-show={isShowSelector}>
|
|
<Icon
|
|
type="md-close"
|
|
size={24}
|
|
class="xy-selectors-card__close"
|
|
on={{['click']:()=> {
|
|
this.isShowSelector = false
|
|
}}}/>
|
|
<div class="xy-selectors-card-content">
|
|
{$scopedSlots?.selected ? $scopedSlots?.selected() : ''}
|
|
{$scopedSlots?.default ? $scopedSlots?.default() : ''}
|
|
</div>
|
|
<div class="xy-selectors-card-btn">
|
|
<Button
|
|
class="xy-selectors-card-btn__item"
|
|
type="primary"
|
|
ghost={true}
|
|
on={{['click']:()=>{this.$emit('reset')}}}>重置</Button>
|
|
<Button
|
|
class="xy-selectors-card-btn__item"
|
|
type="primary"
|
|
on={{['click']:()=>{
|
|
this.$emit('search')
|
|
this.isShowSelector = false
|
|
}}}>搜索</Button>
|
|
</div>
|
|
</div>
|
|
</transition>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
}
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
.xy-selectors{
|
|
|
|
&__item{
|
|
display: flex;
|
|
align-items: center;
|
|
|
|
padding: 8px 20px;
|
|
|
|
&--name{
|
|
width: 100px;
|
|
|
|
margin-right: 20px;
|
|
}
|
|
}
|
|
}
|
|
</style>
|
|
<style scoped lang="scss">
|
|
@import "../../styles/variables";
|
|
.xy-selectors{
|
|
|
|
position: relative;
|
|
&-btn{
|
|
//display: flex;
|
|
//justify-content: flex-start;
|
|
//align-items: center;
|
|
&__item{
|
|
|
|
//margin-right: 10px;
|
|
}
|
|
&__select{
|
|
|
|
}
|
|
&-active__select{
|
|
border-bottom-left-radius: 0;
|
|
border-bottom-right-radius: 0;
|
|
border-bottom: none;
|
|
box-shadow: 0 2px 10px 1px var(--theme-color);
|
|
|
|
position: relative;
|
|
&::after{
|
|
content:'';
|
|
height: 12px;
|
|
background: linear-gradient(to top,rgba(235,238,244,0.98) 40%,#0000 80%,#0000);
|
|
|
|
z-index: 5;
|
|
position: absolute;
|
|
bottom: -4px;
|
|
left: 0;
|
|
right: 0;
|
|
}
|
|
}
|
|
}
|
|
&-card{
|
|
//width: 100%;
|
|
background: rgba(239,242,250,0.95);
|
|
border-radius: 0 4px 4px 4px;
|
|
border: var(--theme-color) solid 1px;
|
|
box-shadow: 0 4px 10px 1px var(--theme-color);
|
|
|
|
z-index: 4;
|
|
position: absolute;
|
|
&__close{
|
|
cursor: pointer;
|
|
|
|
position: absolute;
|
|
top: 6px;
|
|
right: 14px;
|
|
}
|
|
&-content{
|
|
min-height: 50px;
|
|
max-height: 400px;
|
|
overflow: scroll;
|
|
|
|
padding: 36px 0 44px 8px;
|
|
&::-webkit-scrollbar-thumb{
|
|
background: var(--theme-color);
|
|
}
|
|
}
|
|
&-btn{
|
|
width: 100%;
|
|
display: flex;
|
|
justify-content: space-evenly;
|
|
background: rgba(239,242,250,0.95);
|
|
|
|
position: absolute;
|
|
bottom: 0;
|
|
&__item{
|
|
width: 120px;
|
|
|
|
margin: 10px 0px;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.scale-enter{
|
|
transform-origin: 0 0%;
|
|
animation: scale-enter 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
|
|
}
|
|
@keyframes scale-enter {
|
|
from{
|
|
transform: scaleY(0);
|
|
opacity: 0;
|
|
}
|
|
to{
|
|
transform: scaleY(1);
|
|
opacity: 1;
|
|
}
|
|
}
|
|
.scale-leave{
|
|
transform-origin: 0 0%;
|
|
animation: scale-leave 0.5s cubic-bezier(0.250, 0.460, 0.450, 0.940) both;
|
|
}
|
|
@keyframes scale-leave {
|
|
from{
|
|
transform: scaleY(1);
|
|
opacity: 1;
|
|
}
|
|
to{
|
|
transform: scaleY(0);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
</style>
|