| | |
| | | v-for="(option, index) in options" |
| | | :key="index" |
| | | :label="option.label"> |
| | | {{option.title}} |
| | | {{ 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"> |
| | |
| | | </template> |
| | | <template v-if="nameOfOtherOption"> |
| | | <button class="pam-selectAll-btn cursor--pointer fix-chrome-click--issue" :class="{'selected':isSelectOtherOption}" :model="isSelectOtherOption" @click="selectOther"> |
| | | {{nameOfOtherOption}} |
| | | {{ nameOfOtherOption }} |
| | | </button> |
| | | <div> |
| | | <input class="pam-muti-select-other cursor--pointer " v-if="isSelectOtherOption" v-model="syncOtherSelect" placeholder="請輸入,限20字"> |
| | |
| | | </template> |
| | | |
| | | <script lang="ts"> |
| | | import { Vue, Component, Prop, PropSync} from 'vue-property-decorator'; |
| | | import { OptionBtnDto } from './singleSelectBtn.vue'; |
| | | import { Vue, Component, Prop, PropSync, Watch} from 'vue-property-decorator'; |
| | | import { OptionBtnDto } from '~/shared/models/optionBtnDto.model'; |
| | | |
| | | @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; |
| | | |
| | | @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; |
| | | |
| | | @Prop() |
| | | maxLength? : number; |
| | | |
| | | @Watch('syncMutiSelect') |
| | | onMutiSelectChange(): void { |
| | | if (!this.maxLength) return; |
| | | if (this.syncMutiSelect.length > this.maxLength) { |
| | | this.syncMutiSelect.shift(); |
| | | } |
| | | } |
| | | |
| | | isSelectOtherOption=false; |
| | | isSelectAll=false; |
| | | |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | updated() { |
| | | this.isSelectAll = this.syncMutiSelect.length === this.options.length; |
| | | } |
| | | |
| | | selectAll():void{ |
| | | ////////////////////////////////////////////////////////////////////// |
| | | |
| | | selectAll():void { |
| | | this.isSelectAll= !this.isSelectAll; |
| | | this.syncMutiSelect = this.isSelectAll ? this.optionsFormat(this.options):[]; |
| | | } |
| | | optionsFormat(optios:OptionBtnDto[]):string[]{ |
| | | return optios.map(o=>o.title); |
| | | |
| | | optionsFormat(options:OptionBtnDto[]): string[] { |
| | | return options.map((option)=> option.title ); |
| | | } |
| | | selectOther():void{ |
| | | |
| | | selectOther(): void { |
| | | this.isSelectOtherOption = !this.isSelectOtherOption; |
| | | if(!this.isSelectOtherOption){ |
| | | this.syncOtherSelect = ''; |
| | |
| | | |
| | | <style lang="scss" scoped> |
| | | .pam-selectAll-btn{ |
| | | padding: 6px 20px; |
| | | border: 1px $LIGHT_GREY solid; |
| | | padding : 10px 20px; |
| | | border : 1px $LIGHT_GREY solid; |
| | | background-color: $PRIMARY_WHITE; |
| | | border-radius: 30px; |
| | | color: $PRIMARY_BLACK; |
| | | font-size: 20px; |
| | | margin-right: 10px; |
| | | margin-bottom: 10px; |
| | | border-radius : 30px; |
| | | color : $PRIMARY_BLACK; |
| | | font-size : 20px; |
| | | margin-right : 10px; |
| | | margin-bottom : 10px; |
| | | &.selected{ |
| | | background-color:$CORAL; |
| | | color: $PRIMARY_WHITE; |
| | | 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; |
| | | 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> |