pickadate-rails 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 +7 -0
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +61 -0
- data/Rakefile +26 -0
- data/lib/pickadate-rails.rb +7 -0
- data/lib/pickadate-rails/version.rb +3 -0
- data/pickadate-rails.gemspec +25 -0
- data/vendor/assets/javascripts/pickadate/picker.date.js +925 -0
- data/vendor/assets/javascripts/pickadate/picker.js +785 -0
- data/vendor/assets/javascripts/pickadate/picker.time.js +651 -0
- data/vendor/assets/javascripts/pickadate/translations/bg_BG.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/bs_BA.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/ca_ES.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/cs_CZ.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/da_DK.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/de_DE.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/el_GR.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/es_ES.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/et_EE.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/eu_ES.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/fi_FI.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/fr_FR.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/he_IL.js +12 -0
- data/vendor/assets/javascripts/pickadate/translations/hr_HR.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/hu_HU.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/id_ID.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/it_IT.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/nl_NL.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/no_NO.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/pl_PL.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/pt_BR.js +12 -0
- data/vendor/assets/javascripts/pickadate/translations/pt_PT.js +12 -0
- data/vendor/assets/javascripts/pickadate/translations/ro_RO.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/ru_RU.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/sk_SK.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/sv_SE.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/th_TH.js +12 -0
- data/vendor/assets/javascripts/pickadate/translations/tr_TR.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/uk_UA.js +13 -0
- data/vendor/assets/javascripts/pickadate/translations/zh_CN.js +13 -0
- data/vendor/assets/stylesheets/pickadate/classic.css +159 -0
- data/vendor/assets/stylesheets/pickadate/classic.date.css +332 -0
- data/vendor/assets/stylesheets/pickadate/classic.time.css +198 -0
- data/vendor/assets/stylesheets/pickadate/default.css +234 -0
- data/vendor/assets/stylesheets/pickadate/default.date.css +332 -0
- data/vendor/assets/stylesheets/pickadate/default.time.css +193 -0
- metadata +134 -0
@@ -0,0 +1,651 @@
|
|
1
|
+
|
2
|
+
/*!
|
3
|
+
* Time picker for pickadate.js v3.0.3
|
4
|
+
* http://amsul.github.io/pickadate.js/time.htm
|
5
|
+
*/
|
6
|
+
|
7
|
+
/*jshint
|
8
|
+
debug: true,
|
9
|
+
devel: true,
|
10
|
+
browser: true,
|
11
|
+
asi: true,
|
12
|
+
unused: true,
|
13
|
+
boss: true
|
14
|
+
*/
|
15
|
+
|
16
|
+
|
17
|
+
// Create a new scope.
|
18
|
+
(function() {
|
19
|
+
|
20
|
+
|
21
|
+
/**
|
22
|
+
* Globals and constants
|
23
|
+
*/
|
24
|
+
var HOURS_IN_DAY = 24,
|
25
|
+
MINUTES_IN_HOUR = 60,
|
26
|
+
HOURS_TO_NOON = 12,
|
27
|
+
MINUTES_IN_DAY = HOURS_IN_DAY * MINUTES_IN_HOUR
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
/**
|
32
|
+
* The time picker constructor
|
33
|
+
*/
|
34
|
+
function TimePicker( picker, settings ) {
|
35
|
+
|
36
|
+
var clock = this,
|
37
|
+
elementDataValue = picker.$node.data( 'value' )
|
38
|
+
|
39
|
+
clock.settings = settings
|
40
|
+
|
41
|
+
// The queue of methods that will be used to build item objects.
|
42
|
+
clock.queue = {
|
43
|
+
interval: 'i',
|
44
|
+
min: 'measure create',
|
45
|
+
max: 'measure create',
|
46
|
+
now: 'now create',
|
47
|
+
select: 'parse create validate',
|
48
|
+
highlight: 'create validate',
|
49
|
+
view: 'create validate',
|
50
|
+
disable: 'flipItem',
|
51
|
+
enable: 'flipItem'
|
52
|
+
}
|
53
|
+
|
54
|
+
// The component's item object.
|
55
|
+
clock.item = {}
|
56
|
+
|
57
|
+
clock.item.interval = settings.interval || 30
|
58
|
+
clock.item.disable = ( settings.disable || [] ).slice( 0 )
|
59
|
+
clock.item.enable = -(function( collectionDisabled ) {
|
60
|
+
return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1
|
61
|
+
})( clock.item.disable )
|
62
|
+
|
63
|
+
clock.
|
64
|
+
set( 'min', settings.min ).
|
65
|
+
set( 'max', settings.max ).
|
66
|
+
set( 'now' ).
|
67
|
+
|
68
|
+
// Setting the `select` also sets the `highlight` and `view`.
|
69
|
+
set( 'select',
|
70
|
+
|
71
|
+
// If there's a `value` or `data-value`, use that with formatting.
|
72
|
+
// Otherwise default to the minimum selectable time.
|
73
|
+
elementDataValue || picker.$node[ 0 ].value || clock.item.min,
|
74
|
+
|
75
|
+
// Use the relevant format.
|
76
|
+
{ format: elementDataValue ? settings.formatSubmit : settings.format }
|
77
|
+
)
|
78
|
+
|
79
|
+
// The keycode to movement mapping.
|
80
|
+
clock.key = {
|
81
|
+
40: 1, // Down
|
82
|
+
38: -1, // Up
|
83
|
+
39: 1, // Right
|
84
|
+
37: -1, // Left
|
85
|
+
go: function( timeChange ) {
|
86
|
+
clock.set( 'highlight', clock.item.highlight.pick + timeChange * clock.item.interval, { interval: timeChange * clock.item.interval } )
|
87
|
+
this.render()
|
88
|
+
}
|
89
|
+
}
|
90
|
+
|
91
|
+
|
92
|
+
// Bind some picker events.
|
93
|
+
picker.
|
94
|
+
on( 'render', function() {
|
95
|
+
var $pickerHolder = picker.$root.children(),
|
96
|
+
$viewset = $pickerHolder.find( '.' + settings.klass.viewset )
|
97
|
+
if ( $viewset.length ) {
|
98
|
+
$pickerHolder[ 0 ].scrollTop = ~~( $viewset.position().top - ( $viewset[ 0 ].clientHeight * 2 ) )
|
99
|
+
}
|
100
|
+
else {
|
101
|
+
console.warn( 'Nothing to viewset with', clock.item.view )
|
102
|
+
}
|
103
|
+
}).
|
104
|
+
on( 'open', function() {
|
105
|
+
picker.$root.find( 'button' ).attr( 'disable', false )
|
106
|
+
}).
|
107
|
+
on( 'close', function() {
|
108
|
+
picker.$root.find( 'button' ).attr( 'disable', true )
|
109
|
+
})
|
110
|
+
|
111
|
+
} //TimePicker
|
112
|
+
|
113
|
+
|
114
|
+
/**
|
115
|
+
* Set a timepicker item object.
|
116
|
+
*/
|
117
|
+
TimePicker.prototype.set = function( type, value, options ) {
|
118
|
+
|
119
|
+
var clock = this
|
120
|
+
|
121
|
+
// Go through the queue of methods, and invoke the function. Update this
|
122
|
+
// as the time unit, and set the final resultant as this item type.
|
123
|
+
// * In the case of `enable`, keep the queue but set `disable` instead.
|
124
|
+
// And in the case of `flip`, keep the queue but set `enable` instead.
|
125
|
+
clock.item[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = clock.queue[ type ].split( ' ' ).map( function( method ) {
|
126
|
+
return value = clock[ method ]( type, value, options )
|
127
|
+
}).pop()
|
128
|
+
|
129
|
+
// Check if we need to cascade through more updates.
|
130
|
+
if ( type == 'select' ) {
|
131
|
+
clock.set( 'highlight', clock.item.select, options )
|
132
|
+
}
|
133
|
+
else if ( type == 'highlight' ) {
|
134
|
+
clock.set( 'view', clock.item.highlight, options )
|
135
|
+
}
|
136
|
+
else if ( type == 'interval' ) {
|
137
|
+
clock.
|
138
|
+
set( 'min', clock.item.min, options ).
|
139
|
+
set( 'max', clock.item.max, options )
|
140
|
+
}
|
141
|
+
else if ( ( type == 'flip' || type == 'min' || type == 'max' || type == 'disable' || type == 'enable' ) && clock.item.select && clock.item.highlight ) {
|
142
|
+
if ( type == 'min' ) {
|
143
|
+
clock.set( 'max', clock.item.max, options )
|
144
|
+
}
|
145
|
+
clock.
|
146
|
+
set( 'select', clock.item.select, options ).
|
147
|
+
set( 'highlight', clock.item.highlight, options )
|
148
|
+
}
|
149
|
+
|
150
|
+
return clock
|
151
|
+
} //TimePicker.prototype.set
|
152
|
+
|
153
|
+
|
154
|
+
/**
|
155
|
+
* Get a timepicker item object.
|
156
|
+
*/
|
157
|
+
TimePicker.prototype.get = function( type ) {
|
158
|
+
return this.item[ type ]
|
159
|
+
} //TimePicker.prototype.get
|
160
|
+
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Create a picker time object.
|
164
|
+
*/
|
165
|
+
TimePicker.prototype.create = function( type, value, options ) {
|
166
|
+
|
167
|
+
var clock = this
|
168
|
+
|
169
|
+
// If there's no value, use the type as the value.
|
170
|
+
value = value === undefined ? type : value
|
171
|
+
|
172
|
+
// If it's an object, use the "pick" value.
|
173
|
+
if ( Picker._.isObject( value ) && Picker._.isInteger( value.pick ) ) {
|
174
|
+
value = value.pick
|
175
|
+
}
|
176
|
+
|
177
|
+
// If it's an array, convert it into minutes.
|
178
|
+
else if ( Array.isArray( value ) ) {
|
179
|
+
value = +value[ 0 ] * MINUTES_IN_HOUR + (+value[ 1 ])
|
180
|
+
}
|
181
|
+
|
182
|
+
// If no valid value is passed, set it to "now".
|
183
|
+
else if ( !Picker._.isInteger( value ) ) {
|
184
|
+
value = clock.now( type, value, options )
|
185
|
+
}
|
186
|
+
|
187
|
+
// If we're setting the max, make sure it's greater than the min.
|
188
|
+
if ( type == 'max' && value < clock.item.min.pick ) {
|
189
|
+
value += MINUTES_IN_DAY
|
190
|
+
}
|
191
|
+
|
192
|
+
// Normalize it into a "reachable" interval.
|
193
|
+
value = clock.normalize( value, options )
|
194
|
+
|
195
|
+
// Return the compiled object.
|
196
|
+
return {
|
197
|
+
|
198
|
+
// Divide to get hours from minutes.
|
199
|
+
hour: ~~( HOURS_IN_DAY + value / MINUTES_IN_HOUR ) % HOURS_IN_DAY,
|
200
|
+
|
201
|
+
// The remainder is the minutes.
|
202
|
+
mins: ( MINUTES_IN_HOUR + value % MINUTES_IN_HOUR ) % MINUTES_IN_HOUR,
|
203
|
+
|
204
|
+
// The time in total minutes.
|
205
|
+
time: ( MINUTES_IN_DAY + value ) % MINUTES_IN_DAY,
|
206
|
+
|
207
|
+
// Reference to the "relative" value to pick.
|
208
|
+
pick: value
|
209
|
+
}
|
210
|
+
} //TimePicker.prototype.create
|
211
|
+
|
212
|
+
|
213
|
+
/**
|
214
|
+
* Get the time relative to now.
|
215
|
+
*/
|
216
|
+
TimePicker.prototype.now = function( type, value/*, options*/ ) {
|
217
|
+
|
218
|
+
var date = new Date(),
|
219
|
+
dateMinutes = date.getHours() * MINUTES_IN_HOUR + date.getMinutes()
|
220
|
+
|
221
|
+
// If the value is a number, adjust by that many intervals because
|
222
|
+
// the time has passed. In the case of “midnight” and a negative `min`,
|
223
|
+
// increase the value by 2. Otherwise increase it by 1.
|
224
|
+
if ( Picker._.isInteger( value ) ) {
|
225
|
+
value += type == 'min' && value < 0 && dateMinutes === 0 ? 2 : 1
|
226
|
+
}
|
227
|
+
|
228
|
+
// If the value isn’t a number, default to 1 passed interval.
|
229
|
+
else {
|
230
|
+
value = 1
|
231
|
+
}
|
232
|
+
|
233
|
+
// Calculate the final relative time.
|
234
|
+
return value * this.item.interval + dateMinutes
|
235
|
+
} //TimePicker.prototype.now
|
236
|
+
|
237
|
+
|
238
|
+
/**
|
239
|
+
* Normalize minutes or an object to be "reachable" based on the interval.
|
240
|
+
*/
|
241
|
+
TimePicker.prototype.normalize = function( value/*, options*/ ) {
|
242
|
+
// If it's a negative value, add one interval to keep it as "passed".
|
243
|
+
return value - ( ( value < 0 ? this.item.interval : 0 ) + value % this.item.interval )
|
244
|
+
} //TimePicker.prototype.normalize
|
245
|
+
|
246
|
+
|
247
|
+
/**
|
248
|
+
* Measure the range of minutes.
|
249
|
+
*/
|
250
|
+
TimePicker.prototype.measure = function( type, value, options ) {
|
251
|
+
|
252
|
+
var clock = this
|
253
|
+
|
254
|
+
// If it's anything false-y, set it to the default.
|
255
|
+
if ( !value ) {
|
256
|
+
value = type == 'min' ? [ 0, 0 ] : [ HOURS_IN_DAY - 1, MINUTES_IN_HOUR - 1 ]
|
257
|
+
}
|
258
|
+
|
259
|
+
// If it's a literal true, or an integer, make it relative to now.
|
260
|
+
else if ( value === true || Picker._.isInteger( value ) ) {
|
261
|
+
value = clock.now( type, value, options )
|
262
|
+
}
|
263
|
+
|
264
|
+
// If it's an object already, just normalize it.
|
265
|
+
else if ( Picker._.isObject( value ) && Picker._.isInteger( value.pick ) ) {
|
266
|
+
value = clock.normalize( value.pick, options )
|
267
|
+
}
|
268
|
+
|
269
|
+
return value
|
270
|
+
} ///TimePicker.prototype.measure
|
271
|
+
|
272
|
+
|
273
|
+
/**
|
274
|
+
* Validate an object as enabled.
|
275
|
+
*/
|
276
|
+
TimePicker.prototype.validate = function( type, timeObject, options ) {
|
277
|
+
|
278
|
+
var clock = this,
|
279
|
+
interval = options && options.interval ? options.interval : clock.item.interval
|
280
|
+
|
281
|
+
// Check if the object is disabled.
|
282
|
+
if ( clock.disabled( timeObject ) ) {
|
283
|
+
|
284
|
+
// Shift with the interval until we reach an enabled time.
|
285
|
+
timeObject = clock.shift( timeObject, interval )
|
286
|
+
}
|
287
|
+
|
288
|
+
// Scope the object into range.
|
289
|
+
timeObject = clock.scope( timeObject )
|
290
|
+
|
291
|
+
// Do a second check to see if we landed on a disabled min/max.
|
292
|
+
// In that case, shift using the opposite interval as before.
|
293
|
+
if ( clock.disabled( timeObject ) ) {
|
294
|
+
timeObject = clock.shift( timeObject, interval * -1 )
|
295
|
+
}
|
296
|
+
|
297
|
+
// Return the final object.
|
298
|
+
return timeObject
|
299
|
+
} //TimePicker.prototype.validate
|
300
|
+
|
301
|
+
|
302
|
+
/**
|
303
|
+
* Check if an object is disabled.
|
304
|
+
*/
|
305
|
+
TimePicker.prototype.disabled = function( timeObject ) {
|
306
|
+
|
307
|
+
var
|
308
|
+
clock = this,
|
309
|
+
|
310
|
+
// Filter through the disabled times to check if this is one.
|
311
|
+
isDisabledTime = clock.item.disable.filter( function( timeToDisable ) {
|
312
|
+
|
313
|
+
// If the time is a number, match the hours.
|
314
|
+
if ( Picker._.isInteger( timeToDisable ) ) {
|
315
|
+
return timeObject.hour == timeToDisable
|
316
|
+
}
|
317
|
+
|
318
|
+
// If it's an array, create the object and match the times.
|
319
|
+
if ( Array.isArray( timeToDisable ) ) {
|
320
|
+
return timeObject.pick == clock.create( timeToDisable ).pick
|
321
|
+
}
|
322
|
+
}).length
|
323
|
+
|
324
|
+
// If the clock is "enabled" flag is flipped, flip the condition.
|
325
|
+
return clock.item.enable === -1 ? !isDisabledTime : isDisabledTime
|
326
|
+
} //TimePicker.prototype.disabled
|
327
|
+
|
328
|
+
|
329
|
+
/**
|
330
|
+
* Shift an object by an interval until we reach an enabled object.
|
331
|
+
*/
|
332
|
+
TimePicker.prototype.shift = function( timeObject, interval ) {
|
333
|
+
|
334
|
+
var
|
335
|
+
clock = this
|
336
|
+
|
337
|
+
// Keep looping as long as the time is disabled.
|
338
|
+
while ( clock.disabled( timeObject ) ) {
|
339
|
+
|
340
|
+
// Increase/decrease the time by the interval and keep looping.
|
341
|
+
timeObject = clock.create( timeObject.pick += interval || clock.item.interval )
|
342
|
+
|
343
|
+
// If we've looped beyond the limits, break out of the loop.
|
344
|
+
if ( timeObject.pick <= clock.item.min.pick || timeObject.pick >= clock.item.max.pick ) {
|
345
|
+
break
|
346
|
+
}
|
347
|
+
}
|
348
|
+
|
349
|
+
// Return the final object.
|
350
|
+
return timeObject
|
351
|
+
} //TimePicker.prototype.shift
|
352
|
+
|
353
|
+
|
354
|
+
/**
|
355
|
+
* Scope an object to be within range of min and max.
|
356
|
+
*/
|
357
|
+
TimePicker.prototype.scope = function( timeObject ) {
|
358
|
+
var minLimit = this.item.min.pick,
|
359
|
+
maxLimit = this.item.max.pick
|
360
|
+
return this.create( timeObject.pick > maxLimit ? maxLimit : timeObject.pick < minLimit ? minLimit : timeObject )
|
361
|
+
} //TimePicker.prototype.scope
|
362
|
+
|
363
|
+
|
364
|
+
/**
|
365
|
+
* Parse a string into a usable type.
|
366
|
+
*/
|
367
|
+
TimePicker.prototype.parse = function( type, value, options ) {
|
368
|
+
|
369
|
+
var
|
370
|
+
clock = this,
|
371
|
+
parsingObject = {}
|
372
|
+
|
373
|
+
if ( !value || Picker._.isInteger( value ) || Array.isArray( value ) || Picker._.isDate( value ) || Picker._.isObject( value ) && Picker._.isInteger( value.pick ) ) {
|
374
|
+
return value
|
375
|
+
}
|
376
|
+
|
377
|
+
// We need a `.format` to parse the value.
|
378
|
+
if ( !( options && options.format ) ) {
|
379
|
+
throw "Need a formatting option to parse this.."
|
380
|
+
}
|
381
|
+
|
382
|
+
// Convert the format into an array and then map through it.
|
383
|
+
clock.formats.toArray( options.format ).map( function( label ) {
|
384
|
+
|
385
|
+
var
|
386
|
+
// Grab the formatting label.
|
387
|
+
formattingLabel = clock.formats[ label ],
|
388
|
+
|
389
|
+
// The format length is from the formatting label function or the
|
390
|
+
// label length without the escaping exclamation (!) mark.
|
391
|
+
formatLength = formattingLabel ? Picker._.trigger( formattingLabel, clock, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length
|
392
|
+
|
393
|
+
// If there's a format label, split the value up to the format length.
|
394
|
+
// Then add it to the parsing object with appropriate label.
|
395
|
+
if ( formattingLabel ) {
|
396
|
+
parsingObject[ label ] = value.substr( 0, formatLength )
|
397
|
+
}
|
398
|
+
|
399
|
+
// Update the time value as the substring from format length to end.
|
400
|
+
value = value.substr( formatLength )
|
401
|
+
})
|
402
|
+
|
403
|
+
return +parsingObject.i + MINUTES_IN_HOUR * (
|
404
|
+
|
405
|
+
+( parsingObject.H || parsingObject.HH ) ||
|
406
|
+
|
407
|
+
( +( parsingObject.h || parsingObject.hh ) % 12 + ( /^p/i.test( parsingObject.A || parsingObject.a ) ? 12 : 0 ) )
|
408
|
+
)
|
409
|
+
} //TimePicker.prototype.parse
|
410
|
+
|
411
|
+
|
412
|
+
/**
|
413
|
+
* Various formats to display the object in.
|
414
|
+
*/
|
415
|
+
TimePicker.prototype.formats = {
|
416
|
+
|
417
|
+
h: function( string, timeObject ) {
|
418
|
+
|
419
|
+
// If there's string, then get the digits length.
|
420
|
+
// Otherwise return the selected hour in "standard" format.
|
421
|
+
return string ? Picker._.digits( string ) : timeObject.hour % HOURS_TO_NOON || HOURS_TO_NOON
|
422
|
+
},
|
423
|
+
hh: function( string, timeObject ) {
|
424
|
+
|
425
|
+
// If there's a string, then the length is always 2.
|
426
|
+
// Otherwise return the selected hour in "standard" format with a leading zero.
|
427
|
+
return string ? 2 : Picker._.lead( timeObject.hour % HOURS_TO_NOON || HOURS_TO_NOON )
|
428
|
+
},
|
429
|
+
H: function( string, timeObject ) {
|
430
|
+
|
431
|
+
// If there's string, then get the digits length.
|
432
|
+
// Otherwise return the selected hour in "military" format as a string.
|
433
|
+
return string ? Picker._.digits( string ) : '' + timeObject.hour
|
434
|
+
},
|
435
|
+
HH: function( string, timeObject ) {
|
436
|
+
|
437
|
+
// If there's string, then get the digits length.
|
438
|
+
// Otherwise return the selected hour in "military" format with a leading zero.
|
439
|
+
return string ? Picker._.digits( string ) : Picker._.lead( timeObject.hour )
|
440
|
+
},
|
441
|
+
i: function( string, timeObject ) {
|
442
|
+
|
443
|
+
// If there's a string, then the length is always 2.
|
444
|
+
// Otherwise return the selected minutes.
|
445
|
+
return string ? 2 : Picker._.lead( timeObject.mins )
|
446
|
+
},
|
447
|
+
a: function( string, timeObject ) {
|
448
|
+
|
449
|
+
// If there's a string, then the length is always 4.
|
450
|
+
// Otherwise check if it's more than "noon" and return either am/pm.
|
451
|
+
return string ? 4 : MINUTES_IN_DAY / 2 > timeObject.time % MINUTES_IN_DAY ? 'a.m.' : 'p.m.'
|
452
|
+
},
|
453
|
+
A: function( string, timeObject ) {
|
454
|
+
|
455
|
+
// If there's a string, then the length is always 2.
|
456
|
+
// Otherwise check if it's more than "noon" and return either am/pm.
|
457
|
+
return string ? 2 : MINUTES_IN_DAY / 2 > timeObject.time % MINUTES_IN_DAY ? 'AM' : 'PM'
|
458
|
+
},
|
459
|
+
|
460
|
+
// Create an array by splitting the formatting string passed.
|
461
|
+
toArray: function( formatString ) { return formatString.split( /(h{1,2}|H{1,2}|i|a|A|!.)/g ) },
|
462
|
+
|
463
|
+
// Format an object into a string using the formatting options.
|
464
|
+
toString: function ( formatString, itemObject ) {
|
465
|
+
var clock = this
|
466
|
+
return clock.formats.toArray( formatString ).map( function( label ) {
|
467
|
+
return Picker._.trigger( clock.formats[ label ], clock, [ 0, itemObject ] ) || label.replace( /^!/, '' )
|
468
|
+
}).join( '' )
|
469
|
+
}
|
470
|
+
} //TimePicker.prototype.formats
|
471
|
+
|
472
|
+
|
473
|
+
/**
|
474
|
+
* Flip an item as enabled or disabled.
|
475
|
+
*/
|
476
|
+
TimePicker.prototype.flipItem = function( type, value/*, options*/ ) {
|
477
|
+
|
478
|
+
var clock = this,
|
479
|
+
collection = clock.item.disable,
|
480
|
+
isFlipped = clock.item.enable === -1
|
481
|
+
|
482
|
+
// Flip the enabled and disabled times.
|
483
|
+
if ( value == 'flip' ) {
|
484
|
+
clock.item.enable = isFlipped ? 1 : -1
|
485
|
+
}
|
486
|
+
|
487
|
+
// Check if we have to add/remove from collection.
|
488
|
+
else if ( !isFlipped && type == 'enable' || isFlipped && type == 'disable' ) {
|
489
|
+
collection = clock.removeDisabled( collection, value )
|
490
|
+
}
|
491
|
+
else if ( !isFlipped && type == 'disable' || isFlipped && type == 'enable' ) {
|
492
|
+
collection = clock.addDisabled( collection, value )
|
493
|
+
}
|
494
|
+
|
495
|
+
return collection
|
496
|
+
} //TimePicker.prototype.flipItem
|
497
|
+
|
498
|
+
|
499
|
+
/**
|
500
|
+
* Add an item to the disabled collection.
|
501
|
+
*/
|
502
|
+
TimePicker.prototype.addDisabled = function( collection, item ) {
|
503
|
+
var clock = this
|
504
|
+
item.map( function( timeUnit ) {
|
505
|
+
if ( !clock.filterDisabled( collection, timeUnit ).length ) {
|
506
|
+
collection.push( timeUnit )
|
507
|
+
}
|
508
|
+
})
|
509
|
+
return collection
|
510
|
+
} //TimePicker.prototype.addDisabled
|
511
|
+
|
512
|
+
|
513
|
+
/**
|
514
|
+
* Remove an item from the disabled collection.
|
515
|
+
*/
|
516
|
+
TimePicker.prototype.removeDisabled = function( collection, item ) {
|
517
|
+
var clock = this
|
518
|
+
item.map( function( timeUnit ) {
|
519
|
+
collection = clock.filterDisabled( collection, timeUnit, 1 )
|
520
|
+
})
|
521
|
+
return collection
|
522
|
+
} //TimePicker.prototype.removeDisabled
|
523
|
+
|
524
|
+
|
525
|
+
/**
|
526
|
+
* Filter through the disabled collection to find a time unit.
|
527
|
+
*/
|
528
|
+
TimePicker.prototype.filterDisabled = function( collection, timeUnit, isRemoving ) {
|
529
|
+
var timeIsArray = Array.isArray( timeUnit )
|
530
|
+
return collection.filter( function( disabledTimeUnit ) {
|
531
|
+
var isMatch = !timeIsArray && timeUnit === disabledTimeUnit ||
|
532
|
+
timeIsArray && Array.isArray( disabledTimeUnit ) && timeUnit.toString() === disabledTimeUnit.toString()
|
533
|
+
return isRemoving ? !isMatch : isMatch
|
534
|
+
})
|
535
|
+
} //TimePicker.prototype.filterDisabled
|
536
|
+
|
537
|
+
|
538
|
+
/**
|
539
|
+
* The division to use for the range intervals.
|
540
|
+
*/
|
541
|
+
TimePicker.prototype.i = function( type, value/*, options*/ ) {
|
542
|
+
return Picker._.isInteger( value ) && value > 0 ? value : this.item.interval
|
543
|
+
}
|
544
|
+
|
545
|
+
|
546
|
+
/**
|
547
|
+
* Create a string for the nodes in the picker.
|
548
|
+
*/
|
549
|
+
TimePicker.prototype.nodes = function( isOpen ) {
|
550
|
+
|
551
|
+
var
|
552
|
+
clock = this,
|
553
|
+
settings = clock.settings,
|
554
|
+
selectedObject = clock.item.select,
|
555
|
+
highlightedObject = clock.item.highlight,
|
556
|
+
viewsetObject = clock.item.view,
|
557
|
+
disabledCollection = clock.item.disable
|
558
|
+
|
559
|
+
return Picker._.node( 'ul', Picker._.group({
|
560
|
+
min: clock.item.min.pick,
|
561
|
+
max: clock.item.max.pick,
|
562
|
+
i: clock.item.interval,
|
563
|
+
node: 'li',
|
564
|
+
item: function( loopedTime ) {
|
565
|
+
loopedTime = clock.create( loopedTime )
|
566
|
+
return [
|
567
|
+
Picker._.trigger( clock.formats.toString, clock, [ Picker._.trigger( settings.formatLabel, clock, [ loopedTime ] ) || settings.format, loopedTime ] ),
|
568
|
+
(function( klasses, timeMinutes ) {
|
569
|
+
|
570
|
+
if ( selectedObject && selectedObject.pick == timeMinutes ) {
|
571
|
+
klasses.push( settings.klass.selected )
|
572
|
+
}
|
573
|
+
|
574
|
+
if ( highlightedObject && highlightedObject.pick == timeMinutes ) {
|
575
|
+
klasses.push( settings.klass.highlighted )
|
576
|
+
}
|
577
|
+
|
578
|
+
if ( viewsetObject && viewsetObject.pick == timeMinutes ) {
|
579
|
+
klasses.push( settings.klass.viewset )
|
580
|
+
}
|
581
|
+
|
582
|
+
if ( disabledCollection && clock.disabled( loopedTime ) ) {
|
583
|
+
klasses.push( settings.klass.disabled )
|
584
|
+
}
|
585
|
+
|
586
|
+
return klasses.join( ' ' )
|
587
|
+
})( [ settings.klass.listItem ], loopedTime.pick ),
|
588
|
+
'data-pick=' + loopedTime.pick
|
589
|
+
]
|
590
|
+
}
|
591
|
+
}) + Picker._.node( 'li', Picker._.node( 'button', settings.clear, settings.klass.buttonClear, 'data-clear=1' + ( isOpen ? '' : ' disable' ) ) ), settings.klass.list )
|
592
|
+
} //TimePicker.prototype.nodes
|
593
|
+
|
594
|
+
|
595
|
+
|
596
|
+
|
597
|
+
|
598
|
+
|
599
|
+
|
600
|
+
/* ==========================================================================
|
601
|
+
Extend the picker to add the component with the defaults.
|
602
|
+
========================================================================== */
|
603
|
+
|
604
|
+
TimePicker.defaults = (function( prefix ) {
|
605
|
+
|
606
|
+
return {
|
607
|
+
|
608
|
+
// Clear
|
609
|
+
clear: 'Clear',
|
610
|
+
|
611
|
+
// The format to show on the `input` element
|
612
|
+
format: 'h:i A',
|
613
|
+
|
614
|
+
// The interval between each time
|
615
|
+
interval: 30,
|
616
|
+
|
617
|
+
// Classes
|
618
|
+
klass: {
|
619
|
+
|
620
|
+
picker: prefix + ' ' + prefix + '--time',
|
621
|
+
holder: prefix + '__holder',
|
622
|
+
|
623
|
+
list: prefix + '__list',
|
624
|
+
listItem: prefix + '__list-item',
|
625
|
+
|
626
|
+
disabled: prefix + '__list-item--disabled',
|
627
|
+
selected: prefix + '__list-item--selected',
|
628
|
+
highlighted: prefix + '__list-item--highlighted',
|
629
|
+
viewset: prefix + '__list-item--viewset',
|
630
|
+
now: prefix + '__list-item--now',
|
631
|
+
|
632
|
+
buttonClear: prefix + '__button--clear'
|
633
|
+
}
|
634
|
+
}
|
635
|
+
})( Picker.klasses().picker )
|
636
|
+
|
637
|
+
|
638
|
+
|
639
|
+
|
640
|
+
|
641
|
+
/**
|
642
|
+
* Extend the picker to add the date picker.
|
643
|
+
*/
|
644
|
+
Picker.extend( 'pickatime', TimePicker )
|
645
|
+
|
646
|
+
|
647
|
+
// Close the scope.
|
648
|
+
})();
|
649
|
+
|
650
|
+
|
651
|
+
|