|
1 | 1 | /**
|
2 |
| - * selectize.js (v0.9.0) |
| 2 | + * selectize.js (v0.9.1) |
3 | 3 | * Copyright (c) 2013 Brian Reavis & contributors
|
4 | 4 | *
|
5 | 5 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
|
|
371 | 371 | if (!str) {
|
372 | 372 | return 0;
|
373 | 373 | }
|
374 |
| - |
| 374 | + |
375 | 375 | var $test = $('<test>').css({
|
376 | 376 | position: 'absolute',
|
377 | 377 | top: -99999,
|
|
406 | 406 | */
|
407 | 407 | var autoGrow = function($input) {
|
408 | 408 | var currentWidth = null;
|
409 |
| - |
410 |
| - var update = function(e) { |
| 409 | + |
| 410 | + var update = function(e, options) { |
411 | 411 | var value, keyCode, printable, placeholder, width;
|
412 | 412 | var shift, character, selection;
|
413 | 413 | e = e || window.event || {};
|
| 414 | + options = options || {}; |
414 | 415 |
|
415 | 416 | if (e.metaKey || e.altKey) return;
|
416 |
| - if ($input.data('grow') === false) return; |
| 417 | + if (!options.force && $input.data('grow') === false) return; |
417 | 418 |
|
418 | 419 | value = $input.val();
|
419 | 420 | if (e.type && e.type.toLowerCase() === 'keydown') {
|
|
443 | 444 | }
|
444 | 445 | }
|
445 | 446 |
|
446 |
| - placeholder = $input.attr('placeholder') || ''; |
447 |
| - if (!value.length && placeholder.length) { |
| 447 | + placeholder = $input.attr('placeholder'); |
| 448 | + if (!value && placeholder) { |
448 | 449 | value = placeholder;
|
449 | 450 | }
|
450 | 451 |
|
|
506 | 507 | userOptions : {},
|
507 | 508 | items : [],
|
508 | 509 | renderCache : {},
|
509 |
| - onSearchChange : debounce(self.onSearchChange, settings.loadThrottle) |
| 510 | + onSearchChange : settings.loadThrottle === null ? self.onSearchChange : debounce(self.onSearchChange, settings.loadThrottle) |
510 | 511 | });
|
511 | 512 |
|
512 | 513 | // search system
|
|
595 | 596 | $control_input.attr('placeholder', settings.placeholder);
|
596 | 597 | }
|
597 | 598 |
|
| 599 | + if (self.$input.attr('autocorrect')) { |
| 600 | + $control_input.attr('autocorrect', self.$input.attr('autocorrect')); |
| 601 | + } |
| 602 | + |
| 603 | + if (self.$input.attr('autocapitalize')) { |
| 604 | + $control_input.attr('autocapitalize', self.$input.attr('autocapitalize')); |
| 605 | + } |
| 606 | + |
598 | 607 | self.$wrapper = $wrapper;
|
599 | 608 | self.$control = $control;
|
600 | 609 | self.$control_input = $control_input;
|
|
618 | 627 | keypress : function() { return self.onKeyPress.apply(self, arguments); },
|
619 | 628 | resize : function() { self.positionDropdown.apply(self, []); },
|
620 | 629 | blur : function() { return self.onBlur.apply(self, arguments); },
|
621 |
| - focus : function() { return self.onFocus.apply(self, arguments); } |
| 630 | + focus : function() { return self.onFocus.apply(self, arguments); }, |
| 631 | + paste : function() { return self.onPaste.apply(self, arguments); } |
622 | 632 | });
|
623 | 633 |
|
624 | 634 | $document.on('keydown' + eventNS, function(e) {
|
|
815 | 825 | this.$input.trigger('change');
|
816 | 826 | },
|
817 | 827 |
|
| 828 | + |
| 829 | + /** |
| 830 | + * Triggered on <input> paste. |
| 831 | + * |
| 832 | + * @param {object} e |
| 833 | + * @returns {boolean} |
| 834 | + */ |
| 835 | + onPaste: function(e) { |
| 836 | + var self = this; |
| 837 | + if (self.isFull() || self.isInputHidden || self.isLocked) { |
| 838 | + e.preventDefault(); |
| 839 | + } |
| 840 | + }, |
| 841 | + |
818 | 842 | /**
|
819 | 843 | * Triggered on <input> keypress.
|
820 | 844 | *
|
|
859 | 883 | self.close();
|
860 | 884 | return;
|
861 | 885 | case KEY_N:
|
862 |
| - if (!e.ctrlKey) break; |
| 886 | + if (!e.ctrlKey || e.altKey) break; |
863 | 887 | case KEY_DOWN:
|
864 | 888 | if (!self.isOpen && self.hasOptions) {
|
865 | 889 | self.open();
|
|
871 | 895 | e.preventDefault();
|
872 | 896 | return;
|
873 | 897 | case KEY_P:
|
874 |
| - if (!e.ctrlKey) break; |
| 898 | + if (!e.ctrlKey || e.altKey) break; |
875 | 899 | case KEY_UP:
|
876 | 900 | if (self.$activeOption) {
|
877 | 901 | self.ignoreHover = true;
|
|
893 | 917 | self.advanceSelection(1, e);
|
894 | 918 | return;
|
895 | 919 | case KEY_TAB:
|
896 |
| - if (self.isOpen && self.$activeOption) { |
| 920 | + if (self.settings.selectOnTab && self.isOpen && self.$activeOption) { |
897 | 921 | self.onOptionSelect({currentTarget: self.$activeOption});
|
898 | 922 | }
|
899 | 923 | if (self.settings.create && self.createItem()) {
|
|
905 | 929 | self.deleteSelection(e);
|
906 | 930 | return;
|
907 | 931 | }
|
908 |
| - if (self.isFull() || self.isInputHidden) { |
| 932 | + |
| 933 | + if ((self.isFull() || self.isInputHidden) && !(IS_MAC ? e.metaKey : e.ctrlKey)) { |
909 | 934 | e.preventDefault();
|
910 | 935 | return;
|
911 | 936 | }
|
|
1091 | 1116 | * @param {string} value
|
1092 | 1117 | */
|
1093 | 1118 | setTextboxValue: function(value) {
|
1094 |
| - this.$control_input.val(value).triggerHandler('update'); |
1095 |
| - this.lastValue = value; |
| 1119 | + var $input = this.$control_input; |
| 1120 | + var changed = $input.val() !== value; |
| 1121 | + if (changed) { |
| 1122 | + $input.val(value).triggerHandler('update'); |
| 1123 | + this.lastValue = value; |
| 1124 | + } |
1096 | 1125 | },
|
1097 | 1126 |
|
1098 | 1127 | /**
|
|
1573 | 1602 | cache_items = self.renderCache['item'];
|
1574 | 1603 | cache_options = self.renderCache['option'];
|
1575 | 1604 |
|
1576 |
| - if (isset(cache_items)) { |
| 1605 | + if (cache_items) { |
1577 | 1606 | delete cache_items[value];
|
1578 | 1607 | delete cache_items[value_new];
|
1579 | 1608 | }
|
1580 |
| - if (isset(cache_options)) { |
| 1609 | + if (cache_options) { |
1581 | 1610 | delete cache_options[value];
|
1582 | 1611 | delete cache_options[value_new];
|
1583 | 1612 | }
|
|
1603 | 1632 | */
|
1604 | 1633 | removeOption: function(value) {
|
1605 | 1634 | var self = this;
|
1606 |
| - |
1607 | 1635 | value = hash_key(value);
|
| 1636 | + |
| 1637 | + var cache_items = self.renderCache['item']; |
| 1638 | + var cache_options = self.renderCache['option']; |
| 1639 | + if (cache_items) delete cache_items[value]; |
| 1640 | + if (cache_options) delete cache_options[value]; |
| 1641 | + |
1608 | 1642 | delete self.userOptions[value];
|
1609 | 1643 | delete self.options[value];
|
1610 | 1644 | self.lastQuery = null;
|
|
1620 | 1654 |
|
1621 | 1655 | self.loadedSearches = {};
|
1622 | 1656 | self.userOptions = {};
|
| 1657 | + self.renderCache = {}; |
1623 | 1658 | self.options = self.sifter.items = {};
|
1624 | 1659 | self.lastQuery = null;
|
1625 | 1660 | self.trigger('option_clear');
|
|
1945 | 1980 | } else {
|
1946 | 1981 | $input.attr('placeholder', this.settings.placeholder);
|
1947 | 1982 | }
|
1948 |
| - $input.triggerHandler('update'); |
| 1983 | + $input.triggerHandler('update', {force: true}); |
1949 | 1984 | },
|
1950 | 1985 |
|
1951 | 1986 | /**
|
|
2335 | 2370 | maxItems: null,
|
2336 | 2371 | hideSelected: null,
|
2337 | 2372 | addPrecedence: false,
|
| 2373 | + selectOnTab: false, |
2338 | 2374 | preload: false,
|
2339 | 2375 |
|
2340 | 2376 | scrollDuration: 60,
|
|
0 commit comments