primevue
Version:
PrimeVue is an open source UI library for Vue featuring a rich set of 80+ components, a theme designer, various theme alternatives such as Material, Bootstrap, Tailwind, premium templates and professional support. In addition, it integrates with PrimeBloc
284 lines (275 loc) • 13 kB
JavaScript
this.primevue = this.primevue || {};
this.primevue.selectbutton = (function (Ripple, utils, BaseComponent, SelectButtonStyle, vue) {
'use strict';
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var Ripple__default = /*#__PURE__*/_interopDefaultLegacy(Ripple);
var BaseComponent__default = /*#__PURE__*/_interopDefaultLegacy(BaseComponent);
var SelectButtonStyle__default = /*#__PURE__*/_interopDefaultLegacy(SelectButtonStyle);
var script$1 = {
name: 'BaseSelectButton',
"extends": BaseComponent__default["default"],
props: {
modelValue: null,
options: Array,
optionLabel: null,
optionValue: null,
optionDisabled: null,
multiple: Boolean,
unselectable: {
type: Boolean,
"default": true
},
allowEmpty: {
type: Boolean,
"default": true
},
invalid: {
type: Boolean,
"default": false
},
disabled: Boolean,
dataKey: null,
ariaLabelledby: {
type: String,
"default": null
}
},
style: SelectButtonStyle__default["default"],
provide: function provide() {
return {
$parentInstance: this
};
}
};
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
var script = {
name: 'SelectButton',
"extends": script$1,
inheritAttrs: false,
emits: ['update:modelValue', 'focus', 'blur', 'change'],
data: function data() {
return {
focusedIndex: 0
};
},
mounted: function mounted() {
this.defaultTabIndexes();
},
methods: {
defaultTabIndexes: function defaultTabIndexes() {
var opts = utils.DomHandler.find(this.$refs.container, '[data-pc-section="button"]');
var firstHighlight = utils.DomHandler.findSingle(this.$refs.container, '[data-p-highlight="true"]');
for (var i = 0; i < opts.length; i++) {
if (utils.DomHandler.getAttribute(opts[i], 'data-p-highlight') === true && utils.ObjectUtils.equals(opts[i], firstHighlight) || firstHighlight === null && i == 0) {
this.focusedIndex = i;
}
}
},
getOptionLabel: function getOptionLabel(option) {
return this.optionLabel ? utils.ObjectUtils.resolveFieldData(option, this.optionLabel) : option;
},
getOptionValue: function getOptionValue(option) {
return this.optionValue ? utils.ObjectUtils.resolveFieldData(option, this.optionValue) : option;
},
getOptionRenderKey: function getOptionRenderKey(option) {
return this.dataKey ? utils.ObjectUtils.resolveFieldData(option, this.dataKey) : this.getOptionLabel(option);
},
getPTOptions: function getPTOptions(option, key) {
return this.ptm(key, {
context: {
active: this.isSelected(option),
disabled: this.isOptionDisabled(option),
option: option
}
});
},
isOptionDisabled: function isOptionDisabled(option) {
return this.optionDisabled ? utils.ObjectUtils.resolveFieldData(option, this.optionDisabled) : false;
},
onOptionSelect: function onOptionSelect(event, option, index) {
var _this = this;
if (this.disabled || this.isOptionDisabled(option)) {
return;
}
var selected = this.isSelected(option);
if (selected && !(this.unselectable && this.allowEmpty)) {
return;
}
var optionValue = this.getOptionValue(option);
var newValue;
if (this.multiple) {
if (selected) newValue = this.modelValue.filter(function (val) {
return !utils.ObjectUtils.equals(val, optionValue, _this.equalityKey);
});else newValue = this.modelValue ? [].concat(_toConsumableArray(this.modelValue), [optionValue]) : [optionValue];
} else {
newValue = selected ? null : optionValue;
}
this.focusedIndex = index;
this.$emit('update:modelValue', newValue);
this.$emit('change', {
event: event,
value: newValue
});
},
isSelected: function isSelected(option) {
var selected = false;
var optionValue = this.getOptionValue(option);
if (this.multiple) {
if (this.modelValue) {
var _iterator = _createForOfIteratorHelper(this.modelValue),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var val = _step.value;
if (utils.ObjectUtils.equals(val, optionValue, this.equalityKey)) {
selected = true;
break;
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
} else {
selected = utils.ObjectUtils.equals(this.modelValue, optionValue, this.equalityKey);
}
return selected;
},
onKeydown: function onKeydown(event, option, index) {
switch (event.code) {
case 'Space':
{
this.onOptionSelect(event, option, index);
event.preventDefault();
break;
}
case 'ArrowDown':
case 'ArrowRight':
{
this.onArrowRightKey(event.target);
event.preventDefault();
break;
}
case 'ArrowUp':
case 'ArrowLeft':
{
this.onArrowLeftKey(event.target);
event.preventDefault();
break;
}
}
},
onArrowRightKey: function onArrowRightKey(target) {
var nextEl = this.findNextElement(target);
if (nextEl) {
this.focusedIndex = utils.ObjectUtils.findIndexInList(nextEl, this.findAllElements());
utils.DomHandler.focus(nextEl);
}
},
onArrowLeftKey: function onArrowLeftKey(target) {
var prevEl = this.findPrevElement(target);
if (prevEl) {
this.focusedIndex = utils.ObjectUtils.findIndexInList(prevEl, this.findAllElements());
utils.DomHandler.focus(prevEl);
}
},
findAllElements: function findAllElements() {
return utils.DomHandler.find(this.$refs.container, '[data-pc-section="button"]');
},
findNextElement: function findNextElement(target) {
if (target.nextElementSibling) {
if (utils.DomHandler.getAttribute(target.nextElementSibling, 'data-p-disabled')) {
return this.findNextElement(target.nextElementSibling);
}
return target.nextElementSibling;
}
return null;
},
findPrevElement: function findPrevElement(target) {
if (target.previousElementSibling) {
if (utils.DomHandler.getAttribute(target.previousElementSibling, 'data-p-disabled')) {
return this.findPrevElement(target.previousElementSibling);
}
return target.previousElementSibling;
}
return null;
},
onFocus: function onFocus(event) {
this.$emit('focus', event);
},
onBlur: function onBlur(event, option) {
if (event.target && event.relatedTarget && event.target.parentElement !== event.relatedTarget.parentElement) {
this.defaultTabIndexes();
}
this.$emit('blur', event, option);
},
findTabindex: function findTabindex(option, index) {
return this.disabled || this.isOptionDisabled(option) || index !== this.focusedIndex ? '-1' : '0';
}
},
computed: {
equalityKey: function equalityKey() {
return this.optionValue ? null : this.dataKey;
}
},
directives: {
ripple: Ripple__default["default"]
}
};
var _hoisted_1 = ["aria-labelledby"];
var _hoisted_2 = ["tabindex", "aria-label", "role", "aria-checked", "aria-disabled", "onClick", "onKeydown", "onBlur", "data-p-highlight", "data-p-disabled"];
function render(_ctx, _cache, $props, $setup, $data, $options) {
var _directive_ripple = vue.resolveDirective("ripple");
return vue.openBlock(), vue.createElementBlock("div", vue.mergeProps({
ref: "container",
"class": _ctx.cx('root'),
role: "group",
"aria-labelledby": _ctx.ariaLabelledby
}, _ctx.ptmi('root')), [(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(_ctx.options, function (option, i) {
return vue.withDirectives((vue.openBlock(), vue.createElementBlock("div", vue.mergeProps({
key: $options.getOptionRenderKey(option),
tabindex: $options.findTabindex(option, i),
"aria-label": $options.getOptionLabel(option),
role: _ctx.multiple ? 'checkbox' : 'radio',
"aria-checked": $options.isSelected(option),
"aria-disabled": $options.isOptionDisabled(option),
"class": _ctx.cx('button', {
option: option
}),
onClick: function onClick($event) {
return $options.onOptionSelect($event, option, i);
},
onKeydown: function onKeydown($event) {
return $options.onKeydown($event, option, i);
},
onFocus: _cache[0] || (_cache[0] = function ($event) {
return $options.onFocus($event);
}),
onBlur: function onBlur($event) {
return $options.onBlur($event, option);
}
}, $options.getPTOptions(option, 'button'), {
"data-p-highlight": $options.isSelected(option),
"data-p-disabled": $options.isOptionDisabled(option)
}), [vue.renderSlot(_ctx.$slots, "option", {
option: option,
index: i,
"class": vue.normalizeClass(_ctx.cx('label'))
}, function () {
return [vue.createElementVNode("span", vue.mergeProps({
"class": _ctx.cx('label')
}, $options.getPTOptions(option, 'label')), vue.toDisplayString($options.getOptionLabel(option)), 17)];
})], 16, _hoisted_2)), [[_directive_ripple]]);
}), 128))], 16, _hoisted_1);
}
script.render = render;
return script;
})(primevue.ripple, primevue.utils, primevue.basecomponent, primevue.selectbutton.style, Vue);