pickadate-rails 1.4.0 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b8bbf39c9f159feed3de69900df634b556e902ac
4
- data.tar.gz: 44c4abfe39c4d8a63c0181b812cb0ff68a9e85a1
3
+ metadata.gz: 6606da54f9baaaa812e41c549b788ecf64c26cd5
4
+ data.tar.gz: 80293e9775fe12311d370e50b8239c6a3bbb607e
5
5
  SHA512:
6
- metadata.gz: 7621c5f039ba977bfb838997b0e74902d7d7bbacaa6c0abddc7204cf25ed6d3bdd297969e5c0c53d9c6004c4ef8ca3e181b1139842aeb35a54f3f93ab5f8b3c9
7
- data.tar.gz: 2661ae990c6fdaf3148aaabbd4916f0c69c9cfecf64c3ebe853e29ce022e953060fe1de27b3edae9c4b088a72d432f683c714545303fb5abf6bb141331eb68a1
6
+ metadata.gz: 12bb87a7dbf92495f1bdee7c6a4219f55d4c48a9133321f67c7fbee01b9f16d9439372076ea5cec094ae2a7499b0d49fd5ddd69743e084a038b5f9464781398f
7
+ data.tar.gz: ad2ee99730e0e8c8ce9fd493e6612e888d1344c4185c4a81f2da92056d48c60c5963aa30a08f425aec9cdeb0936af39523476c54db038c56d1275cbfdd2b4da7
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pickadate-Rails [![Gem Version](https://badge.fury.io/rb/pickadate-rails.png)](http://badge.fury.io/rb/pickadate-rails)
2
2
 
3
- ## Pickadate Version: 3.4.0
3
+ ## Pickadate Version: 3.5.0
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
 
@@ -1,3 +1,3 @@
1
1
  module PickadateRails
2
- VERSION = "1.4.0"
2
+ VERSION = "1.5.0"
3
3
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  /*!
3
- * Date picker for pickadate.js v3.4.0
3
+ * Date picker for pickadate.js v3.5.0
4
4
  * http://amsul.github.io/pickadate.js/date.htm
5
5
  */
6
6
 
@@ -57,6 +57,7 @@ function DatePicker( picker, settings ) {
57
57
  // The component's item object.
58
58
  calendar.item = {}
59
59
 
60
+ calendar.item.clear = null
60
61
  calendar.item.disable = ( settings.disable || [] ).slice( 0 )
61
62
  calendar.item.enable = -(function( collectionDisabled ) {
62
63
  return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1
@@ -70,10 +71,7 @@ function DatePicker( picker, settings ) {
70
71
  // When there’s a value, set the `select`, which in turn
71
72
  // also sets the `highlight` and `view`.
72
73
  if ( valueString ) {
73
- calendar.set( 'select', valueString, {
74
- format: formatString,
75
- fromValue: !!elementValue
76
- })
74
+ calendar.set( 'select', valueString, { format: formatString })
77
75
  }
78
76
 
79
77
  // If there’s no value, default to highlighting “today”.
@@ -141,6 +139,7 @@ DatePicker.prototype.set = function( type, value, options ) {
141
139
 
142
140
  // If the value is `null` just set it immediately.
143
141
  if ( value === null ) {
142
+ if ( type == 'clear' ) type = 'select'
144
143
  calendarItem[ type ] = value
145
144
  return calendar
146
145
  }
@@ -290,7 +289,7 @@ DatePicker.prototype.overlapRanges = function( one, two ) {
290
289
  one = calendar.createRange( one.from, one.to )
291
290
  two = calendar.createRange( two.from, two.to )
292
291
 
293
- return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||
292
+ return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||
294
293
  calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )
295
294
  }
296
295
 
@@ -490,12 +489,20 @@ DatePicker.prototype.validate = function( type, dateObject, options ) {
490
489
  if ( dateObject.pick <= minLimitObject.pick ) {
491
490
  reachedMin = true
492
491
  interval = 1
493
- dateObject = calendar.create([ minLimitObject.year, minLimitObject.month, minLimitObject.date - 1 ])
492
+ dateObject = calendar.create([
493
+ minLimitObject.year,
494
+ minLimitObject.month,
495
+ minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)
496
+ ])
494
497
  }
495
498
  else if ( dateObject.pick >= maxLimitObject.pick ) {
496
499
  reachedMax = true
497
500
  interval = -1
498
- dateObject = calendar.create([ maxLimitObject.year, maxLimitObject.month, maxLimitObject.date + 1 ])
501
+ dateObject = calendar.create([
502
+ maxLimitObject.year,
503
+ maxLimitObject.month,
504
+ maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)
505
+ ])
499
506
  }
500
507
 
501
508
 
@@ -565,10 +572,10 @@ DatePicker.prototype.disabled = function( dateToVerify ) {
565
572
  DatePicker.prototype.parse = function( type, value, options ) {
566
573
 
567
574
  var calendar = this,
568
- parsingObject = {},
569
- monthIndex
575
+ parsingObject = {}
570
576
 
571
- if ( !value || _.isInteger( value ) || $.isArray( value ) || _.isDate( value ) || $.isPlainObject( value ) && _.isInteger( value.pick ) ) {
577
+ // If it’s already parsed, we’re good.
578
+ if ( !value || typeof value != 'string' ) {
572
579
  return value
573
580
  }
574
581
 
@@ -578,9 +585,6 @@ DatePicker.prototype.parse = function( type, value, options ) {
578
585
  options.format = calendar.settings.format
579
586
  }
580
587
 
581
- // Calculate the month index to adjust with.
582
- monthIndex = typeof value == 'string' && !options.fromValue ? 1 : 0
583
-
584
588
  // Convert the format into an array and then map through it.
585
589
  calendar.formats.toArray( options.format ).map( function( label ) {
586
590
 
@@ -602,10 +606,10 @@ DatePicker.prototype.parse = function( type, value, options ) {
602
606
  value = value.substr( formatLength )
603
607
  })
604
608
 
605
- // If it’s parsing a user provided month value, compensate for month 0index.
609
+ // Compensate for month 0index.
606
610
  return [
607
611
  parsingObject.yyyy || parsingObject.yy,
608
- +( parsingObject.mm || parsingObject.m ) - monthIndex,
612
+ +( parsingObject.mm || parsingObject.m ) - 1,
609
613
  parsingObject.dd || parsingObject.d
610
614
  ]
611
615
  } //DatePicker.prototype.parse
@@ -624,7 +628,7 @@ DatePicker.prototype.formats = (function() {
624
628
 
625
629
  // If there's no month index, add it to the date object
626
630
  if ( !dateObject.mm && !dateObject.m ) {
627
- dateObject.m = collection.indexOf( word )
631
+ dateObject.m = collection.indexOf( word ) + 1
628
632
  }
629
633
 
630
634
  // Return the length of the word.
@@ -955,11 +959,12 @@ DatePicker.prototype.nodes = function( isOpen ) {
955
959
 
956
960
  // Create the calendar table head using a copy of weekday labels collection.
957
961
  // * We do a copy so we don't mutate the original array.
958
- tableHead = (function( collection ) {
962
+ tableHead = (function( collection, fullCollection ) {
959
963
 
960
964
  // If the first day should be Monday, move Sunday to the end.
961
965
  if ( settings.firstDay ) {
962
966
  collection.push( collection.shift() )
967
+ fullCollection.push( fullCollection.shift() )
963
968
  }
964
969
 
965
970
  // Create and return the table head group.
@@ -975,13 +980,14 @@ DatePicker.prototype.nodes = function( isOpen ) {
975
980
  item: function( counter ) {
976
981
  return [
977
982
  collection[ counter ],
978
- settings.klass.weekdays
983
+ settings.klass.weekdays,
984
+ 'scope=col title="' + fullCollection[ counter ] + '"'
979
985
  ]
980
986
  }
981
987
  })
982
988
  )
983
989
  ) //endreturn
984
- })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysShort ).slice( 0 ) ), //tableHead
990
+ })( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysShort ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead
985
991
 
986
992
 
987
993
  // Create the nav for next/prev month.
@@ -998,42 +1004,55 @@ DatePicker.prototype.nodes = function( isOpen ) {
998
1004
  ( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?
999
1005
  ' ' + settings.klass.navDisabled : ''
1000
1006
  ),
1001
- 'data-nav=' + ( next || -1 )
1007
+ 'data-nav=' + ( next || -1 ) + ' ' +
1008
+ _.ariaAttr({
1009
+ role: 'button',
1010
+ controls: calendar.$node[0].id + '_table'
1011
+ }) + ' ' +
1012
+ 'title="' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '"'
1002
1013
  ) //endreturn
1003
1014
  }, //createMonthNav
1004
1015
 
1005
1016
 
1006
1017
  // Create the month label.
1007
- createMonthLabel = function( monthsCollection ) {
1018
+ createMonthLabel = function() {
1019
+
1020
+ var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull
1008
1021
 
1009
1022
  // If there are months to select, add a dropdown menu.
1010
1023
  if ( settings.selectMonths ) {
1011
1024
 
1012
- return _.node( 'select', _.group({
1013
- min: 0,
1014
- max: 11,
1015
- i: 1,
1016
- node: 'option',
1017
- item: function( loopedMonth ) {
1025
+ return _.node( 'select',
1026
+ _.group({
1027
+ min: 0,
1028
+ max: 11,
1029
+ i: 1,
1030
+ node: 'option',
1031
+ item: function( loopedMonth ) {
1018
1032
 
1019
- return [
1033
+ return [
1020
1034
 
1021
- // The looped month and no classes.
1022
- monthsCollection[ loopedMonth ], 0,
1035
+ // The looped month and no classes.
1036
+ monthsCollection[ loopedMonth ], 0,
1023
1037
 
1024
- // Set the value and selected index.
1025
- 'value=' + loopedMonth +
1026
- ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +
1027
- (
1038
+ // Set the value and selected index.
1039
+ 'value=' + loopedMonth +
1040
+ ( viewsetObject.month == loopedMonth ? ' selected' : '' ) +
1028
1041
  (
1029
- ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||
1030
- ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )
1031
- ) ?
1032
- ' disabled' : ''
1033
- )
1034
- ]
1035
- }
1036
- }), settings.klass.selectMonth, isOpen ? '' : 'disabled' )
1042
+ (
1043
+ ( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||
1044
+ ( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )
1045
+ ) ?
1046
+ ' disabled' : ''
1047
+ )
1048
+ ]
1049
+ }
1050
+ }),
1051
+ settings.klass.selectMonth,
1052
+ ( isOpen ? '' : 'disabled' ) + ' ' +
1053
+ _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +
1054
+ 'title="' + settings.labelMonthSelect + '"'
1055
+ )
1037
1056
  }
1038
1057
 
1039
1058
  // If there's a need for a month selector
@@ -1078,22 +1097,27 @@ DatePicker.prototype.nodes = function( isOpen ) {
1078
1097
  highestYear = maxYear
1079
1098
  }
1080
1099
 
1081
- return _.node( 'select', _.group({
1082
- min: lowestYear,
1083
- max: highestYear,
1084
- i: 1,
1085
- node: 'option',
1086
- item: function( loopedYear ) {
1087
- return [
1100
+ return _.node( 'select',
1101
+ _.group({
1102
+ min: lowestYear,
1103
+ max: highestYear,
1104
+ i: 1,
1105
+ node: 'option',
1106
+ item: function( loopedYear ) {
1107
+ return [
1088
1108
 
1089
- // The looped year and no classes.
1090
- loopedYear, 0,
1109
+ // The looped year and no classes.
1110
+ loopedYear, 0,
1091
1111
 
1092
- // Set the value and selected index.
1093
- 'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )
1094
- ]
1095
- }
1096
- }), settings.klass.selectYear, isOpen ? '' : 'disabled' )
1112
+ // Set the value and selected index.
1113
+ 'value=' + loopedYear + ( focusedYear == loopedYear ? ' selected' : '' )
1114
+ ]
1115
+ }
1116
+ }),
1117
+ settings.klass.selectYear,
1118
+ ( isOpen ? '' : 'disabled' ) + ' ' + _.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +
1119
+ 'title="' + settings.labelYearSelect + '"'
1120
+ )
1097
1121
  }
1098
1122
 
1099
1123
  // Otherwise just return the year focused
@@ -1104,9 +1128,8 @@ DatePicker.prototype.nodes = function( isOpen ) {
1104
1128
  // Create and return the entire calendar.
1105
1129
  return _.node(
1106
1130
  'div',
1107
- createMonthNav() + createMonthNav( 1 ) +
1108
- createMonthLabel( settings.showMonthsShort ? settings.monthsShort : settings.monthsFull ) +
1109
- createYearLabel(),
1131
+ ( settings.selectYears ? createYearLabel() + createMonthLabel() : createMonthLabel() + createYearLabel() ) +
1132
+ createMonthNav() + createMonthNav( 1 ),
1110
1133
  settings.klass.header
1111
1134
  ) + _.node(
1112
1135
  'table',
@@ -1172,9 +1195,8 @@ DatePicker.prototype.nodes = function( isOpen ) {
1172
1195
  return klasses.join( ' ' )
1173
1196
  })([ settings.klass.day ]),
1174
1197
  'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
1175
- role: 'button',
1176
- controls: calendar.$node[0].id,
1177
- checked: isSelected && calendar.$node.val() === _.trigger(
1198
+ role: 'gridcell',
1199
+ selected: isSelected && calendar.$node.val() === _.trigger(
1178
1200
  calendar.formats.toString,
1179
1201
  calendar,
1180
1202
  [ settings.format, targetDate ]
@@ -1182,7 +1204,9 @@ DatePicker.prototype.nodes = function( isOpen ) {
1182
1204
  activedescendant: isHighlighted ? true : null,
1183
1205
  disabled: isDisabled ? true : null
1184
1206
  })
1185
- )
1207
+ ),
1208
+ '',
1209
+ _.ariaAttr({ role: 'presentation' })
1186
1210
  ] //endreturn
1187
1211
  }
1188
1212
  })
@@ -1190,14 +1214,25 @@ DatePicker.prototype.nodes = function( isOpen ) {
1190
1214
  }
1191
1215
  })
1192
1216
  ),
1193
- settings.klass.table
1217
+ settings.klass.table,
1218
+ 'id="' + calendar.$node[0].id + '_table' + '" ' + _.ariaAttr({
1219
+ role: 'grid',
1220
+ controls: calendar.$node[0].id,
1221
+ readonly: true
1222
+ })
1194
1223
  ) +
1195
1224
 
1196
1225
  // * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.
1197
1226
  _.node(
1198
1227
  'div',
1199
- _.node( 'button', settings.today, settings.klass.buttonToday, 'type=button data-pick=' + nowObject.pick + ( isOpen ? '' : ' disabled' ) ) +
1200
- _.node( 'button', settings.clear, settings.klass.buttonClear, 'type=button data-clear=1' + ( isOpen ? '' : ' disabled' ) ),
1228
+ _.node( 'button', settings.today, settings.klass.buttonToday,
1229
+ 'type=button data-pick=' + nowObject.pick +
1230
+ ( isOpen ? '' : ' disabled' ) + ' ' +
1231
+ _.ariaAttr({ controls: calendar.$node[0].id }) ) +
1232
+ _.node( 'button', settings.clear, settings.klass.buttonClear,
1233
+ 'type=button data-clear=1' +
1234
+ ( isOpen ? '' : ' disabled' ) + ' ' +
1235
+ _.ariaAttr({ controls: calendar.$node[0].id }) ),
1201
1236
  settings.klass.footer
1202
1237
  ) //endreturn
1203
1238
  } //DatePicker.prototype.nodes
@@ -1212,6 +1247,14 @@ DatePicker.defaults = (function( prefix ) {
1212
1247
 
1213
1248
  return {
1214
1249
 
1250
+ // The title label to use for the month nav buttons
1251
+ labelMonthNext: 'Next month',
1252
+ labelMonthPrev: 'Previous month',
1253
+
1254
+ // The title label to use for the dropdown selectors
1255
+ labelMonthSelect: 'Select a month',
1256
+ labelYearSelect: 'Select a year',
1257
+
1215
1258
  // Months and weekdays
1216
1259
  monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
1217
1260
  monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],
@@ -1,6 +1,5 @@
1
-
2
1
  /*!
3
- * pickadate.js v3.4.0, 2014/02/15
2
+ * pickadate.js v3.5.0, 2014/04/13
4
3
  * By Amsul, http://amsul.ca
5
4
  * Hosted on http://amsul.github.io/pickadate.js
6
5
  * Licensed under MIT
@@ -30,6 +29,9 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
30
29
 
31
30
 
32
31
  var
32
+ IS_DEFAULT_THEME = false,
33
+
34
+
33
35
  // The state of the picker.
34
36
  STATE = {
35
37
  id: ELEMENT.id || 'P' + Math.abs( ~~(Math.random() * new Date()) )
@@ -128,6 +130,10 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
128
130
  })
129
131
 
130
132
 
133
+ // Once we’re all set, check the theme in use.
134
+ IS_DEFAULT_THEME = isUsingDefaultTheme( P.$root.children()[ 0 ] )
135
+
136
+
131
137
  // If the element has autofocus, open the picker.
132
138
  if ( ELEMENT.autofocus ) {
133
139
  P.open()
@@ -206,9 +212,16 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
206
212
  $ELEMENT.addClass( CLASSES.active )
207
213
  aria( ELEMENT, 'expanded', true )
208
214
 
209
- // Add the “opened” class to the picker root.
210
- P.$root.addClass( CLASSES.opened )
211
- aria( P.$root[0], 'hidden', false )
215
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
216
+ // killing transitions :(. So add the “opened state on the next tick.
217
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
218
+ setTimeout( function() {
219
+
220
+ // Add the “opened” class to the picker root.
221
+ P.$root.addClass( CLASSES.opened )
222
+ aria( P.$root[0], 'hidden', false )
223
+
224
+ }, 0 )
212
225
 
213
226
  // If we have to give focus, bind the element and doc events.
214
227
  if ( dontGiveFocus !== false ) {
@@ -216,6 +229,13 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
216
229
  // Set it as open.
217
230
  STATE.open = true
218
231
 
232
+ // Prevent the page from scrolling.
233
+ if ( IS_DEFAULT_THEME ) {
234
+ $( 'html' ).
235
+ css( 'overflow', 'hidden' ).
236
+ css( 'padding-right', '+=' + getScrollbarWidth() )
237
+ }
238
+
219
239
  // Pass focus to the element’s jQuery object.
220
240
  $ELEMENT.trigger( 'focus' )
221
241
 
@@ -309,10 +329,16 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
309
329
  $ELEMENT.removeClass( CLASSES.active )
310
330
  aria( ELEMENT, 'expanded', false )
311
331
 
312
- // Remove the “opened” and “focused” class from the picker root.
313
- P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused )
314
- aria( P.$root[0], 'hidden', true )
315
- aria( P.$root[0], 'selected', false )
332
+ // * A Firefox bug, when `html` has `overflow:hidden`, results in
333
+ // killing transitions :(. So remove the “opened state on the next tick.
334
+ // Bug: https://bugzilla.mozilla.org/show_bug.cgi?id=625289
335
+ setTimeout( function() {
336
+
337
+ // Remove the “opened” and “focused” class from the picker root.
338
+ P.$root.removeClass( CLASSES.opened + ' ' + CLASSES.focused )
339
+ aria( P.$root[0], 'hidden', true )
340
+
341
+ }, 0 )
316
342
 
317
343
  // If it’s already closed, do nothing more.
318
344
  if ( !STATE.open ) return P
@@ -320,6 +346,13 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
320
346
  // Set it as closed.
321
347
  STATE.open = false
322
348
 
349
+ // Allow the page to scroll.
350
+ if ( IS_DEFAULT_THEME ) {
351
+ $( 'html' ).
352
+ css( 'overflow', '' ).
353
+ css( 'padding-right', '-=' + getScrollbarWidth() )
354
+ }
355
+
323
356
  // Unbind the document events.
324
357
  $document.off( '.' + STATE.id )
325
358
 
@@ -346,7 +379,7 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
346
379
  thingObject = thingIsObject ? thing : {}
347
380
 
348
381
  // Make sure we have usable options.
349
- options = thingIsObject && $.isPlainObject( value ) ? value : options || {}
382
+ options = thingIsObject && $.isPlainObject( value ) ? value : options || {}
350
383
 
351
384
  if ( thing ) {
352
385
 
@@ -363,14 +396,15 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
363
396
 
364
397
  // First, if the item exists and there’s a value, set it.
365
398
  if ( thingItem in P.component.item ) {
399
+ if ( thingValue === undefined ) thingValue = null
366
400
  P.component.set( thingItem, thingValue, options )
367
401
  }
368
402
 
369
403
  // Then, check to update the element value and broadcast a change.
370
404
  if ( thingItem == 'select' || thingItem == 'clear' ) {
371
- $ELEMENT.val( thingItem == 'clear' ?
372
- '' : P.get( thingItem, SETTINGS.format )
373
- ).trigger( 'change' )
405
+ $ELEMENT.
406
+ val( thingItem == 'clear' ? '' : P.get( thingItem, SETTINGS.format ) ).
407
+ trigger( 'change' )
374
408
  }
375
409
  }
376
410
 
@@ -600,7 +634,6 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
600
634
  // to the doc and remove the “focused” state from the root.
601
635
  focusin: function( event ) {
602
636
  P.$root.removeClass( CLASSES.focused )
603
- aria( P.$root[0], 'selected', false )
604
637
  event.stopPropagation()
605
638
  },
606
639
 
@@ -673,10 +706,21 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
673
706
  */
674
707
  function prepareElementHidden() {
675
708
 
676
- var id = [
677
- typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',
678
- typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'
679
- ]
709
+ var id,
710
+ name
711
+
712
+ if ( SETTINGS.hiddenName === true ) {
713
+ id = ELEMENT.name + '_hidden'
714
+ name = ELEMENT.name
715
+ ELEMENT.name = ''
716
+ }
717
+ else {
718
+ name = [
719
+ typeof SETTINGS.hiddenPrefix == 'string' ? SETTINGS.hiddenPrefix : '',
720
+ typeof SETTINGS.hiddenSuffix == 'string' ? SETTINGS.hiddenSuffix : '_submit'
721
+ ]
722
+ name = id = name[0] + ELEMENT.name + name[1]
723
+ }
680
724
 
681
725
  P._hidden = $(
682
726
  '<input ' +
@@ -684,8 +728,8 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
684
728
 
685
729
  // Create the name and ID by using the original
686
730
  // input’s with a prefix and suffix.
687
- 'name="' + id[0] + ELEMENT.name + id[1] + '"' +
688
- 'id="' + id[0] + ELEMENT.id + id[1] + '"' +
731
+ 'name="' + name + '"' +
732
+ 'id="' + id + '"' +
689
733
 
690
734
  // If the element has a value, set the hidden value as well.
691
735
  (
@@ -719,7 +763,6 @@ function PickerConstructor( ELEMENT, NAME, COMPONENT, OPTIONS ) {
719
763
  // If it’s a focus event, add the “focused” class to the root.
720
764
  if ( event.type == 'focus' ) {
721
765
  P.$root.addClass( CLASSES.focused )
722
- aria( P.$root[0], 'selected', true )
723
766
  }
724
767
 
725
768
  // And then finally open the picker.
@@ -758,6 +801,59 @@ PickerConstructor.klasses = function( prefix ) {
758
801
 
759
802
 
760
803
 
804
+ /**
805
+ * Check if the default theme is being used.
806
+ */
807
+ function isUsingDefaultTheme( element ) {
808
+
809
+ var theme,
810
+ prop = 'position'
811
+
812
+ // For IE.
813
+ if ( element.currentStyle ) {
814
+ theme = element.currentStyle[prop]
815
+ }
816
+
817
+ // For normal browsers.
818
+ else if ( window.getComputedStyle ) {
819
+ theme = getComputedStyle( element )[prop]
820
+ }
821
+
822
+ return theme == 'fixed'
823
+ }
824
+
825
+
826
+
827
+ /**
828
+ * Get the width of the browser’s scrollbar.
829
+ * Taken from: https://github.com/VodkaBears/Remodal/blob/master/src/jquery.remodal.js
830
+ */
831
+ function getScrollbarWidth() {
832
+
833
+ var $outer = $( '<div style="visibility:hidden;width:100px" />' ).
834
+ appendTo( 'body' )
835
+
836
+ // Get the width without scrollbars.
837
+ var widthWithoutScroll = $outer[0].offsetWidth
838
+
839
+ // Force adding scrollbars.
840
+ $outer.css( 'overflow', 'scroll' )
841
+
842
+ // Add the inner div.
843
+ var $inner = $( '<div style="width:100%" />' ).appendTo( $outer )
844
+
845
+ // Get the width with scrollbars.
846
+ var widthWithScroll = $inner[0].offsetWidth
847
+
848
+ // Remove the divs.
849
+ $outer.remove()
850
+
851
+ // Return the difference between the widths.
852
+ return widthWithoutScroll - widthWithScroll
853
+ }
854
+
855
+
856
+
761
857
  /**
762
858
  * PickerConstructor helper methods.
763
859
  */
@@ -896,8 +992,7 @@ PickerConstructor.extend = function( name, Component ) {
896
992
 
897
993
  // If the component data exists and `options` is a string, carry out the action.
898
994
  if ( componentData && typeof options == 'string' ) {
899
- PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )
900
- return this
995
+ return PickerConstructor._.trigger( componentData[ options ], componentData, [ action ] )
901
996
  }
902
997
 
903
998
  // Otherwise go through each matched element and if the component
@@ -929,17 +1024,17 @@ function aria(element, attribute, value) {
929
1024
  }
930
1025
  function ariaSet(element, attribute, value) {
931
1026
  element.setAttribute(
932
- (attribute == 'role' ? '' : 'aria-') + attribute,
1027
+ (attribute == 'role' ? '' : 'aria-') + attribute,
933
1028
  value
934
1029
  )
935
1030
  }
936
1031
  function ariaAttr(attribute, data) {
937
1032
  if ( !$.isPlainObject(attribute) ) {
938
- attribute = { attribute: data }
1033
+ attribute = { attribute: data }
939
1034
  }
940
1035
  data = ''
941
1036
  for ( var key in attribute ) {
942
- var attr = (key == 'role' ? '' : 'aria-') + key,
1037
+ var attr = (key == 'role' ? '' : 'aria-') + key,
943
1038
  attrVal = attribute[key]
944
1039
  data += attrVal == null ? '' : attr + '="' + attribute[key] + '"'
945
1040
  }
@@ -1,6 +1,6 @@
1
1
 
2
2
  /*!
3
- * Time picker for pickadate.js v3.4.0
3
+ * Time picker for pickadate.js v3.5.0
4
4
  * http://amsul.github.io/pickadate.js/time.htm
5
5
  */
6
6
 
@@ -57,6 +57,7 @@ function TimePicker( picker, settings ) {
57
57
  // The component's item object.
58
58
  clock.item = {}
59
59
 
60
+ clock.item.clear = null
60
61
  clock.item.interval = settings.interval || 30
61
62
  clock.item.disable = ( settings.disable || [] ).slice( 0 )
62
63
  clock.item.enable = -(function( collectionDisabled ) {
@@ -111,10 +112,10 @@ function TimePicker( picker, settings ) {
111
112
  }
112
113
  }).
113
114
  on( 'open', function() {
114
- picker.$root.find( 'button' ).attr( 'disable', false )
115
+ picker.$root.find( 'button' ).attr( 'disabled', false )
115
116
  }).
116
117
  on( 'close', function() {
117
- picker.$root.find( 'button' ).attr( 'disable', true )
118
+ picker.$root.find( 'button' ).attr( 'disabled', true )
118
119
  })
119
120
 
120
121
  } //TimePicker
@@ -130,6 +131,7 @@ TimePicker.prototype.set = function( type, value, options ) {
130
131
 
131
132
  // If the value is `null` just set it immediately.
132
133
  if ( value === null ) {
134
+ if ( type == 'clear' ) type = 'select'
133
135
  clockItem[ type ] = value
134
136
  return clock
135
137
  }
@@ -298,7 +300,7 @@ TimePicker.prototype.overlapRanges = function( one, two ) {
298
300
  one = clock.createRange( one.from, one.to )
299
301
  two = clock.createRange( two.from, two.to )
300
302
 
301
- return clock.withinRange( one, two.from ) || clock.withinRange( one, two.to ) ||
303
+ return clock.withinRange( one, two.from ) || clock.withinRange( one, two.to ) ||
302
304
  clock.withinRange( two, one.from ) || clock.withinRange( two, one.to )
303
305
  }
304
306
 
@@ -502,7 +504,8 @@ TimePicker.prototype.parse = function( type, value, options ) {
502
504
  clock = this,
503
505
  parsingObject = {}
504
506
 
505
- if ( !value || _.isInteger( value ) || $.isArray( value ) || _.isDate( value ) || $.isPlainObject( value ) && _.isInteger( value.pick ) ) {
507
+ // If it’s already parsed, we’re good.
508
+ if ( !value || typeof value != 'string' ) {
506
509
  return value
507
510
  }
508
511
 
@@ -898,9 +901,8 @@ TimePicker.prototype.nodes = function( isOpen ) {
898
901
  return klasses.join( ' ' )
899
902
  })( [ settings.klass.listItem ] ),
900
903
  'data-pick=' + loopedTime.pick + ' ' + _.ariaAttr({
901
- role: 'button',
902
- controls: clock.$node[0].id,
903
- checked: isSelected && clock.$node.val() === _.trigger(
904
+ role: 'option',
905
+ selected: isSelected && clock.$node.val() === _.trigger(
904
906
  clock.formats.toString,
905
907
  clock,
906
908
  [ settings.format, loopedTime ]
@@ -919,10 +921,13 @@ TimePicker.prototype.nodes = function( isOpen ) {
919
921
  'button',
920
922
  settings.clear,
921
923
  settings.klass.buttonClear,
922
- 'type=button data-clear=1' + ( isOpen ? '' : ' disable' )
923
- )
924
+ 'type=button data-clear=1' + ( isOpen ? '' : ' disabled' ) + ' ' +
925
+ _.ariaAttr({ controls: clock.$node[0].id })
926
+ ),
927
+ '', _.ariaAttr({ role: 'presentation' })
924
928
  ),
925
- settings.klass.list
929
+ settings.klass.list,
930
+ _.ariaAttr({ role: 'listbox', controls: clock.$node[0].id })
926
931
  )
927
932
  } //TimePicker.prototype.nodes
928
933
 
@@ -1,12 +1,12 @@
1
1
  // Hungarian
2
2
 
3
3
  jQuery.extend( jQuery.fn.pickadate.defaults, {
4
- monthsFull: [ 'január', 'február', 'március', 'aprilis', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december' ],
5
- monthsShort: [ 'jan', 'febr', 'márc', 'apr', 'máj', 'jún', 'júl', 'aug', 'szept', 'okt', 'nov', 'dec' ],
6
- weekdaysFull: [ 'vasámap', 'hétfö', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat' ],
7
- weekdaysShort: [ 'V', 'H', 'K', 'SZ', 'CS', 'P', 'SZ' ],
8
- today: 'ma',
9
- clear: 'töröl',
4
+ monthsFull: [ 'január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december' ],
5
+ monthsShort: [ 'jan', 'febr', 'márc', 'ápr', 'máj', 'jún', 'júl', 'aug', 'szept', 'okt', 'nov', 'dec' ],
6
+ weekdaysFull: [ 'vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat' ],
7
+ weekdaysShort: [ 'V', 'H', 'K', 'SZe', 'CS', 'P', 'SZo' ],
8
+ today: 'Ma',
9
+ clear: 'Törlés',
10
10
  firstDay: 1,
11
11
  format: 'yyyy. mmmm dd.',
12
12
  formatSubmit: 'yyyy/mm/dd'
@@ -0,0 +1,13 @@
1
+ // Nepali
2
+
3
+ jQuery.extend( jQuery.fn.pickadate.defaults, {
4
+ monthsFull: [ 'जनअरी', 'र्े ब्रीवरी', 'मार', 'वसप्रब', 'म', 'जीन', 'जीबाई', 'वगस्त', 'म्े् ेारर', 'वक् ोरर', 'नोभेारर', 'सडम्ेारर' ],
5
+ monthsShort: [ 'जन', 'र्े ब्री', 'मार', 'वसप', 'मे', 'जीन', 'जीब', 'वग', 'म्े्', 'वक् ो', 'नोभ', 'सडम्े' ],
6
+ weekdaysFull: [ 'म्ोमअार', 'मकगबअार', 'रीधअार', 'सरहीअार', 'लीक्रअार', 'लसनअार', 'आइतअार' ],
7
+ weekdaysShort: [ 'म्ोम', 'मकगब', 'रीध', 'सरही', 'लीक्र', 'लसन', 'आइत' ],
8
+ numbers: [ '०', '१', '२', '३', '४', '५', '६', '७', '८', '९' ],
9
+ today: 'आज',
10
+ clear: 'मेटाउनुहोस्',
11
+ format: 'dddd, dd mmmm, yyyy',
12
+ formatSubmit: 'yyyy/mm/dd'
13
+ });
@@ -72,9 +72,9 @@
72
72
  -webkit-transform: translateY(-1em) perspective(600px) rotateX(10deg);
73
73
  -moz-transform: translateY(-1em) perspective(600px) rotateX(10deg);
74
74
  transform: translateY(-1em) perspective(600px) rotateX(10deg);
75
- -webkit-transition: all 0.15s ease-out, max-height 0 0.15s, border-width 0 0.15s;
76
- -moz-transition: all 0.15s ease-out, max-height 0 0.15s, border-width 0 0.15s;
77
- transition: all 0.15s ease-out, max-height 0 0.15s, border-width 0 0.15s;
75
+ -webkit-transition: -webkit-transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s 0.15s, border-width 0s 0.15s;
76
+ -moz-transition: -moz-transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s 0.15s, border-width 0s 0.15s;
77
+ transition: transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s 0.15s, border-width 0s 0.15s;
78
78
  }
79
79
  /**
80
80
  * The frame and wrap work together to ensure that
@@ -100,9 +100,9 @@
100
100
  -webkit-transform: translateY(0) perspective(600px) rotateX(0);
101
101
  -moz-transform: translateY(0) perspective(600px) rotateX(0);
102
102
  transform: translateY(0) perspective(600px) rotateX(0);
103
- -webkit-transition: all 0.15s ease-out, max-height 0, border-width 0;
104
- -moz-transition: all 0.15s ease-out, max-height 0, border-width 0;
105
- transition: all 0.15s ease-out, max-height 0, border-width 0;
103
+ -webkit-transition: -webkit-transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s, border-width 0s;
104
+ -moz-transition: -moz-transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s, border-width 0s;
105
+ transition: transform 0.15s ease-out, opacity 0.15s ease-out, max-height 0s, border-width 0s;
106
106
  -webkit-box-shadow: 0 6px 18px 1px rgba(0, 0, 0, 0.12);
107
107
  -moz-box-shadow: 0 6px 18px 1px rgba(0, 0, 0, 0.12);
108
108
  box-shadow: 0 6px 18px 1px rgba(0, 0, 0, 0.12);
@@ -36,16 +36,14 @@
36
36
  .picker__select--month,
37
37
  .picker__select--year {
38
38
  border: 1px solid #b7b7b7;
39
- height: 2.5em;
40
- padding: .5em .25em;
39
+ height: 2em;
40
+ padding: .5em;
41
41
  margin-left: .25em;
42
42
  margin-right: .25em;
43
- font-size: .6em;
44
43
  }
45
44
  @media (min-width: 24.5em) {
46
45
  .picker__select--month,
47
46
  .picker__select--year {
48
- font-size: .8em;
49
47
  margin-top: -0.5em;
50
48
  }
51
49
  }
@@ -36,16 +36,14 @@
36
36
  .picker__select--month,
37
37
  .picker__select--year {
38
38
  border: 1px solid #b7b7b7;
39
- height: 2.5em;
40
- padding: .5em .25em;
39
+ height: 2em;
40
+ padding: .5em;
41
41
  margin-left: .25em;
42
42
  margin-right: .25em;
43
- font-size: .6em;
44
43
  }
45
44
  @media (min-width: 24.5em) {
46
45
  .picker__select--month,
47
46
  .picker__select--year {
48
- font-size: .8em;
49
47
  margin-top: -0.5em;
50
48
  }
51
49
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pickadate-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 1.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Fraser
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-24 00:00:00.000000000 Z
11
+ date: 2014-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -94,6 +94,7 @@ files:
94
94
  - vendor/assets/javascripts/pickadate/translations/it_IT.js
95
95
  - vendor/assets/javascripts/pickadate/translations/ja_JP.js
96
96
  - vendor/assets/javascripts/pickadate/translations/ko_KR.js
97
+ - vendor/assets/javascripts/pickadate/translations/ne_NP.js
97
98
  - vendor/assets/javascripts/pickadate/translations/nl_NL.js
98
99
  - vendor/assets/javascripts/pickadate/translations/no_NO.js
99
100
  - vendor/assets/javascripts/pickadate/translations/pl_PL.js