uber_select_rails 0.6.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -117,6 +117,7 @@ label {
117
117
  .uber_select .result.highlighted{
118
118
  background-color: #C4E4FF;
119
119
  color: inherit;
120
+ outline: none;
120
121
  }
121
122
  .uber_select .messages{
122
123
  padding: 1px 20px;
@@ -68,6 +68,24 @@
68
68
  <p>This prepopulated example hides blank options, but still allows the search to be cleared</p>
69
69
  </span>
70
70
 
71
+ <span class="example">
72
+ <label for="select">
73
+ Grouped search with group matching
74
+ </label>
75
+ <select data-uber-options='{"matchGroupNames": true}'>
76
+ <optgroup label="Colours">
77
+ <option>Red</option>
78
+ <option>Green</option>
79
+ </optgroup>
80
+ <optgroup label="Names">
81
+ <option>Red</option>
82
+ <option>Greene</option>
83
+ </optgroup>
84
+ </select>
85
+ <p>This example uses optgroups to separate option types. It allows the search to match against the group names, which
86
+ causes all results in that group to show.
87
+ </p>
88
+ </span>
71
89
 
72
90
  <span class="example">
73
91
  <label for="select">
@@ -111,7 +129,6 @@
111
129
  </p>
112
130
  </span>
113
131
 
114
-
115
132
  <span class="example">
116
133
  <label for="select">
117
134
  Placeholder as blank
@@ -243,17 +260,18 @@
243
260
  </span>
244
261
 
245
262
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
246
- <script src="javascript/string_extensions.js"></script>
247
- <script src="javascript/search_field.js"></script>
248
- <script src="javascript/list.js"></script>
249
- <script src="javascript/output_container.js"></script>
250
- <script src="javascript/search.js"></script>
251
- <script src="javascript/pane.js"></script>
252
263
  <script src="javascript/uber_search.js"></script>
264
+ <script src="javascript/uber_search/search_field.js"></script>
265
+ <script src="javascript/uber_search/list.js"></script>
266
+ <script src="javascript/uber_search/output_container.js"></script>
267
+ <script src="javascript/uber_search/search_model.js"></script>
268
+ <script src="javascript/uber_search/search.js"></script>
269
+ <script src="javascript/uber_search/pane.js"></script>
253
270
  <script src="javascript/jquery.uber-select.js"></script>
254
271
 
255
272
  <script type="text/javascript">
256
- $('select').uberSelect({selectCaret: '&#xF078;'})
273
+ jQuery.noConflict()
274
+ jQuery('select').uberSelect({selectCaret: '&#xF078;'})
257
275
  </script>
258
276
  </body>
259
277
  </html>
@@ -1 +1 @@
1
- //= require_tree ./uber_select/javascript
1
+ //= require_directory ./uber_select/javascript
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uber_select_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nicholas Jakobsen
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2022-03-02 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: rails
@@ -52,7 +51,6 @@ dependencies:
52
51
  - - "~>"
53
52
  - !ruby/object:Gem::Version
54
53
  version: '10.0'
55
- description:
56
54
  email:
57
55
  - nicholas.jakobsen@gmail.com
58
56
  executables: []
@@ -72,19 +70,18 @@ files:
72
70
  - vendor/assets/javascript/uber_select/.gitignore
73
71
  - vendor/assets/javascript/uber_select/README.md
74
72
  - vendor/assets/javascript/uber_select/javascript/jquery.uber-select.js
75
- - vendor/assets/javascript/uber_select/javascript/list.js
76
- - vendor/assets/javascript/uber_select/javascript/output_container.js
77
- - vendor/assets/javascript/uber_select/javascript/pane.js
78
- - vendor/assets/javascript/uber_select/javascript/search.js
79
- - vendor/assets/javascript/uber_select/javascript/search_field.js
80
- - vendor/assets/javascript/uber_select/javascript/string_extensions.js
81
73
  - vendor/assets/javascript/uber_select/javascript/uber_search.js
74
+ - vendor/assets/javascript/uber_select/javascript/uber_search/list.js
75
+ - vendor/assets/javascript/uber_select/javascript/uber_search/output_container.js
76
+ - vendor/assets/javascript/uber_select/javascript/uber_search/pane.js
77
+ - vendor/assets/javascript/uber_select/javascript/uber_search/search.js
78
+ - vendor/assets/javascript/uber_select/javascript/uber_search/search_field.js
79
+ - vendor/assets/javascript/uber_select/javascript/uber_search/search_model.js
82
80
  - vendor/assets/javascript/uber_select/test.css
83
81
  - vendor/assets/javascript/uber_select/test.html
84
82
  homepage: https://github.com/culturecode/uber_select_rails
85
83
  licenses: []
86
84
  metadata: {}
87
- post_install_message:
88
85
  rdoc_options: []
89
86
  require_paths:
90
87
  - lib
@@ -99,8 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
96
  - !ruby/object:Gem::Version
100
97
  version: '0'
101
98
  requirements: []
102
- rubygems_version: 3.2.3
103
- signing_key:
99
+ rubygems_version: 3.6.9
104
100
  specification_version: 4
105
101
  summary: A Rails gem containing a javascript plugin that adds a layer of UI goodness
106
102
  overtop of basic HTML select elements
@@ -1,122 +0,0 @@
1
- function List(options) {
2
- var context = this
3
-
4
- var view = this.view = $('<ul class="results"></ul>')
5
-
6
-
7
- // BEHAVIOUR
8
-
9
- // Handle up and down arrow key presses
10
- $(options.keypressInput || view).on('keydown', function(event){
11
- switch (event.which) {
12
- case 38: // Up Arrow
13
- stepHighlight(-1, true)
14
- return false
15
- case 40: // Down Arrow
16
- stepHighlight(1)
17
- return false
18
- case 13: // Enter
19
- if (highlightedResult().length) {
20
- highlightedResult().click()
21
- } else {
22
- $(this).trigger('noHighlightSubmit')
23
- }
24
- return false
25
- }
26
- })
27
-
28
- // When a list item is hovered
29
- $(view).on('mouseenter', '.result:not(.disabled)', function(){
30
- unhighlightResults()
31
- highlightResult(this, {scroll: false})
32
- })
33
-
34
-
35
- // HELPER FUNCTIONS
36
-
37
- this.getResults = function(){
38
- return $(view).find('.result')
39
- }
40
-
41
- this.renderResults = function(data){
42
- var results = $.map(data, function(datum){
43
- return context.buildResult(datum)
44
- })
45
-
46
- view.toggleClass('empty', !data.length)
47
-
48
- view.html(results)
49
- }
50
-
51
- // Can be overridden to format how results are built
52
- this.buildResult = function(datum){
53
- return $('<li role="option" class="result" tabindex="0"></li>').html(datum)
54
- }
55
-
56
- this.unhighlightResults = unhighlightResults
57
- this.highlightResult = highlightResult
58
-
59
- function stepHighlight(amount, allowUnhighlight){
60
- var index = selectableResults().index(highlightedResult())
61
- var result = selectableResults()[index + amount]
62
-
63
- if (result || allowUnhighlight){
64
- unhighlightResults()
65
- highlightResult(result)
66
- }
67
- }
68
-
69
- function highlightResult(result, options) {
70
- result = $(result)
71
- options = $.extend({scroll: true}, options)
72
-
73
- if (!result.length) { return }
74
-
75
- result.addClass('highlighted')
76
- result.attr("aria-selected", true)
77
-
78
- if (options.scroll){
79
- scrollResultIntoView(result)
80
- }
81
- }
82
-
83
- function unhighlightResults(){
84
- highlightedResult().removeClass('highlighted').attr("aria-selected", false)
85
- }
86
-
87
- function highlightedResult(){
88
- return results().filter('.highlighted')
89
- }
90
-
91
- function selectableResults(){
92
- return visibleResults().not('.disabled')
93
- }
94
-
95
- function visibleResults(){
96
- return results().not('.hidden')
97
- }
98
-
99
- function results(){
100
- return view.find('.result')
101
- }
102
-
103
- function scrollResultIntoView(result){
104
- result = $(result)
105
- var container = result.closest('.results').css('position', 'relative') // Ensure the results container is positioned so offset is calculated correctly
106
- var containerHeight = container.outerHeight()
107
- var containerTop = container.get(0).scrollTop
108
- var containerBottom = containerTop + containerHeight
109
- var resultHeight = result.outerHeight()
110
- var resultTop = result.get(0).offsetTop
111
- var resultBottom = resultTop + resultHeight
112
-
113
- if (containerBottom < resultBottom){
114
- container.scrollTop(resultBottom - containerHeight)
115
- } else if (containerTop > resultTop){
116
- container.scrollTop(resultTop)
117
- }
118
- }
119
-
120
- // INITIALIZATION
121
- $.extend(this, options) // Allow overriding of functions
122
- }
@@ -1,25 +0,0 @@
1
- var OutputContainer = function(options){
2
- options = $.extend({}, options)
3
- var view = $('<span class="selected_text_container" tabindex="0"></span>')
4
- var selectedText = $('<span class="selected_text"></span>').appendTo(view)
5
- var selectCaret = $('<span class="select_caret"></span>').appendTo(view).html(options.selectCaret)
6
-
7
- // INITIALIZATION
8
-
9
- setValue()
10
-
11
- // HELPER FUNCTIONS
12
-
13
- function setValue(value){
14
- selectedText.html(value || '&nbsp;')
15
- view.toggleClass('empty', !value)
16
- }
17
-
18
- function setDisabled(boolean) {
19
- view.toggleClass('disabled', boolean)
20
- }
21
-
22
- // PUBLIC INTERFACE
23
-
24
- $.extend(this, {view: view, setValue: setValue, setDisabled: setDisabled})
25
- }
@@ -1,100 +0,0 @@
1
- function Pane(options){
2
- options = $.extend({
3
- trigger: null
4
- }, options)
5
-
6
- var context = this
7
- var model = {}
8
- var isOpen = false
9
- var view = $('<div class="pane"></div>').toggle(isOpen)
10
- var innerPane = $('<div class="pane_inner"></div>').appendTo(view)
11
-
12
-
13
- // PUBLIC INTERFACE
14
-
15
- $.extend(this, {
16
- model: model,
17
- view: view,
18
- addContent: addContent,
19
- removeContent: removeContent,
20
- show: show,
21
- hide: hide,
22
- toggle: toggle,
23
- isOpen: paneIsOpen,
24
- isClosed: paneIsClosed
25
- })
26
-
27
-
28
- // BEHAVIOUR
29
-
30
- // Hide the pane when clicked out
31
- $(document).on('mousedown', function(event){
32
- if (isEventOutsidePane(event) && isEventOutsideTrigger(event)){
33
- context.hide()
34
- }
35
- })
36
-
37
- // Make it possible to have elements in the pane that close it
38
- view.on('click', '[data-behaviour~=close-pane]', function(event){
39
- context.hide()
40
- })
41
-
42
- // Close the pane when the user presses escape
43
- $(document).on('keyup', function(event){
44
- if (event.which == 27 && isOpen){
45
- context.hide()
46
- return false
47
- }
48
- })
49
-
50
-
51
- // HELPER FUNCTIONS
52
-
53
- function paneIsOpen(){
54
- return isOpen
55
- }
56
-
57
- function paneIsClosed(){
58
- return !isOpen
59
- }
60
-
61
- function addContent(name, content){
62
- model[name] = content
63
- innerPane.append(content)
64
- }
65
-
66
- function removeContent(name){
67
- $(model[name]).remove()
68
- delete model['name']
69
- }
70
-
71
- function show(){
72
- if (isOpen) { return }
73
- isOpen = true
74
- view.show()
75
- $(context).trigger('shown')
76
- }
77
- function hide(){
78
- if (!isOpen) { return }
79
- isOpen = false
80
- view.hide()
81
- $(context).trigger('hidden')
82
- }
83
- function toggle(){
84
- if (isOpen) {
85
- context.hide()
86
- } else {
87
- context.show()
88
- }
89
- }
90
-
91
- // returns true if the event originated outside the pane
92
- function isEventOutsidePane(event){
93
- return !$(event.target).closest(view).length
94
- }
95
-
96
- function isEventOutsideTrigger(event){
97
- return !$(event.target).closest(options.trigger).length
98
- }
99
-
100
- }
@@ -1,84 +0,0 @@
1
- function SearchField(options){
2
- options = $.extend({
3
- placeholder: 'Type to Search',
4
- searchInputAttributes: { 'aria-label': "Type to Search" },
5
- clearButton:'&#x2715;' // Text content of clear search button
6
- }, options)
7
-
8
- var inputAttrs = {}
9
- $.extend(inputAttrs, { placeholder: options.placeholder }, options.searchInputAttributes)
10
-
11
- var context = this
12
- var input = this.input = $('<input type="search" class="search_input">').attr(inputAttrs)
13
- var value = input.val()
14
- var clearButton = this.clearButton = $('<span class="clear_search_button"></span>').html(options.clearButton)
15
- var view = this.view = $('<span class="search_field_container"></span>').append(input).append(clearButton)
16
- var eventNames = isOnInputSupported() ? 'input change' : 'keyup change'
17
-
18
-
19
- // PUBLIC INTERFACE
20
-
21
- $.extend(this, {refresh: refresh})
22
-
23
-
24
- // BEHAVIOUR
25
-
26
- // When a change is detected
27
- input.on(eventNames, function() {
28
- refresh() // Always refresh on input in case something has altered the state without informing us
29
-
30
- if (input.val() == value) { return }
31
-
32
- triggerEvent('searchInput')
33
- value = input.val()
34
- })
35
-
36
- // When the clear button is pressed
37
- clearButton.on('click', function(){
38
- input.val('')
39
- refresh()
40
- input.focus()
41
- triggerEvent('searchInput')
42
- triggerEvent('clear')
43
- })
44
-
45
- // When the enter button is pressed
46
- input.on('keydown', function(event){
47
- if (event.which == 13){
48
- triggerEvent('querySubmit')
49
- }
50
- })
51
-
52
-
53
- // HELPER FUNCTIONS
54
-
55
- function refresh(){
56
- updateClearButtonVisiblity()
57
- updateSearchInputClass()
58
- }
59
-
60
- function updateSearchInputClass(){
61
- input.toggleClass('empty', !input.val())
62
- }
63
-
64
- function isOnInputSupported(){
65
- // IE 8 and 9 are the only common browsers that don't completely support oninput
66
- // IE 10 and 11 fire the input event when the element is focussed, treat them as unsupported as well
67
- return !(navigator.userAgent.indexOf('MSIE')!==-1 || navigator.appVersion.indexOf('Trident/') > 0) // SOURCE: http://stackoverflow.com/questions/21825157/internet-explorer-11-detection
68
- }
69
-
70
- function updateClearButtonVisiblity(){
71
- clearButton.toggle(!!input.val().length)
72
- }
73
-
74
- // Allow observer to be attached to the SearchField itself
75
- function triggerEvent(eventType, callbackArgs){
76
- input.trigger(eventType, callbackArgs)
77
- $(context).trigger(eventType, callbackArgs)
78
- }
79
-
80
-
81
- // INITIALIZATION
82
-
83
- refresh()
84
- }
@@ -1,8 +0,0 @@
1
- (function(){
2
- // Add a function that makes it easy to escape a string before it is used in a RegExp
3
- if (!String.prototype.escapeForRegExp){
4
- String.prototype.escapeForRegExp = function(){
5
- return this.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
- }
7
- }
8
- })()