primevue
Version:
[](https://opensource.org/licenses/MIT) [](https://badge.fury.io/js/primevue) [ • 4.36 kB
JavaScript
"use strict";var e=require("primevue/basecomponent"),t=require("primevue/ripple"),i=require("primevue/utils"),l=require("vue");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e),o=n(t),s={name:"SelectButton",extends:a.default,emits:["update:modelValue","focus","blur","change"],props:{modelValue:null,options:Array,optionLabel:null,optionValue:null,optionDisabled:null,multiple:Boolean,unselectable:{type:Boolean,default:!1},disabled:Boolean,dataKey:null,"aria-labelledby":{type:String,default:null}},data:()=>({focusedIndex:0}),mounted(){this.defaultTabIndexes()},methods:{defaultTabIndexes(){let e=i.DomHandler.find(this.$refs.container,".p-button"),t=i.DomHandler.findSingle(this.$refs.container,".p-highlight");for(let l=0;l<e.length;l++)(i.DomHandler.hasClass(e[l],"p-highlight")&&i.ObjectUtils.equals(e[l],t)||null===t&&0==l)&&(this.focusedIndex=l)},getOptionLabel(e){return this.optionLabel?i.ObjectUtils.resolveFieldData(e,this.optionLabel):e},getOptionValue(e){return this.optionValue?i.ObjectUtils.resolveFieldData(e,this.optionValue):e},getOptionRenderKey(e){return this.dataKey?i.ObjectUtils.resolveFieldData(e,this.dataKey):this.getOptionLabel(e)},getPTOptions(e,t){return this.ptm(t,{context:{active:this.isSelected(e),disabled:this.isOptionDisabled(e)}})},isOptionDisabled(e){return!!this.optionDisabled&&i.ObjectUtils.resolveFieldData(e,this.optionDisabled)},onOptionSelect(e,t,l){if(this.disabled||this.isOptionDisabled(t))return;let n=this.isSelected(t);if(n&&this.unselectable)return;let a,o=this.getOptionValue(t);a=this.multiple?n?this.modelValue.filter((e=>!i.ObjectUtils.equals(e,o,this.equalityKey))):this.modelValue?[...this.modelValue,o]:[o]:n?null:o,this.focusedIndex=l,this.$emit("update:modelValue",a),this.$emit("change",{event:e,value:a})},isSelected(e){let t=!1,l=this.getOptionValue(e);if(this.multiple){if(this.modelValue)for(let e of this.modelValue)if(i.ObjectUtils.equals(e,l,this.equalityKey)){t=!0;break}}else t=i.ObjectUtils.equals(this.modelValue,l,this.equalityKey);return t},onKeydown(e,t,i){switch(e.code){case"Space":this.onOptionSelect(e,t,i),e.preventDefault();break;case"ArrowDown":case"ArrowRight":this.changeTabIndexes(e,"next"),e.preventDefault();break;case"ArrowUp":case"ArrowLeft":this.changeTabIndexes(e,"prev"),e.preventDefault()}},changeTabIndexes(e,t){let i,l;for(let e=0;e<=this.$refs.container.children.length-1;e++)"0"===this.$refs.container.children[e].getAttribute("tabindex")&&(i={elem:this.$refs.container.children[e],index:e});l="prev"===t?0===i.index?this.$refs.container.children.length-1:i.index-1:i.index===this.$refs.container.children.length-1?0:i.index+1,this.focusedIndex=l,this.$refs.container.children[l].focus()},onFocus(e){this.$emit("focus",e)},onBlur(e,t){e.target&&e.relatedTarget&&e.target.parentElement!==e.relatedTarget.parentElement&&this.defaultTabIndexes(),this.$emit("blur",e,t)},getButtonClass(e){return["p-button p-component",{"p-highlight":this.isSelected(e),"p-disabled":this.isOptionDisabled(e)}]}},computed:{containerClass(){return["p-selectbutton p-buttonset p-component",{"p-disabled":this.disabled}]},equalityKey(){return this.optionValue?null:this.dataKey}},directives:{ripple:o.default}};const r=["aria-labelledby"],d=["tabindex","aria-label","role","aria-checked","aria-disabled","onClick","onKeydown","onBlur"];s.render=function(e,t,i,n,a,o){const s=l.resolveDirective("ripple");return l.openBlock(),l.createElementBlock("div",l.mergeProps({ref:"container",class:o.containerClass,role:"group","aria-labelledby":e.ariaLabelledby},e.ptm("root")),[(l.openBlock(!0),l.createElementBlock(l.Fragment,null,l.renderList(i.options,((n,r)=>l.withDirectives((l.openBlock(),l.createElementBlock("div",l.mergeProps({key:o.getOptionRenderKey(n),tabindex:r===a.focusedIndex?"0":"-1","aria-label":o.getOptionLabel(n),role:i.multiple?"checkbox":"radio","aria-checked":o.isSelected(n),"aria-disabled":i.optionDisabled,class:o.getButtonClass(n,r),onClick:e=>o.onOptionSelect(e,n,r),onKeydown:e=>o.onKeydown(e,n,r),onFocus:t[0]||(t[0]=e=>o.onFocus(e)),onBlur:e=>o.onBlur(e,n)},o.getPTOptions(n,"button")),[l.renderSlot(e.$slots,"option",{option:n,index:r},(()=>[l.createElementVNode("span",l.mergeProps({class:"p-button-label"},o.getPTOptions(n,"label")),l.toDisplayString(o.getOptionLabel(n)),17)]))],16,d)),[[s]]))),128))],16,r)},module.exports=s;