pickadate-rails 3.5.5.0 → 3.5.6.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 +5 -5
- data/README.md +1 -1
- data/Rakefile +2 -2
- data/lib/pickadate-rails/version.rb +1 -1
- data/pickadate-rails.gemspec +1 -1
- data/vendor/assets/javascripts/pickadate/picker.date.js +18 -13
- data/vendor/assets/javascripts/pickadate/picker.js +165 -80
- data/vendor/assets/javascripts/pickadate/picker.time.js +20 -21
- data/vendor/assets/javascripts/pickadate/translations/ar.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/bg_BG.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/bs_BA.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/ca_ES.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/cs_CZ.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/da_DK.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/de_DE.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/el_GR.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/es_ES.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/et_EE.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/eu_ES.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/fa_ir.js +19 -0
- data/vendor/assets/javascripts/pickadate/translations/fi_FI.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/fr_FR.js +9 -4
- data/vendor/assets/javascripts/pickadate/translations/gl_ES.js +4 -0
- data/vendor/assets/javascripts/pickadate/translations/he_IL.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/hi_IN.js +20 -0
- data/vendor/assets/javascripts/pickadate/translations/hr_HR.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/hu_HU.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/id_ID.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/is_IS.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/it_IT.js +16 -5
- data/vendor/assets/javascripts/pickadate/translations/ja_JP.js +6 -2
- data/vendor/assets/javascripts/pickadate/translations/ko_KR.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/lt_LT.js +24 -0
- data/vendor/assets/javascripts/pickadate/translations/lv_LV.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/nb_NO.js +18 -0
- data/vendor/assets/javascripts/pickadate/translations/ne_NP.js +4 -0
- data/vendor/assets/javascripts/pickadate/translations/nl_NL.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/pl_PL.js +9 -4
- data/vendor/assets/javascripts/pickadate/translations/pt_BR.js +7 -2
- data/vendor/assets/javascripts/pickadate/translations/pt_PT.js +10 -5
- data/vendor/assets/javascripts/pickadate/translations/ro_RO.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/ru_RU.js +7 -2
- data/vendor/assets/javascripts/pickadate/translations/sk_SK.js +8 -3
- data/vendor/assets/javascripts/pickadate/translations/sl_SI.js +6 -1
- data/vendor/assets/javascripts/pickadate/translations/sv_SE.js +14 -5
- data/vendor/assets/javascripts/pickadate/translations/th_TH.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/tr_TR.js +7 -2
- data/vendor/assets/javascripts/pickadate/translations/uk_UA.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/vi_VN.js +5 -1
- data/vendor/assets/javascripts/pickadate/translations/zh_CN.js +7 -2
- data/vendor/assets/javascripts/pickadate/translations/zh_TW.js +6 -1
- data/vendor/assets/stylesheets/pickadate/classic.css +7 -17
- data/vendor/assets/stylesheets/pickadate/classic.time.css +1 -0
- data/vendor/assets/stylesheets/pickadate/default.css +15 -22
- data/vendor/assets/stylesheets/pickadate/default.time.css +1 -0
- metadata +15 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: db5a522c29e1b7a50b0059b31974659d3f10b4b152dfcde3b926733c91277815
|
4
|
+
data.tar.gz: 9db86717846ee88ebd602066724391cbea985c0b806ff2497311663ac7a978de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49612283eca2f9a6d177ec2a1d8a77d969e678872ac54ee7f0e50b873db35ceaf3dd5ff0e5c20f29ccbd08d4645995e5fded57de52a8db1ea8ada83f16a8ae2e
|
7
|
+
data.tar.gz: e6cdf27de7c1797533eae95a6e92e9c2852da5dec794504501d2fdc2fa6dbfeba2c4a4f60da231e1ba60b2e74c7c668f82fb3eaea85664ca1bab04e48e145bc9
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Pickadate-Rails [](http://badge.fury.io/rb/pickadate-rails)
|
2
2
|
|
3
|
-
## Pickadate Version: 3.5.
|
3
|
+
## Pickadate Version: 3.5.6
|
4
4
|
|
5
5
|
Easily add [pickadate.js](https://github.com/amsul/pickadate.js) to your Rails 3.1+ application using the asset pipeline.
|
6
6
|
|
data/Rakefile
CHANGED
@@ -5,8 +5,8 @@ namespace :pickadate do
|
|
5
5
|
task :download do
|
6
6
|
require 'fileutils'
|
7
7
|
|
8
|
-
system "curl https://github.com/amsul/pickadate.js/archive/
|
9
|
-
system "unzip tmp/pickadate.zip -d tmp/"
|
8
|
+
system "curl https://github.com/amsul/pickadate.js/archive/master.zip -f -L --create-dirs -o tmp/pickadate.zip"
|
9
|
+
system "unzip -o tmp/pickadate.zip -d tmp/"
|
10
10
|
system "rm tmp/pickadate.zip"
|
11
11
|
|
12
12
|
Dir["tmp/pickadate*/lib/picker*.js"].each do |file|
|
data/pickadate-rails.gemspec
CHANGED
@@ -1,6 +1,5 @@
|
|
1
|
-
|
2
1
|
/*!
|
3
|
-
* Date picker for pickadate.js v3.5.
|
2
|
+
* Date picker for pickadate.js v3.5.6
|
4
3
|
* http://amsul.github.io/pickadate.js/date.htm
|
5
4
|
*/
|
6
5
|
|
@@ -8,7 +7,7 @@
|
|
8
7
|
|
9
8
|
// AMD.
|
10
9
|
if ( typeof define == 'function' && define.amd )
|
11
|
-
define( ['picker','jquery'], factory )
|
10
|
+
define( ['picker', 'jquery'], factory )
|
12
11
|
|
13
12
|
// Node.js/browserify.
|
14
13
|
else if ( typeof exports == 'object' )
|
@@ -83,7 +82,10 @@ function DatePicker( picker, settings ) {
|
|
83
82
|
// When there’s a value, set the `select`, which in turn
|
84
83
|
// also sets the `highlight` and `view`.
|
85
84
|
if ( valueString ) {
|
86
|
-
calendar.set( 'select', valueString, {
|
85
|
+
calendar.set( 'select', valueString, {
|
86
|
+
format: formatString,
|
87
|
+
defaultValue: true
|
88
|
+
})
|
87
89
|
}
|
88
90
|
|
89
91
|
// If there’s no value, default to highlighting “today”.
|
@@ -105,7 +107,7 @@ function DatePicker( picker, settings ) {
|
|
105
107
|
targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange )
|
106
108
|
calendar.set(
|
107
109
|
'highlight',
|
108
|
-
|
110
|
+
targetDate,
|
109
111
|
{ interval: timeChange }
|
110
112
|
)
|
111
113
|
this.render()
|
@@ -476,7 +478,7 @@ DatePicker.prototype.validate = function( type, dateObject, options ) {
|
|
476
478
|
// • Not inverted and date enabled.
|
477
479
|
// • Inverted and all dates disabled.
|
478
480
|
// • ..and anything else.
|
479
|
-
if ( !options || !options.nav ) if (
|
481
|
+
if ( !options || (!options.nav && !options.defaultValue) ) if (
|
480
482
|
/* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||
|
481
483
|
/* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||
|
482
484
|
/* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )
|
@@ -645,7 +647,8 @@ DatePicker.prototype.formats = (function() {
|
|
645
647
|
function getWordLengthFromCollection( string, collection, dateObject ) {
|
646
648
|
|
647
649
|
// Grab the first word from the string.
|
648
|
-
|
650
|
+
// Regex pattern from http://stackoverflow.com/q/150033
|
651
|
+
var word = string.match( /[^\x00-\x7F]+|\w+/ )[ 0 ]
|
649
652
|
|
650
653
|
// If there's no month index, add it to the date object
|
651
654
|
if ( !dateObject.mm && !dateObject.m ) {
|
@@ -1185,7 +1188,8 @@ DatePicker.prototype.nodes = function( isOpen ) {
|
|
1185
1188
|
|
1186
1189
|
var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
|
1187
1190
|
isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
|
1188
|
-
isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick
|
1191
|
+
isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
|
1192
|
+
formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] )
|
1189
1193
|
|
1190
1194
|
return [
|
1191
1195
|
_.node(
|
@@ -1220,11 +1224,8 @@ DatePicker.prototype.nodes = function( isOpen ) {
|
|
1220
1224
|
})([ settings.klass.day ]),
|
1221
1225
|
'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
|
1222
1226
|
role: 'gridcell',
|
1223
|
-
|
1224
|
-
|
1225
|
-
calendar,
|
1226
|
-
[ settings.format, targetDate ]
|
1227
|
-
) ? true : null,
|
1227
|
+
label: formattedDate,
|
1228
|
+
selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
|
1228
1229
|
activedescendant: isHighlighted ? true : null,
|
1229
1230
|
disabled: isDisabled ? true : null
|
1230
1231
|
})
|
@@ -1294,6 +1295,10 @@ DatePicker.defaults = (function( prefix ) {
|
|
1294
1295
|
clear: 'Clear',
|
1295
1296
|
close: 'Close',
|
1296
1297
|
|
1298
|
+
// Picker close behavior
|
1299
|
+
closeOnSelect: true,
|
1300
|
+
closeOnClear: true,
|
1301
|
+
|
1297
1302
|
// The format to show on the `input` element
|
1298
1303
|
format: 'd mmmm, yyyy',
|
1299
1304
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* pickadate.js v3.5.
|
2
|
+
* pickadate.js v3.5.6, 2015/04/20
|
3
3
|
* By Amsul, http://amsul.ca
|
4
4
|
* Hosted on http://amsul.github.io/pickadate.js
|
5
5
|
* Licensed under MIT
|
@@ -23,6 +23,7 @@
|
|
23
23
|
var $window = $( window )
|
24
24
|
var $document = $( document )
|
25
25
|
var $html = $( document.documentElement )
|
26
|
+
var supportsTransitions = document.documentElement.style.transition != null
|
26
27
|
|
27
28
|
|
28
29
|
/**
|
@@ -88,7 +89,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
88
89
|
|
89
90
|
// Confirm focus state, convert into text input to remove UA stylings,
|
90
91
|
// and set as readonly to prevent keyboard popup.
|
91
|
-
ELEMENT.autofocus = ELEMENT ==
|
92
|
+
ELEMENT.autofocus = ELEMENT == getActiveElement()
|
92
93
|
ELEMENT.readOnly = !SETTINGS.editable
|
93
94
|
ELEMENT.id = ELEMENT.id || STATE.id
|
94
95
|
if ( ELEMENT.type != 'text' ) {
|
@@ -100,11 +101,16 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
100
101
|
P.component = new COMPONENT(P, SETTINGS)
|
101
102
|
|
102
103
|
|
103
|
-
// Create the picker root
|
104
|
-
P.$root = $(
|
104
|
+
// Create the picker root and then prepare it.
|
105
|
+
P.$root = $( '<div class="' + CLASSES.picker + '" id="' + ELEMENT.id + '_root" />' )
|
105
106
|
prepareElementRoot()
|
106
107
|
|
107
108
|
|
109
|
+
// Create the picker holder and then prepare it.
|
110
|
+
P.$holder = $( createWrappedComponent() ).appendTo( P.$root )
|
111
|
+
prepareElementHolder()
|
112
|
+
|
113
|
+
|
108
114
|
// If there’s a format for the hidden input element, create the element.
|
109
115
|
if ( SETTINGS.formatSubmit ) {
|
110
116
|
prepareElementHidden()
|
@@ -115,6 +121,11 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
115
121
|
prepareElement()
|
116
122
|
|
117
123
|
|
124
|
+
// Insert the hidden input as specified in the settings.
|
125
|
+
if ( SETTINGS.containerHidden ) $( SETTINGS.containerHidden ).append( P._hidden )
|
126
|
+
else $ELEMENT.after( P._hidden )
|
127
|
+
|
128
|
+
|
118
129
|
// Insert the root as specified in the settings.
|
119
130
|
if ( SETTINGS.container ) $( SETTINGS.container ).append( P.$root )
|
120
131
|
else $ELEMENT.after( P.$root )
|
@@ -139,7 +150,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
139
150
|
|
140
151
|
|
141
152
|
// Once we’re all set, check the theme in use.
|
142
|
-
IS_DEFAULT_THEME = isUsingDefaultTheme( P.$
|
153
|
+
IS_DEFAULT_THEME = isUsingDefaultTheme( P.$holder[0] )
|
143
154
|
|
144
155
|
|
145
156
|
// If the element has autofocus, open the picker.
|
@@ -159,7 +170,11 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
159
170
|
render: function( entireComponent ) {
|
160
171
|
|
161
172
|
// Insert a new component holder in the root or box.
|
162
|
-
if ( entireComponent )
|
173
|
+
if ( entireComponent ) {
|
174
|
+
P.$holder = $( createWrappedComponent() )
|
175
|
+
prepareElementHolder()
|
176
|
+
P.$root.html( P.$holder )
|
177
|
+
}
|
163
178
|
else P.$root.find( '.' + CLASSES.box ).html( P.component.nodes( STATE.open ) )
|
164
179
|
|
165
180
|
// Trigger the queued “render” events.
|
@@ -244,8 +259,8 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
244
259
|
css( 'padding-right', '+=' + getScrollbarWidth() )
|
245
260
|
}
|
246
261
|
|
247
|
-
// Pass focus to the element’s jQuery object.
|
248
|
-
|
262
|
+
// Pass focus to the root element’s jQuery object.
|
263
|
+
focusPickerOnceOpened()
|
249
264
|
|
250
265
|
// Bind the document events.
|
251
266
|
$document.on( 'click.' + STATE.id + ' focusin.' + STATE.id, function( event ) {
|
@@ -263,7 +278,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
263
278
|
|
264
279
|
// If the target was the holder that covers the screen,
|
265
280
|
// keep the element focused to maintain tabindex.
|
266
|
-
P.close( target === P.$
|
281
|
+
P.close( target === P.$holder[0] )
|
267
282
|
}
|
268
283
|
|
269
284
|
}).on( 'keydown.' + STATE.id, function( event ) {
|
@@ -286,7 +301,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
286
301
|
|
287
302
|
|
288
303
|
// Check if there is a key movement or “enter” keypress on the element.
|
289
|
-
else if ( target ==
|
304
|
+
else if ( target == P.$holder[0] && ( keycodeToMove || keycode == 13 ) ) {
|
290
305
|
|
291
306
|
// Prevent the default action to stop page movement.
|
292
307
|
event.preventDefault()
|
@@ -298,7 +313,10 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
298
313
|
|
299
314
|
// On “enter”, if the highlighted item isn’t disabled, set the value and close.
|
300
315
|
else if ( !P.$root.find( '.' + CLASSES.highlighted ).hasClass( CLASSES.disabled ) ) {
|
301
|
-
P.set( 'select', P.component.item.highlight )
|
316
|
+
P.set( 'select', P.component.item.highlight )
|
317
|
+
if ( SETTINGS.closeOnSelect ) {
|
318
|
+
P.close( true )
|
319
|
+
}
|
302
320
|
}
|
303
321
|
}
|
304
322
|
|
@@ -324,13 +342,18 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
324
342
|
|
325
343
|
// If we need to give focus, do it before changing states.
|
326
344
|
if ( giveFocus ) {
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
345
|
+
if ( SETTINGS.editable ) {
|
346
|
+
ELEMENT.focus()
|
347
|
+
}
|
348
|
+
else {
|
349
|
+
// ....ah yes! It would’ve been incomplete without a crazy workaround for IE :|
|
350
|
+
// The focus is triggered *after* the close has completed - causing it
|
351
|
+
// to open again. So unbind and rebind the event at the next tick.
|
352
|
+
P.$holder.off( 'focus.toOpen' ).focus()
|
353
|
+
setTimeout( function() {
|
354
|
+
P.$holder.on( 'focus.toOpen', handleFocusToOpenEvent )
|
355
|
+
}, 0 )
|
356
|
+
}
|
334
357
|
}
|
335
358
|
|
336
359
|
// Remove the “active” class.
|
@@ -438,6 +461,14 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
438
461
|
return STATE[ thing ]
|
439
462
|
}
|
440
463
|
|
464
|
+
// Return the submission value, if that.
|
465
|
+
if ( thing == 'valueSubmit' ) {
|
466
|
+
if ( P._hidden ) {
|
467
|
+
return P._hidden.value
|
468
|
+
}
|
469
|
+
thing = 'value'
|
470
|
+
}
|
471
|
+
|
441
472
|
// Return the value, if that.
|
442
473
|
if ( thing == 'value' ) {
|
443
474
|
return ELEMENT.value
|
@@ -568,7 +599,9 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
568
599
|
),
|
569
600
|
|
570
601
|
// Picker holder class
|
571
|
-
CLASSES.holder
|
602
|
+
CLASSES.holder,
|
603
|
+
|
604
|
+
'tabindex="-1"'
|
572
605
|
) //endreturn
|
573
606
|
} //createWrappedComponent
|
574
607
|
|
@@ -591,42 +624,22 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
591
624
|
val( $ELEMENT.data('value') ?
|
592
625
|
P.get('select', SETTINGS.format) :
|
593
626
|
ELEMENT.value
|
594
|
-
)
|
595
|
-
|
596
|
-
// On focus/click, open the picker and adjust the root “focused” state.
|
597
|
-
on('focus.' + STATE.id + ' click.' + STATE.id, focusToOpen)
|
627
|
+
)
|
598
628
|
|
599
629
|
|
600
630
|
// Only bind keydown events if the element isn’t editable.
|
601
631
|
if ( !SETTINGS.editable ) {
|
602
632
|
|
603
|
-
|
604
|
-
$ELEMENT.on('keydown.' + STATE.id, function(event) {
|
605
|
-
|
606
|
-
var keycode = event.keyCode,
|
607
|
-
|
608
|
-
// Check if one of the delete keys was pressed.
|
609
|
-
isKeycodeDelete = /^(8|46)$/.test(keycode)
|
610
|
-
|
611
|
-
// For some reason IE clears the input value on “escape”.
|
612
|
-
if ( keycode == 27 ) {
|
613
|
-
P.close()
|
614
|
-
return false
|
615
|
-
}
|
633
|
+
$ELEMENT.
|
616
634
|
|
617
|
-
//
|
618
|
-
|
619
|
-
|
620
|
-
// Prevent it from moving the page and bubbling to doc.
|
635
|
+
// On focus/click, open the picker.
|
636
|
+
on( 'focus.' + STATE.id + ' click.' + STATE.id, function(event) {
|
621
637
|
event.preventDefault()
|
622
|
-
|
638
|
+
P.open()
|
639
|
+
}).
|
623
640
|
|
624
|
-
|
625
|
-
|
626
|
-
if ( isKeycodeDelete ) { P.clear().close() }
|
627
|
-
else { P.open() }
|
628
|
-
}
|
629
|
-
})
|
641
|
+
// Handle keyboard event based on the picker being opened or not.
|
642
|
+
on( 'keydown.' + STATE.id, handleKeydownEvent )
|
630
643
|
}
|
631
644
|
|
632
645
|
|
@@ -635,7 +648,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
635
648
|
haspopup: true,
|
636
649
|
expanded: false,
|
637
650
|
readonly: false,
|
638
|
-
owns: ELEMENT.id + '_root'
|
651
|
+
owns: ELEMENT.id + '_root'
|
639
652
|
})
|
640
653
|
}
|
641
654
|
|
@@ -644,26 +657,44 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
644
657
|
* Prepare the root picker element with all bindings.
|
645
658
|
*/
|
646
659
|
function prepareElementRoot() {
|
660
|
+
aria( P.$root[0], 'hidden', true )
|
661
|
+
}
|
662
|
+
|
647
663
|
|
648
|
-
|
664
|
+
/**
|
665
|
+
* Prepare the holder picker element with all bindings.
|
666
|
+
*/
|
667
|
+
function prepareElementHolder() {
|
668
|
+
|
669
|
+
P.$holder.
|
649
670
|
|
650
671
|
on({
|
651
672
|
|
652
|
-
//
|
673
|
+
// For iOS8.
|
674
|
+
keydown: handleKeydownEvent,
|
675
|
+
|
676
|
+
'focus.toOpen': handleFocusToOpenEvent,
|
677
|
+
|
678
|
+
blur: function() {
|
679
|
+
// Remove the “target” class.
|
680
|
+
$ELEMENT.removeClass( CLASSES.target )
|
681
|
+
},
|
682
|
+
|
683
|
+
// When something within the holder is focused, stop from bubbling
|
653
684
|
// to the doc and remove the “focused” state from the root.
|
654
685
|
focusin: function( event ) {
|
655
686
|
P.$root.removeClass( CLASSES.focused )
|
656
687
|
event.stopPropagation()
|
657
688
|
},
|
658
689
|
|
659
|
-
// When something within the
|
690
|
+
// When something within the holder is clicked, stop it
|
660
691
|
// from bubbling to the doc.
|
661
692
|
'mousedown click': function( event ) {
|
662
693
|
|
663
694
|
var target = event.target
|
664
695
|
|
665
696
|
// Make sure the target isn’t the root holder so it can bubble up.
|
666
|
-
if ( target != P.$
|
697
|
+
if ( target != P.$holder[0] ) {
|
667
698
|
|
668
699
|
event.stopPropagation()
|
669
700
|
|
@@ -671,20 +702,21 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
671
702
|
// prevent cases where focus is shifted onto external elements
|
672
703
|
// when using things like jQuery mobile or MagnificPopup (ref: #249 & #120).
|
673
704
|
// Also, for Firefox, don’t prevent action on the `option` element.
|
674
|
-
if ( event.type == 'mousedown' && !$( target ).is( '
|
705
|
+
if ( event.type == 'mousedown' && !$( target ).is( 'input, select, textarea, button, option' )) {
|
675
706
|
|
676
707
|
event.preventDefault()
|
677
708
|
|
678
|
-
// Re-focus onto the
|
709
|
+
// Re-focus onto the holder so that users can click away
|
679
710
|
// from elements focused within the picker.
|
680
|
-
|
711
|
+
P.$holder[0].focus()
|
681
712
|
}
|
682
713
|
}
|
683
714
|
}
|
715
|
+
|
684
716
|
}).
|
685
717
|
|
686
718
|
// If there’s a click on an actionable element, carry out the actions.
|
687
|
-
on( 'click', '[data-pick], [data-nav], [data-clear]', function() {
|
719
|
+
on( 'click', '[data-pick], [data-nav], [data-clear], [data-close]', function() {
|
688
720
|
|
689
721
|
var $target = $( this ),
|
690
722
|
targetData = $target.data(),
|
@@ -692,34 +724,41 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
692
724
|
|
693
725
|
// * For IE, non-focusable elements can be active elements as well
|
694
726
|
// (http://stackoverflow.com/a/2684561).
|
695
|
-
activeElement =
|
696
|
-
activeElement = activeElement && ( activeElement.type || activeElement.href )
|
727
|
+
activeElement = getActiveElement()
|
728
|
+
activeElement = activeElement && ( activeElement.type || activeElement.href )
|
697
729
|
|
698
730
|
// If it’s disabled or nothing inside is actively focused, re-focus the element.
|
699
731
|
if ( targetDisabled || activeElement && !$.contains( P.$root[0], activeElement ) ) {
|
700
|
-
|
732
|
+
P.$holder[0].focus()
|
701
733
|
}
|
702
734
|
|
703
735
|
// If something is superficially changed, update the `highlight` based on the `nav`.
|
704
|
-
if ( targetData.nav
|
736
|
+
if ( !targetDisabled && targetData.nav ) {
|
705
737
|
P.set( 'highlight', P.component.item.highlight, { nav: targetData.nav } )
|
706
738
|
}
|
707
739
|
|
708
740
|
// If something is picked, set `select` then close with focus.
|
709
|
-
else if (
|
710
|
-
P.set( 'select', targetData.pick )
|
741
|
+
else if ( !targetDisabled && 'pick' in targetData ) {
|
742
|
+
P.set( 'select', targetData.pick )
|
743
|
+
if ( SETTINGS.closeOnSelect ) {
|
744
|
+
P.close( true )
|
745
|
+
}
|
711
746
|
}
|
712
747
|
|
713
748
|
// If a “clear” button is pressed, empty the values and close with focus.
|
714
749
|
else if ( targetData.clear ) {
|
715
|
-
P.clear()
|
750
|
+
P.clear()
|
751
|
+
if ( SETTINGS.closeOnClear ) {
|
752
|
+
P.close( true )
|
753
|
+
}
|
716
754
|
}
|
717
|
-
})
|
718
|
-
.on('click', '[data-close]', function () {
|
719
|
-
P.close(true);
|
720
|
-
}) //P.$root
|
721
755
|
|
722
|
-
|
756
|
+
else if ( targetData.close ) {
|
757
|
+
P.close( true )
|
758
|
+
}
|
759
|
+
|
760
|
+
}) //P.$holder
|
761
|
+
|
723
762
|
}
|
724
763
|
|
725
764
|
|
@@ -749,9 +788,6 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
749
788
|
// Create the name using the original input’s with a prefix and suffix.
|
750
789
|
'name="' + name + '"' +
|
751
790
|
|
752
|
-
// Create the ID using the original input’s; only if it has one.
|
753
|
-
(ELEMENT.id ? 'id="' + ELEMENT.id + '_hidden"' : '') +
|
754
|
-
|
755
791
|
// If the element has a value, set the hidden value as well.
|
756
792
|
(
|
757
793
|
$ELEMENT.data('value') || ELEMENT.value ?
|
@@ -768,29 +804,70 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
|
|
768
804
|
P._hidden.value = ELEMENT.value ?
|
769
805
|
P.get('select', SETTINGS.formatSubmit) :
|
770
806
|
''
|
771
|
-
})
|
807
|
+
})
|
808
|
+
}
|
809
|
+
|
772
810
|
|
773
|
-
|
774
|
-
|
811
|
+
// Wait for transitions to end before focusing the holder. Otherwise, while
|
812
|
+
// using the `container` option, the view jumps to the container.
|
813
|
+
function focusPickerOnceOpened() {
|
814
|
+
|
815
|
+
if (IS_DEFAULT_THEME && supportsTransitions) {
|
816
|
+
P.$holder.find('.' + CLASSES.frame).one('transitionend', function() {
|
817
|
+
P.$holder[0].focus()
|
818
|
+
})
|
819
|
+
}
|
820
|
+
else {
|
821
|
+
P.$holder[0].focus()
|
822
|
+
}
|
775
823
|
}
|
776
824
|
|
777
825
|
|
778
|
-
|
779
|
-
function focusToOpen( event ) {
|
826
|
+
function handleFocusToOpenEvent(event) {
|
780
827
|
|
781
828
|
// Stop the event from propagating to the doc.
|
782
829
|
event.stopPropagation()
|
783
830
|
|
784
|
-
//
|
785
|
-
|
786
|
-
|
787
|
-
|
831
|
+
// Add the “target” class.
|
832
|
+
$ELEMENT.addClass( CLASSES.target )
|
833
|
+
|
834
|
+
// Add the “focused” class to the root.
|
835
|
+
P.$root.addClass( CLASSES.focused )
|
788
836
|
|
789
837
|
// And then finally open the picker.
|
790
838
|
P.open()
|
791
839
|
}
|
792
840
|
|
793
841
|
|
842
|
+
// For iOS8.
|
843
|
+
function handleKeydownEvent( event ) {
|
844
|
+
|
845
|
+
var keycode = event.keyCode,
|
846
|
+
|
847
|
+
// Check if one of the delete keys was pressed.
|
848
|
+
isKeycodeDelete = /^(8|46)$/.test(keycode)
|
849
|
+
|
850
|
+
// For some reason IE clears the input value on “escape”.
|
851
|
+
if ( keycode == 27 ) {
|
852
|
+
P.close( true )
|
853
|
+
return false
|
854
|
+
}
|
855
|
+
|
856
|
+
// Check if `space` or `delete` was pressed or the picker is closed with a key movement.
|
857
|
+
if ( keycode == 32 || isKeycodeDelete || !STATE.open && P.component.key[keycode] ) {
|
858
|
+
|
859
|
+
// Prevent it from moving the page and bubbling to doc.
|
860
|
+
event.preventDefault()
|
861
|
+
event.stopPropagation()
|
862
|
+
|
863
|
+
// If `delete` was pressed, clear the values and close the picker.
|
864
|
+
// Otherwise open the picker.
|
865
|
+
if ( isKeycodeDelete ) { P.clear().close() }
|
866
|
+
else { P.open() }
|
867
|
+
}
|
868
|
+
}
|
869
|
+
|
870
|
+
|
794
871
|
// Return a new picker instance.
|
795
872
|
return new PickerInstance()
|
796
873
|
} //PickerConstructor
|
@@ -810,6 +887,7 @@ PickerConstructor.klasses = function( prefix ) {
|
|
810
887
|
|
811
888
|
input: prefix + '__input',
|
812
889
|
active: prefix + '__input--active',
|
890
|
+
target: prefix + '__input--target',
|
813
891
|
|
814
892
|
holder: prefix + '__holder',
|
815
893
|
|
@@ -1066,6 +1144,13 @@ function ariaAttr(attribute, data) {
|
|
1066
1144
|
return data
|
1067
1145
|
}
|
1068
1146
|
|
1147
|
+
// IE8 bug throws an error for activeElements within iframes.
|
1148
|
+
function getActiveElement() {
|
1149
|
+
try {
|
1150
|
+
return document.activeElement
|
1151
|
+
} catch ( err ) { }
|
1152
|
+
}
|
1153
|
+
|
1069
1154
|
|
1070
1155
|
|
1071
1156
|
// Expose the picker constructor.
|