uber_select_rails 0.6.1 → 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.
- checksums.yaml +4 -4
- data/lib/uber_select_rails/version.rb +1 -1
- data/vendor/assets/javascript/uber_select/README.md +28 -7
- data/vendor/assets/javascript/uber_select/javascript/jquery.uber-select.js +12 -6
- data/vendor/assets/javascript/uber_select/javascript/uber_search/list.js +160 -0
- data/vendor/assets/javascript/uber_select/javascript/uber_search/output_container.js +29 -0
- data/vendor/assets/javascript/uber_select/javascript/uber_search/pane.js +93 -0
- data/vendor/assets/javascript/uber_select/javascript/uber_search/search.js +77 -0
- data/vendor/assets/javascript/uber_select/javascript/uber_search/search_field.js +96 -0
- data/vendor/assets/javascript/uber_select/javascript/{search.js → uber_search/search_model.js} +11 -69
- data/vendor/assets/javascript/uber_select/javascript/uber_search.js +378 -309
- data/vendor/assets/javascript/uber_select/test.css +1 -0
- data/vendor/assets/javascript/uber_select/test.html +26 -8
- data/vendor/assets/javascript/uber_select.js +1 -1
- metadata +9 -13
- data/vendor/assets/javascript/uber_select/javascript/list.js +0 -122
- data/vendor/assets/javascript/uber_select/javascript/output_container.js +0 -25
- data/vendor/assets/javascript/uber_select/javascript/pane.js +0 -89
- data/vendor/assets/javascript/uber_select/javascript/search_field.js +0 -84
- data/vendor/assets/javascript/uber_select/javascript/string_extensions.js +0 -8
@@ -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
|
-
|
273
|
+
jQuery.noConflict()
|
274
|
+
jQuery('select').uberSelect({selectCaret: ''})
|
257
275
|
</script>
|
258
276
|
</body>
|
259
277
|
</html>
|
@@ -1 +1 @@
|
|
1
|
-
//=
|
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.
|
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:
|
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.
|
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 || ' ')
|
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,89 +0,0 @@
|
|
1
|
-
function Pane(){
|
2
|
-
var eventsTriggered = {
|
3
|
-
shown: 'shown.UberSelect',
|
4
|
-
hidden: 'hidden.UberSelect'
|
5
|
-
}
|
6
|
-
|
7
|
-
var context = this
|
8
|
-
var model = {}
|
9
|
-
var isOpen = false
|
10
|
-
var view = $('<div class="pane"></div>').toggle(isOpen)
|
11
|
-
var innerPane = $('<div class="pane_inner"></div>').appendTo(view)
|
12
|
-
|
13
|
-
|
14
|
-
// PUBLIC INTERFACE
|
15
|
-
|
16
|
-
$.extend(this, {
|
17
|
-
model: model,
|
18
|
-
view: view,
|
19
|
-
addContent: addContent,
|
20
|
-
removeContent: removeContent,
|
21
|
-
show: show,
|
22
|
-
hide: hide,
|
23
|
-
toggle: toggle,
|
24
|
-
isOpen: paneIsOpen,
|
25
|
-
isClosed: paneIsClosed
|
26
|
-
})
|
27
|
-
|
28
|
-
|
29
|
-
// BEHAVIOUR
|
30
|
-
|
31
|
-
// Make it possible to have elements in the pane that close it
|
32
|
-
view.on('click', '[data-behaviour~=close-pane]', function(event){
|
33
|
-
context.hide()
|
34
|
-
})
|
35
|
-
|
36
|
-
// Close the pane when the user presses escape
|
37
|
-
$(document).on('keyup', function(event){
|
38
|
-
if (event.which == 27 && isOpen){
|
39
|
-
context.hide()
|
40
|
-
return false
|
41
|
-
}
|
42
|
-
})
|
43
|
-
|
44
|
-
|
45
|
-
// HELPER FUNCTIONS
|
46
|
-
|
47
|
-
function paneIsOpen(){
|
48
|
-
return isOpen
|
49
|
-
}
|
50
|
-
|
51
|
-
function paneIsClosed(){
|
52
|
-
return !isOpen
|
53
|
-
}
|
54
|
-
|
55
|
-
function addContent(name, content){
|
56
|
-
model[name] = content
|
57
|
-
innerPane.append(content)
|
58
|
-
}
|
59
|
-
|
60
|
-
function removeContent(name){
|
61
|
-
$(model[name]).remove()
|
62
|
-
delete model['name']
|
63
|
-
}
|
64
|
-
|
65
|
-
function show(){
|
66
|
-
if (isOpen) { return }
|
67
|
-
isOpen = true
|
68
|
-
view.show()
|
69
|
-
triggerEvent(eventsTriggered.shown)
|
70
|
-
}
|
71
|
-
function hide(){
|
72
|
-
if (!isOpen) { return }
|
73
|
-
isOpen = false
|
74
|
-
view.hide()
|
75
|
-
triggerEvent(eventsTriggered.hidden)
|
76
|
-
}
|
77
|
-
function toggle(){
|
78
|
-
if (isOpen) {
|
79
|
-
context.hide()
|
80
|
-
} else {
|
81
|
-
context.show()
|
82
|
-
}
|
83
|
-
}
|
84
|
-
|
85
|
-
function triggerEvent(eventType, callbackArgs){
|
86
|
-
view.trigger(eventType, callbackArgs)
|
87
|
-
$(context).trigger(eventType, callbackArgs)
|
88
|
-
}
|
89
|
-
}
|
@@ -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:'✕' // 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
|
-
}
|