bootstrap-vue
Version:
BootstrapVue, with more than 85 custom components, over 45 plugins, several custom directives, and over 300 icons, provides one of the most comprehensive implementations of Bootstrap v4 components and grid system for Vue.js. With extensive and automated W
149 lines (134 loc) • 5.28 kB
JavaScript
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
import Vue from '../../utils/vue';
import { arrayIncludes } from '../../utils/array';
import { eventOn, eventOff, eventOnOff } from '../../utils/events';
import idMixin from '../../mixins/id';
import formMixin from '../../mixins/form';
import formSizeMixin from '../../mixins/form-size';
import formStateMixin from '../../mixins/form-state';
import formTextMixin from '../../mixins/form-text';
import formSelectionMixin from '../../mixins/form-selection';
import formValidityMixin from '../../mixins/form-validity'; // Valid supported input types
var TYPES = ['text', 'password', 'email', 'number', 'url', 'tel', 'search', 'range', 'color', 'date', 'time', 'datetime', 'datetime-local', 'month', 'week']; // @vue/component
export var BFormInput = /*#__PURE__*/Vue.extend({
name: 'BFormInput',
mixins: [idMixin, formMixin, formSizeMixin, formStateMixin, formTextMixin, formSelectionMixin, formValidityMixin],
props: {
// value prop defined in form-text mixin
// value: { },
type: {
type: String,
default: 'text',
validator: function validator(type) {
return arrayIncludes(TYPES, type);
}
},
noWheel: {
// Disable mousewheel to prevent wheel from changing values (i.e. number/date).
type: Boolean,
default: false
},
min: {
type: [String, Number] // default: null
},
max: {
type: [String, Number] // default: null
},
step: {
type: [String, Number] // default: null
},
list: {
type: String // default: null
}
},
computed: {
localType: function localType() {
// We only allow certain types
return arrayIncludes(TYPES, this.type) ? this.type : 'text';
}
},
watch: {
noWheel: function noWheel(newVal) {
this.setWheelStopper(newVal);
}
},
mounted: function mounted() {
this.setWheelStopper(this.noWheel);
},
/* istanbul ignore next */
deactivated: function deactivated() {
// Turn off listeners when keep-alive component deactivated
/* istanbul ignore next */
this.setWheelStopper(false);
},
/* istanbul ignore next */
activated: function activated() {
// Turn on listeners (if no-wheel) when keep-alive component activated
/* istanbul ignore next */
this.setWheelStopper(this.noWheel);
},
beforeDestroy: function beforeDestroy() {
/* istanbul ignore next */
this.setWheelStopper(false);
},
methods: {
setWheelStopper: function setWheelStopper(on) {
var input = this.$el; // We use native events, so that we don't interfere with propagation
eventOnOff(on, input, 'focus', this.onWheelFocus);
eventOnOff(on, input, 'blur', this.onWheelBlur);
if (!on) {
eventOff(document, 'wheel', this.stopWheel);
}
},
onWheelFocus: function onWheelFocus() {
eventOn(document, 'wheel', this.stopWheel);
},
onWheelBlur: function onWheelBlur() {
eventOff(document, 'wheel', this.stopWheel);
},
stopWheel: function stopWheel(evt) {
evt.preventDefault();
this.$el.blur();
}
},
render: function render(h) {
var self = this;
return h('input', {
ref: 'input',
class: self.computedClass,
directives: [{
name: 'model',
rawName: 'v-model',
value: self.localValue,
expression: 'localValue'
}],
attrs: {
id: self.safeId(),
name: self.name,
form: self.form || null,
type: self.localType,
disabled: self.disabled,
placeholder: self.placeholder,
required: self.required,
autocomplete: self.autocomplete || null,
readonly: self.readonly || self.plaintext,
min: self.min,
max: self.max,
step: self.step,
list: self.localType !== 'password' ? self.list : null,
'aria-required': self.required ? 'true' : null,
'aria-invalid': self.computedAriaInvalid
},
domProps: {
value: self.localValue
},
on: _objectSpread(_objectSpread({}, self.$listeners), {}, {
input: self.onInput,
change: self.onChange,
blur: self.onBlur
})
});
}
});