Skip to content

Commit aaf67b5

Browse files
committed
Merge remote-tracking branch 'refs/remotes/sjhewitt/required-element-b' into 0.8
2 parents ff304db + 95d2413 commit aaf67b5

File tree

2 files changed

+71
-0
lines changed

2 files changed

+71
-0
lines changed

src/selectize.js

+21
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ var Selectize = function($input, settings) {
1818
highlightedValue : null,
1919
isOpen : false,
2020
isDisabled : false,
21+
isRequired : false,
22+
isInvalid : false,
2123
isLocked : false,
2224
isFocused : false,
2325
isInputHidden : false,
@@ -198,6 +200,22 @@ $.extend(Selectize.prototype, {
198200
delete settings.items;
199201
}
200202

203+
self.isRequired = self.$input.is(":required");
204+
self.$control_input.prop('required', self.isRequired && !self.items.length);
205+
206+
// feature detect for the validation API
207+
if(self.$input[0].validity) {
208+
self.$input.on('invalid' + eventNS, function(event){
209+
event.preventDefault();
210+
self.isInvalid = true;
211+
self.refreshClasses();
212+
});
213+
self.$input.on('change' + eventNS, function(event){
214+
self.isInvalid = !self.$input[0].validity.valid;
215+
self.refreshClasses();
216+
});
217+
}
218+
201219
self.updateOriginalInput();
202220
self.refreshItems();
203221
self.refreshClasses();
@@ -332,6 +350,7 @@ $.extend(Selectize.prototype, {
332350
* input / select element.
333351
*/
334352
onChange: function() {
353+
this.$control_input.prop('required', this.isRequired && !this.items.length);
335354
this.$input.trigger('change');
336355
},
337356

@@ -1339,6 +1358,8 @@ $.extend(Selectize.prototype, {
13391358
this.$control
13401359
.toggleClass('focus', self.isFocused)
13411360
.toggleClass('disabled', self.isDisabled)
1361+
.toggleClass('required', self.isRequired)
1362+
.toggleClass('invalid', self.isInvalid)
13421363
.toggleClass('locked', isLocked)
13431364
.toggleClass('full', isFull).toggleClass('not-full', !isFull)
13441365
.toggleClass('input-active', self.isFocused && !self.isInputHidden)

test/setup.js

+50
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,56 @@
158158
});
159159
});
160160

161+
describe('<select required>', function(){
162+
var form;
163+
before(function(){
164+
test = setup_test('<select required>' +
165+
'<option value="">Select an option...</option>' +
166+
'<option value="a">A</option>' +
167+
'</select>', {});
168+
test.$select.parent().children().wrapAll("<form>");
169+
form = test.$select.parent();
170+
form.append("<button>");
171+
form.on('submit', function(event){
172+
event.preventDefault();
173+
assert.ok(false, 'the form was submitted');
174+
});
175+
});
176+
it('should have isRequired property set to true', function() {
177+
expect(test.selectize.isRequired).to.be.equal(true);
178+
});
179+
it('should have the required class', function() {
180+
expect(test.selectize.$control.hasClass('required')).to.be.equal(true);
181+
});
182+
it('should have the invalid class when validation fails', function() {
183+
test.$select[0].checkValidity();
184+
expect(test.selectize.$control.hasClass('invalid')).to.be.equal(true);
185+
expect(test.selectize.isInputFocused).to.be.equal(false);
186+
});
187+
it('should gain focus when validation via a button fails', function() {
188+
$("form button").click();
189+
expect(test.selectize.$control.hasClass('invalid')).to.be.equal(true);
190+
expect(test.selectize.isInputFocused).to.be.equal(true);
191+
});
192+
it('should clear the invalid class after an item is selected', function(){
193+
$("form button").click();
194+
test.selectize.addItem('a');
195+
expect(test.selectize.$control.hasClass('invalid')).to.be.equal(false);
196+
});
197+
it('should pass validation if an element is selected', function(done){
198+
test.selectize.addItem('a');
199+
form.off('submit').on('submit', function(event){
200+
event.preventDefault();
201+
done();
202+
});
203+
$("form button").click();
204+
});
205+
after(function(){
206+
test.teardown();
207+
form.remove();
208+
});
209+
});
210+
161211
});
162212

163213
})();

0 commit comments

Comments
 (0)