Skip to content

Commit d6a6f53

Browse files
committed
Released 0.9.0.
1 parent 4fcad2d commit d6a6f53

16 files changed

+143
-69
lines changed

bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "selectize",
33
"keywords": ["select", "ui", "form", "input", "control", "autocomplete", "tagging", "tag"],
44
"description": "Selectize is a jQuery-based custom <select> UI control. Useful for tagging, contact lists, country selectors, etc.",
5-
"version": "0.8.5",
5+
"version": "0.9.0",
66
"license": "Apache License, Version 2.0",
77
"readmeFilename": "README.md",
88
"repository": {

dist/css/selectize.bootstrap2.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.bootstrap2.css (v0.8.5) - Bootstrap 2 Theme
2+
* selectize.bootstrap2.css (v0.9.0) - Bootstrap 2 Theme
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this

dist/css/selectize.bootstrap3.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.bootstrap3.css (v0.8.5) - Bootstrap 3 Theme
2+
* selectize.bootstrap3.css (v0.9.0) - Bootstrap 3 Theme
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this

dist/css/selectize.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.css (v0.8.5)
2+
* selectize.css (v0.9.0)
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this

dist/css/selectize.default.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.default.css (v0.8.5) - Default Theme
2+
* selectize.default.css (v0.9.0) - Default Theme
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this

dist/css/selectize.legacy.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.legacy.css (v0.8.5) - Default Theme
2+
* selectize.legacy.css (v0.9.0) - Default Theme
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this

dist/js/selectize.js

+59-23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* selectize.js (v0.8.5)
2+
* selectize.js (v0.9.0)
33
* Copyright (c) 2013 Brian Reavis & contributors
44
*
55
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
@@ -20,6 +20,8 @@
2020
(function(root, factory) {
2121
if (typeof define === 'function' && define.amd) {
2222
define(['jquery','sifter','microplugin'], factory);
23+
} else if (typeof exports === 'object') {
24+
module.exports = factory(require('jquery'), require('sifter'), require('microplugin'));
2325
} else {
2426
root.Selectize = factory(root.jQuery, root.Sifter, root.MicroPlugin);
2527
}
@@ -105,8 +107,10 @@
105107
var KEY_ESC = 27;
106108
var KEY_LEFT = 37;
107109
var KEY_UP = 38;
110+
var KEY_P = 80;
108111
var KEY_RIGHT = 39;
109112
var KEY_DOWN = 40;
113+
var KEY_N = 78;
110114
var KEY_BACKSPACE = 8;
111115
var KEY_DELETE = 46;
112116
var KEY_SHIFT = 16;
@@ -117,6 +121,7 @@
117121
var TAG_SELECT = 1;
118122
var TAG_INPUT = 2;
119123

124+
120125
var isset = function(object) {
121126
return typeof object !== 'undefined';
122127
};
@@ -363,6 +368,10 @@
363368
* @returns {int}
364369
*/
365370
var measureString = function(str, $parent) {
371+
if (!str) {
372+
return 0;
373+
}
374+
366375
var $test = $('<test>').css({
367376
position: 'absolute',
368377
top: -99999,
@@ -396,6 +405,8 @@
396405
* @param {object} $input
397406
*/
398407
var autoGrow = function($input) {
408+
var currentWidth = null;
409+
399410
var update = function(e) {
400411
var value, keyCode, printable, placeholder, width;
401412
var shift, character, selection;
@@ -438,7 +449,8 @@
438449
}
439450

440451
width = measureString(value, $input) + 4;
441-
if (width !== $input.width()) {
452+
if (width !== currentWidth) {
453+
currentWidth = width;
442454
$input.width(width);
443455
$input.triggerHandler('resize');
444456
}
@@ -560,7 +572,7 @@
560572

561573
$wrapper = $('<div>').addClass(settings.wrapperClass).addClass(classes).addClass(inputMode);
562574
$control = $('<div>').addClass(settings.inputClass).addClass('items').appendTo($wrapper);
563-
$control_input = $('<input type="text" autocomplete="off">').appendTo($control).attr('tabindex', tab_index);
575+
$control_input = $('<input type="text" autocomplete="off" />').appendTo($control).attr('tabindex', tab_index);
564576
$dropdown_parent = $(settings.dropdownParent || $wrapper);
565577
$dropdown = $('<div>').addClass(settings.dropdownClass).addClass(classes).addClass(inputMode).hide().appendTo($dropdown_parent);
566578
$dropdown_content = $('<div>').addClass(settings.dropdownContentClass).appendTo($dropdown);
@@ -680,7 +692,7 @@
680692
self.trigger('initialize');
681693

682694
// preload options
683-
if (settings.preload) {
695+
if (settings.preload === true) {
684696
self.onSearchChange('');
685697
}
686698
},
@@ -846,6 +858,8 @@
846858
case KEY_ESC:
847859
self.close();
848860
return;
861+
case KEY_N:
862+
if (!e.ctrlKey) break;
849863
case KEY_DOWN:
850864
if (!self.isOpen && self.hasOptions) {
851865
self.open();
@@ -856,6 +870,8 @@
856870
}
857871
e.preventDefault();
858872
return;
873+
case KEY_P:
874+
if (!e.ctrlKey) break;
859875
case KEY_UP:
860876
if (self.$activeOption) {
861877
self.ignoreHover = true;
@@ -877,6 +893,9 @@
877893
self.advanceSelection(1, e);
878894
return;
879895
case KEY_TAB:
896+
if (self.isOpen && self.$activeOption) {
897+
self.onOptionSelect({currentTarget: self.$activeOption});
898+
}
880899
if (self.settings.create && self.createItem()) {
881900
e.preventDefault();
882901
}
@@ -970,7 +989,7 @@
970989
if (self.ignoreFocus) return;
971990

972991
if (self.settings.create && self.settings.createOnBlur) {
973-
self.createItem();
992+
self.createItem(false);
974993
}
975994

976995
self.close();
@@ -1100,10 +1119,7 @@
11001119
setValue: function(value) {
11011120
debounce_events(this, ['change'], function() {
11021121
this.clear();
1103-
var items = $.isArray(value) ? value : [value];
1104-
for (var i = 0, n = items.length; i < n; i++) {
1105-
this.addItem(items[i]);
1106-
}
1122+
this.addItems(value);
11071123
});
11081124
},
11091125

@@ -1669,6 +1685,20 @@
16691685
return this.getElementWithValue(value, this.$control.children());
16701686
},
16711687

1688+
/**
1689+
* "Selects" multiple items at once. Adds them to the list
1690+
* at the current caret position.
1691+
*
1692+
* @param {string} value
1693+
*/
1694+
addItems: function(values) {
1695+
var items = $.isArray(values) ? values : [values];
1696+
for (var i = 0, n = items.length; i < n; i++) {
1697+
this.isPending = (i < n - 1);
1698+
this.addItem(items[i]);
1699+
}
1700+
},
1701+
16721702
/**
16731703
* "Selects" an item. Adds it to the list
16741704
* at the current caret position.
@@ -1677,10 +1707,10 @@
16771707
*/
16781708
addItem: function(value) {
16791709
debounce_events(this, ['change'], function() {
1680-
var $item, $option;
1710+
var $item, $option, $options;
16811711
var self = this;
16821712
var inputMode = self.settings.mode;
1683-
var i, active, options, value_next;
1713+
var i, active, value_next;
16841714
value = hash_key(value);
16851715

16861716
if (self.items.indexOf(value) !== -1) {
@@ -1698,18 +1728,20 @@
16981728
self.refreshState();
16991729

17001730
if (self.isSetup) {
1701-
options = self.$dropdown_content.find('[data-selectable]');
1702-
1703-
// update menu / remove the option
1704-
$option = self.getOption(value);
1705-
value_next = self.getAdjacentOption($option, 1).attr('data-value');
1706-
self.refreshOptions(self.isFocused && inputMode !== 'single');
1707-
if (value_next) {
1708-
self.setActiveOption(self.getOption(value_next));
1731+
$options = self.$dropdown_content.find('[data-selectable]');
1732+
1733+
// update menu / remove the option (if this is not one item being added as part of series)
1734+
if (!this.isPending) {
1735+
$option = self.getOption(value);
1736+
value_next = self.getAdjacentOption($option, 1).attr('data-value');
1737+
self.refreshOptions(self.isFocused && inputMode !== 'single');
1738+
if (value_next) {
1739+
self.setActiveOption(self.getOption(value_next));
1740+
}
17091741
}
17101742

17111743
// hide the menu if the maximum number of items have been selected or no options are left
1712-
if (!options.length || (self.settings.maxItems !== null && self.items.length >= self.settings.maxItems)) {
1744+
if (!$options.length || (self.settings.maxItems !== null && self.items.length >= self.settings.maxItems)) {
17131745
self.close();
17141746
} else {
17151747
self.positionDropdown();
@@ -1771,13 +1803,17 @@
17711803
*
17721804
* @return {boolean}
17731805
*/
1774-
createItem: function() {
1806+
createItem: function(triggerDropdown) {
17751807
var self = this;
17761808
var input = $.trim(self.$control_input.val() || '');
17771809
var caret = self.caretPos;
17781810
if (!input.length) return false;
17791811
self.lock();
17801812

1813+
if (typeof triggerDropdown === 'undefined') {
1814+
triggerDropdown = true;
1815+
}
1816+
17811817
var setup = (typeof self.settings.create === 'function') ? this.settings.create : function(input) {
17821818
var data = {};
17831819
data[self.settings.labelField] = input;
@@ -1796,7 +1832,7 @@
17961832
self.addOption(data);
17971833
self.setCaret(caret);
17981834
self.addItem(value);
1799-
self.refreshOptions(self.settings.mode !== 'single');
1835+
self.refreshOptions(triggerDropdown && self.settings.mode !== 'single');
18001836
});
18011837

18021838
var output = setup.apply(this, [input, create]);
@@ -2704,7 +2740,7 @@
27042740
e.preventDefault();
27052741
if (self.isLocked) return;
27062742

2707-
var $item = $(e.target).parent();
2743+
var $item = $(e.currentTarget).parent();
27082744
self.setActiveItem($item);
27092745
if (self.deleteSelection()) {
27102746
self.setCaret(self.items.length);

dist/js/selectize.min.js

+3-3
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)