uber_select_rails 0.1.8 → 0.4.1
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 +18 -0
- data/vendor/assets/javascript/uber_select/javascript/jquery.uber-select.js +10 -1
- data/vendor/assets/javascript/uber_select/javascript/list.js +11 -10
- data/vendor/assets/javascript/uber_select/javascript/output_container.js +5 -1
- data/vendor/assets/javascript/uber_select/javascript/pane.js +4 -0
- data/vendor/assets/javascript/uber_select/javascript/uber_search.js +19 -5
- data/vendor/assets/javascript/uber_select/test.css +8 -0
- data/vendor/assets/javascript/uber_select/test.html +64 -0
- metadata +7 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c03ef32585a000f449ad3851d5a90da08a0ec646c3bae0fddb335c67522062d
|
4
|
+
data.tar.gz: 36c973de206ac86363ceed385a516b2f0cc3ba396e3723501d23e984b666910c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7701b85c337519d3694ddde32fe59bf779ca762bbd874b6cb34363d9ab8194bae46e922c866928eced917179eadfc524485337609e6be19d2d9e40e1af7ff464
|
7
|
+
data.tar.gz: 6edaa218f7e0e43bcf72959fd24bd0577c890704e156b61e6618cca6ed4b4121b5b272490d1ce147e4a12bd540c80b77efce8d6f1e8546950bb965cdd1c5d7f5
|
@@ -21,6 +21,10 @@ you can use UberSelect to gussy up forms, without changing any of the underlying
|
|
21
21
|
$('.my_selects').uberSelect(options);
|
22
22
|
```
|
23
23
|
|
24
|
+
#### Attributes <a name="UberSearch attributes"></a>
|
25
|
+
Attribtes on the outermost element can be specified by setting the `data-uber-attributes` attribute on the `<select>` element. Values should be passed
|
26
|
+
as a JSON string of key/value pairs where the key is the attribute name and the value is the attribute value.
|
27
|
+
|
24
28
|
#### Options
|
25
29
|
Options can be specified by setting the `data-uber-options` attribute on the `<select>` element. Values should be passed
|
26
30
|
as a JSON string. All options on the are passed to the underlying UberSearch, see [UberSearch options](#UberSearchOptions).
|
@@ -94,6 +98,12 @@ Data is an array of objects. Each object may have the following properties:
|
|
94
98
|
- ##### text
|
95
99
|
String shown to the user in the list of results. This value is required if *value* is not provided.
|
96
100
|
|
101
|
+
- ##### selectedText
|
102
|
+
String shown to the user in the output container when this option is selected. *optional*
|
103
|
+
|
104
|
+
- ##### title
|
105
|
+
Title text shown to the user when hovering over the result. *optional*
|
106
|
+
|
97
107
|
- ##### value
|
98
108
|
This is matched against the *value* option passed UberSearch and will appear selected if it matches. It is also used to match against search input text when the user searches. This value is required if *text* is not provided.
|
99
109
|
|
@@ -103,9 +113,17 @@ Data is an array of objects. Each object may have the following properties:
|
|
103
113
|
- ##### visibility
|
104
114
|
This is used to determine whether the option appears only when searching or only when not searching. Values accepted: `query`, `no-query`. *optional*
|
105
115
|
|
116
|
+
- ##### disabled
|
117
|
+
This is used to determine whether the option appears disabled. *optional*
|
118
|
+
|
106
119
|
- ##### group
|
107
120
|
This is used to visually group options. All options with the same group will appear together. *optional*
|
108
121
|
|
122
|
+
#### Methods
|
123
|
+
|
124
|
+
- ##### setData(data)
|
125
|
+
Sets the data. `data` should be an Array conforming to the specifications described in <a href="#data">Data</a>
|
126
|
+
|
109
127
|
|
110
128
|
#### Options <a name="UberSearch options"></a>
|
111
129
|
Options can be specified by setting the `data-uber-options` attribute on the `<select>` element. Values should be passed
|
@@ -14,12 +14,13 @@
|
|
14
14
|
var options = $.extend({
|
15
15
|
prepopulateSearchOnOpen: false, // Should the search input start with the selected value in it when the pane is opened?
|
16
16
|
clearSearchClearsSelect: false, // Should the select value be cleared When the search is cleared?
|
17
|
+
disabled: $(select).is(':disabled'), // Whether the select is currently disabled
|
17
18
|
placeholder: $(select).attr('placeholder') || $(select).attr('data-placeholder'), // Placeholder to show in the selected text area
|
18
19
|
dataUrl: null, // A url to pre-fetch select options from, see optionsFromData for data format
|
19
20
|
optionFromDatum: optionFromDatum, // A function to create select options
|
20
21
|
value: $(select).val() // Initialize the UberSearch with this selected value
|
21
22
|
}, opts, $(select).data('uber-options'))
|
22
|
-
|
23
|
+
var uberAttributes = $(select).data('uber-attributes'); // Attributes defined as data-uber-attributes on the original select element. These will be added as attributes on the uberSelect element.
|
23
24
|
var uberSearch = this.uberSearch = new UberSearch(dataFromSelect(select), options)
|
24
25
|
|
25
26
|
|
@@ -52,6 +53,10 @@
|
|
52
53
|
|
53
54
|
// INITIALIZATION
|
54
55
|
|
56
|
+
if (uberAttributes) {
|
57
|
+
uberSearch.view.attr(uberAttributes)
|
58
|
+
}
|
59
|
+
|
55
60
|
uberSearch.view.insertBefore(select).append(select)
|
56
61
|
hideSelect()
|
57
62
|
if (options.dataUrl) {
|
@@ -78,7 +83,10 @@
|
|
78
83
|
// This is optimized for performance and does not use jQuery convenience methods. Seems to be about 30% faster loading during non-scientific tests.
|
79
84
|
datum = {
|
80
85
|
text: option.textContent,
|
86
|
+
selectedText: getAttribute(option, 'data-selected-text'),
|
81
87
|
value: getAttribute(option, 'value'),
|
88
|
+
title: getAttribute(option, 'title'),
|
89
|
+
disabled: getAttribute(option, 'disabled'),
|
82
90
|
matchValue: getAttribute(option, 'data-match-value'),
|
83
91
|
visibility: getAttribute(option, 'data-visibility'),
|
84
92
|
element: option
|
@@ -130,6 +138,7 @@
|
|
130
138
|
}
|
131
139
|
|
132
140
|
function refreshOptionsList(){
|
141
|
+
uberSearch.setDisabled($(select).is(':disabled'))
|
133
142
|
uberSearch.setData(dataFromSelect(select))
|
134
143
|
updateSelectedValue()
|
135
144
|
}
|
@@ -26,7 +26,7 @@ function List(options) {
|
|
26
26
|
})
|
27
27
|
|
28
28
|
// When a list item is hovered
|
29
|
-
$(view).on('mouseenter', '.result', function(){
|
29
|
+
$(view).on('mouseenter', '.result:not(.disabled)', function(){
|
30
30
|
unhighlightResults()
|
31
31
|
highlightResult(this, {scroll: false})
|
32
32
|
})
|
@@ -57,8 +57,8 @@ function List(options) {
|
|
57
57
|
this.highlightResult = highlightResult
|
58
58
|
|
59
59
|
function stepHighlight(amount, allowUnhighlight){
|
60
|
-
var index =
|
61
|
-
var result =
|
60
|
+
var index = selectableResults().index(highlightedResult())
|
61
|
+
var result = selectableResults()[index + amount]
|
62
62
|
|
63
63
|
if (result || allowUnhighlight){
|
64
64
|
unhighlightResults()
|
@@ -66,19 +66,16 @@ function List(options) {
|
|
66
66
|
}
|
67
67
|
}
|
68
68
|
|
69
|
-
function highlightResult(result, options){
|
69
|
+
function highlightResult(result, options) {
|
70
70
|
result = $(result)
|
71
71
|
options = $.extend({scroll: true}, options)
|
72
72
|
|
73
73
|
if (!result.length) { return }
|
74
74
|
|
75
|
-
|
76
|
-
if (visibleResult.length) {
|
77
|
-
visibleResult.addClass('highlighted')
|
75
|
+
result.addClass('highlighted')
|
78
76
|
|
79
|
-
|
80
|
-
|
81
|
-
}
|
77
|
+
if (options.scroll){
|
78
|
+
scrollResultIntoView(result)
|
82
79
|
}
|
83
80
|
}
|
84
81
|
|
@@ -90,6 +87,10 @@ function List(options) {
|
|
90
87
|
return results().filter('.highlighted')
|
91
88
|
}
|
92
89
|
|
90
|
+
function selectableResults(){
|
91
|
+
return visibleResults().not('.disabled')
|
92
|
+
}
|
93
|
+
|
93
94
|
function visibleResults(){
|
94
95
|
return results().not('.hidden')
|
95
96
|
}
|
@@ -15,7 +15,11 @@ var OutputContainer = function(options){
|
|
15
15
|
view.toggleClass('empty', !value)
|
16
16
|
}
|
17
17
|
|
18
|
+
function setDisabled(boolean) {
|
19
|
+
view.toggleClass('disabled', boolean)
|
20
|
+
}
|
21
|
+
|
18
22
|
// PUBLIC INTERFACE
|
19
23
|
|
20
|
-
$.extend(this, {view: view, setValue: setValue})
|
24
|
+
$.extend(this, {view: view, setValue: setValue, setDisabled: setDisabled})
|
21
25
|
}
|
@@ -20,11 +20,15 @@ function Pane(options){
|
|
20
20
|
if (options.trigger){
|
21
21
|
// Show the pane when the select element is clicked
|
22
22
|
$(options.trigger).on('click', function(event){
|
23
|
+
if ($(options.trigger).hasClass('disabled')) { return }
|
24
|
+
|
23
25
|
context.show()
|
24
26
|
})
|
25
27
|
|
26
28
|
// Show the pane if the user was tabbed onto the trigger and pressed enter or space
|
27
29
|
$(options.trigger).on('keyup', function(event){
|
30
|
+
if ($(options.trigger).hasClass('disabled')) { return }
|
31
|
+
|
28
32
|
if (event.which == 13 || event.which == 32){
|
29
33
|
context.show()
|
30
34
|
return false
|
@@ -8,7 +8,8 @@ var UberSearch = function(data, options){
|
|
8
8
|
|
9
9
|
options = $.extend({
|
10
10
|
value: null, // Initialize with this selectedValue
|
11
|
-
|
11
|
+
disabled: false, // Initialize with this disabled value
|
12
|
+
search: true, // Show the search input
|
12
13
|
clearSearchButton:'✕', // Text content of clear search button
|
13
14
|
selectCaret: '⌄', // Text content of select caret
|
14
15
|
hideBlankOption: false, // Should blank options be hidden automatically?
|
@@ -87,7 +88,7 @@ var UberSearch = function(data, options){
|
|
87
88
|
})
|
88
89
|
|
89
90
|
// When a search result is chosen
|
90
|
-
resultsContainer.on('click', '.result', function(event){
|
91
|
+
resultsContainer.on('click', '.result:not(.disabled)', function(event){
|
91
92
|
var datum = $(this).data()
|
92
93
|
|
93
94
|
if (options.onSelect(datum, this, event) === false) {
|
@@ -113,6 +114,7 @@ var UberSearch = function(data, options){
|
|
113
114
|
|
114
115
|
// INITIALIZATION
|
115
116
|
|
117
|
+
setDisabled(options.disabled)
|
116
118
|
setData(data)
|
117
119
|
|
118
120
|
if (options.search){
|
@@ -150,6 +152,11 @@ var UberSearch = function(data, options){
|
|
150
152
|
markSelected()
|
151
153
|
}
|
152
154
|
|
155
|
+
// Enables or disables UberSearch
|
156
|
+
function setDisabled(boolean){
|
157
|
+
outputContainer.setDisabled(boolean)
|
158
|
+
}
|
159
|
+
|
153
160
|
// Updates the enhanced select with the text of the selected result
|
154
161
|
function setSelectedText(text){
|
155
162
|
if (text) {
|
@@ -236,6 +243,9 @@ var UberSearch = function(data, options){
|
|
236
243
|
.html((options.treatBlankOptionAsPlaceholder ? datum.text || options.placeholder : datum.text) || " ")
|
237
244
|
.data(datum) // Store the datum so we can get know what the value of the selected item is
|
238
245
|
|
246
|
+
if (datum.title) { result.attr('title', datum.title) }
|
247
|
+
if (datum.disabled) { result.addClass('disabled') }
|
248
|
+
|
239
249
|
options.resultPostprocessor(result, datum)
|
240
250
|
|
241
251
|
return result
|
@@ -253,7 +263,7 @@ var UberSearch = function(data, options){
|
|
253
263
|
if (selected) {
|
254
264
|
search.highlightResult(selected)
|
255
265
|
} else if (options.highlightByDefault) {
|
256
|
-
search.highlightResult(results.not('.hidden').first())
|
266
|
+
search.highlightResult(results.not('.hidden').not('.disabled').first())
|
257
267
|
}
|
258
268
|
}
|
259
269
|
|
@@ -279,7 +289,11 @@ var UberSearch = function(data, options){
|
|
279
289
|
}
|
280
290
|
|
281
291
|
function textFromValue(value){
|
282
|
-
return $.map(data, function(datum){
|
292
|
+
return $.map(data, function(datum) {
|
293
|
+
if (datum.value == value) {
|
294
|
+
return datum.selectedText || datum.text
|
295
|
+
}
|
296
|
+
})[0]
|
283
297
|
}
|
284
298
|
|
285
299
|
function updateMessages(){
|
@@ -311,5 +325,5 @@ var UberSearch = function(data, options){
|
|
311
325
|
|
312
326
|
// PUBLIC INTERFACE
|
313
327
|
|
314
|
-
$.extend(this, {view:view, searchField:searchField, setValue:setValue, setData:setData, options:options})
|
328
|
+
$.extend(this, {view:view, searchField:searchField, setValue:setValue, setData:setData, setDisabled:setDisabled, options:options})
|
315
329
|
}
|
@@ -39,6 +39,10 @@ label {
|
|
39
39
|
text-overflow: ellipsis;
|
40
40
|
position: relative; /* Contain caret */
|
41
41
|
}
|
42
|
+
.uber_select .selected_text_container.disabled{
|
43
|
+
cursor: default;
|
44
|
+
opacity: 0.5;
|
45
|
+
}
|
42
46
|
.uber_select .selected_text.empty{
|
43
47
|
color: #aaa;
|
44
48
|
}
|
@@ -103,6 +107,10 @@ label {
|
|
103
107
|
overflow: hidden;
|
104
108
|
text-overflow: ellipsis;
|
105
109
|
}
|
110
|
+
.uber_select .result.disabled{
|
111
|
+
cursor: default;
|
112
|
+
opacity: 0.5;
|
113
|
+
}
|
106
114
|
.uber_select .result.selected{
|
107
115
|
font-weight: bold;
|
108
116
|
}
|
@@ -167,6 +167,70 @@
|
|
167
167
|
</p>
|
168
168
|
</span>
|
169
169
|
|
170
|
+
<span class="example">
|
171
|
+
<label for="select">
|
172
|
+
Disabled Options
|
173
|
+
</label>
|
174
|
+
<select>
|
175
|
+
<option></option>
|
176
|
+
<option>Jimmy Johnson</option>
|
177
|
+
<option>Amanda Hugginkiss</option>
|
178
|
+
<option disabled="disabled">Cosmo Kramer</option>
|
179
|
+
<option>Bob Zickowski</option>
|
180
|
+
<option>Nicholas Cage</option>
|
181
|
+
<option>Queen Latifah</option>
|
182
|
+
</select>
|
183
|
+
<p>This example has a disabled option that should not highlight or be selectable.</p>
|
184
|
+
</span>
|
185
|
+
|
186
|
+
<span class="example">
|
187
|
+
<label for="select">
|
188
|
+
Disabled Select
|
189
|
+
</label>
|
190
|
+
<select disabled="disabled">
|
191
|
+
<option></option>
|
192
|
+
<option>Jimmy Johnson</option>
|
193
|
+
<option>Amanda Hugginkiss</option>
|
194
|
+
<option>Cosmo Kramer</option>
|
195
|
+
<option>Bob Zickowski</option>
|
196
|
+
<option>Nicholas Cage</option>
|
197
|
+
<option>Queen Latifah</option>
|
198
|
+
</select>
|
199
|
+
<p>This example has a disabled select that should disable the entire UI.</p>
|
200
|
+
</span>
|
201
|
+
|
202
|
+
<span class="example">
|
203
|
+
<label for="select">
|
204
|
+
Selected Text
|
205
|
+
</label>
|
206
|
+
<select>
|
207
|
+
<option></option>
|
208
|
+
<option>Jimmy Johnson</option>
|
209
|
+
<option data-selected-text="Good Choice!">Custom Selected Text</option>
|
210
|
+
<option>Cosmo Kramer</option>
|
211
|
+
<option>Bob Zickowski</option>
|
212
|
+
<option>Nicholas Cage</option>
|
213
|
+
<option>Queen Latifah</option>
|
214
|
+
</select>
|
215
|
+
<p>This example has an option with <code>data-selected-text</code> that should show custom text in the output container when selected.</p>
|
216
|
+
</span>
|
217
|
+
|
218
|
+
<span class="example">
|
219
|
+
<label for="select">
|
220
|
+
Title Attribute
|
221
|
+
</label>
|
222
|
+
<select>
|
223
|
+
<option></option>
|
224
|
+
<option>Jimmy Johnson</option>
|
225
|
+
<option title="Cooltip!">Option with Title</option>
|
226
|
+
<option>Cosmo Kramer</option>
|
227
|
+
<option>Bob Zickowski</option>
|
228
|
+
<option>Nicholas Cage</option>
|
229
|
+
<option>Queen Latifah</option>
|
230
|
+
</select>
|
231
|
+
<p>This example has an option with a <code>title</code> attribute that should show as a tooltip.</p>
|
232
|
+
</span>
|
233
|
+
|
170
234
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
|
171
235
|
<script src="javascript/string_extensions.js"></script>
|
172
236
|
<script src="javascript/search_field.js"></script>
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uber_select_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicholas Jakobsen
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-09-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,7 +52,7 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '10.0'
|
55
|
-
description:
|
55
|
+
description:
|
56
56
|
email:
|
57
57
|
- nicholas.jakobsen@gmail.com
|
58
58
|
executables: []
|
@@ -84,7 +84,7 @@ files:
|
|
84
84
|
homepage: https://github.com/culturecode/uber_select_rails
|
85
85
|
licenses: []
|
86
86
|
metadata: {}
|
87
|
-
post_install_message:
|
87
|
+
post_install_message:
|
88
88
|
rdoc_options: []
|
89
89
|
require_paths:
|
90
90
|
- lib
|
@@ -99,9 +99,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
99
|
- !ruby/object:Gem::Version
|
100
100
|
version: '0'
|
101
101
|
requirements: []
|
102
|
-
|
103
|
-
|
104
|
-
signing_key:
|
102
|
+
rubygems_version: 3.0.8
|
103
|
+
signing_key:
|
105
104
|
specification_version: 4
|
106
105
|
summary: A Rails gem containing a javascript plugin that adds a layer of UI goodness
|
107
106
|
overtop of basic HTML select elements
|