select2-rails 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  module Select2
2
2
  module Rails
3
- VERSION = "0.0.4"
3
+ VERSION = "0.0.5"
4
4
  end
5
5
  end
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  Copyright 2012 Igor Vaynberg
3
-
3
+
4
4
  Version: @@ver@@ Timestamp: @@timestamp@@
5
5
 
6
6
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in
@@ -20,7 +20,7 @@
20
20
  return;
21
21
  }
22
22
 
23
- var KEY, AbstractSelect2, SingleSelect2, MultiSelect2;
23
+ var KEY, AbstractSelect2, SingleSelect2, MultiSelect2, nextUid;
24
24
 
25
25
  KEY = {
26
26
  TAB: 9,
@@ -67,10 +67,12 @@
67
67
  }
68
68
  };
69
69
 
70
+ nextUid=(function() { var counter=1; return function() { return counter++; }; }());
71
+
70
72
  function indexOf(value, array) {
71
73
  var i = 0, l = array.length, v;
72
74
 
73
- if (typeof value == 'undefined') {
75
+ if (typeof value === "undefined") {
74
76
  return -1;
75
77
  }
76
78
 
@@ -90,7 +92,7 @@
90
92
  }
91
93
 
92
94
  /**
93
- * Compares equality of a and b taking into account that a and b may be strings, in which case localCompare is used
95
+ * Compares equality of a and b taking into account that a and b may be strings, in which case localeCompare is used
94
96
  * @param a
95
97
  * @param b
96
98
  */
@@ -206,7 +208,7 @@
206
208
  * @param options object containing configuration paramters
207
209
  * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
208
210
  * @param options.url url for the data
209
- * @param options.data a function(searchTerm, pageNumber) that should return an object containing query string parameters for the above url.
211
+ * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
210
212
  * @param options.dataType request data type: ajax, jsonp, other datatatypes supported by jQuery's $.ajax function or the transport function if specified
211
213
  * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
212
214
  * @param options.results a function(remoteData, pageNumber) that converts data returned form the remote request to the format expected by Select2.
@@ -229,7 +231,7 @@
229
231
  data = options.data, // ajax data function
230
232
  transport = options.transport || $.ajax;
231
233
 
232
- data = data.call(this, query.term, query.page);
234
+ data = data.call(this, query.term, query.page, query.context);
233
235
 
234
236
  if( null !== handler){
235
237
  handler.abort();
@@ -243,7 +245,8 @@
243
245
  return;
244
246
  }
245
247
  // TODO 3.0 - replace query.page with query so users have access to term, page, etc.
246
- query.callback(options.results(data, query.page));
248
+ var results = options.results(data, query.page);
249
+ query.callback(results);
247
250
  }
248
251
  });
249
252
  }, quietMillis);
@@ -266,23 +269,27 @@
266
269
  */
267
270
  function local(options) {
268
271
  var data = options, // data elements
272
+ dataText,
269
273
  text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
270
274
 
271
275
  if (!$.isArray(data)) {
272
276
  text = data.text;
273
277
  // if text is not a function we assume it to be a key name
274
- if (!$.isFunction(text)) text = function (item) { return item[data.text]; };
278
+ if (!$.isFunction(text)) {
279
+ dataText = data.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
280
+ text = function (item) { return item[dataText]; };
281
+ }
275
282
  data = data.results;
276
283
  }
277
284
 
278
285
  return function (query) {
279
- var t = query.term.toUpperCase(), filtered = {};
286
+ var t = query.term, filtered = {};
280
287
  if (t === "") {
281
288
  query.callback({results: data});
282
289
  return;
283
290
  }
284
291
  filtered.results = $(data)
285
- .filter(function () {return text(this).toUpperCase().indexOf(t) >= 0;})
292
+ .filter(function () {return query.matcher(t, text(this));})
286
293
  .get();
287
294
  query.callback(filtered);
288
295
  };
@@ -299,11 +306,11 @@
299
306
  // if not a function we assume it to be an array
300
307
 
301
308
  return function (query) {
302
- var t = query.term.toUpperCase(), filtered = {results: []};
309
+ var t = query.term, filtered = {results: []};
303
310
  $(data).each(function () {
304
311
  var isObject = this.text !== undefined,
305
312
  text = isObject ? this.text : this;
306
- if (t === "" || text.toUpperCase().indexOf(t) >= 0) {
313
+ if (t === "" || query.matcher(t, text)) {
307
314
  filtered.results.push(isObject ? this : {id: this, text: this});
308
315
  }
309
316
  });
@@ -315,11 +322,18 @@
315
322
  * blurs any Select2 container that has focus when an element outside them was clicked or received focus
316
323
  */
317
324
  $(document).ready(function () {
318
- $(document).delegate("*", "mousedown focusin", function (e) {
325
+ $(document).delegate("*", "mousedown focusin touchend", function (e) {
319
326
  var target = $(e.target).closest("div.select2-container").get(0);
320
- $(document).find("div.select2-container-active").each(function () {
321
- if (this !== target) $(this).data("select2").blur();
322
- });
327
+ if (target) {
328
+ $(document).find("div.select2-container-active").each(function () {
329
+ if (this !== target) $(this).data("select2").blur();
330
+ });
331
+ } else {
332
+ target = $(e.target).closest("div.select2-drop").get(0);
333
+ $(document).find("div.select2-drop-active").each(function () {
334
+ if (this !== target) $(this).data("select2").blur();
335
+ });
336
+ }
323
337
  });
324
338
  });
325
339
 
@@ -361,6 +375,7 @@
361
375
  this.destroy();
362
376
  }
363
377
 
378
+ this.enabled=true;
364
379
  this.container = this.createContainer();
365
380
 
366
381
  if (opts.element.attr("class") !== undefined) {
@@ -375,19 +390,22 @@
375
390
  this.container.data("select2", this);
376
391
 
377
392
  this.dropdown = this.container.find(".select2-drop");
393
+ this.dropdown.data("select2", this);
394
+
378
395
  this.results = results = this.container.find(resultsSelector);
379
396
  this.search = search = this.container.find("input[type=text]");
380
397
 
381
398
  this.resultsPage = 0;
399
+ this.context = null;
382
400
 
383
401
  // initialize the container
384
402
  this.initContainer();
385
403
 
386
404
  installFilteredMouseMove(this.results);
387
- this.container.delegate(resultsSelector, "mousemove-filtered", this.bind(this.highlightUnderEvent));
405
+ this.dropdown.delegate(resultsSelector, "mousemove-filtered", this.bind(this.highlightUnderEvent));
388
406
 
389
407
  installDebouncedScroll(80, this.results);
390
- this.container.delegate(resultsSelector, "scroll-debounced", this.bind(this.loadMoreIfNeeded));
408
+ this.dropdown.delegate(resultsSelector, "scroll-debounced", this.bind(this.loadMoreIfNeeded));
391
409
 
392
410
  // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
393
411
  if ($.fn.mousewheel) {
@@ -408,7 +426,7 @@
408
426
  search.bind("focus", function () { search.addClass("select2-focused");});
409
427
  search.bind("blur", function () { search.removeClass("select2-focused");});
410
428
 
411
- this.container.delegate(resultsSelector, "click", this.bind(function (e) {
429
+ this.dropdown.delegate(resultsSelector, "click", this.bind(function (e) {
412
430
  if ($(e.target).closest(".select2-result:not(.select2-disabled)").length > 0) {
413
431
  this.highlightUnderEvent(e);
414
432
  this.selectHighlighted(e);
@@ -426,12 +444,15 @@
426
444
  // we monitor the change event on the element and trigger it, allowing for two way synchronization
427
445
  this.monitorSource();
428
446
  }
447
+
448
+ if (opts.element.is(":disabled")) this.disable();
429
449
  },
430
450
 
431
451
  destroy: function () {
432
452
  var select2 = this.opts.element.data("select2");
433
453
  if (select2 !== undefined) {
434
454
  select2.container.remove();
455
+ select2.dropdown.remove();
435
456
  select2.opts.element
436
457
  .removeData("select2")
437
458
  .unbind(".select2")
@@ -458,13 +479,74 @@
458
479
  }
459
480
 
460
481
  opts = $.extend({}, {
461
- formatResult: function (data) { return data.text; },
462
- formatSelection: function (data) { return data.text; },
482
+ populateResults: function(container, results) {
483
+ var uidToData={}, populate, markup=[], uid, data, result, children;
484
+
485
+ populate=function(results, depth) {
486
+
487
+ var i, l, uid, result, selectable, compound;
488
+ for (i = 0, l = results.length; i < l; i = i + 1) {
489
+
490
+ result=results[i];
491
+ selectable=("id" in result); // TODO switch to id() function
492
+ compound=("children" in result) && result.children.length > 0;
493
+
494
+ markup.push("<li class='select2-result-depth-"+depth);
495
+ if (!selectable) { markup.push(" select2-result-unselectable"); } else { markup.push(" select2-result");}
496
+ if (compound) { markup.push(" select2-result-with-children"); }
497
+
498
+ markup.push("'");
499
+
500
+ if (selectable) {
501
+ uid=nextUid();
502
+ markup.push(" id='select2-result-"+uid+"'");
503
+ uidToData[uid]=result;
504
+ }
505
+
506
+ markup.push("><div class='select2-result-label'>"+opts.formatResult(result)+"</div>");
507
+
508
+ if (compound) {
509
+ markup.push("<ul class='select2-result-sub'>");
510
+ populate(result.children, depth + 1);
511
+ markup.push("</ul>");
512
+ }
513
+
514
+ markup.push("</li>");
515
+ }
516
+ };
517
+
518
+ populate(results, 0);
519
+
520
+ children=container.children();
521
+ if (children.length===0) {
522
+ container.html(markup.join(""));
523
+ } else {
524
+ $(children[children.length-1]).append(markup.join(""));
525
+ }
526
+
527
+ for (uid in uidToData) {
528
+ $("#select2-result-"+uid).data("select2-data", uidToData[uid]);
529
+ }
530
+
531
+ },
532
+ formatResult: function(result) {
533
+ return result.text;
534
+ },
535
+ formatSelection: function (data) {
536
+ if (data.fullText) {
537
+ return data.fullText;
538
+ } else {
539
+ return data.text;
540
+ }
541
+ },
463
542
  formatNoMatches: function () { return "No matches found"; },
464
543
  formatInputTooShort: function (input, min) { return "Please enter " + (min - input.length) + " more characters"; },
465
544
  minimumResultsForSearch: 0,
466
545
  minimumInputLength: 0,
467
- id: function (e) { return e.id; }
546
+ id: function (e) { return e.id; },
547
+ matcher: function(term, text) {
548
+ return text.toUpperCase().indexOf(term.toUpperCase()) >= 0;
549
+ }
468
550
  }, opts);
469
551
 
470
552
  if (typeof(opts.id) !== "function") {
@@ -474,19 +556,27 @@
474
556
 
475
557
  if (select) {
476
558
  opts.query = this.bind(function (query) {
477
- var data = {results: [], more: false},
478
- term = query.term.toUpperCase(),
479
- placeholder = this.getPlaceholder();
480
- element.find("option").each(function (i) {
481
- var e = $(this),
482
- text = e.text();
559
+ var data = { results: [], more: false },
560
+ term = query.term,
561
+ process;
562
+
563
+ process=function(element, collection) {
564
+ var group;
565
+ if (element.is("option")) {
566
+ if (query.matcher(term, element.text())) {
567
+ collection.push({id:element.attr("value"), text:element.text()});
568
+ }
569
+ } else if (element.is("optgroup")) {
570
+ group={text:element.attr("label"), children:[]};
571
+ element.children().each(function() { process($(this), group.children); });
572
+ if (group.children.length>0) {
573
+ collection.push(group);
574
+ }
575
+ }
576
+ };
483
577
 
484
- if (i === 0 && placeholder !== undefined && text === "") return true;
578
+ element.children().each(function() { process($(this), data.results); });
485
579
 
486
- if (text.toUpperCase().indexOf(term) >= 0) {
487
- data.results.push({id: e.attr("value"), text: text});
488
- }
489
- });
490
580
  query.callback(data);
491
581
  });
492
582
  // this is needed because inside val() we construct choices from options and there id is hardcoded
@@ -538,14 +628,49 @@
538
628
  this.opts.element.data("select2-change-triggered", false);
539
629
  },
540
630
 
631
+
632
+ enable: function() {
633
+ if (this.enabled) return;
634
+
635
+ this.enabled=true;
636
+ this.container.removeClass("select2-container-disabled");
637
+ },
638
+
639
+ disable: function() {
640
+ if (!this.enabled) return;
641
+
642
+ this.close();
643
+
644
+ this.enabled=false;
645
+ this.container.addClass("select2-container-disabled");
646
+ },
647
+
541
648
  opened: function () {
542
649
  return this.container.hasClass("select2-dropdown-open");
543
650
  },
544
651
 
652
+ positionDropdown: function() {
653
+ var offset = this.container.offset();
654
+ var height = this.container.outerHeight();
655
+ var width = this.container.outerWidth();
656
+ var css = {
657
+ top: offset.top + height,
658
+ left: offset.left,
659
+ width: width
660
+ }
661
+ if (this.opts.dropdownZIndex !== undefined) {
662
+ css["z-index"] = this.opts.dropdownZIndex;
663
+ }
664
+ this.dropdown.css(css);
665
+ },
666
+
545
667
  open: function () {
546
668
  if (this.opened()) return;
547
669
 
548
670
  this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
671
+ this.dropdown.detach().appendTo('body').addClass("select2-drop-active");
672
+
673
+ this.positionDropdown();
549
674
 
550
675
  this.updateResults(true);
551
676
  this.dropdown.show();
@@ -569,7 +694,7 @@
569
694
  ensureHighlightVisible: function () {
570
695
  var results = this.results, children, index, child, hb, rb, y, more;
571
696
 
572
- children = results.children(".select2-result");
697
+ children = results.find(".select2-result");
573
698
  index = this.highlight();
574
699
 
575
700
  if (index < 0) return;
@@ -599,7 +724,7 @@
599
724
  },
600
725
 
601
726
  moveHighlight: function (delta) {
602
- var choices = this.results.children(".select2-result"),
727
+ var choices = this.results.find(".select2-result"),
603
728
  index = this.highlight();
604
729
 
605
730
  while (index > -1 && index < choices.length) {
@@ -612,17 +737,21 @@
612
737
  },
613
738
 
614
739
  highlight: function (index) {
615
- var choices = this.results.children(".select2-result");
740
+ var choices = this.results.find(".select2-result .select2-result-label");
616
741
 
617
742
  if (arguments.length === 0) {
618
743
  return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
619
744
  }
620
745
 
621
- choices.removeClass("select2-highlighted");
622
-
623
746
  if (index >= choices.length) index = choices.length - 1;
624
747
  if (index < 0) index = 0;
625
748
 
749
+ if ($(choices[index]).parent().is('.select2-result-unselectable')) {
750
+ return;
751
+ }
752
+
753
+ choices.removeClass("select2-highlighted");
754
+
626
755
  $(choices[index]).addClass("select2-highlighted");
627
756
  this.ensureHighlightVisible();
628
757
 
@@ -631,8 +760,9 @@
631
760
 
632
761
  highlightUnderEvent: function (event) {
633
762
  var el = $(event.target).closest(".select2-result");
763
+ var choices = this.results.find('.select2-result');
634
764
  if (el.length > 0) {
635
- this.highlight(el.index());
765
+ this.highlight(choices.index(el));
636
766
  }
637
767
  },
638
768
 
@@ -641,36 +771,32 @@
641
771
  more = results.find("li.select2-more-results"),
642
772
  below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
643
773
  offset = -1, // index of first element without data
644
- page = this.resultsPage + 1;
774
+ page = this.resultsPage + 1,
775
+ self=this;
645
776
 
646
777
  if (more.length === 0) return;
647
-
648
778
  below = more.offset().top - results.offset().top - results.height();
649
779
 
650
780
  if (below <= 0) {
651
781
  more.addClass("select2-active");
652
- this.opts.query({term: this.search.val(), page: page, callback: this.bind(function (data) {
653
- var parts = [], self = this;
654
- $(data.results).each(function () {
655
- parts.push("<li class='select2-result'>");
656
- parts.push(self.opts.formatResult(this));
657
- parts.push("</li>");
658
- });
659
- more.before(parts.join(""));
660
- results.find(".select2-result").each(function (i) {
661
- var e = $(this);
662
- if (e.data("select2-data") !== undefined) {
663
- offset = i;
664
- } else {
665
- e.data("select2-data", data.results[i - offset - 1]);
666
- }
667
- });
668
- if (data.more) {
782
+ this.opts.query({
783
+ term: this.search.val(),
784
+ page: page,
785
+ context: this.context,
786
+ matcher: this.opts.matcher,
787
+ callback: this.bind(function (data) {
788
+ console.log("load more callback", data);
789
+
790
+ self.opts.populateResults(results, data.results);
791
+
792
+ if (data.more===true) {
793
+ more.detach();
794
+ results.children().filter(":last").append(more);
669
795
  more.removeClass("select2-active");
670
796
  } else {
671
797
  more.remove();
672
798
  }
673
- this.resultsPage = page;
799
+ self.resultsPage = page;
674
800
  })});
675
801
  }
676
802
  },
@@ -681,23 +807,39 @@
681
807
  updateResults: function (initial) {
682
808
  var search = this.search, results = this.results, opts = this.opts, self=this;
683
809
 
810
+ // if the search is currently hidden we do not alter the results
811
+ if (initial !== true && this.showSearchInput === false) {
812
+ return;
813
+ }
814
+
684
815
  search.addClass("select2-active");
685
816
 
686
- function render(html) {
687
- results.html(html);
817
+ function postRender() {
688
818
  results.scrollTop(0);
689
819
  search.removeClass("select2-active");
690
820
  }
691
821
 
822
+ function render(html) {
823
+ results.html(html);
824
+ postRender();
825
+ }
826
+
692
827
  if (search.val().length < opts.minimumInputLength) {
693
828
  render("<li class='select2-no-results'>" + opts.formatInputTooShort(search.val(), opts.minimumInputLength) + "</li>");
694
829
  return;
695
830
  }
696
831
 
697
832
  this.resultsPage = 1;
698
- opts.query({term: search.val(), page: this.resultsPage, callback: this.bind(function (data) {
699
- var parts = [], // html parts
700
- def; // default choice
833
+ opts.query({
834
+ term: search.val(),
835
+ page: this.resultsPage,
836
+ context: null,
837
+ matcher: opts.matcher,
838
+ callback: this.bind(function (data) {
839
+ var def; // default choice
840
+
841
+ // save context, if any
842
+ this.context = (data.context===undefined) ? null : data.context;
701
843
 
702
844
  // create a default choice and prepend it to the list
703
845
  if (this.opts.createSearchChoice && search.val() !== "") {
@@ -717,21 +859,14 @@
717
859
  return;
718
860
  }
719
861
 
720
- $(data.results).each(function () {
721
- parts.push("<li class='select2-result'>");
722
- parts.push(opts.formatResult(this));
723
- parts.push("</li>");
724
- });
862
+ results.empty();
863
+ self.opts.populateResults(results, data.results);
864
+ postRender();
725
865
 
726
866
  if (data.more === true) {
727
- parts.push("<li class='select2-more-results'>Loading more results...</li>");
867
+ results.children().filter(":last").append("<li class='select2-more-results'>Loading more results...</li>");
728
868
  }
729
869
 
730
- render(parts.join(""));
731
- results.children(".select2-result").each(function (i) {
732
- var d = data.results[i];
733
- $(this).data("select2-data", d);
734
- });
735
870
  this.postprocessResults(data, initial);
736
871
  })});
737
872
  },
@@ -746,6 +881,7 @@
746
881
  window.setTimeout(this.bind(function () {
747
882
  this.close();
748
883
  this.container.removeClass("select2-container-active");
884
+ this.dropdown.removeClass("select2-drop-active");
749
885
  this.clearSearch();
750
886
  this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
751
887
  this.search.blur();
@@ -761,7 +897,7 @@
761
897
  },
762
898
 
763
899
  selectHighlighted: function () {
764
- var data = this.results.find(".select2-highlighted:not(.select2-disabled)").data("select2-data");
900
+ var data = this.results.find(".select2-highlighted").not(".select2-disabled").closest('.select2-result').not('.select2-result-unselectable').data("select2-data");
765
901
  if (data) {
766
902
  this.onSelect(data);
767
903
  }
@@ -847,7 +983,11 @@
847
983
 
848
984
  initContainer: function () {
849
985
 
850
- var selection, container = this.container, clickingInside = false,
986
+ var selection,
987
+ container = this.container,
988
+ dropdown = this.dropdown,
989
+ containers = $([this.container.get(0), this.dropdown.get(0)]),
990
+ clickingInside = false,
851
991
  selector = ".select2-choice";
852
992
 
853
993
  this.selection = selection = container.find(selector);
@@ -871,21 +1011,21 @@
871
1011
  }
872
1012
  }));
873
1013
 
874
- container.delegate(selector, "click", this.bind(function (e) {
1014
+ containers.delegate(selector, "click", this.bind(function (e) {
875
1015
  clickingInside = true;
876
1016
 
877
1017
  if (this.opened()) {
878
1018
  this.close();
879
1019
  selection.focus();
880
- } else {
1020
+ } else if (this.enabled) {
881
1021
  this.open();
882
1022
  }
883
1023
  e.preventDefault();
884
1024
 
885
1025
  clickingInside = false;
886
1026
  }));
887
- container.delegate(selector, "keydown", this.bind(function (e) {
888
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
1027
+ containers.delegate(selector, "keydown", this.bind(function (e) {
1028
+ if (!this.enabled || e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
889
1029
  return;
890
1030
  }
891
1031
  this.open();
@@ -898,13 +1038,14 @@
898
1038
  killEvent(e);
899
1039
  }
900
1040
  }));
901
- container.delegate(selector, "focus", function () { container.addClass("select2-container-active"); });
902
- container.delegate(selector, "blur", this.bind(function () {
1041
+ containers.delegate(selector, "focus", function () { if (this.enabled) { containers.addClass("select2-container-active"); dropdown.addClass("select2-drop-active"); }});
1042
+ containers.delegate(selector, "blur", this.bind(function () {
903
1043
  if (clickingInside) return;
904
1044
  if (!this.opened()) this.blur();
905
1045
  }));
906
1046
 
907
1047
  selection.delegate("abbr", "click", this.bind(function (e) {
1048
+ if (!this.enabled) return;
908
1049
  this.val("");
909
1050
  killEvent(e);
910
1051
  this.close();
@@ -985,8 +1126,8 @@
985
1126
  // hide the search box if this is the first we got the results and there are a few of them
986
1127
 
987
1128
  if (initial === true) {
988
- showSearchInput = data.results.length >= this.opts.minimumResultsForSearch;
989
- this.search.parent().toggle(showSearchInput);
1129
+ showSearchInput = this.showSearchInput = data.results.length >= this.opts.minimumResultsForSearch;
1130
+ this.container.find(".select2-search")[showSearchInput ? "removeClass" : "addClass"]("select2-search-hidden");
990
1131
 
991
1132
  //add "select2-with-searchbox" to the container if search box is shown
992
1133
  this.container[showSearchInput ? "addClass" : "removeClass"]("select2-with-searchbox");
@@ -1062,7 +1203,7 @@
1062
1203
  " <input type='text' autocomplete='off' style='width: 25px;'>" ,
1063
1204
  " </li>" ,
1064
1205
  "</ul>" ,
1065
- "<div class='select2-drop' style='display:none;'>" ,
1206
+ "<div class='select2-drop select2-drop-multi' style='display:none;'>" ,
1066
1207
  " <ul class='select2-results'>" ,
1067
1208
  " </ul>" ,
1068
1209
  "</div>"].join(""));
@@ -1099,6 +1240,8 @@
1099
1240
  this.selection = selection = this.container.find(selector);
1100
1241
 
1101
1242
  this.search.bind("keydown", this.bind(function (e) {
1243
+ if (!this.enabled) return;
1244
+
1102
1245
  if (e.which === KEY.BACKSPACE && this.search.val() === "") {
1103
1246
  this.close();
1104
1247
 
@@ -1153,13 +1296,16 @@
1153
1296
  this.search.bind("keyup", this.bind(this.resizeSearch));
1154
1297
 
1155
1298
  this.container.delegate(selector, "click", this.bind(function (e) {
1299
+ if (!this.enabled) return;
1156
1300
  this.open();
1157
1301
  this.focusSearch();
1158
1302
  e.preventDefault();
1159
1303
  }));
1160
1304
 
1161
1305
  this.container.delegate(selector, "focus", this.bind(function () {
1306
+ if (!this.enabled) return;
1162
1307
  this.container.addClass("select2-container-active");
1308
+ this.dropdown.addClass("select2-drop-active");
1163
1309
  this.clearPlaceholder();
1164
1310
  }));
1165
1311
 
@@ -1167,6 +1313,22 @@
1167
1313
  this.clearSearch();
1168
1314
  },
1169
1315
 
1316
+ enable: function() {
1317
+ if (this.enabled) return;
1318
+
1319
+ this.parent.enable.apply(this, arguments);
1320
+
1321
+ this.search.show();
1322
+ },
1323
+
1324
+ disable: function() {
1325
+ if (!this.enabled) return;
1326
+
1327
+ this.parent.disable.apply(this, arguments);
1328
+
1329
+ this.search.hide();
1330
+ },
1331
+
1170
1332
  initSelection: function () {
1171
1333
  var data;
1172
1334
  if (this.opts.element.val() === "") {
@@ -1188,9 +1350,7 @@
1188
1350
  clearSearch: function () {
1189
1351
  var placeholder = this.getPlaceholder();
1190
1352
 
1191
- if (placeholder !== undefined
1192
- && this.getVal().length === 0
1193
- && this.search.hasClass("select2-focused") === false) {
1353
+ if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
1194
1354
 
1195
1355
  this.search.val(placeholder).addClass("select2-default");
1196
1356
  // stretch the search box to full width of the container so as much of the placeholder is visible as possible
@@ -1285,13 +1445,17 @@
1285
1445
  choice = $(parts.join(""));
1286
1446
  choice.find("a")
1287
1447
  .bind("click dblclick", this.bind(function (e) {
1448
+ if (!this.enabled) return;
1449
+
1288
1450
  this.unselect($(e.target));
1289
1451
  this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1290
1452
  killEvent(e);
1291
1453
  this.close();
1292
1454
  this.focusSearch();
1293
1455
  })).bind("focus", this.bind(function () {
1456
+ if (!this.enabled) return;
1294
1457
  this.container.addClass("select2-container-active");
1458
+ this.dropdown.addClass("select2-drop-active");
1295
1459
  }));
1296
1460
 
1297
1461
  choice.data("select2-data", data);
@@ -1413,7 +1577,6 @@
1413
1577
  val = (val === null) ? [] : val;
1414
1578
  this.setVal(val);
1415
1579
  // val is a list of objects
1416
-
1417
1580
  $(val).each(function () { data.push(self.id(this)); });
1418
1581
  this.setVal(data);
1419
1582
  this.updateSelection(val);
@@ -1457,7 +1620,7 @@
1457
1620
  var args = Array.prototype.slice.call(arguments, 0),
1458
1621
  opts,
1459
1622
  select2,
1460
- value, multiple, allowedMethods = ["val", "destroy", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd"];
1623
+ value, multiple, allowedMethods = ["val", "destroy", "open", "close", "focus", "isFocused", "container", "onSortStart", "onSortEnd", "enable", "disable", "positionDropdown"];
1461
1624
 
1462
1625
  this.each(function () {
1463
1626
  if (args.length === 0 || typeof(args[0]) === "object") {
@@ -7,11 +7,11 @@
7
7
  /* inline-block for ie7
8
8
  zoom: 1
9
9
  *display: inline
10
- /*
11
- *Force border-box so that % widths fit the parent
12
- *container without overlap because of margin/padding.
13
- *
14
- *More Info : http://www.quirksmode.org/css/box.html
10
+ /*
11
+ * Force border-box so that % widths fit the parent
12
+ * container without overlap because of margin/padding.
13
+ *
14
+ * More Info : http://www.quirksmode.org/css/box.html
15
15
  -moz-box-sizing: border-box
16
16
  /* firefox
17
17
  -ms-box-sizing: border-box
@@ -23,12 +23,12 @@
23
23
  box-sizing: border-box
24
24
  /* css3
25
25
 
26
- .select2-drop, .select2-search
27
- /*
28
- *Force border-box so that % widths fit the parent
29
- *container without overlap because of margin/padding.
30
- *
31
- *More Info : http://www.quirksmode.org/css/box.html
26
+ .select2-drop
27
+ /*
28
+ * Force border-box so that % widths fit the parent
29
+ * container without overlap because of margin/padding.
30
+ *
31
+ * More Info : http://www.quirksmode.org/css/box.html
32
32
  -moz-box-sizing: border-box
33
33
  /* firefox
34
34
  -ms-box-sizing: border-box
@@ -40,13 +40,28 @@
40
40
  box-sizing: border-box
41
41
  /* css3
42
42
 
43
- .select2-container
44
- .select2-search input
45
- /*
46
- *Force border-box so that % widths fit the parent
47
- *container without overlap because of margin/padding.
48
- *
49
- *More Info : http://www.quirksmode.org/css/box.html
43
+ .select2-search
44
+ /*
45
+ * Force border-box so that % widths fit the parent
46
+ * container without overlap because of margin/padding.
47
+ *
48
+ * More Info : http://www.quirksmode.org/css/box.html
49
+ -moz-box-sizing: border-box
50
+ /* firefox
51
+ -ms-box-sizing: border-box
52
+ /* ie
53
+ -webkit-box-sizing: border-box
54
+ /* webkit
55
+ -khtml-box-sizing: border-box
56
+ /* konqueror
57
+ box-sizing: border-box
58
+ /* css3
59
+ input
60
+ /*
61
+ * Force border-box so that % widths fit the parent
62
+ * container without overlap because of margin/padding.
63
+ *
64
+ * More Info : http://www.quirksmode.org/css/box.html
50
65
  -moz-box-sizing: border-box
51
66
  /* firefox
52
67
  -ms-box-sizing: border-box
@@ -57,138 +72,148 @@
57
72
  /* konqueror
58
73
  box-sizing: border-box
59
74
  /* css3
60
- .select2-choice
61
- background-color: #fff
62
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white))
63
- background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%)
64
- background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%)
65
- background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 50%)
66
- background-image: -ms-linear-gradient(top, #eeeeee 0%, white 50%)
67
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0)
68
- background-image: linear-gradient(top, #eeeeee 0%, white 50%)
69
- -webkit-border-radius: 4px
70
- -moz-border-radius: 4px
71
- border-radius: 4px
72
- -moz-background-clip: padding
73
- -webkit-background-clip: padding-box
74
- background-clip: padding-box
75
- border: 1px solid #aaa
75
+
76
+ .select2-container .select2-choice
77
+ background-color: #fff
78
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eeeeee), color-stop(0.5, white))
79
+ background-image: -webkit-linear-gradient(center bottom, #eeeeee 0%, white 50%)
80
+ background-image: -moz-linear-gradient(center bottom, #eeeeee 0%, white 50%)
81
+ background-image: -o-linear-gradient(bottom, #eeeeee 0%, white 50%)
82
+ background-image: -ms-linear-gradient(top, #eeeeee 0%, white 50%)
83
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#ffffff', GradientType = 0)
84
+ background-image: linear-gradient(top, #eeeeee 0%, white 50%)
85
+ -webkit-border-radius: 4px
86
+ -moz-border-radius: 4px
87
+ border-radius: 4px
88
+ -moz-background-clip: padding
89
+ -webkit-background-clip: padding-box
90
+ background-clip: padding-box
91
+ border: 1px solid #aaa
92
+ display: block
93
+ overflow: hidden
94
+ white-space: nowrap
95
+ position: relative
96
+ height: 26px
97
+ line-height: 26px
98
+ padding: 0 0 0 8px
99
+ color: #444
100
+ text-decoration: none
101
+ span
102
+ margin-right: 26px
76
103
  display: block
77
104
  overflow: hidden
78
105
  white-space: nowrap
79
- position: relative
80
- height: 26px
81
- line-height: 26px
82
- padding: 0 0 0 8px
83
- color: #444
106
+ -o-text-overflow: ellipsis
107
+ -ms-text-overflow: ellipsis
108
+ text-overflow: ellipsis
109
+ abbr
110
+ display: block
111
+ position: absolute
112
+ right: 26px
113
+ top: 8px
114
+ width: 12px
115
+ height: 12px
116
+ font-size: 1px
117
+ background: image-url('select2.png') right top no-repeat
118
+ cursor: pointer
84
119
  text-decoration: none
85
- span
86
- margin-right: 26px
87
- display: block
88
- overflow: hidden
89
- white-space: nowrap
90
- -o-text-overflow: ellipsis
91
- -ms-text-overflow: ellipsis
92
- text-overflow: ellipsis
93
- abbr
94
- display: block
95
- position: absolute
96
- right: 26px
97
- top: 8px
98
- width: 12px
99
- height: 12px
100
- font-size: 1px
101
- background: image-url('select2.png') right top no-repeat
120
+ border: 0
121
+ outline: 0
122
+ &:hover
123
+ background-position: right -11px
102
124
  cursor: pointer
103
- text-decoration: none
104
- border: 0
105
- outline: 0
106
- &:hover
107
- background-position: right -11px
108
- cursor: pointer
109
- .select2-drop
110
- background: #fff
111
- border: 1px solid #aaa
112
- border-top: 0
113
- position: absolute
114
- top: 100%
115
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
116
- -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
117
- -o-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
118
- box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
119
- z-index: 999
120
- width: 100%
121
- margin-top: -1px
122
- -webkit-border-radius: 0 0 4px 4px
123
- -moz-border-radius: 0 0 4px 4px
124
- border-radius: 0 0 4px 4px
125
- .select2-choice div
126
- -webkit-border-radius: 0 4px 4px 0
127
- -moz-border-radius: 0 4px 4px 0
128
- border-radius: 0 4px 4px 0
129
- -moz-background-clip: padding
130
- -webkit-background-clip: padding-box
131
- background-clip: padding-box
132
- background: #ccc
133
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #cccccc), color-stop(0.6, #eeeeee))
134
- background-image: -webkit-linear-gradient(center bottom, #cccccc 0%, #eeeeee 60%)
135
- background-image: -moz-linear-gradient(center bottom, #cccccc 0%, #eeeeee 60%)
136
- background-image: -o-linear-gradient(bottom, #cccccc 0%, #eeeeee 60%)
137
- background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%)
138
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0)
139
- background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%)
140
- border-left: 1px solid #aaa
141
- position: absolute
142
- right: 0
143
- top: 0
125
+
126
+ .select2-drop
127
+ background: #fff
128
+ border: 1px solid #aaa
129
+ border-top: 0
130
+ position: absolute
131
+ top: 100%
132
+ -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
133
+ -moz-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
134
+ -o-box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
135
+ box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15)
136
+ z-index: 999
137
+ width: 100%
138
+ margin-top: -1px
139
+ -webkit-border-radius: 0 0 4px 4px
140
+ -moz-border-radius: 0 0 4px 4px
141
+ border-radius: 0 0 4px 4px
142
+
143
+ .select2-container div
144
+ -webkit-border-radius: 0 4px 4px 0
145
+ -moz-border-radius: 0 4px 4px 0
146
+ border-radius: 0 4px 4px 0
147
+ -moz-background-clip: padding
148
+ -webkit-background-clip: padding-box
149
+ background-clip: padding-box
150
+ background: #ccc
151
+ background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #cccccc), color-stop(0.6, #eeeeee))
152
+ background-image: -webkit-linear-gradient(center bottom, #cccccc 0%, #eeeeee 60%)
153
+ background-image: -moz-linear-gradient(center bottom, #cccccc 0%, #eeeeee 60%)
154
+ background-image: -o-linear-gradient(bottom, #cccccc 0%, #eeeeee 60%)
155
+ background-image: -ms-linear-gradient(top, #cccccc 0%, #eeeeee 60%)
156
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#cccccc', endColorstr = '#eeeeee', GradientType = 0)
157
+ background-image: linear-gradient(top, #cccccc 0%, #eeeeee 60%)
158
+ border-left: 1px solid #aaa
159
+ position: absolute
160
+ right: 0
161
+ top: 0
162
+ display: block
163
+ height: 100%
164
+ width: 18px
165
+ b
166
+ background: image-url('select2.png') no-repeat 0 1px
144
167
  display: block
145
- height: 100%
146
- width: 18px
147
- b
148
- background: image-url('select2.png') no-repeat 0 1px
149
- display: block
150
- width: 100%
151
- height: 100%
152
- .select2-search
153
- display: inline-block
154
- white-space: nowrap
155
- z-index: 1010
156
- min-height: 26px
157
168
  width: 100%
158
- margin: 0
159
- padding-left: 4px
160
- padding-right: 4px
161
- input
162
- background: white image-url('select2.png') no-repeat 100% -22px
163
- background: image-url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee))
164
- background: image-url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%)
165
- background: image-url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%)
166
- background: image-url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%)
167
- background: image-url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, white 85%, #eeeeee 99%)
168
- background: image-url('select2.png') no-repeat 100% -22px, linear-gradient(top, white 85%, #eeeeee 99%)
169
- padding: 4px 20px 4px 5px
170
- outline: 0
171
- border: 1px solid #aaa
172
- font-family: sans-serif
173
- font-size: 1em
174
- width: 100%
175
- margin: 0
176
- height: auto !important
177
- min-height: 26px
178
- -webkit-box-shadow: none
179
- -moz-box-shadow: none
180
- box-shadow: none
181
- border-radius: 0
182
- -moz-border-radius: 0
183
- -webkit-border-radius: 0
184
- &.select2-active
185
- background: white image-url('spinner.gif') no-repeat 100%
186
- background: image-url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee))
187
- background: image-url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%)
188
- background: image-url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%)
189
- background: image-url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%)
190
- background: image-url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, white 85%, #eeeeee 99%)
191
- background: image-url('spinner.gif') no-repeat 100%, linear-gradient(top, white 85%, #eeeeee 99%)
169
+ height: 100%
170
+
171
+ .select2-search
172
+ display: inline-block
173
+ white-space: nowrap
174
+ z-index: 1010
175
+ min-height: 26px
176
+ width: 100%
177
+ margin: 0
178
+ padding-left: 4px
179
+ padding-right: 4px
180
+
181
+ .select2-search-hidden
182
+ display: block
183
+ position: absolute
184
+ left: -10000px
185
+
186
+ .select2-search input
187
+ background: white image-url('select2.png') no-repeat 100% -22px
188
+ background: image-url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee))
189
+ background: image-url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%)
190
+ background: image-url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%)
191
+ background: image-url('select2.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%)
192
+ background: image-url('select2.png') no-repeat 100% -22px, -ms-linear-gradient(top, white 85%, #eeeeee 99%)
193
+ background: image-url('select2.png') no-repeat 100% -22px, linear-gradient(top, white 85%, #eeeeee 99%)
194
+ padding: 4px 20px 4px 5px
195
+ outline: 0
196
+ border: 1px solid #aaa
197
+ font-family: sans-serif
198
+ font-size: 1em
199
+ width: 100%
200
+ margin: 0
201
+ height: auto !important
202
+ min-height: 26px
203
+ -webkit-box-shadow: none
204
+ -moz-box-shadow: none
205
+ box-shadow: none
206
+ border-radius: 0
207
+ -moz-border-radius: 0
208
+ -webkit-border-radius: 0
209
+ &.select2-active
210
+ background: white image-url('spinner.gif') no-repeat 100%
211
+ background: image-url('spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee))
212
+ background: image-url('spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%)
213
+ background: image-url('spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%)
214
+ background: image-url('spinner.gif') no-repeat 100%, -o-linear-gradient(bottom, white 85%, #eeeeee 99%)
215
+ background: image-url('spinner.gif') no-repeat 100%, -ms-linear-gradient(top, white 85%, #eeeeee 99%)
216
+ background: image-url('spinner.gif') no-repeat 100%, linear-gradient(top, white 85%, #eeeeee 99%)
192
217
 
193
218
  .select2-container-active
194
219
  .select2-choice, .select2-choices
@@ -228,20 +253,44 @@
228
253
 
229
254
  /* results
230
255
 
231
- .select2-container .select2-results
256
+ .select2-results
232
257
  margin: 4px 4px 4px 0
233
258
  padding: 0 0 0 4px
234
259
  position: relative
235
260
  overflow-x: hidden
236
261
  overflow-y: auto
237
262
  max-height: 200px
263
+ ul.select2-result-sub
264
+ margin: 0 0 0 0
265
+ > .select2-result-label
266
+ padding-left: 20px
267
+ ul.select2-result-sub
268
+ > .select2-result-label
269
+ padding-left: 40px
270
+ ul.select2-result-sub
271
+ > .select2-result-label
272
+ padding-left: 60px
273
+ ul.select2-result-sub
274
+ > .select2-result-label
275
+ padding-left: 80px
276
+ ul.select2-result-sub
277
+ > .select2-result-label
278
+ padding-left: 100px
279
+ ul.select2-result-sub
280
+ > .select2-result-label
281
+ padding-left: 110px
282
+ ul.select2-result-sub .select2-result-label
283
+ padding-left: 120px
238
284
  li
285
+ list-style: none
286
+ display: list-item
287
+ &.select2-result-with-children .select2-result-label
288
+ font-weight: bold
289
+ .select2-result-label
239
290
  line-height: 80%
240
291
  padding: 7px 7px 8px
241
292
  margin: 0
242
- list-style: none
243
293
  cursor: pointer
244
- display: list-item
245
294
  .select2-highlighted
246
295
  background: #3875d7
247
296
  color: #fff
@@ -258,13 +307,13 @@
258
307
 
259
308
  /*
260
309
  *disabled look for already selected choices in the results dropdown
261
- *.select2-container .select2-results .select2-disabled.select2-highlighted {
310
+ *.select2-results .select2-disabled.select2-highlighted {
262
311
  * color: #666;
263
312
  * background: #f4f4f4;
264
313
  * display: list-item;
265
314
  * cursor: default;
266
315
  *}
267
- *.select2-container .select2-results .select2-disabled {
316
+ *.select2-results .select2-disabled {
268
317
  * background: #f4f4f4;
269
318
  * display: list-item;
270
319
  * cursor: default;
@@ -276,6 +325,18 @@
276
325
  background: #f4f4f4
277
326
  display: list-item
278
327
 
328
+ /* disabled styles
329
+
330
+ .select2-container.select2-container-disabled .select2-choice
331
+ background-color: #f4f4f4
332
+ background-image: none
333
+ border: 1px solid #ddd
334
+ cursor: default
335
+ div
336
+ background-color: #f4f4f4
337
+ background-image: none
338
+ border-left: 0
339
+
279
340
  /* multiselect
280
341
 
281
342
  .select2-container-multi
@@ -295,8 +356,7 @@
295
356
  height: auto !important
296
357
  height: 1%
297
358
  position: relative
298
- .select2-drop
299
- margin-top: 0
359
+ min-height: 26px
300
360
  &.select2-container-active .select2-choices
301
361
  -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3)
302
362
  -moz-box-shadow: 0 0 5px rgba(0, 0, 0, 0.3)
@@ -378,8 +438,19 @@
378
438
  .select2-choices
379
439
  .select2-search-choice .select2-search-choice-close:hover, .select2-search-choice-focus .select2-search-choice-close
380
440
  background-position: right -11px
381
- .select2-results
382
- margin: -1px 0 0
383
- padding: 0
441
+ &.select2-container-disabled .select2-choices
442
+ background-color: #f4f4f4
443
+ background-image: none
444
+ border: 1px solid #ddd
445
+ cursor: default
446
+ .select2-search-choice
447
+ background-image: none
448
+ background-color: #f4f4f4
449
+ border: 1px solid #ddd
450
+ padding: 3px 5px 3px 5px
451
+ .select2-search-choice-close
452
+ display: none
453
+
454
+ /* disabled styles
384
455
 
385
456
  /* end multiselect
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: select2-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-04 00:00:00.000000000 Z
12
+ date: 2012-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &84270160 !ruby/object:Gem::Requirement
16
+ requirement: &87475570 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0.14'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *84270160
24
+ version_requirements: *87475570
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler
27
- requirement: &84269910 !ruby/object:Gem::Requirement
27
+ requirement: &87475320 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '1.0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *84269910
35
+ version_requirements: *87475320
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rails
38
- requirement: &84269680 !ruby/object:Gem::Requirement
38
+ requirement: &87475090 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ~>
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '3.0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *84269680
46
+ version_requirements: *87475090
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: sass
49
- requirement: &84269450 !ruby/object:Gem::Requirement
49
+ requirement: &87474860 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
@@ -54,7 +54,7 @@ dependencies:
54
54
  version: '3.1'
55
55
  type: :development
56
56
  prerelease: false
57
- version_requirements: *84269450
57
+ version_requirements: *87474860
58
58
  description: Select2 is a jQuery based replacement for select boxes. It supports searching,
59
59
  remote data sets, and infinite scrolling of results. This gem integrates Select2
60
60
  with Rails asset pipeline for easy of use.