123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 |
- 'use strict';
-
- Object.defineProperty(exports, "__esModule", {
- value: true
- });
- exports.defaultMenuProps = undefined;
-
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
-
- require('../../../src/stylus/components/_text-fields.styl');
-
- require('../../../src/stylus/components/_select.styl');
-
- var _VChip = require('../VChip');
-
- var _VChip2 = _interopRequireDefault(_VChip);
-
- var _VMenu = require('../VMenu');
-
- var _VMenu2 = _interopRequireDefault(_VMenu);
-
- var _VSelectList = require('./VSelectList');
-
- var _VSelectList2 = _interopRequireDefault(_VSelectList);
-
- var _VTextField = require('../VTextField/VTextField');
-
- var _VTextField2 = _interopRequireDefault(_VTextField);
-
- var _comparable = require('../../mixins/comparable');
-
- var _comparable2 = _interopRequireDefault(_comparable);
-
- var _filterable = require('../../mixins/filterable');
-
- var _filterable2 = _interopRequireDefault(_filterable);
-
- var _clickOutside = require('../../directives/click-outside');
-
- var _clickOutside2 = _interopRequireDefault(_clickOutside);
-
- var _helpers = require('../../util/helpers');
-
- var _console = require('../../util/console');
-
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
- 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; } // Styles
-
- // Components
-
- // Extensions
-
- // Mixins
-
- // Directives
-
- // Helpers
-
-
- var defaultMenuProps = exports.defaultMenuProps = {
- closeOnClick: false,
- closeOnContentClick: false,
- openOnClick: false,
- maxHeight: 300
- };
- /* @vue/component */
- exports.default = _VTextField2.default.extend({
- name: 'v-select',
- directives: {
- ClickOutside: _clickOutside2.default
- },
- mixins: [_comparable2.default, _filterable2.default],
- props: {
- appendIcon: {
- type: String,
- default: '$vuetify.icons.dropdown'
- },
- appendIconCb: Function,
- attach: {
- type: null,
- default: false
- },
- browserAutocomplete: {
- type: String,
- default: 'on'
- },
- cacheItems: Boolean,
- chips: Boolean,
- clearable: Boolean,
- deletableChips: Boolean,
- dense: Boolean,
- hideSelected: Boolean,
- items: {
- type: Array,
- default: function _default() {
- return [];
- }
- },
- itemAvatar: {
- type: [String, Array, Function],
- default: 'avatar'
- },
- itemDisabled: {
- type: [String, Array, Function],
- default: 'disabled'
- },
- itemText: {
- type: [String, Array, Function],
- default: 'text'
- },
- itemValue: {
- type: [String, Array, Function],
- default: 'value'
- },
- menuProps: {
- type: [String, Array, Object],
- default: function _default() {
- return defaultMenuProps;
- }
- },
- multiple: Boolean,
- openOnClear: Boolean,
- returnObject: Boolean,
- searchInput: {
- default: null
- },
- smallChips: Boolean
- },
- data: function data(vm) {
- return {
- attrsInput: { role: 'combobox' },
- cachedItems: vm.cacheItems ? vm.items : [],
- content: null,
- isBooted: false,
- isMenuActive: false,
- lastItem: 20,
- // As long as a value is defined, show it
- // Otherwise, check if multiple
- // to determine which default to provide
- lazyValue: vm.value !== undefined ? vm.value : vm.multiple ? [] : undefined,
- selectedIndex: -1,
- selectedItems: [],
- keyboardLookupPrefix: '',
- keyboardLookupLastTime: 0
- };
- },
- computed: {
- /* All items that the select has */
- allItems: function allItems() {
- return this.filterDuplicates(this.cachedItems.concat(this.items));
- },
- classes: function classes() {
- return Object.assign({}, _VTextField2.default.options.computed.classes.call(this), {
- 'v-select': true,
- 'v-select--chips': this.hasChips,
- 'v-select--chips--small': this.smallChips,
- 'v-select--is-menu-active': this.isMenuActive
- });
- },
-
- /* Used by other components to overwrite */
- computedItems: function computedItems() {
- return this.allItems;
- },
- counterValue: function counterValue() {
- return this.multiple ? this.selectedItems.length : (this.getText(this.selectedItems[0]) || '').toString().length;
- },
- directives: function directives() {
- return this.isFocused ? [{
- name: 'click-outside',
- value: this.blur,
- args: {
- closeConditional: this.closeConditional
- }
- }] : undefined;
- },
- dynamicHeight: function dynamicHeight() {
- return 'auto';
- },
- hasChips: function hasChips() {
- return this.chips || this.smallChips;
- },
- hasSlot: function hasSlot() {
- return Boolean(this.hasChips || this.$scopedSlots.selection);
- },
- isDirty: function isDirty() {
- return this.selectedItems.length > 0;
- },
- listData: function listData() {
- var scopeId = this.$vnode && this.$vnode.context.$options._scopeId;
- return {
- attrs: scopeId ? _defineProperty({}, scopeId, true) : null,
- props: {
- action: this.multiple && !this.isHidingSelected,
- color: this.color,
- dense: this.dense,
- hideSelected: this.hideSelected,
- items: this.virtualizedItems,
- noDataText: this.$vuetify.t(this.noDataText),
- selectedItems: this.selectedItems,
- itemAvatar: this.itemAvatar,
- itemDisabled: this.itemDisabled,
- itemValue: this.itemValue,
- itemText: this.itemText
- },
- on: {
- select: this.selectItem
- },
- scopedSlots: {
- item: this.$scopedSlots.item
- }
- };
- },
- staticList: function staticList() {
- if (this.$slots['no-data'] || this.$slots['prepend-item'] || this.$slots['append-item']) {
- (0, _console.consoleError)('assert: staticList should not be called if slots are used');
- }
- return this.$createElement(_VSelectList2.default, this.listData);
- },
- virtualizedItems: function virtualizedItems() {
- return this.$_menuProps.auto ? this.computedItems : this.computedItems.slice(0, this.lastItem);
- },
- menuCanShow: function menuCanShow() {
- return true;
- },
- $_menuProps: function $_menuProps() {
- var normalisedProps = void 0;
- normalisedProps = typeof this.menuProps === 'string' ? this.menuProps.split(',') : this.menuProps;
- if (Array.isArray(normalisedProps)) {
- normalisedProps = normalisedProps.reduce(function (acc, p) {
- acc[p.trim()] = true;
- return acc;
- }, {});
- }
- return _extends({}, defaultMenuProps, {
- value: this.menuCanShow && this.isMenuActive,
- nudgeBottom: this.nudgeBottom ? this.nudgeBottom : normalisedProps.offsetY ? 1 : 0
- }, normalisedProps);
- }
- },
- watch: {
- internalValue: function internalValue(val) {
- this.initialValue = val;
- this.setSelectedItems();
- },
- isBooted: function isBooted() {
- var _this = this;
-
- this.$nextTick(function () {
- if (_this.content && _this.content.addEventListener) {
- _this.content.addEventListener('scroll', _this.onScroll, false);
- }
- });
- },
- isMenuActive: function isMenuActive(val) {
- if (!val) return;
- this.isBooted = true;
- },
-
- items: {
- immediate: true,
- handler: function handler(val) {
- if (this.cacheItems) {
- this.cachedItems = this.filterDuplicates(this.cachedItems.concat(val));
- }
- this.setSelectedItems();
- }
- }
- },
- mounted: function mounted() {
- this.content = this.$refs.menu && this.$refs.menu.$refs.content;
- },
-
- methods: {
- /** @public */
- blur: function blur(e) {
- this.isMenuActive = false;
- this.isFocused = false;
- this.$refs.input && this.$refs.input.blur();
- this.selectedIndex = -1;
- this.onBlur(e);
- },
-
- /** @public */
- activateMenu: function activateMenu() {
- this.isMenuActive = true;
- },
- clearableCallback: function clearableCallback() {
- var _this2 = this;
-
- this.setValue(this.multiple ? [] : undefined);
- this.$nextTick(function () {
- return _this2.$refs.input.focus();
- });
- if (this.openOnClear) this.isMenuActive = true;
- },
- closeConditional: function closeConditional(e) {
- return (
- // Click originates from outside the menu content
- !!this.content && !this.content.contains(e.target) &&
- // Click originates from outside the element
- !!this.$el && !this.$el.contains(e.target) && e.target !== this.$el
- );
- },
- filterDuplicates: function filterDuplicates(arr) {
- var uniqueValues = new Map();
- for (var index = 0; index < arr.length; ++index) {
- var item = arr[index];
- var val = this.getValue(item);
- // TODO: comparator
- !uniqueValues.has(val) && uniqueValues.set(val, item);
- }
- return Array.from(uniqueValues.values());
- },
- findExistingIndex: function findExistingIndex(item) {
- var _this3 = this;
-
- var itemValue = this.getValue(item);
- return (this.internalValue || []).findIndex(function (i) {
- return _this3.valueComparator(_this3.getValue(i), itemValue);
- });
- },
- genChipSelection: function genChipSelection(item, index) {
- var _this4 = this;
-
- var isDisabled = this.disabled || this.readonly || this.getDisabled(item);
- return this.$createElement(_VChip2.default, {
- staticClass: 'v-chip--select-multi',
- attrs: { tabindex: -1 },
- props: {
- close: this.deletableChips && !isDisabled,
- disabled: isDisabled,
- selected: index === this.selectedIndex,
- small: this.smallChips
- },
- on: {
- click: function click(e) {
- if (isDisabled) return;
- e.stopPropagation();
- _this4.selectedIndex = index;
- },
- input: function input() {
- return _this4.onChipInput(item);
- }
- },
- key: this.getValue(item)
- }, this.getText(item));
- },
- genCommaSelection: function genCommaSelection(item, index, last) {
- // Item may be an object
- // TODO: Remove JSON.stringify
- var key = JSON.stringify(this.getValue(item));
- var color = index === this.selectedIndex && this.color;
- var isDisabled = this.disabled || this.getDisabled(item);
- return this.$createElement('div', this.setTextColor(color, {
- staticClass: 'v-select__selection v-select__selection--comma',
- 'class': {
- 'v-select__selection--disabled': isDisabled
- },
- key: key
- }), '' + this.getText(item) + (last ? '' : ', '));
- },
- genDefaultSlot: function genDefaultSlot() {
- var selections = this.genSelections();
- var input = this.genInput();
- // If the return is an empty array
- // push the input
- if (Array.isArray(selections)) {
- selections.push(input);
- // Otherwise push it into children
- } else {
- selections.children = selections.children || [];
- selections.children.push(input);
- }
- return [this.$createElement('div', {
- staticClass: 'v-select__slot',
- directives: this.directives
- }, [this.genLabel(), this.prefix ? this.genAffix('prefix') : null, selections, this.suffix ? this.genAffix('suffix') : null, this.genClearIcon(), this.genIconSlot()]), this.genMenu(), this.genProgress()];
- },
- genInput: function genInput() {
- var input = _VTextField2.default.options.methods.genInput.call(this);
- input.data.domProps.value = null;
- input.data.attrs.readonly = true;
- input.data.attrs['aria-readonly'] = String(this.readonly);
- input.data.on.keypress = this.onKeyPress;
- return input;
- },
- genList: function genList() {
- // If there's no slots, we can use a cached VNode to improve performance
- if (this.$slots['no-data'] || this.$slots['prepend-item'] || this.$slots['append-item']) {
- return this.genListWithSlot();
- } else {
- return this.staticList;
- }
- },
- genListWithSlot: function genListWithSlot() {
- var _this5 = this;
-
- var slots = ['prepend-item', 'no-data', 'append-item'].filter(function (slotName) {
- return _this5.$slots[slotName];
- }).map(function (slotName) {
- return _this5.$createElement('template', {
- slot: slotName
- }, _this5.$slots[slotName]);
- });
- // Requires destructuring due to Vue
- // modifying the `on` property when passed
- // as a referenced object
- return this.$createElement(_VSelectList2.default, _extends({}, this.listData), slots);
- },
- genMenu: function genMenu() {
- var _this6 = this;
-
- var props = this.$_menuProps;
- props.activator = this.$refs['input-slot'];
- // Deprecate using menu props directly
- // TODO: remove (2.0)
- var inheritedProps = Object.keys(_VMenu2.default.options.props);
- var deprecatedProps = Object.keys(this.$attrs).reduce(function (acc, attr) {
- if (inheritedProps.includes((0, _helpers.camelize)(attr))) acc.push(attr);
- return acc;
- }, []);
- var _iteratorNormalCompletion = true;
- var _didIteratorError = false;
- var _iteratorError = undefined;
-
- try {
- for (var _iterator = deprecatedProps[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
- var prop = _step.value;
-
- props[(0, _helpers.camelize)(prop)] = this.$attrs[prop];
- }
- } catch (err) {
- _didIteratorError = true;
- _iteratorError = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion && _iterator.return) {
- _iterator.return();
- }
- } finally {
- if (_didIteratorError) {
- throw _iteratorError;
- }
- }
- }
-
- if (process.env.NODE_ENV !== 'production') {
- if (deprecatedProps.length) {
- var multiple = deprecatedProps.length > 1;
- var replacement = deprecatedProps.reduce(function (acc, p) {
- acc[(0, _helpers.camelize)(p)] = _this6.$attrs[p];
- return acc;
- }, {});
- var _props = deprecatedProps.map(function (p) {
- return '\'' + p + '\'';
- }).join(', ');
- var separator = multiple ? '\n' : '\'';
- var onlyBools = Object.keys(replacement).every(function (prop) {
- var propType = _VMenu2.default.options.props[prop];
- var value = replacement[prop];
- return value === true || (propType.type || propType) === Boolean && value === '';
- });
- if (onlyBools) {
- replacement = Object.keys(replacement).join(', ');
- } else {
- replacement = JSON.stringify(replacement, null, multiple ? 2 : 0).replace(/"([^(")"]+)":/g, '$1:').replace(/"/g, '\'');
- }
- (0, _console.consoleWarn)(_props + ' ' + (multiple ? 'are' : 'is') + ' deprecated, use ' + ('' + separator + (onlyBools ? '' : ':') + 'menu-props="' + replacement + '"' + separator + ' instead'), this);
- }
- }
- // Attach to root el so that
- // menu covers prepend/append icons
- if (
- // TODO: make this a computed property or helper or something
- this.attach === '' || // If used as a boolean prop (<v-menu attach>)
- this.attach === true || // If bound to a boolean (<v-menu :attach="true">)
- this.attach === 'attach' // If bound as boolean prop in pug (v-menu(attach))
- ) {
- props.attach = this.$el;
- } else {
- props.attach = this.attach;
- }
- return this.$createElement(_VMenu2.default, {
- props: props,
- on: {
- input: function input(val) {
- _this6.isMenuActive = val;
- _this6.isFocused = val;
- }
- },
- ref: 'menu'
- }, [this.genList()]);
- },
- genSelections: function genSelections() {
- var length = this.selectedItems.length;
- var children = new Array(length);
- var genSelection = void 0;
- if (this.$scopedSlots.selection) {
- genSelection = this.genSlotSelection;
- } else if (this.hasChips) {
- genSelection = this.genChipSelection;
- } else {
- genSelection = this.genCommaSelection;
- }
- while (length--) {
- children[length] = genSelection(this.selectedItems[length], length, length === children.length - 1);
- }
- return this.$createElement('div', {
- staticClass: 'v-select__selections'
- }, children);
- },
- genSlotSelection: function genSlotSelection(item, index) {
- return this.$scopedSlots.selection({
- parent: this,
- item: item,
- index: index,
- selected: index === this.selectedIndex,
- disabled: this.disabled || this.readonly
- });
- },
- getMenuIndex: function getMenuIndex() {
- return this.$refs.menu ? this.$refs.menu.listIndex : -1;
- },
- getDisabled: function getDisabled(item) {
- return (0, _helpers.getPropertyFromItem)(item, this.itemDisabled, false);
- },
- getText: function getText(item) {
- return (0, _helpers.getPropertyFromItem)(item, this.itemText, item);
- },
- getValue: function getValue(item) {
- return (0, _helpers.getPropertyFromItem)(item, this.itemValue, this.getText(item));
- },
- onBlur: function onBlur(e) {
- this.$emit('blur', e);
- },
- onChipInput: function onChipInput(item) {
- if (this.multiple) this.selectItem(item);else this.setValue(null);
- // If all items have been deleted,
- // open `v-menu`
- if (this.selectedItems.length === 0) {
- this.isMenuActive = true;
- } else {
- this.isMenuActive = false;
- }
- this.selectedIndex = -1;
- },
- onClick: function onClick() {
- if (this.isDisabled) return;
- this.isMenuActive = true;
- if (!this.isFocused) {
- this.isFocused = true;
- this.$emit('focus');
- }
- },
- onEnterDown: function onEnterDown() {
- this.onBlur();
- },
- onEscDown: function onEscDown(e) {
- e.preventDefault();
- if (this.isMenuActive) {
- e.stopPropagation();
- this.isMenuActive = false;
- }
- },
- onKeyPress: function onKeyPress(e) {
- var _this7 = this;
-
- if (this.multiple) return;
- var KEYBOARD_LOOKUP_THRESHOLD = 1000; // milliseconds
- var now = performance.now();
- if (now - this.keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
- this.keyboardLookupPrefix = '';
- }
- this.keyboardLookupPrefix += e.key.toLowerCase();
- this.keyboardLookupLastTime = now;
- var index = this.allItems.findIndex(function (item) {
- return _this7.getText(item).toLowerCase().startsWith(_this7.keyboardLookupPrefix);
- });
- var item = this.allItems[index];
- if (index !== -1) {
- this.setValue(this.returnObject ? item : this.getValue(item));
- setTimeout(function () {
- return _this7.setMenuIndex(index);
- });
- }
- },
- onKeyDown: function onKeyDown(e) {
- var keyCode = e.keyCode;
- // If enter, space, up, or down is pressed, open menu
- if (!this.readonly && !this.isMenuActive && [_helpers.keyCodes.enter, _helpers.keyCodes.space, _helpers.keyCodes.up, _helpers.keyCodes.down].includes(keyCode)) this.activateMenu();
- if (this.isMenuActive && this.$refs.menu) this.$refs.menu.changeListIndex(e);
- // This should do something different
- if (keyCode === _helpers.keyCodes.enter) return this.onEnterDown(e);
- // If escape deactivate the menu
- if (keyCode === _helpers.keyCodes.esc) return this.onEscDown(e);
- // If tab - select item or close menu
- if (keyCode === _helpers.keyCodes.tab) return this.onTabDown(e);
- },
- onMouseUp: function onMouseUp(e) {
- var _this8 = this;
-
- if (this.hasMouseDown) {
- var appendInner = this.$refs['append-inner'];
- // If append inner is present
- // and the target is itself
- // or inside, toggle menu
- if (this.isMenuActive && appendInner && (appendInner === e.target || appendInner.contains(e.target))) {
- this.$nextTick(function () {
- return _this8.isMenuActive = !_this8.isMenuActive;
- });
- // If user is clicking in the container
- // and field is enclosed, activate it
- } else if (this.isEnclosed && !this.isDisabled) {
- this.isMenuActive = true;
- }
- }
- _VTextField2.default.options.methods.onMouseUp.call(this, e);
- },
- onScroll: function onScroll() {
- var _this9 = this;
-
- if (!this.isMenuActive) {
- requestAnimationFrame(function () {
- return _this9.content.scrollTop = 0;
- });
- } else {
- if (this.lastItem >= this.computedItems.length) return;
- var showMoreItems = this.content.scrollHeight - (this.content.scrollTop + this.content.clientHeight) < 200;
- if (showMoreItems) {
- this.lastItem += 20;
- }
- }
- },
- onTabDown: function onTabDown(e) {
- var menuIndex = this.getMenuIndex();
- var listTile = this.$refs.menu.tiles[menuIndex];
- // An item that is selected by
- // menu-index should toggled
- if (listTile && listTile.className.indexOf('v-list__tile--highlighted') > -1 && this.isMenuActive && menuIndex > -1) {
- e.preventDefault();
- e.stopPropagation();
- listTile.click();
- } else {
- // If we make it here,
- // the user has no selected indexes
- // and is probably tabbing out
- this.blur(e);
- }
- },
- selectItem: function selectItem(item) {
- var _this10 = this;
-
- if (!this.multiple) {
- this.setValue(this.returnObject ? item : this.getValue(item));
- this.isMenuActive = false;
- } else {
- var internalValue = (this.internalValue || []).slice();
- var i = this.findExistingIndex(item);
- i !== -1 ? internalValue.splice(i, 1) : internalValue.push(item);
- this.setValue(internalValue.map(function (i) {
- return _this10.returnObject ? i : _this10.getValue(i);
- }));
- // When selecting multiple
- // adjust menu after each
- // selection
- this.$nextTick(function () {
- _this10.$refs.menu && _this10.$refs.menu.updateDimensions();
- });
- }
- },
- setMenuIndex: function setMenuIndex(index) {
- this.$refs.menu && (this.$refs.menu.listIndex = index);
- },
- setSelectedItems: function setSelectedItems() {
- var _this11 = this;
-
- var selectedItems = [];
- var values = !this.multiple || !Array.isArray(this.internalValue) ? [this.internalValue] : this.internalValue;
-
- var _loop = function _loop(value) {
- var index = _this11.allItems.findIndex(function (v) {
- return _this11.valueComparator(_this11.getValue(v), _this11.getValue(value));
- });
- if (index > -1) {
- selectedItems.push(_this11.allItems[index]);
- }
- };
-
- var _iteratorNormalCompletion2 = true;
- var _didIteratorError2 = false;
- var _iteratorError2 = undefined;
-
- try {
- for (var _iterator2 = values[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
- var value = _step2.value;
-
- _loop(value);
- }
- } catch (err) {
- _didIteratorError2 = true;
- _iteratorError2 = err;
- } finally {
- try {
- if (!_iteratorNormalCompletion2 && _iterator2.return) {
- _iterator2.return();
- }
- } finally {
- if (_didIteratorError2) {
- throw _iteratorError2;
- }
- }
- }
-
- this.selectedItems = selectedItems;
- },
- setValue: function setValue(value) {
- var oldValue = this.internalValue;
- this.internalValue = value;
- value !== oldValue && this.$emit('change', value);
- }
- }
- });
- //# sourceMappingURL=VSelect.js.map
|