|
1 |
| -/*! selectize.js - v0.6.9 | https://github.com/brianreavis/selectize.js | Apache License (v2) */ |
| 1 | +/*! selectize.js - v0.6.10 | https://github.com/brianreavis/selectize.js | Apache License (v2) */ |
2 | 2 |
|
3 | 3 | (function(factory) {
|
4 | 4 | if (typeof exports === 'object') {
|
|
249 | 249 | return typeof object !== 'undefined';
|
250 | 250 | };
|
251 | 251 |
|
| 252 | + /** |
| 253 | + * Converts a scalar to its best string representation |
| 254 | + * for hash keys and HTML attribute values. |
| 255 | + * |
| 256 | + * Transformations: |
| 257 | + * 'str' -> 'str' |
| 258 | + * null -> '' |
| 259 | + * undefined -> '' |
| 260 | + * true -> '1' |
| 261 | + * false -> '0' |
| 262 | + * 0 -> '0' |
| 263 | + * 1 -> '1' |
| 264 | + * |
| 265 | + * @param {string} value |
| 266 | + * @returns {string} |
| 267 | + */ |
| 268 | + var hash_key = function(value) { |
| 269 | + if (typeof value === 'undefined' || value === null) return ''; |
| 270 | + if (typeof value === 'boolean') return value ? '1' : '0'; |
| 271 | + return value + ''; |
| 272 | + }; |
| 273 | + |
252 | 274 | /**
|
253 | 275 | * Escapes a string for use within HTML.
|
254 | 276 | *
|
|
872 | 894 | case KEY_A:
|
873 | 895 | if (self.isCmdDown) {
|
874 | 896 | self.selectAll();
|
875 |
| - e.preventDefault(); |
876 | 897 | return;
|
877 | 898 | }
|
878 | 899 | break;
|
|
1654 | 1675 | return;
|
1655 | 1676 | }
|
1656 | 1677 |
|
1657 |
| - value = value || ''; |
| 1678 | + value = hash_key(value); |
1658 | 1679 | if (self.options.hasOwnProperty(value)) return;
|
1659 | 1680 |
|
1660 | 1681 | self.userOptions[value] = true;
|
|
1686 | 1707 | updateOption: function(value, data) {
|
1687 | 1708 | var self = this;
|
1688 | 1709 | var $item, $item_new;
|
| 1710 | + var value, value_new, index_item, cache_items, cache_options; |
1689 | 1711 |
|
1690 |
| - value = String(value); |
1691 |
| - self.options[value] = data; |
1692 |
| - if (isset(self.renderCache['item'])) delete self.renderCache['item'][value]; |
1693 |
| - if (isset(self.renderCache['option'])) delete self.renderCache['option'][value]; |
| 1712 | + value = hash_key(value); |
| 1713 | + value_new = hash_key(data[self.settings.valueField]); |
| 1714 | + |
| 1715 | + // sanity checks |
| 1716 | + if (!self.options.hasOwnProperty(value)) return; |
| 1717 | + if (!value_new) throw new Error('Value must be set in option data'); |
| 1718 | + |
| 1719 | + // update references |
| 1720 | + if (value_new !== value) { |
| 1721 | + delete self.options[value]; |
| 1722 | + index_item = self.items.indexOf(value); |
| 1723 | + if (index_item !== -1) { |
| 1724 | + self.items.splice(index_item, 1, value_new); |
| 1725 | + } |
| 1726 | + } |
| 1727 | + self.options[value_new] = data; |
| 1728 | + |
| 1729 | + // invalidate render cache |
| 1730 | + cache_items = self.renderCache['item']; |
| 1731 | + cache_options = self.renderCache['option']; |
| 1732 | + |
| 1733 | + if (isset(cache_items)) { |
| 1734 | + delete cache_items[value]; |
| 1735 | + delete cache_items[value_new]; |
| 1736 | + } |
| 1737 | + if (isset(cache_options)) { |
| 1738 | + delete cache_options[value]; |
| 1739 | + delete cache_options[value_new]; |
| 1740 | + } |
1694 | 1741 |
|
1695 |
| - if (self.items.indexOf(value) !== -1) { |
| 1742 | + // update the item if it's selected |
| 1743 | + if (self.items.indexOf(value_new) !== -1) { |
1696 | 1744 | $item = self.getItem(value);
|
1697 | 1745 | $item_new = $(self.render('item', data));
|
1698 | 1746 | if ($item.hasClass('active')) $item_new.addClass('active');
|
1699 | 1747 | $item.replaceWith($item_new);
|
1700 | 1748 | }
|
1701 | 1749 |
|
| 1750 | + // update dropdown contents |
1702 | 1751 | if (self.isOpen) {
|
1703 | 1752 | self.refreshOptions(false);
|
1704 | 1753 | }
|
|
1712 | 1761 | removeOption: function(value) {
|
1713 | 1762 | var self = this;
|
1714 | 1763 |
|
1715 |
| - value = String(value); |
| 1764 | + value = hash_key(value); |
1716 | 1765 | delete self.userOptions[value];
|
1717 | 1766 | delete self.options[value];
|
1718 | 1767 | self.lastQuery = null;
|
|
1742 | 1791 | * @returns {object}
|
1743 | 1792 | */
|
1744 | 1793 | getOption: function(value) {
|
| 1794 | + value = hash_key(value); |
1745 | 1795 | return value ? this.$dropdown_content.find('[data-selectable]').filter('[data-value="' + value.replace(/(['"])/g, '\\$1') + '"]:first') : $();
|
1746 | 1796 | },
|
1747 | 1797 |
|
|
1791 | 1841 | var self = this;
|
1792 | 1842 | var inputMode = self.settings.mode;
|
1793 | 1843 | var i, active, options, value_next;
|
1794 |
| - value = String(value); |
| 1844 | + value = hash_key(value); |
1795 | 1845 |
|
1796 | 1846 | if (inputMode === 'single') self.clear();
|
1797 | 1847 | if (inputMode === 'multi' && self.isFull()) return;
|
|
1852 | 1902 | var $item, i, idx;
|
1853 | 1903 |
|
1854 | 1904 | $item = (typeof value === 'object') ? value : self.getItem(value);
|
1855 |
| - value = String($item.attr('data-value')); |
| 1905 | + value = hash_key($item.attr('data-value')); |
1856 | 1906 | i = self.items.indexOf(value);
|
1857 | 1907 |
|
1858 | 1908 | if (i !== -1) {
|
|
1906 | 1956 | self.unlock();
|
1907 | 1957 | self.focus(false);
|
1908 | 1958 |
|
1909 |
| - var value = data && data[self.settings.valueField]; |
| 1959 | + var value = hash_key(data && data[self.settings.valueField]); |
1910 | 1960 | if (!value) return;
|
1911 | 1961 |
|
1912 | 1962 | self.setTextboxValue('');
|
|
2300 | 2350 | var regex_tag = /^[\ ]*<([a-z][a-z0-9\-_]*(?:\:[a-z][a-z0-9\-_]*)?)/i;
|
2301 | 2351 |
|
2302 | 2352 | if (templateName === 'option' || templateName === 'item') {
|
2303 |
| - value = data[self.settings.valueField]; |
2304 |
| - cache = isset(value); |
| 2353 | + value = hash_key(data[self.settings.valueField]); |
| 2354 | + cache = !!value; |
2305 | 2355 | }
|
2306 | 2356 |
|
2307 | 2357 | // pull markup from cache if it exists
|
|
0 commit comments