selectivity-rails 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 34ad4f9ee657c8b9a129e0d85269e4bcfc371351
4
- data.tar.gz: 46e914da3aef1d3efd779c242c6a52f525b77c0f
3
+ metadata.gz: f9962649945a0f217355e4e18ea370d25b1aec02
4
+ data.tar.gz: 7e58ef158675932c42c21c7683d0030fabd2bdae
5
5
  SHA512:
6
- metadata.gz: 9a57ab8f4c34bbe85f32a14f466a75d5c9e33c1dccb45bea9becf6733b6bffbd5da6879bcf15e12cd59fdd16f6cc6f81a5eb0238a849f756e601a0b3f1b25d7c
7
- data.tar.gz: e6018c41fea9a6aecbfa18976b642393aba6bf3987b547f6c8850ecf77457c89d2249c7fc0bd91d455136f85f1b11da89472822b398f9c55419c6796f5c57d61
6
+ metadata.gz: d5bd4d195d05ddee4d51a35234ae4e7db8d4da1980573dac036a3fcb426ff33bd2605f3941da9d072f3111872a6caccbccb09e7de0ebf561dd0fc56b2e60c885
7
+ data.tar.gz: 3e0a5c418e0efbda4a8815e4d7e7c7cc3a7b7fabd32e3b0df2e1d99e35220b754cc85d02d556c7e57e2e42e72a03ef0b9d7d2da6719d35ddfedf726323a678bb
@@ -1,5 +1,5 @@
1
1
  module Selectivity
2
2
  module Rails
3
- VERSION = '0.1.7'
3
+ VERSION = '0.1.8'
4
4
  end
5
5
  end
@@ -37,11 +37,17 @@ module Selectivity
37
37
  private
38
38
 
39
39
  def find_selectivity_input(from, options)
40
- find(:div, from, options)
41
- rescue Capybara::ElementNotFound
42
- label = find('label', { text: from }.merge(options))
43
-
44
- find(:div, "##{label[:for]}", options)
40
+ label = first(:xpath, ".//label[contains(., '#{from}')]", options)
41
+ if label.present?
42
+ find(:div, "##{label[:for]}", options)
43
+ else
44
+ target = first(:xpath, ".//div[contains(., '#{from}')]", options) || first(:div, from, options)
45
+ if target[:class].include?('selectivity-input')
46
+ target
47
+ else
48
+ target.first('.selectivity-input')
49
+ end
50
+ end
45
51
  end
46
52
 
47
53
  def _selectivity_multiselect?(input)
@@ -1,3 +1,10 @@
1
+ /**
2
+ * @license
3
+ * Selectivity.js 2.1.0 <https://arendjr.github.io/selectivity/>
4
+ * Copyright (c) 2014-2016 Arend van Beelen jr.
5
+ * (c) 2016 Speakap BV
6
+ * Available under MIT license <https://github.com/arendjr/selectivity/blob/master/LICENSE>
7
+ */
1
8
  !function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.selectivity=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
2
9
  _dereq_(5);_dereq_(6);_dereq_(7);_dereq_(9);_dereq_(10);_dereq_(11);_dereq_(12);_dereq_(13);_dereq_(14);_dereq_(15);_dereq_(16);_dereq_(17);_dereq_(18);_dereq_(19);module.exports=_dereq_(8);
3
10
  },{"10":10,"11":11,"12":12,"13":13,"14":14,"15":15,"16":16,"17":17,"18":18,"19":19,"5":5,"6":6,"7":7,"8":8,"9":9}],2:[function(_dereq_,module,exports){
@@ -105,7 +112,8 @@ var now = Date.now;
105
112
  * Creates a function that delays invoking `func` until after `wait` milliseconds
106
113
  * have elapsed since the last time it was invoked.
107
114
  *
108
- * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
115
+ * See [David Corbacho's article]
116
+ * (http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
109
117
  * for details over the differences between `_.debounce` and `_.throttle`.
110
118
  *
111
119
  * @static
@@ -252,8 +260,6 @@ Selectivity.OptionListeners.unshift(function(selectivity, options) {
252
260
  Selectivity.Locale.needMoreCharacters(minimumInputLength - term.length)
253
261
  );
254
262
  } else {
255
- selectivity.dropdown.showLoading();
256
-
257
263
  var url = (ajax.url instanceof Function ? ajax.url(queryOptions) : ajax.url);
258
264
  if (params) {
259
265
  url += (url.indexOf('?') > -1 ? '&' : '?') + $.param(params(term, offset));
@@ -560,6 +566,8 @@ function Selectivity(options) {
560
566
  this.data(options.data || null, { triggerChange: false });
561
567
  }
562
568
 
569
+ this.$el.on('mouseover', this._mouseover.bind(this));
570
+ this.$el.on('mouseleave', this._mouseout.bind(this));
563
571
  this.$el.on('selectivity-close', this._closed.bind(this));
564
572
 
565
573
  EventDelegator.call(this);
@@ -600,6 +608,9 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
600
608
  * selected.
601
609
  * @param options Optional options object. May contain the following property:
602
610
  * triggerChange - Set to false to suppress the "change" event being triggered.
611
+ * Note this will also cause the UI to not update automatically;
612
+ * so you may want to call rerenderSelection() manually when
613
+ * using this option.
603
614
  *
604
615
  * @return If newData is omitted, this method returns the current data.
605
616
  */
@@ -656,8 +667,6 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
656
667
 
657
668
  if (this.$searchInput) {
658
669
  this.$searchInput.focus();
659
- } else if (this.dropdown) {
660
- this.dropdown.focus();
661
670
  }
662
671
  },
663
672
 
@@ -687,8 +696,12 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
687
696
  * action of searching when something is typed.
688
697
  *
689
698
  * @param $input jQuery container for the input element.
699
+ * @param options Optional options object. May contain the following property:
700
+ * noSearch - If true, no event handlers are setup to initiate searching when
701
+ * the user types in the input field. This is useful if you want to
702
+ * use the input only to handle keyboard support.
690
703
  */
691
- initSearchInput: function($input) {
704
+ initSearchInput: function($input, options) {
692
705
 
693
706
  this.$searchInput = $input;
694
707
 
@@ -696,11 +709,13 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
696
709
  listener(this, $input);
697
710
  }.bind(this));
698
711
 
699
- $input.on('keyup', function(event) {
700
- if (!event.isDefaultPrevented()) {
701
- this.search();
702
- }
703
- }.bind(this));
712
+ if (!options || !options.noSearch) {
713
+ $input.on('keyup', function(event) {
714
+ if (!event.isDefaultPrevented()) {
715
+ this.search();
716
+ }
717
+ }.bind(this));
718
+ }
704
719
  },
705
720
 
706
721
  /**
@@ -734,6 +749,8 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
734
749
  this.search('');
735
750
  }
736
751
  }
752
+
753
+ this.$el.children().toggleClass('open', true);
737
754
  }
738
755
  },
739
756
 
@@ -976,11 +993,14 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
976
993
  * case it will assume the text is equal to the ID. This is useful if you're working with tags,
977
994
  * or selecting e-mail addresses for instance, but may not always be what you want.
978
995
  *
979
- * @param newValue Optional new value to set. For a MultipleSelectivity instance the value must be
980
- * an array of IDs, for a SingleSelectivity instance the value must be a single ID
981
- * (a string or a number) or null to indicate no item is selected.
996
+ * @param newValue Optional new value to set. For a MultipleSelectivity instance the value must
997
+ * be an array of IDs, for a SingleSelectivity instance the value must be a
998
+ * single ID (a string or a number) or null to indicate no item is selected.
982
999
  * @param options Optional options object. May contain the following property:
983
1000
  * triggerChange - Set to false to suppress the "change" event being triggered.
1001
+ * Note this will also cause the UI to not update automatically;
1002
+ * so you may want to call rerenderSelection() manually when
1003
+ * using this option.
984
1004
  *
985
1005
  * @return If newValue is omitted, this method returns the current value.
986
1006
  */
@@ -1021,6 +1041,8 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
1021
1041
  _closed: function() {
1022
1042
 
1023
1043
  this.dropdown = null;
1044
+
1045
+ this.$el.children().toggleClass('open', false);
1024
1046
  },
1025
1047
 
1026
1048
  /**
@@ -1064,6 +1086,22 @@ $.extend(Selectivity.prototype, EventDelegator.prototype, {
1064
1086
  return '' + id;
1065
1087
  }
1066
1088
  }
1089
+ },
1090
+
1091
+ /**
1092
+ * @private
1093
+ */
1094
+ _mouseout: function() {
1095
+
1096
+ this.$el.children().toggleClass('hover', false);
1097
+ },
1098
+
1099
+ /**
1100
+ * @private
1101
+ */
1102
+ _mouseover: function() {
1103
+
1104
+ this.$el.children().toggleClass('hover', true);
1067
1105
  }
1068
1106
 
1069
1107
  });
@@ -2209,13 +2247,6 @@ function SelectivityDropdown(options) {
2209
2247
  */
2210
2248
  this.$results = this.$('.selectivity-results-container');
2211
2249
 
2212
- /**
2213
- * jQuery container for the search input.
2214
- *
2215
- * May be null as long as there is no visible search input. It is set by initSearchInput().
2216
- */
2217
- this.$searchInput = null;
2218
-
2219
2250
  /**
2220
2251
  * Boolean indicating whether more results are available than currently displayed in the
2221
2252
  * dropdown.
@@ -2332,16 +2363,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2332
2363
  'mouseenter .selectivity-result-item': '_resultHovered'
2333
2364
  },
2334
2365
 
2335
- /**
2336
- * Applies focus to the input.
2337
- */
2338
- focus: function() {
2339
-
2340
- if (this.$searchInput) {
2341
- this.$searchInput.focus();
2342
- }
2343
- },
2344
-
2345
2366
  /**
2346
2367
  * Highlights a result item.
2347
2368
  *
@@ -2378,29 +2399,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2378
2399
  this.loadMoreHighlighted = true;
2379
2400
  },
2380
2401
 
2381
- /**
2382
- * Initializes the search input element.
2383
- *
2384
- * Sets the $searchInput property, invokes all search input listeners and attaches the default
2385
- * action of searching when something is typed.
2386
- *
2387
- * @param $input jQuery container for the input element.
2388
- */
2389
- initSearchInput: function($input) {
2390
-
2391
- this.$searchInput = $input;
2392
-
2393
- this.selectivity.searchInputListeners.forEach(function(listener) {
2394
- listener(this, $input);
2395
- }.bind(this));
2396
-
2397
- $input.on('keyup', function(event) {
2398
- if (!event.isDefaultPrevented()) {
2399
- this.search();
2400
- }
2401
- }.bind(this));
2402
- },
2403
-
2404
2402
  /**
2405
2403
  * Loads a follow-up page with results after a search.
2406
2404
  *
@@ -2420,9 +2418,7 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2420
2418
  throw new Error('callback must be passed a response object');
2421
2419
  }
2422
2420
  }.bind(this),
2423
- error: function() {
2424
- this._showResults([], { add: true });
2425
- }.bind(this),
2421
+ error: this._showResults.bind(this, [], { add: true }),
2426
2422
  offset: this.results.length,
2427
2423
  selectivity: this.selectivity,
2428
2424
  term: this.term
@@ -2478,35 +2474,30 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2478
2474
  * search will be performed among those items. Otherwise, the query function specified in the
2479
2475
  * options will be used to perform the search. If neither is defined, nothing happens.
2480
2476
  *
2481
- * @param term Optional term to search for. If ommitted, the value of the search input element
2482
- * is used as term.
2477
+ * @param term Term to search for.
2483
2478
  */
2484
2479
  search: function(term) {
2485
2480
 
2486
2481
  var self = this;
2487
- function setResults(results, resultOptions) {
2488
- self._showResults(results, $.extend({ term: term }, resultOptions));
2489
- }
2490
2482
 
2491
- if (term === undefined) {
2492
- term = (self.$searchInput ? self.$searchInput.val() : '');
2493
- }
2483
+ term = term || '';
2484
+ self.term = term;
2494
2485
 
2495
2486
  if (self.options.items) {
2496
2487
  term = Selectivity.transformText(term);
2497
2488
  var matcher = self.selectivity.matcher;
2498
- setResults(self.options.items.map(function(item) {
2489
+ self._showResults(self.options.items.map(function(item) {
2499
2490
  return matcher(item, term);
2500
2491
  }).filter(function(item) {
2501
2492
  return !!item;
2502
- }));
2493
+ }), { term: term });
2503
2494
  } else if (self.options.query) {
2504
2495
  self.options.query({
2505
2496
  callback: function(response) {
2506
2497
  if (response && response.results) {
2507
- setResults(
2498
+ self._showResults(
2508
2499
  Selectivity.processItems(response.results),
2509
- { hasMore: !!response.more }
2500
+ { hasMore: !!response.more, term: term }
2510
2501
  );
2511
2502
  } else {
2512
2503
  throw new Error('callback must be passed a response object');
@@ -2518,8 +2509,6 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2518
2509
  term: term
2519
2510
  });
2520
2511
  }
2521
-
2522
- self.term = term;
2523
2512
  },
2524
2513
 
2525
2514
  /**
@@ -2542,7 +2531,7 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2542
2531
  selectItem: function(id) {
2543
2532
 
2544
2533
  var item = Selectivity.findNestedById(this.results, id);
2545
- if (item) {
2534
+ if (item && !item.disabled) {
2546
2535
  var options = { id: id, item: item };
2547
2536
  if (this.selectivity.triggerEvent('selectivity-selecting', options)) {
2548
2537
  this.selectivity.triggerEvent('selectivity-selected', options);
@@ -2740,7 +2729,7 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2740
2729
  event.screenY === undefined || event.screenY !== this._lastMousePosition.y) {
2741
2730
  var id = this.selectivity._getItemId(event);
2742
2731
  var item = Selectivity.findNestedById(this.results, id);
2743
- if (item) {
2732
+ if (item && !item.disabled) {
2744
2733
  this.highlight(item);
2745
2734
  }
2746
2735
 
@@ -2766,7 +2755,7 @@ $.extend(SelectivityDropdown.prototype, EventDelegator.prototype, {
2766
2755
  */
2767
2756
  _showResults: function(results, options) {
2768
2757
 
2769
- this.showResults(this.selectivity.filterResults(results), options || {});
2758
+ this.showResults(this.selectivity.filterResults(results), options);
2770
2759
  },
2771
2760
 
2772
2761
  /**
@@ -3214,7 +3203,7 @@ function MultipleSelectivity(options) {
3214
3203
 
3215
3204
  this.initSearchInput(this.$('.selectivity-multiple-input:not(.selectivity-width-detector)'));
3216
3205
 
3217
- this._rerenderSelection();
3206
+ this.rerenderSelection();
3218
3207
 
3219
3208
  if (!options.positionDropdown) {
3220
3209
  // dropdowns for multiple-value inputs should open below the select box,
@@ -3292,7 +3281,7 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3292
3281
  * Follows the same format as Backbone: http://backbonejs.org/#View-delegateEvents
3293
3282
  */
3294
3283
  events: {
3295
- 'change': '_rerenderSelection',
3284
+ 'change': 'rerenderSelection',
3296
3285
  'change .selectivity-multiple-input': function() { return false; },
3297
3286
  'click': '_clicked',
3298
3287
  'click .selectivity-multiple-selected-item': '_itemClicked',
@@ -3371,6 +3360,49 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3371
3360
  }
3372
3361
  },
3373
3362
 
3363
+ /**
3364
+ * Re-renders the selection.
3365
+ *
3366
+ * Normally the UI is automatically updated whenever the selection changes, but you may want to
3367
+ * call this method explicitly if you've updated the selection with the triggerChange option set
3368
+ * to false.
3369
+ */
3370
+ rerenderSelection: function(event) {
3371
+
3372
+ event = event || {};
3373
+
3374
+ if (event.added) {
3375
+ this._renderSelectedItem(event.added);
3376
+
3377
+ this._scrollToBottom();
3378
+ } else if (event.removed) {
3379
+ var quotedId = Selectivity.quoteCssAttr(event.removed.id);
3380
+ this.$('.selectivity-multiple-selected-item[data-item-id=' + quotedId + ']').remove();
3381
+ } else {
3382
+ this.$('.selectivity-multiple-selected-item').remove();
3383
+
3384
+ this._data.forEach(this._renderSelectedItem, this);
3385
+
3386
+ this._updateInputWidth();
3387
+ }
3388
+
3389
+ if (event.added || event.removed) {
3390
+ if (this.dropdown) {
3391
+ this.dropdown.showResults(this.filterResults(this.dropdown.results), {
3392
+ hasMore: this.dropdown.hasMore
3393
+ });
3394
+ }
3395
+
3396
+ if (this.hasKeyboard) {
3397
+ this.focus();
3398
+ }
3399
+ }
3400
+
3401
+ this.positionDropdown();
3402
+
3403
+ this._updatePlaceholder();
3404
+ },
3405
+
3374
3406
  /**
3375
3407
  * @inherit
3376
3408
  */
@@ -3381,10 +3413,8 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3381
3413
  if (this.options.tokenizer) {
3382
3414
  term = this.options.tokenizer(term, this._data, this.add.bind(this), this.options);
3383
3415
 
3384
- if ($.type(term) === 'string') {
3416
+ if ($.type(term) === 'string' && term !== this.$searchInput.val()) {
3385
3417
  this.$searchInput.val(term);
3386
- } else {
3387
- term = '';
3388
3418
  }
3389
3419
  }
3390
3420
 
@@ -3441,7 +3471,13 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3441
3471
  options.allowedTypes = options.allowedTypes || {};
3442
3472
  options.allowedTypes[backspaceHighlightsBeforeDelete] = 'boolean';
3443
3473
 
3474
+ var wasEnabled = this.enabled;
3475
+
3444
3476
  callSuper(this, 'setOptions', options);
3477
+
3478
+ if (wasEnabled !== this.enabled) {
3479
+ this.$el.html(this.template('multipleSelectInput', { enabled: this.enabled }));
3480
+ }
3445
3481
  },
3446
3482
 
3447
3483
  /**
@@ -3646,45 +3682,6 @@ var callSuper = Selectivity.inherits(MultipleSelectivity, {
3646
3682
  .on('click', this._itemRemoveClicked.bind(this));
3647
3683
  },
3648
3684
 
3649
- /**
3650
- * @private
3651
- */
3652
- _rerenderSelection: function(event) {
3653
-
3654
- event = event || {};
3655
-
3656
- if (event.added) {
3657
- this._renderSelectedItem(event.added);
3658
-
3659
- this._scrollToBottom();
3660
- } else if (event.removed) {
3661
- var quotedId = Selectivity.quoteCssAttr(event.removed.id);
3662
- this.$('.selectivity-multiple-selected-item[data-item-id=' + quotedId + ']').remove();
3663
- } else {
3664
- this.$('.selectivity-multiple-selected-item').remove();
3665
-
3666
- this._data.forEach(this._renderSelectedItem, this);
3667
-
3668
- this._updateInputWidth();
3669
- }
3670
-
3671
- if (event.added || event.removed) {
3672
- if (this.dropdown) {
3673
- this.dropdown.showResults(this.filterResults(this.dropdown.results), {
3674
- hasMore: this.dropdown.hasMore
3675
- });
3676
- }
3677
-
3678
- if (this.hasKeyboard) {
3679
- this.focus();
3680
- }
3681
- }
3682
-
3683
- this.positionDropdown();
3684
-
3685
- this._updatePlaceholder();
3686
- },
3687
-
3688
3685
  /**
3689
3686
  * @private
3690
3687
  */
@@ -3759,7 +3756,7 @@ function SingleSelectivity(options) {
3759
3756
  this.$el.html(this.template('singleSelectInput', this.options))
3760
3757
  .trigger('selectivity-init', 'single');
3761
3758
 
3762
- this._rerenderSelection();
3759
+ this.rerenderSelection();
3763
3760
 
3764
3761
  if (!options.positionDropdown) {
3765
3762
  // dropdowns for single-value inputs should open below the select box,
@@ -3786,7 +3783,7 @@ function SingleSelectivity(options) {
3786
3783
  }
3787
3784
 
3788
3785
  if (options.showSearchInputInDropdown === false) {
3789
- this.initSearchInput(this.$('.selectivity-single-select-input'));
3786
+ this.initSearchInput(this.$('.selectivity-single-select-input'), { noSearch: true });
3790
3787
  }
3791
3788
  }
3792
3789
 
@@ -3801,7 +3798,7 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3801
3798
  * Follows the same format as Backbone: http://backbonejs.org/#View-delegateEvents
3802
3799
  */
3803
3800
  events: {
3804
- 'change': '_rerenderSelection',
3801
+ 'change': 'rerenderSelection',
3805
3802
  'click': '_clicked',
3806
3803
  'focus .selectivity-single-select-input': '_focused',
3807
3804
  'selectivity-selected': '_resultSelected'
@@ -3878,6 +3875,32 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3878
3875
  this._opening = false;
3879
3876
  },
3880
3877
 
3878
+ /**
3879
+ * Re-renders the selection.
3880
+ *
3881
+ * Normally the UI is automatically updated whenever the selection changes, but you may want to
3882
+ * call this method explicitly if you've updated the selection with the triggerChange option set
3883
+ * to false.
3884
+ */
3885
+ rerenderSelection: function() {
3886
+
3887
+ var $container = this.$('.selectivity-single-result-container');
3888
+ if (this._data) {
3889
+ $container.html(
3890
+ this.template('singleSelectedItem', $.extend({
3891
+ removable: this.options.allowClear && !this.options.readOnly
3892
+ }, this._data))
3893
+ );
3894
+
3895
+ $container.find('.selectivity-single-selected-item-remove')
3896
+ .on('click', this._itemRemoveClicked.bind(this));
3897
+ } else {
3898
+ $container.html(
3899
+ this.template('singleSelectPlaceholder', { placeholder: this.options.placeholder })
3900
+ );
3901
+ }
3902
+ },
3903
+
3881
3904
  /**
3882
3905
  * @inherit
3883
3906
  *
@@ -3965,28 +3988,6 @@ var callSuper = Selectivity.inherits(SingleSelectivity, {
3965
3988
  return false;
3966
3989
  },
3967
3990
 
3968
- /**
3969
- * @private
3970
- */
3971
- _rerenderSelection: function() {
3972
-
3973
- var $container = this.$('.selectivity-single-result-container');
3974
- if (this._data) {
3975
- $container.html(
3976
- this.template('singleSelectedItem', $.extend({
3977
- removable: this.options.allowClear && !this.options.readOnly
3978
- }, this._data))
3979
- );
3980
-
3981
- $container.find('.selectivity-single-selected-item-remove')
3982
- .on('click', this._itemRemoveClicked.bind(this));
3983
- } else {
3984
- $container.html(
3985
- this.template('singleSelectPlaceholder', { placeholder: this.options.placeholder })
3986
- );
3987
- }
3988
- },
3989
-
3990
3991
  /**
3991
3992
  * @private
3992
3993
  */
@@ -4079,6 +4080,18 @@ var callSuper = Selectivity.inherits(SelectivitySubmenu, SelectivityDropdown, {
4079
4080
  }
4080
4081
  },
4081
4082
 
4083
+ /**
4084
+ * @inherit
4085
+ */
4086
+ search: function(term) {
4087
+
4088
+ if (this.submenu) {
4089
+ this.submenu.search(term);
4090
+ } else {
4091
+ callSuper(this, 'search', term);
4092
+ }
4093
+ },
4094
+
4082
4095
  /**
4083
4096
  * @inherit
4084
4097
  */
@@ -4097,7 +4110,7 @@ var callSuper = Selectivity.inherits(SelectivitySubmenu, SelectivityDropdown, {
4097
4110
  selectItem: function(id) {
4098
4111
 
4099
4112
  var item = Selectivity.findNestedById(this.results, id);
4100
- if (item && !item.submenu) {
4113
+ if (item && !item.disabled && !item.submenu) {
4101
4114
  var options = { id: id, item: item };
4102
4115
  if (this.selectivity.triggerEvent('selectivity-selecting', options)) {
4103
4116
  this.selectivity.triggerEvent('selectivity-selected', options);
@@ -4403,11 +4416,13 @@ Selectivity.Templates = {
4403
4416
  * @param options Options object containing the following properties:
4404
4417
  * id - Identifier for the item.
4405
4418
  * text - Text label which the user sees.
4419
+ * disabled - Truthy if the item should be disabled.
4406
4420
  * submenu - Truthy if the result item has a menu with subresults.
4407
4421
  */
4408
4422
  resultItem: function(options) {
4409
4423
  return (
4410
- '<div class="selectivity-result-item" data-item-id="' + escape(options.id) + '">' +
4424
+ '<div class="selectivity-result-item' + (options.disabled ? ' disabled' : '') + '"' +
4425
+ ' data-item-id="' + escape(options.id) + '">' +
4411
4426
  escape(options.text) +
4412
4427
  (options.submenu ? '<i class="selectivity-submenu-icon fa fa-chevron-right"></i>'
4413
4428
  : '') +
@@ -4494,10 +4509,14 @@ Selectivity.Templates = {
4494
4509
  * mode - Mode in which select exists, single or multiple.
4495
4510
  */
4496
4511
  selectCompliance: function(options) {
4497
- if (options.mode === 'multiple' && options.name.slice(-2) !== '[]') {
4498
- options.name += '[]';
4512
+ var mode = options.mode;
4513
+ var name = options.name;
4514
+ if (mode === 'multiple' && name.slice(-2) !== '[]') {
4515
+ name += '[]';
4499
4516
  }
4500
- return ('<select name="' + options.name + '"' + (options.mode === 'multiple' ? ' multiple' : '') + '></select>');
4517
+ return (
4518
+ '<select name="' + name + '"' + (mode === 'multiple' ? ' multiple' : '') + '></select>'
4519
+ );
4501
4520
  },
4502
4521
 
4503
4522
  /**
@@ -36,6 +36,10 @@
36
36
  background: $selectivity-dropdown-highlight-bg
37
37
  color: $selectivity-dropdown-highlight-color
38
38
 
39
+ .selectivity-result-item.disabled
40
+ cursor: default
41
+ color: #999
42
+
39
43
  .selectivity-result-item:first-child
40
44
  border-radius: 4px 4px 0 0
41
45
 
@@ -20,6 +20,7 @@ input[type='text'].selectivity-multiple-input
20
20
  background-color: transparent
21
21
  border: none
22
22
  float: left
23
+ font: inherit
23
24
  height: calc(2em + 4px)
24
25
  max-width: 100%
25
26
  outline: 0
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: selectivity-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konrad Jurkowski
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-13 00:00:00.000000000 Z
11
+ date: 2016-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler