<template>
|
<div>
|
<el-checkbox-group class="pam-multi-select-btn" v-model="syncMutiSelect">
|
<el-checkbox
|
v-for="(option, index) in options"
|
:key="index"
|
:label="option.label">
|
{{option.title}}
|
</el-checkbox>
|
<template v-if="nameOfSelectAll">
|
<button class="pam-selectAll-btn cursor--pointer fix-chrome-click--issue" :class="{'selected':isSelectAll}" :model="isSelectAll" @click="selectAll">
|
<span>{{nameOfSelectAll}}</span>
|
</button>
|
</template>
|
<template v-if="nameOfOtherOption">
|
<button class="pam-selectAll-btn cursor--pointer fix-chrome-click--issue" :class="{'selected':isSelectOtherOption}" :model="isSelectOtherOption" @click="selectOther">
|
<span>{{nameOfOtherOption}}</span>
|
</button>
|
<div>
|
<input class="pam-muti-select-other cursor--pointer " v-if="isSelectOtherOption" v-model="syncOtherSelect" placeholder="請輸入,限20字">
|
</div>
|
</template>
|
</el-checkbox-group>
|
</div>
|
</template>
|
|
<script lang="ts">
|
import { Vue, Component, Prop, PropSync} from 'vue-property-decorator';
|
import { OptionBtnDto } from './singleSelectBtn.vue';
|
|
@Component
|
export default class MultiSelectBtn extends Vue {
|
@PropSync('mutiSelect',{type:Array,default:()=>[]}) syncMutiSelect!:string[];
|
@Prop({default:()=>[]}) options!:OptionBtnDto[];
|
@Prop({default:''}) nameOfSelectAll!:string;
|
@PropSync('otherSelect',{default:''}) syncOtherSelect!:string;
|
@Prop({type:String,default:''}) nameOfOtherOption!:string;
|
isSelectOtherOption=false;
|
isSelectAll=false;
|
|
updated() {
|
this.isSelectAll = this.syncMutiSelect.length === this.options.length;
|
}
|
|
selectAll():void{
|
this.isSelectAll= !this.isSelectAll;
|
this.syncMutiSelect = this.isSelectAll ? this.optionsFormat(this.options):[];
|
}
|
optionsFormat(optios:OptionBtnDto[]):string[]{
|
return optios.map(o=>o.title);
|
}
|
selectOther():void{
|
this.isSelectOtherOption = !this.isSelectOtherOption;
|
if(!this.isSelectOtherOption){
|
this.syncOtherSelect = '';
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.pam-selectAll-btn{
|
padding: 6px 20px;
|
border: 1px $LIGHT_GREY solid;
|
background-color: $PRIMARY_WHITE;
|
border-radius: 30px;
|
font-size: 20px;
|
margin-right: 10px;
|
margin-bottom: 10px;
|
&.selected{
|
background-color:$CORAL;
|
color: $PRIMARY_WHITE;
|
}
|
}
|
.pam-muti-select-other {
|
height: 50px;
|
padding: 5px;
|
-webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
|
-moz-box-sizing: border-box; /* Firefox, other Gecko */
|
box-sizing: border-box;
|
width: 316px;
|
border: 1px solid #CCCCCC;
|
}
|
</style>
|