materialize-sass 0.100.2 → 0.100.2.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/app/assets/javascripts/materialize/date_picker/picker.date.js +1120 -952
- data/app/assets/javascripts/materialize/date_picker/picker.js +723 -561
- data/app/assets/stylesheets/materialize/components/date_picker/_default.date.scss +43 -30
- data/app/assets/stylesheets/materialize/components/date_picker/_default.scss +7 -3
- data/lib/materialize-sass/version.rb +1 -1
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 10f312120051d650a859c2ded14e86821d455166e9b290b431de01a2b8e2d0ca
|
4
|
+
data.tar.gz: 7756573ea82e2cc222d4ea4cb9e4b40e4947931f555826b5ddc14ab8d9172c3c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '0981080c6260cf76d64720b04633da6fdcad713c553b794850466f0fb96c37f2da046758d21fafcaee5164c8d2fd03b1d218d3c9aff3fb943be1603b87254d68'
|
7
|
+
data.tar.gz: f8c61b196caf0e20c1d72cdfef2683ab2a76eb84ba2755fe34b861a281e0a157509e13b75ddefce5af9eade17a39b2352f04b9517c4752e1f6d257a87600d433
|
@@ -1,980 +1,1088 @@
|
|
1
1
|
/*!
|
2
|
-
* Date picker for pickadate.js v3.
|
2
|
+
* Date picker for pickadate.js v3.6.1
|
3
3
|
* http://amsul.github.io/pickadate.js/date.htm
|
4
4
|
*/
|
5
5
|
|
6
|
-
(function (factory) {
|
6
|
+
(function ( factory ) {
|
7
7
|
factory(Materialize.Picker, jQuery);
|
8
|
-
})(function
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
8
|
+
})(function( Picker, $ ) {
|
9
|
+
|
10
|
+
|
11
|
+
/**
|
12
|
+
* Globals and constants
|
13
|
+
*/
|
14
|
+
var DAYS_IN_WEEK = 7,
|
15
|
+
WEEKS_IN_CALENDAR = 6,
|
16
|
+
_ = Picker._
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
/**
|
21
|
+
* The date picker constructor
|
22
|
+
*/
|
23
|
+
function DatePicker( picker, settings ) {
|
24
|
+
|
25
|
+
var calendar = this,
|
26
|
+
element = picker.$node[ 0 ],
|
27
|
+
elementValue = element.value,
|
28
|
+
elementDataValue = picker.$node.data( 'value' ),
|
29
|
+
valueString = elementDataValue || elementValue,
|
30
|
+
formatString = elementDataValue ? settings.formatSubmit : settings.format,
|
31
|
+
isRTL = function() {
|
29
32
|
|
30
33
|
return element.currentStyle ?
|
31
34
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
};
|
38
|
-
|
39
|
-
calendar.settings = settings;
|
40
|
-
calendar.$node = picker.$node;
|
41
|
-
|
42
|
-
// The queue of methods that will be used to build item objects.
|
43
|
-
calendar.queue = {
|
44
|
-
min: 'measure create',
|
45
|
-
max: 'measure create',
|
46
|
-
now: 'now create',
|
47
|
-
select: 'parse create validate',
|
48
|
-
highlight: 'parse navigate create validate',
|
49
|
-
view: 'parse create validate viewset',
|
50
|
-
disable: 'deactivate',
|
51
|
-
enable: 'activate'
|
52
|
-
|
53
|
-
// The component's item object.
|
54
|
-
};calendar.item = {};
|
55
|
-
|
56
|
-
calendar.item.clear = null;
|
57
|
-
calendar.item.disable = (settings.disable || []).slice(0);
|
58
|
-
calendar.item.enable = -function (collectionDisabled) {
|
59
|
-
return collectionDisabled[0] === true ? collectionDisabled.shift() : -1;
|
60
|
-
}(calendar.item.disable);
|
61
|
-
|
62
|
-
calendar.set('min', settings.min).set('max', settings.max).set('now');
|
63
|
-
|
64
|
-
// When there’s a value, set the `select`, which in turn
|
65
|
-
// also sets the `highlight` and `view`.
|
66
|
-
if (valueString) {
|
67
|
-
calendar.set('select', valueString, { format: formatString });
|
35
|
+
// For IE.
|
36
|
+
element.currentStyle.direction == 'rtl' :
|
37
|
+
|
38
|
+
// For normal browsers.
|
39
|
+
getComputedStyle( picker.$root[0] ).direction == 'rtl'
|
68
40
|
}
|
69
41
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
42
|
+
calendar.settings = settings
|
43
|
+
calendar.$node = picker.$node
|
44
|
+
|
45
|
+
// The queue of methods that will be used to build item objects.
|
46
|
+
calendar.queue = {
|
47
|
+
min: 'measure create',
|
48
|
+
max: 'measure create',
|
49
|
+
now: 'now create',
|
50
|
+
select: 'parse create validate',
|
51
|
+
highlight: 'parse navigate create validate',
|
52
|
+
view: 'parse create validate viewset',
|
53
|
+
disable: 'deactivate',
|
54
|
+
enable: 'activate'
|
55
|
+
}
|
56
|
+
|
57
|
+
// The component's item object.
|
58
|
+
calendar.item = {}
|
59
|
+
|
60
|
+
calendar.item.clear = null
|
61
|
+
calendar.item.disable = ( settings.disable || [] ).slice( 0 )
|
62
|
+
calendar.item.enable = -(function( collectionDisabled ) {
|
63
|
+
return collectionDisabled[ 0 ] === true ? collectionDisabled.shift() : -1
|
64
|
+
})( calendar.item.disable )
|
65
|
+
|
66
|
+
calendar.
|
67
|
+
set( 'min', settings.min ).
|
68
|
+
set( 'max', settings.max ).
|
69
|
+
set( 'now' )
|
70
|
+
|
71
|
+
// When there’s a value, set the `select`, which in turn
|
72
|
+
// also sets the `highlight` and `view`.
|
73
|
+
if ( valueString ) {
|
74
|
+
calendar.set( 'select', valueString, {
|
75
|
+
format: formatString,
|
76
|
+
defaultValue: true
|
77
|
+
})
|
78
|
+
}
|
79
|
+
|
80
|
+
// If there’s no value, default to highlighting “today”.
|
81
|
+
else {
|
82
|
+
calendar.
|
83
|
+
set( 'select', null ).
|
84
|
+
set( 'highlight', calendar.item.now )
|
85
|
+
}
|
86
|
+
|
87
|
+
|
88
|
+
// The keycode to movement mapping.
|
89
|
+
calendar.key = {
|
90
|
+
40: 7, // Down
|
91
|
+
38: -7, // Up
|
92
|
+
39: function() { return isRTL() ? -1 : 1 }, // Right
|
93
|
+
37: function() { return isRTL() ? 1 : -1 }, // Left
|
94
|
+
go: function( timeChange ) {
|
95
|
+
var highlightedObject = calendar.item.highlight,
|
96
|
+
targetDate = new Date( highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange )
|
97
|
+
calendar.set(
|
98
|
+
'highlight',
|
99
|
+
targetDate,
|
100
|
+
{ interval: timeChange }
|
101
|
+
)
|
102
|
+
this.render()
|
103
|
+
}
|
104
|
+
}
|
74
105
|
|
75
|
-
// The keycode to movement mapping.
|
76
|
-
calendar.key = {
|
77
|
-
40: 7, // Down
|
78
|
-
38: -7, // Up
|
79
|
-
39: function () {
|
80
|
-
return isRTL() ? -1 : 1;
|
81
|
-
}, // Right
|
82
|
-
37: function () {
|
83
|
-
return isRTL() ? 1 : -1;
|
84
|
-
}, // Left
|
85
|
-
go: function (timeChange) {
|
86
|
-
var highlightedObject = calendar.item.highlight,
|
87
|
-
targetDate = new Date(highlightedObject.year, highlightedObject.month, highlightedObject.date + timeChange);
|
88
|
-
calendar.set('highlight', targetDate, { interval: timeChange });
|
89
|
-
this.render();
|
90
|
-
}
|
91
106
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
picker
|
107
|
+
// Bind some picker events.
|
108
|
+
picker.
|
109
|
+
on( 'render', function() {
|
110
|
+
picker.$root.find( '.' + settings.klass.selectMonth ).on( 'change', function() {
|
111
|
+
var value = this.value
|
112
|
+
if ( value ) {
|
113
|
+
picker.set( 'highlight', [ picker.get( 'view' ).year, value, picker.get( 'highlight' ).date ] )
|
114
|
+
picker.$root.find( '.' + settings.klass.selectMonth ).trigger( 'focus' )
|
99
115
|
}
|
100
|
-
})
|
101
|
-
picker.$root.find('.' + settings.klass.selectYear).on('change', function
|
102
|
-
var value = this.value
|
103
|
-
if (value) {
|
104
|
-
picker.set('highlight', [value, picker.get('view').month, picker.get('highlight').date])
|
105
|
-
picker.$root.find('.' + settings.klass.selectYear).trigger('focus')
|
116
|
+
})
|
117
|
+
picker.$root.find( '.' + settings.klass.selectYear ).on( 'change', function() {
|
118
|
+
var value = this.value
|
119
|
+
if ( value ) {
|
120
|
+
picker.set( 'highlight', [ value, picker.get( 'view' ).month, picker.get( 'highlight' ).date ] )
|
121
|
+
picker.$root.find( '.' + settings.klass.selectYear ).trigger( 'focus' )
|
106
122
|
}
|
107
|
-
})
|
108
|
-
}, 1).
|
109
|
-
|
110
|
-
|
111
|
-
|
123
|
+
})
|
124
|
+
}, 1 ).
|
125
|
+
on( 'open', function() {
|
126
|
+
var includeToday = ''
|
127
|
+
if ( calendar.disabled( calendar.get('now') ) ) {
|
128
|
+
includeToday = ':not(.' + settings.klass.buttonToday + ')'
|
112
129
|
}
|
113
|
-
picker.$root.find('button' + includeToday + ', select').attr('disabled', false)
|
114
|
-
}, 1).
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
130
|
+
picker.$root.find( 'button' + includeToday + ', select' ).attr( 'disabled', false )
|
131
|
+
}, 1 ).
|
132
|
+
on( 'close', function() {
|
133
|
+
picker.$root.find( 'button, select' ).attr( 'disabled', true )
|
134
|
+
}, 1 )
|
135
|
+
|
136
|
+
} //DatePicker
|
137
|
+
|
138
|
+
|
139
|
+
/**
|
140
|
+
* Set a datepicker item object.
|
141
|
+
*/
|
142
|
+
DatePicker.prototype.set = function( type, value, options ) {
|
143
|
+
|
144
|
+
var calendar = this,
|
145
|
+
calendarItem = calendar.item
|
146
|
+
|
147
|
+
// If the value is `null` just set it immediately.
|
148
|
+
if ( value === null ) {
|
149
|
+
if ( type == 'clear' ) type = 'select'
|
150
|
+
calendarItem[ type ] = value
|
151
|
+
return calendar
|
152
|
+
}
|
153
|
+
|
154
|
+
// Otherwise go through the queue of methods, and invoke the functions.
|
155
|
+
// Update this as the time unit, and set the final value as this item.
|
156
|
+
// * In the case of `enable`, keep the queue but set `disable` instead.
|
157
|
+
// And in the case of `flip`, keep the queue but set `enable` instead.
|
158
|
+
calendarItem[ ( type == 'enable' ? 'disable' : type == 'flip' ? 'enable' : type ) ] = calendar.queue[ type ].split( ' ' ).map( function( method ) {
|
159
|
+
value = calendar[ method ]( type, value, options )
|
160
|
+
return value
|
161
|
+
}).pop()
|
162
|
+
|
163
|
+
// Check if we need to cascade through more updates.
|
164
|
+
if ( type == 'select' ) {
|
165
|
+
calendar.set( 'highlight', calendarItem.select, options )
|
166
|
+
}
|
167
|
+
else if ( type == 'highlight' ) {
|
168
|
+
calendar.set( 'view', calendarItem.highlight, options )
|
169
|
+
}
|
170
|
+
else if ( type.match( /^(flip|min|max|disable|enable)$/ ) ) {
|
171
|
+
if ( calendarItem.select && calendar.disabled( calendarItem.select ) ) {
|
172
|
+
calendar.set( 'select', calendarItem.select, options )
|
173
|
+
}
|
174
|
+
if ( calendarItem.highlight && calendar.disabled( calendarItem.highlight ) ) {
|
175
|
+
calendar.set( 'highlight', calendarItem.highlight, options )
|
133
176
|
}
|
177
|
+
}
|
134
178
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
179
|
+
return calendar
|
180
|
+
} //DatePicker.prototype.set
|
181
|
+
|
182
|
+
|
183
|
+
/**
|
184
|
+
* Get a datepicker item object.
|
185
|
+
*/
|
186
|
+
DatePicker.prototype.get = function( type ) {
|
187
|
+
return this.item[ type ]
|
188
|
+
} //DatePicker.prototype.get
|
189
|
+
|
190
|
+
|
191
|
+
/**
|
192
|
+
* Create a picker date object.
|
193
|
+
*/
|
194
|
+
DatePicker.prototype.create = function( type, value, options ) {
|
195
|
+
|
196
|
+
var isInfiniteValue,
|
197
|
+
calendar = this
|
198
|
+
|
199
|
+
// If there’s no value, use the type as the value.
|
200
|
+
value = value === undefined ? type : value
|
201
|
+
|
202
|
+
|
203
|
+
// If it’s infinity, update the value.
|
204
|
+
if ( value == -Infinity || value == Infinity ) {
|
205
|
+
isInfiniteValue = value
|
206
|
+
}
|
207
|
+
|
208
|
+
// If it’s an object, use the native date object.
|
209
|
+
else if ( $.isPlainObject( value ) && _.isInteger( value.pick ) ) {
|
210
|
+
value = value.obj
|
211
|
+
}
|
212
|
+
|
213
|
+
// If it’s an array, convert it into a date and make sure
|
214
|
+
// that it’s a valid date – otherwise default to today.
|
215
|
+
else if ( $.isArray( value ) ) {
|
216
|
+
value = new Date( value[ 0 ], value[ 1 ], value[ 2 ] )
|
217
|
+
value = _.isDate( value ) ? value : calendar.create().obj
|
218
|
+
}
|
219
|
+
|
220
|
+
// If it’s a number or date object, make a normalized date.
|
221
|
+
else if ( _.isInteger( value ) || _.isDate( value ) ) {
|
222
|
+
value = calendar.normalize( new Date( value ), options )
|
223
|
+
}
|
224
|
+
|
225
|
+
// If it’s a literal true or any other case, set it to now.
|
226
|
+
else /*if ( value === true )*/ {
|
227
|
+
value = calendar.now( type, value, options )
|
228
|
+
}
|
229
|
+
|
230
|
+
// Return the compiled object.
|
231
|
+
return {
|
232
|
+
year: isInfiniteValue || value.getFullYear(),
|
233
|
+
month: isInfiniteValue || value.getMonth(),
|
234
|
+
date: isInfiniteValue || value.getDate(),
|
235
|
+
day: isInfiniteValue || value.getDay(),
|
236
|
+
obj: isInfiniteValue || value,
|
237
|
+
pick: isInfiniteValue || value.getTime()
|
238
|
+
}
|
239
|
+
} //DatePicker.prototype.create
|
240
|
+
|
241
|
+
|
242
|
+
/**
|
243
|
+
* Create a range limit object using an array, date object,
|
244
|
+
* literal “true”, or integer relative to another time.
|
245
|
+
*/
|
246
|
+
DatePicker.prototype.createRange = function( from, to ) {
|
247
|
+
|
248
|
+
var calendar = this,
|
249
|
+
createDate = function( date ) {
|
250
|
+
if ( date === true || $.isArray( date ) || _.isDate( date ) ) {
|
251
|
+
return calendar.create( date )
|
155
252
|
}
|
253
|
+
return date
|
156
254
|
}
|
157
255
|
|
158
|
-
|
159
|
-
|
256
|
+
// Create objects if possible.
|
257
|
+
if ( !_.isInteger( from ) ) {
|
258
|
+
from = createDate( from )
|
259
|
+
}
|
260
|
+
if ( !_.isInteger( to ) ) {
|
261
|
+
to = createDate( to )
|
262
|
+
}
|
263
|
+
|
264
|
+
// Create relative dates.
|
265
|
+
if ( _.isInteger( from ) && $.isPlainObject( to ) ) {
|
266
|
+
from = [ to.year, to.month, to.date + from ];
|
267
|
+
}
|
268
|
+
else if ( _.isInteger( to ) && $.isPlainObject( from ) ) {
|
269
|
+
to = [ from.year, from.month, from.date + to ];
|
270
|
+
}
|
271
|
+
|
272
|
+
return {
|
273
|
+
from: createDate( from ),
|
274
|
+
to: createDate( to )
|
275
|
+
}
|
276
|
+
} //DatePicker.prototype.createRange
|
277
|
+
|
278
|
+
|
279
|
+
/**
|
280
|
+
* Check if a date unit falls within a date range object.
|
281
|
+
*/
|
282
|
+
DatePicker.prototype.withinRange = function( range, dateUnit ) {
|
283
|
+
range = this.createRange(range.from, range.to)
|
284
|
+
return dateUnit.pick >= range.from.pick && dateUnit.pick <= range.to.pick
|
285
|
+
}
|
160
286
|
|
161
287
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
return this.item[type];
|
167
|
-
}; //DatePicker.prototype.get
|
288
|
+
/**
|
289
|
+
* Check if two date range objects overlap.
|
290
|
+
*/
|
291
|
+
DatePicker.prototype.overlapRanges = function( one, two ) {
|
168
292
|
|
293
|
+
var calendar = this
|
169
294
|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
DatePicker.prototype.create = function (type, value, options) {
|
295
|
+
// Convert the ranges into comparable dates.
|
296
|
+
one = calendar.createRange( one.from, one.to )
|
297
|
+
two = calendar.createRange( two.from, two.to )
|
174
298
|
|
175
|
-
|
176
|
-
|
299
|
+
return calendar.withinRange( one, two.from ) || calendar.withinRange( one, two.to ) ||
|
300
|
+
calendar.withinRange( two, one.from ) || calendar.withinRange( two, one.to )
|
301
|
+
}
|
177
302
|
|
178
|
-
// If there’s no value, use the type as the value.
|
179
|
-
value = value === undefined ? type : value;
|
180
303
|
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
304
|
+
/**
|
305
|
+
* Get the date today.
|
306
|
+
*/
|
307
|
+
DatePicker.prototype.now = function( type, value, options ) {
|
308
|
+
value = new Date()
|
309
|
+
if ( options && options.rel ) {
|
310
|
+
value.setDate( value.getDate() + options.rel )
|
311
|
+
}
|
312
|
+
return this.normalize( value, options )
|
313
|
+
}
|
185
314
|
|
186
|
-
// If it’s an object, use the native date object.
|
187
|
-
else if ($.isPlainObject(value) && _.isInteger(value.pick)) {
|
188
|
-
value = value.obj;
|
189
|
-
}
|
190
315
|
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
value = _.isDate(value) ? value : calendar.create().obj;
|
196
|
-
}
|
316
|
+
/**
|
317
|
+
* Navigate to next/prev month.
|
318
|
+
*/
|
319
|
+
DatePicker.prototype.navigate = function( type, value, options ) {
|
197
320
|
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
321
|
+
var targetDateObject,
|
322
|
+
targetYear,
|
323
|
+
targetMonth,
|
324
|
+
targetDate,
|
325
|
+
isTargetArray = $.isArray( value ),
|
326
|
+
isTargetObject = $.isPlainObject( value ),
|
327
|
+
viewsetObject = this.item.view/*,
|
328
|
+
safety = 100*/
|
202
329
|
|
203
|
-
// If it’s a literal true or any other case, set it to now.
|
204
|
-
else /*if ( value === true )*/{
|
205
|
-
value = calendar.now(type, value, options);
|
206
|
-
}
|
207
330
|
|
208
|
-
|
209
|
-
return {
|
210
|
-
year: isInfiniteValue || value.getFullYear(),
|
211
|
-
month: isInfiniteValue || value.getMonth(),
|
212
|
-
date: isInfiniteValue || value.getDate(),
|
213
|
-
day: isInfiniteValue || value.getDay(),
|
214
|
-
obj: isInfiniteValue || value,
|
215
|
-
pick: isInfiniteValue || value.getTime()
|
216
|
-
};
|
217
|
-
}; //DatePicker.prototype.create
|
218
|
-
|
219
|
-
|
220
|
-
/**
|
221
|
-
* Create a range limit object using an array, date object,
|
222
|
-
* literal “true”, or integer relative to another time.
|
223
|
-
*/
|
224
|
-
DatePicker.prototype.createRange = function (from, to) {
|
225
|
-
|
226
|
-
var calendar = this,
|
227
|
-
createDate = function (date) {
|
228
|
-
if (date === true || $.isArray(date) || _.isDate(date)) {
|
229
|
-
return calendar.create(date);
|
230
|
-
}
|
231
|
-
return date;
|
232
|
-
};
|
331
|
+
if ( isTargetArray || isTargetObject ) {
|
233
332
|
|
234
|
-
|
235
|
-
|
236
|
-
|
333
|
+
if ( isTargetObject ) {
|
334
|
+
targetYear = value.year
|
335
|
+
targetMonth = value.month
|
336
|
+
targetDate = value.date
|
237
337
|
}
|
238
|
-
|
239
|
-
|
338
|
+
else {
|
339
|
+
targetYear = +value[0]
|
340
|
+
targetMonth = +value[1]
|
341
|
+
targetDate = +value[2]
|
240
342
|
}
|
241
343
|
|
242
|
-
//
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
344
|
+
// If we’re navigating months but the view is in a different
|
345
|
+
// month, navigate to the view’s year and month.
|
346
|
+
if ( options && options.nav && viewsetObject && viewsetObject.month !== targetMonth ) {
|
347
|
+
targetYear = viewsetObject.year
|
348
|
+
targetMonth = viewsetObject.month
|
247
349
|
}
|
248
350
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
};
|
263
|
-
|
264
|
-
/**
|
265
|
-
* Check if two date range objects overlap.
|
266
|
-
*/
|
267
|
-
DatePicker.prototype.overlapRanges = function (one, two) {
|
268
|
-
|
269
|
-
var calendar = this;
|
270
|
-
|
271
|
-
// Convert the ranges into comparable dates.
|
272
|
-
one = calendar.createRange(one.from, one.to);
|
273
|
-
two = calendar.createRange(two.from, two.to);
|
274
|
-
|
275
|
-
return calendar.withinRange(one, two.from) || calendar.withinRange(one, two.to) || calendar.withinRange(two, one.from) || calendar.withinRange(two, one.to);
|
276
|
-
};
|
277
|
-
|
278
|
-
/**
|
279
|
-
* Get the date today.
|
280
|
-
*/
|
281
|
-
DatePicker.prototype.now = function (type, value, options) {
|
282
|
-
value = new Date();
|
283
|
-
if (options && options.rel) {
|
284
|
-
value.setDate(value.getDate() + options.rel);
|
351
|
+
// Figure out the expected target year and month.
|
352
|
+
targetDateObject = new Date( targetYear, targetMonth + ( options && options.nav ? options.nav : 0 ), 1 )
|
353
|
+
targetYear = targetDateObject.getFullYear()
|
354
|
+
targetMonth = targetDateObject.getMonth()
|
355
|
+
|
356
|
+
// If the month we’re going to doesn’t have enough days,
|
357
|
+
// keep decreasing the date until we reach the month’s last date.
|
358
|
+
while ( /*safety &&*/ new Date( targetYear, targetMonth, targetDate ).getMonth() !== targetMonth ) {
|
359
|
+
targetDate -= 1
|
360
|
+
/*safety -= 1
|
361
|
+
if ( !safety ) {
|
362
|
+
throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'
|
363
|
+
}*/
|
285
364
|
}
|
286
|
-
return this.normalize(value, options);
|
287
|
-
};
|
288
|
-
|
289
|
-
/**
|
290
|
-
* Navigate to next/prev month.
|
291
|
-
*/
|
292
|
-
DatePicker.prototype.navigate = function (type, value, options) {
|
293
|
-
|
294
|
-
var targetDateObject,
|
295
|
-
targetYear,
|
296
|
-
targetMonth,
|
297
|
-
targetDate,
|
298
|
-
isTargetArray = $.isArray(value),
|
299
|
-
isTargetObject = $.isPlainObject(value),
|
300
|
-
viewsetObject = this.item.view; /*,
|
301
|
-
safety = 100*/
|
302
|
-
|
303
|
-
if (isTargetArray || isTargetObject) {
|
304
|
-
|
305
|
-
if (isTargetObject) {
|
306
|
-
targetYear = value.year;
|
307
|
-
targetMonth = value.month;
|
308
|
-
targetDate = value.date;
|
309
|
-
} else {
|
310
|
-
targetYear = +value[0];
|
311
|
-
targetMonth = +value[1];
|
312
|
-
targetDate = +value[2];
|
313
|
-
}
|
314
|
-
|
315
|
-
// If we’re navigating months but the view is in a different
|
316
|
-
// month, navigate to the view’s year and month.
|
317
|
-
if (options && options.nav && viewsetObject && viewsetObject.month !== targetMonth) {
|
318
|
-
targetYear = viewsetObject.year;
|
319
|
-
targetMonth = viewsetObject.month;
|
320
|
-
}
|
321
365
|
|
322
|
-
|
323
|
-
|
324
|
-
targetYear = targetDateObject.getFullYear();
|
325
|
-
targetMonth = targetDateObject.getMonth();
|
326
|
-
|
327
|
-
// If the month we’re going to doesn’t have enough days,
|
328
|
-
// keep decreasing the date until we reach the month’s last date.
|
329
|
-
while ( /*safety &&*/new Date(targetYear, targetMonth, targetDate).getMonth() !== targetMonth) {
|
330
|
-
targetDate -= 1;
|
331
|
-
/*safety -= 1
|
332
|
-
if ( !safety ) {
|
333
|
-
throw 'Fell into an infinite loop while navigating to ' + new Date( targetYear, targetMonth, targetDate ) + '.'
|
334
|
-
}*/
|
335
|
-
}
|
366
|
+
value = [ targetYear, targetMonth, targetDate ]
|
367
|
+
}
|
336
368
|
|
337
|
-
|
338
|
-
|
369
|
+
return value
|
370
|
+
} //DatePicker.prototype.navigate
|
339
371
|
|
340
|
-
return value;
|
341
|
-
}; //DatePicker.prototype.navigate
|
342
372
|
|
373
|
+
/**
|
374
|
+
* Normalize a date by setting the hours to midnight.
|
375
|
+
*/
|
376
|
+
DatePicker.prototype.normalize = function( value/*, options*/ ) {
|
377
|
+
value.setHours( 0, 0, 0, 0 )
|
378
|
+
return value
|
379
|
+
}
|
343
380
|
|
344
|
-
/**
|
345
|
-
* Normalize a date by setting the hours to midnight.
|
346
|
-
*/
|
347
|
-
DatePicker.prototype.normalize = function (value /*, options*/) {
|
348
|
-
value.setHours(0, 0, 0, 0);
|
349
|
-
return value;
|
350
|
-
};
|
351
381
|
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
382
|
+
/**
|
383
|
+
* Measure the range of dates.
|
384
|
+
*/
|
385
|
+
DatePicker.prototype.measure = function( type, value/*, options*/ ) {
|
356
386
|
|
357
|
-
|
387
|
+
var calendar = this
|
358
388
|
|
359
|
-
|
360
|
-
|
361
|
-
|
362
|
-
|
389
|
+
// If it's an integer, get a date relative to today.
|
390
|
+
if ( _.isInteger( value ) ) {
|
391
|
+
value = calendar.now( type, value, { rel: value } )
|
392
|
+
}
|
363
393
|
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
|
394
|
+
// If it’s anything false-y, remove the limits.
|
395
|
+
else if ( !value ) {
|
396
|
+
value = type == 'min' ? -Infinity : Infinity
|
397
|
+
}
|
368
398
|
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
399
|
+
// If it’s a string, parse it.
|
400
|
+
else if ( typeof value == 'string' ) {
|
401
|
+
value = calendar.parse( type, value )
|
402
|
+
}
|
373
403
|
|
374
|
-
|
375
|
-
|
404
|
+
return value
|
405
|
+
} ///DatePicker.prototype.measure
|
376
406
|
|
377
407
|
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
408
|
+
/**
|
409
|
+
* Create a viewset object based on navigation.
|
410
|
+
*/
|
411
|
+
DatePicker.prototype.viewset = function( type, dateObject/*, options*/ ) {
|
412
|
+
return this.create([ dateObject.year, dateObject.month, 1 ])
|
413
|
+
}
|
384
414
|
|
385
|
-
/**
|
386
|
-
* Validate a date as enabled and shift if needed.
|
387
|
-
*/
|
388
|
-
DatePicker.prototype.validate = function (type, dateObject, options) {
|
389
415
|
|
390
|
-
|
416
|
+
/**
|
417
|
+
* Validate a date as enabled and shift if needed.
|
418
|
+
*/
|
419
|
+
DatePicker.prototype.validate = function( type, dateObject, options ) {
|
391
420
|
|
421
|
+
var calendar = this,
|
392
422
|
|
393
423
|
// Keep a reference to the original date.
|
394
424
|
originalDateObject = dateObject,
|
395
425
|
|
396
|
-
|
397
426
|
// Make sure we have an interval.
|
398
427
|
interval = options && options.interval ? options.interval : 1,
|
399
428
|
|
400
|
-
|
401
429
|
// Check if the calendar enabled dates are inverted.
|
402
430
|
isFlippedBase = calendar.item.enable === -1,
|
403
431
|
|
404
|
-
|
405
432
|
// Check if we have any enabled dates after/before now.
|
406
|
-
hasEnabledBeforeTarget,
|
407
|
-
hasEnabledAfterTarget,
|
408
|
-
|
433
|
+
hasEnabledBeforeTarget, hasEnabledAfterTarget,
|
409
434
|
|
410
435
|
// The min & max limits.
|
411
436
|
minLimitObject = calendar.item.min,
|
412
|
-
|
413
|
-
|
437
|
+
maxLimitObject = calendar.item.max,
|
414
438
|
|
415
439
|
// Check if we’ve reached the limit during shifting.
|
416
|
-
reachedMin,
|
417
|
-
reachedMax,
|
418
|
-
|
440
|
+
reachedMin, reachedMax,
|
419
441
|
|
420
442
|
// Check if the calendar is inverted and at least one weekday is enabled.
|
421
|
-
hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter(function
|
443
|
+
hasEnabledWeekdays = isFlippedBase && calendar.item.disable.filter( function( value ) {
|
422
444
|
|
423
445
|
// If there’s a date, check where it is relative to the target.
|
424
|
-
if ($.isArray(value)) {
|
425
|
-
var dateTime = calendar.create(value).pick
|
426
|
-
if (dateTime < dateObject.pick) hasEnabledBeforeTarget = true
|
446
|
+
if ( $.isArray( value ) ) {
|
447
|
+
var dateTime = calendar.create( value ).pick
|
448
|
+
if ( dateTime < dateObject.pick ) hasEnabledBeforeTarget = true
|
449
|
+
else if ( dateTime > dateObject.pick ) hasEnabledAfterTarget = true
|
427
450
|
}
|
428
451
|
|
429
452
|
// Return only integers for enabled weekdays.
|
430
|
-
return _.isInteger(value)
|
431
|
-
}).length
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
453
|
+
return _.isInteger( value )
|
454
|
+
}).length/*,
|
455
|
+
|
456
|
+
safety = 100*/
|
457
|
+
|
458
|
+
|
459
|
+
|
460
|
+
// Cases to validate for:
|
461
|
+
// [1] Not inverted and date disabled.
|
462
|
+
// [2] Inverted and some dates enabled.
|
463
|
+
// [3] Not inverted and out of range.
|
464
|
+
//
|
465
|
+
// Cases to **not** validate for:
|
466
|
+
// • Navigating months.
|
467
|
+
// • Not inverted and date enabled.
|
468
|
+
// • Inverted and all dates disabled.
|
469
|
+
// • ..and anything else.
|
470
|
+
if ( !options || (!options.nav && !options.defaultValue) ) if (
|
471
|
+
/* 1 */ ( !isFlippedBase && calendar.disabled( dateObject ) ) ||
|
472
|
+
/* 2 */ ( isFlippedBase && calendar.disabled( dateObject ) && ( hasEnabledWeekdays || hasEnabledBeforeTarget || hasEnabledAfterTarget ) ) ||
|
473
|
+
/* 3 */ ( !isFlippedBase && (dateObject.pick <= minLimitObject.pick || dateObject.pick >= maxLimitObject.pick) )
|
474
|
+
) {
|
475
|
+
|
476
|
+
|
477
|
+
// When inverted, flip the direction if there aren’t any enabled weekdays
|
478
|
+
// and there are no enabled dates in the direction of the interval.
|
479
|
+
if ( isFlippedBase && !hasEnabledWeekdays && ( ( !hasEnabledAfterTarget && interval > 0 ) || ( !hasEnabledBeforeTarget && interval < 0 ) ) ) {
|
480
|
+
interval *= -1
|
481
|
+
}
|
454
482
|
|
455
|
-
// Keep looping until we reach an enabled date.
|
456
|
-
while ( /*safety &&*/calendar.disabled(dateObject)) {
|
457
483
|
|
458
|
-
|
459
|
-
|
460
|
-
throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'
|
461
|
-
}*/
|
484
|
+
// Keep looping until we reach an enabled date.
|
485
|
+
while ( /*safety &&*/ calendar.disabled( dateObject ) ) {
|
462
486
|
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
}
|
487
|
+
/*safety -= 1
|
488
|
+
if ( !safety ) {
|
489
|
+
throw 'Fell into an infinite loop while validating ' + dateObject.obj + '.'
|
490
|
+
}*/
|
468
491
|
|
469
|
-
// If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.
|
470
|
-
if (dateObject.pick <= minLimitObject.pick) {
|
471
|
-
reachedMin = true;
|
472
|
-
interval = 1;
|
473
|
-
dateObject = calendar.create([minLimitObject.year, minLimitObject.month, minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)]);
|
474
|
-
} else if (dateObject.pick >= maxLimitObject.pick) {
|
475
|
-
reachedMax = true;
|
476
|
-
interval = -1;
|
477
|
-
dateObject = calendar.create([maxLimitObject.year, maxLimitObject.month, maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)]);
|
478
|
-
}
|
479
492
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
493
|
+
// If we’ve looped into the next/prev month with a large interval, return to the original date and flatten the interval.
|
494
|
+
if ( Math.abs( interval ) > 1 && ( dateObject.month < originalDateObject.month || dateObject.month > originalDateObject.month ) ) {
|
495
|
+
dateObject = originalDateObject
|
496
|
+
interval = interval > 0 ? 1 : -1
|
497
|
+
}
|
484
498
|
|
485
|
-
|
486
|
-
|
499
|
+
|
500
|
+
// If we’ve reached the min/max limit, reverse the direction, flatten the interval and set it to the limit.
|
501
|
+
if ( dateObject.pick <= minLimitObject.pick ) {
|
502
|
+
reachedMin = true
|
503
|
+
interval = 1
|
504
|
+
dateObject = calendar.create([
|
505
|
+
minLimitObject.year,
|
506
|
+
minLimitObject.month,
|
507
|
+
minLimitObject.date + (dateObject.pick === minLimitObject.pick ? 0 : -1)
|
508
|
+
])
|
509
|
+
}
|
510
|
+
else if ( dateObject.pick >= maxLimitObject.pick ) {
|
511
|
+
reachedMax = true
|
512
|
+
interval = -1
|
513
|
+
dateObject = calendar.create([
|
514
|
+
maxLimitObject.year,
|
515
|
+
maxLimitObject.month,
|
516
|
+
maxLimitObject.date + (dateObject.pick === maxLimitObject.pick ? 0 : 1)
|
517
|
+
])
|
487
518
|
}
|
488
|
-
} //endif
|
489
519
|
|
490
520
|
|
491
|
-
|
492
|
-
|
493
|
-
|
521
|
+
// If we’ve reached both limits, just break out of the loop.
|
522
|
+
if ( reachedMin && reachedMax ) {
|
523
|
+
break
|
524
|
+
}
|
525
|
+
|
494
526
|
|
527
|
+
// Finally, create the shifted date using the interval and keep looping.
|
528
|
+
dateObject = calendar.create([ dateObject.year, dateObject.month, dateObject.date + interval ])
|
529
|
+
}
|
495
530
|
|
496
|
-
|
497
|
-
* Check if a date is disabled.
|
498
|
-
*/
|
499
|
-
DatePicker.prototype.disabled = function (dateToVerify) {
|
531
|
+
} //endif
|
500
532
|
|
501
|
-
var calendar = this,
|
502
533
|
|
534
|
+
// Return the date object settled on.
|
535
|
+
return dateObject
|
536
|
+
} //DatePicker.prototype.validate
|
537
|
+
|
538
|
+
|
539
|
+
/**
|
540
|
+
* Check if a date is disabled.
|
541
|
+
*/
|
542
|
+
DatePicker.prototype.disabled = function( dateToVerify ) {
|
543
|
+
|
544
|
+
var
|
545
|
+
calendar = this,
|
503
546
|
|
504
547
|
// Filter through the disabled dates to check if this is one.
|
505
|
-
isDisabledMatch = calendar.item.disable.filter(function
|
548
|
+
isDisabledMatch = calendar.item.disable.filter( function( dateToDisable ) {
|
506
549
|
|
507
550
|
// If the date is a number, match the weekday with 0index and `firstDay` check.
|
508
|
-
if (_.isInteger(dateToDisable)) {
|
509
|
-
return dateToVerify.day === (calendar.settings.firstDay ? dateToDisable : dateToDisable - 1) % 7
|
551
|
+
if ( _.isInteger( dateToDisable ) ) {
|
552
|
+
return dateToVerify.day === ( calendar.settings.firstDay ? dateToDisable : dateToDisable - 1 ) % 7
|
510
553
|
}
|
511
554
|
|
512
555
|
// If it’s an array or a native JS date, create and match the exact date.
|
513
|
-
if ($.isArray(dateToDisable) || _.isDate(dateToDisable)) {
|
514
|
-
return dateToVerify.pick === calendar.create(dateToDisable).pick
|
556
|
+
if ( $.isArray( dateToDisable ) || _.isDate( dateToDisable ) ) {
|
557
|
+
return dateToVerify.pick === calendar.create( dateToDisable ).pick
|
515
558
|
}
|
516
559
|
|
517
560
|
// If it’s an object, match a date within the “from” and “to” range.
|
518
|
-
if ($.isPlainObject(dateToDisable)) {
|
519
|
-
return calendar.withinRange(dateToDisable, dateToVerify)
|
561
|
+
if ( $.isPlainObject( dateToDisable ) ) {
|
562
|
+
return calendar.withinRange( dateToDisable, dateToVerify )
|
520
563
|
}
|
521
|
-
})
|
564
|
+
})
|
522
565
|
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
566
|
+
// If this date matches a disabled date, confirm it’s not inverted.
|
567
|
+
isDisabledMatch = isDisabledMatch.length && !isDisabledMatch.filter(function( dateToDisable ) {
|
568
|
+
return $.isArray( dateToDisable ) && dateToDisable[3] == 'inverted' ||
|
569
|
+
$.isPlainObject( dateToDisable ) && dateToDisable.inverted
|
570
|
+
}).length
|
527
571
|
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
572
|
+
// Check the calendar “enabled” flag and respectively flip the
|
573
|
+
// disabled state. Then also check if it’s beyond the min/max limits.
|
574
|
+
return calendar.item.enable === -1 ? !isDisabledMatch : isDisabledMatch ||
|
575
|
+
dateToVerify.pick < calendar.item.min.pick ||
|
576
|
+
dateToVerify.pick > calendar.item.max.pick
|
532
577
|
|
578
|
+
} //DatePicker.prototype.disabled
|
533
579
|
|
534
|
-
/**
|
535
|
-
* Parse a string into a usable type.
|
536
|
-
*/
|
537
|
-
DatePicker.prototype.parse = function (type, value, options) {
|
538
580
|
|
539
|
-
|
540
|
-
|
581
|
+
/**
|
582
|
+
* Parse a string into a usable type.
|
583
|
+
*/
|
584
|
+
DatePicker.prototype.parse = function( type, value, options ) {
|
541
585
|
|
542
|
-
|
543
|
-
|
544
|
-
return value;
|
545
|
-
}
|
586
|
+
var calendar = this,
|
587
|
+
parsingObject = {}
|
546
588
|
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
}
|
589
|
+
// If it’s already parsed, we’re good.
|
590
|
+
if ( !value || typeof value != 'string' ) {
|
591
|
+
return value
|
592
|
+
}
|
552
593
|
|
553
|
-
|
554
|
-
|
594
|
+
// We need a `.format` to parse the value with.
|
595
|
+
if ( !( options && options.format ) ) {
|
596
|
+
options = options || {}
|
597
|
+
options.format = calendar.settings.format
|
598
|
+
}
|
555
599
|
|
556
|
-
|
557
|
-
|
558
|
-
formattingLabel = calendar.formats[label],
|
600
|
+
// Convert the format into an array and then map through it.
|
601
|
+
calendar.formats.toArray( options.format ).map( function( label ) {
|
559
602
|
|
603
|
+
var
|
604
|
+
// Grab the formatting label.
|
605
|
+
formattingLabel = calendar.formats[ label ],
|
560
606
|
|
561
607
|
// The format length is from the formatting label function or the
|
562
608
|
// label length without the escaping exclamation (!) mark.
|
563
|
-
formatLength = formattingLabel ? _.trigger(formattingLabel, calendar, [value, parsingObject]) : label.replace(/^!/, '').length
|
609
|
+
formatLength = formattingLabel ? _.trigger( formattingLabel, calendar, [ value, parsingObject ] ) : label.replace( /^!/, '' ).length
|
564
610
|
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
611
|
+
// If there's a format label, split the value up to the format length.
|
612
|
+
// Then add it to the parsing object with appropriate label.
|
613
|
+
if ( formattingLabel ) {
|
614
|
+
parsingObject[ label ] = value.substr( 0, formatLength )
|
615
|
+
}
|
570
616
|
|
571
|
-
|
572
|
-
|
573
|
-
|
617
|
+
// Update the value as the substring from format length to end.
|
618
|
+
value = value.substr( formatLength )
|
619
|
+
})
|
574
620
|
|
575
|
-
|
576
|
-
|
577
|
-
|
621
|
+
// Compensate for month 0index.
|
622
|
+
return [
|
623
|
+
parsingObject.yyyy || parsingObject.yy,
|
624
|
+
+( parsingObject.mm || parsingObject.m ) - 1,
|
625
|
+
parsingObject.dd || parsingObject.d
|
626
|
+
]
|
627
|
+
} //DatePicker.prototype.parse
|
578
628
|
|
579
629
|
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
630
|
+
/**
|
631
|
+
* Various formats to display the object in.
|
632
|
+
*/
|
633
|
+
DatePicker.prototype.formats = (function() {
|
584
634
|
|
585
|
-
|
586
|
-
|
635
|
+
// Return the length of the first word in a collection.
|
636
|
+
function getWordLengthFromCollection( string, collection, dateObject ) {
|
587
637
|
|
588
|
-
|
589
|
-
|
638
|
+
// Grab the first word from the string.
|
639
|
+
// Regex pattern from http://stackoverflow.com/q/150033
|
640
|
+
var word = string.match( /[^\x00-\x7F]+|\w+/ )[ 0 ]
|
590
641
|
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
}
|
595
|
-
|
596
|
-
// Return the length of the word.
|
597
|
-
return word.length;
|
642
|
+
// If there's no month index, add it to the date object
|
643
|
+
if ( !dateObject.mm && !dateObject.m ) {
|
644
|
+
dateObject.m = collection.indexOf( word ) + 1
|
598
645
|
}
|
599
646
|
|
600
|
-
//
|
601
|
-
|
602
|
-
|
603
|
-
}
|
647
|
+
// Return the length of the word.
|
648
|
+
return word.length
|
649
|
+
}
|
604
650
|
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
// If there's string, then get the digits length.
|
610
|
-
// Otherwise return the selected date.
|
611
|
-
return string ? _.digits(string) : dateObject.date;
|
612
|
-
},
|
613
|
-
dd: function (string, dateObject) {
|
614
|
-
|
615
|
-
// If there's a string, then the length is always 2.
|
616
|
-
// Otherwise return the selected date with a leading zero.
|
617
|
-
return string ? 2 : _.lead(dateObject.date);
|
618
|
-
},
|
619
|
-
ddd: function (string, dateObject) {
|
620
|
-
|
621
|
-
// If there's a string, then get the length of the first word.
|
622
|
-
// Otherwise return the short selected weekday.
|
623
|
-
return string ? getFirstWordLength(string) : this.settings.weekdaysShort[dateObject.day];
|
624
|
-
},
|
625
|
-
dddd: function (string, dateObject) {
|
626
|
-
|
627
|
-
// If there's a string, then get the length of the first word.
|
628
|
-
// Otherwise return the full selected weekday.
|
629
|
-
return string ? getFirstWordLength(string) : this.settings.weekdaysFull[dateObject.day];
|
630
|
-
},
|
631
|
-
m: function (string, dateObject) {
|
632
|
-
|
633
|
-
// If there's a string, then get the length of the digits
|
634
|
-
// Otherwise return the selected month with 0index compensation.
|
635
|
-
return string ? _.digits(string) : dateObject.month + 1;
|
636
|
-
},
|
637
|
-
mm: function (string, dateObject) {
|
638
|
-
|
639
|
-
// If there's a string, then the length is always 2.
|
640
|
-
// Otherwise return the selected month with 0index and leading zero.
|
641
|
-
return string ? 2 : _.lead(dateObject.month + 1);
|
642
|
-
},
|
643
|
-
mmm: function (string, dateObject) {
|
644
|
-
|
645
|
-
var collection = this.settings.monthsShort;
|
646
|
-
|
647
|
-
// If there's a string, get length of the relevant month from the short
|
648
|
-
// months collection. Otherwise return the selected month from that collection.
|
649
|
-
return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
|
650
|
-
},
|
651
|
-
mmmm: function (string, dateObject) {
|
652
|
-
|
653
|
-
var collection = this.settings.monthsFull;
|
654
|
-
|
655
|
-
// If there's a string, get length of the relevant month from the full
|
656
|
-
// months collection. Otherwise return the selected month from that collection.
|
657
|
-
return string ? getWordLengthFromCollection(string, collection, dateObject) : collection[dateObject.month];
|
658
|
-
},
|
659
|
-
yy: function (string, dateObject) {
|
660
|
-
|
661
|
-
// If there's a string, then the length is always 2.
|
662
|
-
// Otherwise return the selected year by slicing out the first 2 digits.
|
663
|
-
return string ? 2 : ('' + dateObject.year).slice(2);
|
664
|
-
},
|
665
|
-
yyyy: function (string, dateObject) {
|
666
|
-
|
667
|
-
// If there's a string, then the length is always 4.
|
668
|
-
// Otherwise return the selected year.
|
669
|
-
return string ? 4 : dateObject.year;
|
670
|
-
},
|
671
|
-
|
672
|
-
// Create an array by splitting the formatting string passed.
|
673
|
-
toArray: function (formatString) {
|
674
|
-
return formatString.split(/(d{1,4}|m{1,4}|y{4}|yy|!.)/g);
|
675
|
-
},
|
676
|
-
|
677
|
-
// Format an object into a string using the formatting options.
|
678
|
-
toString: function (formatString, itemObject) {
|
679
|
-
var calendar = this;
|
680
|
-
return calendar.formats.toArray(formatString).map(function (label) {
|
681
|
-
return _.trigger(calendar.formats[label], calendar, [0, itemObject]) || label.replace(/^!/, '');
|
682
|
-
}).join('');
|
683
|
-
}
|
684
|
-
};
|
685
|
-
}(); //DatePicker.prototype.formats
|
651
|
+
// Get the length of the first word in a string.
|
652
|
+
function getFirstWordLength( string ) {
|
653
|
+
return string.match( /\w+/ )[ 0 ].length
|
654
|
+
}
|
686
655
|
|
656
|
+
return {
|
687
657
|
|
688
|
-
|
689
|
-
* Check if two date units are the exact.
|
690
|
-
*/
|
691
|
-
DatePicker.prototype.isDateExact = function (one, two) {
|
658
|
+
d: function( string, dateObject ) {
|
692
659
|
|
693
|
-
|
660
|
+
// If there's string, then get the digits length.
|
661
|
+
// Otherwise return the selected date.
|
662
|
+
return string ? _.digits( string ) : dateObject.date
|
663
|
+
},
|
664
|
+
dd: function( string, dateObject ) {
|
694
665
|
|
695
|
-
|
696
|
-
|
697
|
-
return
|
698
|
-
}
|
666
|
+
// If there's a string, then the length is always 2.
|
667
|
+
// Otherwise return the selected date with a leading zero.
|
668
|
+
return string ? 2 : _.lead( dateObject.date )
|
669
|
+
},
|
670
|
+
ddd: function( string, dateObject ) {
|
699
671
|
|
700
|
-
|
701
|
-
|
702
|
-
return
|
703
|
-
}
|
672
|
+
// If there's a string, then get the length of the first word.
|
673
|
+
// Otherwise return the short selected weekday.
|
674
|
+
return string ? getFirstWordLength( string ) : this.settings.weekdaysShort[ dateObject.day ]
|
675
|
+
},
|
676
|
+
dddd: function( string, dateObject ) {
|
704
677
|
|
705
|
-
|
706
|
-
|
707
|
-
return
|
708
|
-
}
|
678
|
+
// If there's a string, then get the length of the first word.
|
679
|
+
// Otherwise return the full selected weekday.
|
680
|
+
return string ? getFirstWordLength( string ) : this.settings.weekdaysFull[ dateObject.day ]
|
681
|
+
},
|
682
|
+
m: function( string, dateObject ) {
|
709
683
|
|
710
|
-
|
711
|
-
|
684
|
+
// If there's a string, then get the length of the digits
|
685
|
+
// Otherwise return the selected month with 0index compensation.
|
686
|
+
return string ? _.digits( string ) : dateObject.month + 1
|
687
|
+
},
|
688
|
+
mm: function( string, dateObject ) {
|
712
689
|
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
690
|
+
// If there's a string, then the length is always 2.
|
691
|
+
// Otherwise return the selected month with 0index and leading zero.
|
692
|
+
return string ? 2 : _.lead( dateObject.month + 1 )
|
693
|
+
},
|
694
|
+
mmm: function( string, dateObject ) {
|
717
695
|
|
718
|
-
|
719
|
-
firstDay = calendar.settings.firstDay ? 1 : 0;
|
696
|
+
var collection = this.settings.monthsShort
|
720
697
|
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
if (_.isInteger(two) && (_.isDate(one) || $.isArray(one))) {
|
727
|
-
two = two % 7 + firstDay;
|
728
|
-
return two === calendar.create(one).day + 1;
|
729
|
-
}
|
698
|
+
// If there's a string, get length of the relevant month from the short
|
699
|
+
// months collection. Otherwise return the selected month from that collection.
|
700
|
+
return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]
|
701
|
+
},
|
702
|
+
mmmm: function( string, dateObject ) {
|
730
703
|
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
704
|
+
var collection = this.settings.monthsFull
|
705
|
+
|
706
|
+
// If there's a string, get length of the relevant month from the full
|
707
|
+
// months collection. Otherwise return the selected month from that collection.
|
708
|
+
return string ? getWordLengthFromCollection( string, collection, dateObject ) : collection[ dateObject.month ]
|
709
|
+
},
|
710
|
+
yy: function( string, dateObject ) {
|
711
|
+
|
712
|
+
// If there's a string, then the length is always 2.
|
713
|
+
// Otherwise return the selected year by slicing out the first 2 digits.
|
714
|
+
return string ? 2 : ( '' + dateObject.year ).slice( 2 )
|
715
|
+
},
|
716
|
+
yyyy: function( string, dateObject ) {
|
735
717
|
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
DatePicker.prototype.deactivate = function (type, datesToDisable) {
|
751
|
-
|
752
|
-
var calendar = this,
|
753
|
-
disabledItems = calendar.item.disable.slice(0);
|
754
|
-
|
755
|
-
// If we’re flipping, that’s all we need to do.
|
756
|
-
if (datesToDisable == 'flip') {
|
757
|
-
calendar.flipEnable();
|
758
|
-
} else if (datesToDisable === false) {
|
759
|
-
calendar.flipEnable(1);
|
760
|
-
disabledItems = [];
|
761
|
-
} else if (datesToDisable === true) {
|
762
|
-
calendar.flipEnable(-1);
|
763
|
-
disabledItems = [];
|
718
|
+
// If there's a string, then the length is always 4.
|
719
|
+
// Otherwise return the selected year.
|
720
|
+
return string ? 4 : dateObject.year
|
721
|
+
},
|
722
|
+
|
723
|
+
// Create an array by splitting the formatting string passed.
|
724
|
+
toArray: function( formatString ) { return formatString.split( /(d{1,4}|m{1,4}|y{4}|yy|!.)/g ) },
|
725
|
+
|
726
|
+
// Format an object into a string using the formatting options.
|
727
|
+
toString: function ( formatString, itemObject ) {
|
728
|
+
var calendar = this
|
729
|
+
return calendar.formats.toArray( formatString ).map( function( label ) {
|
730
|
+
return _.trigger( calendar.formats[ label ], calendar, [ 0, itemObject ] ) || label.replace( /^!/, '' )
|
731
|
+
}).join( '' )
|
764
732
|
}
|
733
|
+
}
|
734
|
+
})() //DatePicker.prototype.formats
|
765
735
|
|
766
|
-
// Otherwise go through the dates to disable.
|
767
|
-
else {
|
768
736
|
|
769
|
-
datesToDisable.map(function (unitToDisable) {
|
770
737
|
|
771
|
-
var matchFound;
|
772
738
|
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
matchFound = true;
|
778
|
-
break;
|
779
|
-
}
|
780
|
-
}
|
739
|
+
/**
|
740
|
+
* Check if two date units are the exact.
|
741
|
+
*/
|
742
|
+
DatePicker.prototype.isDateExact = function( one, two ) {
|
781
743
|
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
744
|
+
var calendar = this
|
745
|
+
|
746
|
+
// When we’re working with weekdays, do a direct comparison.
|
747
|
+
if (
|
748
|
+
( _.isInteger( one ) && _.isInteger( two ) ) ||
|
749
|
+
( typeof one == 'boolean' && typeof two == 'boolean' )
|
750
|
+
) {
|
751
|
+
return one === two
|
752
|
+
}
|
753
|
+
|
754
|
+
// When we’re working with date representations, compare the “pick” value.
|
755
|
+
if (
|
756
|
+
( _.isDate( one ) || $.isArray( one ) ) &&
|
757
|
+
( _.isDate( two ) || $.isArray( two ) )
|
758
|
+
) {
|
759
|
+
return calendar.create( one ).pick === calendar.create( two ).pick
|
760
|
+
}
|
761
|
+
|
762
|
+
// When we’re working with range objects, compare the “from” and “to”.
|
763
|
+
if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {
|
764
|
+
return calendar.isDateExact( one.from, two.from ) && calendar.isDateExact( one.to, two.to )
|
765
|
+
}
|
766
|
+
|
767
|
+
return false
|
768
|
+
}
|
769
|
+
|
770
|
+
|
771
|
+
/**
|
772
|
+
* Check if two date units overlap.
|
773
|
+
*/
|
774
|
+
DatePicker.prototype.isDateOverlap = function( one, two ) {
|
775
|
+
|
776
|
+
var calendar = this,
|
777
|
+
firstDay = calendar.settings.firstDay ? 1 : 0
|
778
|
+
|
779
|
+
// When we’re working with a weekday index, compare the days.
|
780
|
+
if ( _.isInteger( one ) && ( _.isDate( two ) || $.isArray( two ) ) ) {
|
781
|
+
one = one % 7 + firstDay
|
782
|
+
return one === calendar.create( two ).day + 1
|
783
|
+
}
|
784
|
+
if ( _.isInteger( two ) && ( _.isDate( one ) || $.isArray( one ) ) ) {
|
785
|
+
two = two % 7 + firstDay
|
786
|
+
return two === calendar.create( one ).day + 1
|
787
|
+
}
|
788
|
+
|
789
|
+
// When we’re working with range objects, check if the ranges overlap.
|
790
|
+
if ( $.isPlainObject( one ) && $.isPlainObject( two ) ) {
|
791
|
+
return calendar.overlapRanges( one, two )
|
792
|
+
}
|
793
|
+
|
794
|
+
return false
|
795
|
+
}
|
796
|
+
|
797
|
+
|
798
|
+
/**
|
799
|
+
* Flip the “enabled” state.
|
800
|
+
*/
|
801
|
+
DatePicker.prototype.flipEnable = function(val) {
|
802
|
+
var itemObject = this.item
|
803
|
+
itemObject.enable = val || (itemObject.enable == -1 ? 1 : -1)
|
804
|
+
}
|
805
|
+
|
806
|
+
|
807
|
+
/**
|
808
|
+
* Mark a collection of dates as “disabled”.
|
809
|
+
*/
|
810
|
+
DatePicker.prototype.deactivate = function( type, datesToDisable ) {
|
811
|
+
|
812
|
+
var calendar = this,
|
813
|
+
disabledItems = calendar.item.disable.slice(0)
|
814
|
+
|
815
|
+
|
816
|
+
// If we’re flipping, that’s all we need to do.
|
817
|
+
if ( datesToDisable == 'flip' ) {
|
818
|
+
calendar.flipEnable()
|
819
|
+
}
|
820
|
+
|
821
|
+
else if ( datesToDisable === false ) {
|
822
|
+
calendar.flipEnable(1)
|
823
|
+
disabledItems = []
|
824
|
+
}
|
825
|
+
|
826
|
+
else if ( datesToDisable === true ) {
|
827
|
+
calendar.flipEnable(-1)
|
828
|
+
disabledItems = []
|
829
|
+
}
|
830
|
+
|
831
|
+
// Otherwise go through the dates to disable.
|
832
|
+
else {
|
833
|
+
|
834
|
+
datesToDisable.map(function( unitToDisable ) {
|
835
|
+
|
836
|
+
var matchFound
|
837
|
+
|
838
|
+
// When we have disabled items, check for matches.
|
839
|
+
// If something is matched, immediately break out.
|
840
|
+
for ( var index = 0; index < disabledItems.length; index += 1 ) {
|
841
|
+
if ( calendar.isDateExact( unitToDisable, disabledItems[index] ) ) {
|
842
|
+
matchFound = true
|
843
|
+
break
|
844
|
+
}
|
789
845
|
}
|
790
846
|
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
// If we’re flipping, that’s all we need to do.
|
806
|
-
if (datesToEnable == 'flip') {
|
807
|
-
calendar.flipEnable();
|
808
|
-
} else if (datesToEnable === true) {
|
809
|
-
calendar.flipEnable(1);
|
810
|
-
disabledItems = [];
|
811
|
-
} else if (datesToEnable === false) {
|
812
|
-
calendar.flipEnable(-1);
|
813
|
-
disabledItems = [];
|
814
|
-
}
|
847
|
+
// If nothing was found, add the validated unit to the collection.
|
848
|
+
if ( !matchFound ) {
|
849
|
+
if (
|
850
|
+
_.isInteger( unitToDisable ) ||
|
851
|
+
_.isDate( unitToDisable ) ||
|
852
|
+
$.isArray( unitToDisable ) ||
|
853
|
+
( $.isPlainObject( unitToDisable ) && unitToDisable.from && unitToDisable.to )
|
854
|
+
) {
|
855
|
+
disabledItems.push( unitToDisable )
|
856
|
+
}
|
857
|
+
}
|
858
|
+
})
|
859
|
+
}
|
815
860
|
|
816
|
-
|
817
|
-
|
861
|
+
// Return the updated collection.
|
862
|
+
return disabledItems
|
863
|
+
} //DatePicker.prototype.deactivate
|
818
864
|
|
819
|
-
datesToEnable.map(function (unitToEnable) {
|
820
865
|
|
821
|
-
|
866
|
+
/**
|
867
|
+
* Mark a collection of dates as “enabled”.
|
868
|
+
*/
|
869
|
+
DatePicker.prototype.activate = function( type, datesToEnable ) {
|
822
870
|
|
823
|
-
|
824
|
-
|
871
|
+
var calendar = this,
|
872
|
+
disabledItems = calendar.item.disable,
|
873
|
+
disabledItemsCount = disabledItems.length
|
825
874
|
|
826
|
-
|
875
|
+
// If we’re flipping, that’s all we need to do.
|
876
|
+
if ( datesToEnable == 'flip' ) {
|
877
|
+
calendar.flipEnable()
|
878
|
+
}
|
827
879
|
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
break;
|
833
|
-
}
|
880
|
+
else if ( datesToEnable === true ) {
|
881
|
+
calendar.flipEnable(1)
|
882
|
+
disabledItems = []
|
883
|
+
}
|
834
884
|
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
matchFound = unitToEnable;
|
840
|
-
} else if ($.isArray(unitToEnable)) {
|
841
|
-
matchFound = unitToEnable;
|
842
|
-
if (!matchFound[3]) matchFound.push('inverted');
|
843
|
-
} else if (_.isDate(unitToEnable)) {
|
844
|
-
matchFound = [unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted'];
|
845
|
-
}
|
846
|
-
break;
|
847
|
-
}
|
848
|
-
}
|
885
|
+
else if ( datesToEnable === false ) {
|
886
|
+
calendar.flipEnable(-1)
|
887
|
+
disabledItems = []
|
888
|
+
}
|
849
889
|
|
850
|
-
|
851
|
-
|
852
|
-
if (calendar.isDateExact(disabledItems[index], unitToEnable)) {
|
853
|
-
disabledItems[index] = null;
|
854
|
-
break;
|
855
|
-
}
|
856
|
-
}
|
890
|
+
// Otherwise go through the disabled dates.
|
891
|
+
else {
|
857
892
|
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
893
|
+
datesToEnable.map(function( unitToEnable ) {
|
894
|
+
|
895
|
+
var matchFound,
|
896
|
+
disabledUnit,
|
897
|
+
index,
|
898
|
+
isExactRange
|
899
|
+
|
900
|
+
// Go through the disabled items and try to find a match.
|
901
|
+
for ( index = 0; index < disabledItemsCount; index += 1 ) {
|
902
|
+
|
903
|
+
disabledUnit = disabledItems[index]
|
904
|
+
|
905
|
+
// When an exact match is found, remove it from the collection.
|
906
|
+
if ( calendar.isDateExact( disabledUnit, unitToEnable ) ) {
|
907
|
+
matchFound = disabledItems[index] = null
|
908
|
+
isExactRange = true
|
909
|
+
break
|
910
|
+
}
|
866
911
|
|
867
|
-
|
868
|
-
|
869
|
-
|
912
|
+
// When an overlapped match is found, add the “inverted” state to it.
|
913
|
+
else if ( calendar.isDateOverlap( disabledUnit, unitToEnable ) ) {
|
914
|
+
if ( $.isPlainObject( unitToEnable ) ) {
|
915
|
+
unitToEnable.inverted = true
|
916
|
+
matchFound = unitToEnable
|
870
917
|
}
|
871
|
-
|
918
|
+
else if ( $.isArray( unitToEnable ) ) {
|
919
|
+
matchFound = unitToEnable
|
920
|
+
if ( !matchFound[3] ) matchFound.push( 'inverted' )
|
921
|
+
}
|
922
|
+
else if ( _.isDate( unitToEnable ) ) {
|
923
|
+
matchFound = [ unitToEnable.getFullYear(), unitToEnable.getMonth(), unitToEnable.getDate(), 'inverted' ]
|
924
|
+
}
|
925
|
+
break
|
926
|
+
}
|
872
927
|
}
|
873
928
|
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
929
|
+
// If a match was found, remove a previous duplicate entry.
|
930
|
+
if ( matchFound ) for ( index = 0; index < disabledItemsCount; index += 1 ) {
|
931
|
+
if ( calendar.isDateExact( disabledItems[index], unitToEnable ) ) {
|
932
|
+
disabledItems[index] = null
|
933
|
+
break
|
934
|
+
}
|
935
|
+
}
|
879
936
|
|
937
|
+
// In the event that we’re dealing with an exact range of dates,
|
938
|
+
// make sure there are no “inverted” dates because of it.
|
939
|
+
if ( isExactRange ) for ( index = 0; index < disabledItemsCount; index += 1 ) {
|
940
|
+
if ( calendar.isDateOverlap( disabledItems[index], unitToEnable ) ) {
|
941
|
+
disabledItems[index] = null
|
942
|
+
break
|
943
|
+
}
|
944
|
+
}
|
945
|
+
|
946
|
+
// If something is still matched, add it into the collection.
|
947
|
+
if ( matchFound ) {
|
948
|
+
disabledItems.push( matchFound )
|
949
|
+
}
|
950
|
+
})
|
951
|
+
}
|
880
952
|
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
DatePicker.prototype.nodes = function (isOpen) {
|
953
|
+
// Return the updated collection.
|
954
|
+
return disabledItems.filter(function( val ) { return val != null })
|
955
|
+
} //DatePicker.prototype.activate
|
885
956
|
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
957
|
+
|
958
|
+
/**
|
959
|
+
* Create a string for the nodes in the picker.
|
960
|
+
*/
|
961
|
+
DatePicker.prototype.nodes = function( isOpen ) {
|
962
|
+
|
963
|
+
var
|
964
|
+
calendar = this,
|
965
|
+
settings = calendar.settings,
|
966
|
+
calendarItem = calendar.item,
|
967
|
+
nowObject = calendarItem.now,
|
968
|
+
selectedObject = calendarItem.select,
|
969
|
+
highlightedObject = calendarItem.highlight,
|
970
|
+
viewsetObject = calendarItem.view,
|
971
|
+
disabledCollection = calendarItem.disable,
|
972
|
+
minLimitObject = calendarItem.min,
|
973
|
+
maxLimitObject = calendarItem.max,
|
896
974
|
|
897
975
|
|
898
976
|
// Create the calendar table head using a copy of weekday labels collection.
|
899
977
|
// * We do a copy so we don't mutate the original array.
|
900
|
-
tableHead = function
|
978
|
+
tableHead = (function( collection, fullCollection ) {
|
901
979
|
|
902
980
|
// If the first day should be Monday, move Sunday to the end.
|
903
|
-
if (settings.firstDay) {
|
904
|
-
collection.push(collection.shift())
|
905
|
-
fullCollection.push(fullCollection.shift())
|
981
|
+
if ( settings.firstDay ) {
|
982
|
+
collection.push( collection.shift() )
|
983
|
+
fullCollection.push( fullCollection.shift() )
|
906
984
|
}
|
907
985
|
|
908
986
|
// Create and return the table head group.
|
909
|
-
return _.node(
|
910
|
-
|
911
|
-
|
912
|
-
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
987
|
+
return _.node(
|
988
|
+
'thead',
|
989
|
+
_.node(
|
990
|
+
'tr',
|
991
|
+
_.group({
|
992
|
+
min: 0,
|
993
|
+
max: DAYS_IN_WEEK - 1,
|
994
|
+
i: 1,
|
995
|
+
node: 'th',
|
996
|
+
item: function( counter ) {
|
997
|
+
return [
|
998
|
+
collection[ counter ],
|
999
|
+
settings.klass.weekdays,
|
1000
|
+
'scope=col title="' + fullCollection[ counter ] + '"'
|
1001
|
+
]
|
1002
|
+
}
|
1003
|
+
})
|
1004
|
+
)
|
1005
|
+
) //endreturn
|
919
1006
|
// Materialize modified
|
920
|
-
}((settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter).slice(0), settings.weekdaysFull.slice(0)),
|
921
|
-
//tableHead
|
1007
|
+
})( ( settings.showWeekdaysFull ? settings.weekdaysFull : settings.weekdaysLetter ).slice( 0 ), settings.weekdaysFull.slice( 0 ) ), //tableHead
|
922
1008
|
|
923
1009
|
|
924
1010
|
// Create the nav for next/prev month.
|
925
|
-
createMonthNav = function
|
1011
|
+
createMonthNav = function( next ) {
|
926
1012
|
|
927
1013
|
// Otherwise, return the created month tag.
|
928
|
-
return _.node(
|
929
|
-
|
930
|
-
|
931
|
-
|
932
|
-
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
1014
|
+
return _.node(
|
1015
|
+
'div',
|
1016
|
+
' ',
|
1017
|
+
settings.klass[ 'nav' + ( next ? 'Next' : 'Prev' ) ] + (
|
1018
|
+
|
1019
|
+
// If the focused month is outside the range, disabled the button.
|
1020
|
+
( next && viewsetObject.year >= maxLimitObject.year && viewsetObject.month >= maxLimitObject.month ) ||
|
1021
|
+
( !next && viewsetObject.year <= minLimitObject.year && viewsetObject.month <= minLimitObject.month ) ?
|
1022
|
+
' ' + settings.klass.navDisabled : ''
|
1023
|
+
),
|
1024
|
+
'data-nav=' + ( next || -1 ) + ' ' +
|
1025
|
+
_.ariaAttr({
|
1026
|
+
role: 'button',
|
1027
|
+
controls: calendar.$node[0].id + '_table'
|
1028
|
+
}) + ' ' +
|
1029
|
+
'title="' + (next ? settings.labelMonthNext : settings.labelMonthPrev ) + '"'
|
1030
|
+
) //endreturn
|
1031
|
+
}, //createMonthNav
|
937
1032
|
|
938
1033
|
|
939
1034
|
// Create the month label.
|
940
1035
|
//Materialize modified
|
941
|
-
createMonthLabel = function
|
1036
|
+
createMonthLabel = function(override) {
|
942
1037
|
|
943
|
-
var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull
|
1038
|
+
var monthsCollection = settings.showMonthsShort ? settings.monthsShort : settings.monthsFull
|
944
1039
|
|
945
1040
|
// Materialize modified
|
946
1041
|
if (override == "short_months") {
|
947
|
-
|
1042
|
+
monthsCollection = settings.monthsShort;
|
948
1043
|
}
|
949
1044
|
|
950
1045
|
// If there are months to select, add a dropdown menu.
|
951
|
-
if (settings.selectMonths
|
1046
|
+
if ( settings.selectMonths && override == undefined ) {
|
952
1047
|
|
953
|
-
return _.node('select',
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
return [
|
1048
|
+
return _.node( 'select',
|
1049
|
+
_.group({
|
1050
|
+
min: 0,
|
1051
|
+
max: 11,
|
1052
|
+
i: 1,
|
1053
|
+
node: 'option',
|
1054
|
+
item: function( loopedMonth ) {
|
961
1055
|
|
962
|
-
|
963
|
-
monthsCollection[loopedMonth], 0,
|
1056
|
+
return [
|
964
1057
|
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
1058
|
+
// The looped month and no classes.
|
1059
|
+
monthsCollection[ loopedMonth ], 0,
|
1060
|
+
|
1061
|
+
// Set the value and selected index.
|
1062
|
+
'value=' + loopedMonth +
|
1063
|
+
( viewsetObject.month == loopedMonth ? ' selected' : '' ) +
|
1064
|
+
(
|
1065
|
+
(
|
1066
|
+
( viewsetObject.year == minLimitObject.year && loopedMonth < minLimitObject.month ) ||
|
1067
|
+
( viewsetObject.year == maxLimitObject.year && loopedMonth > maxLimitObject.month )
|
1068
|
+
) ?
|
1069
|
+
' disabled' : ''
|
1070
|
+
)
|
1071
|
+
]
|
1072
|
+
}
|
1073
|
+
}),
|
1074
|
+
settings.klass.selectMonth + ' browser-default',
|
1075
|
+
( isOpen ? '' : 'disabled' ) + ' ' +
|
1076
|
+
_.ariaAttr({ controls: calendar.$node[0].id + '_table' }) + ' ' +
|
1077
|
+
'title="' + settings.labelMonthSelect + '"'
|
1078
|
+
)
|
969
1079
|
}
|
970
|
-
|
971
1080
|
// Materialize modified
|
972
1081
|
if (override == "short_months") if (selectedObject != null) return monthsCollection[selectedObject.month];else return monthsCollection[viewsetObject.month];
|
973
1082
|
|
974
1083
|
// If there's a need for a month selector
|
975
|
-
return _.node('div', monthsCollection[viewsetObject.month], settings.klass.month)
|
976
|
-
},
|
977
|
-
//createMonthLabel
|
1084
|
+
return _.node( 'div', monthsCollection[ viewsetObject.month ], settings.klass.month )
|
1085
|
+
}, //createMonthLabel
|
978
1086
|
|
979
1087
|
|
980
1088
|
// Create the year label.
|
@@ -983,54 +1091,59 @@
|
|
983
1091
|
|
984
1092
|
var focusedYear = viewsetObject.year,
|
985
1093
|
|
986
|
-
|
987
1094
|
// If years selector is set to a literal "true", set it to 5. Otherwise
|
988
1095
|
// divide in half to get half before and half after focused year.
|
989
|
-
numberYears = settings.selectYears === true ? 5 : ~~(settings.selectYears / 2)
|
1096
|
+
numberYears = settings.selectYears === true ? 5 : ~~( settings.selectYears / 2 )
|
990
1097
|
|
991
1098
|
// If there are years to select, add a dropdown menu.
|
992
|
-
if (numberYears) {
|
1099
|
+
if ( numberYears ) {
|
993
1100
|
|
994
|
-
var
|
1101
|
+
var
|
1102
|
+
minYear = minLimitObject.year,
|
995
1103
|
maxYear = maxLimitObject.year,
|
996
1104
|
lowestYear = focusedYear - numberYears,
|
997
|
-
highestYear = focusedYear + numberYears
|
1105
|
+
highestYear = focusedYear + numberYears
|
998
1106
|
|
999
1107
|
// If the min year is greater than the lowest year, increase the highest year
|
1000
1108
|
// by the difference and set the lowest year to the min year.
|
1001
|
-
if (minYear > lowestYear) {
|
1002
|
-
highestYear += minYear - lowestYear
|
1003
|
-
lowestYear = minYear
|
1109
|
+
if ( minYear > lowestYear ) {
|
1110
|
+
highestYear += minYear - lowestYear
|
1111
|
+
lowestYear = minYear
|
1004
1112
|
}
|
1005
1113
|
|
1006
1114
|
// If the max year is less than the highest year, decrease the lowest year
|
1007
1115
|
// by the lower of the two: available and needed years. Then set the
|
1008
1116
|
// highest year to the max year.
|
1009
|
-
if (maxYear < highestYear) {
|
1117
|
+
if ( maxYear < highestYear ) {
|
1010
1118
|
|
1011
1119
|
var availableYears = lowestYear - minYear,
|
1012
|
-
neededYears = highestYear - maxYear
|
1120
|
+
neededYears = highestYear - maxYear
|
1013
1121
|
|
1014
|
-
lowestYear -= availableYears > neededYears ? neededYears : availableYears
|
1015
|
-
highestYear = maxYear
|
1122
|
+
lowestYear -= availableYears > neededYears ? neededYears : availableYears
|
1123
|
+
highestYear = maxYear
|
1016
1124
|
}
|
1017
1125
|
|
1018
1126
|
if (settings.selectYears && override == undefined) {
|
1019
1127
|
return _.node('select', _.group({
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
1028
|
-
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1032
|
-
|
1033
|
-
|
1128
|
+
min: lowestYear,
|
1129
|
+
max: highestYear,
|
1130
|
+
i: 1,
|
1131
|
+
node: 'option',
|
1132
|
+
item: function (loopedYear) {
|
1133
|
+
return [
|
1134
|
+
|
1135
|
+
// The looped year and no classes.
|
1136
|
+
loopedYear, 0,
|
1137
|
+
|
1138
|
+
// Set the value and selected index.
|
1139
|
+
'value=' + loopedYear + (focusedYear == loopedYear ? ' selected' : '')
|
1140
|
+
]
|
1141
|
+
}
|
1142
|
+
}),
|
1143
|
+
settings.klass.selectYear + ' browser-default',
|
1144
|
+
(isOpen ? '' : 'disabled') + ' ' + _.ariaAttr({controls: calendar.$node[0].id + '_table'}) + ' ' +
|
1145
|
+
'title="' + settings.labelYearSelect + '"'
|
1146
|
+
)
|
1034
1147
|
}
|
1035
1148
|
}
|
1036
1149
|
|
@@ -1040,192 +1153,247 @@
|
|
1040
1153
|
}
|
1041
1154
|
|
1042
1155
|
// Otherwise just return the year focused
|
1043
|
-
return _.node('div', focusedYear, settings.klass.year)
|
1044
|
-
}
|
1045
|
-
|
1156
|
+
return _.node( 'div', focusedYear, settings.klass.year )
|
1157
|
+
} //createYearLabel
|
1046
1158
|
|
1047
1159
|
// Materialize modified
|
1048
1160
|
createDayLabel = function () {
|
1049
1161
|
if (selectedObject != null) return selectedObject.date;else return nowObject.date;
|
1050
|
-
}
|
1162
|
+
}
|
1051
1163
|
createWeekdayLabel = function () {
|
1052
1164
|
var display_day;
|
1053
1165
|
|
1054
1166
|
if (selectedObject != null) display_day = selectedObject.day;else display_day = nowObject.day;
|
1055
1167
|
var weekday = settings.weekdaysShort[display_day];
|
1056
1168
|
return weekday;
|
1057
|
-
}
|
1058
|
-
|
1059
|
-
// Create and return the entire calendar.
|
1169
|
+
}
|
1060
1170
|
|
1061
|
-
|
1171
|
+
// Create and return the entire calendar.
|
1172
|
+
return _.node(
|
1062
1173
|
// Date presentation View
|
1063
|
-
'div',
|
1174
|
+
'div',
|
1064
1175
|
// Div for Year
|
1065
|
-
'div', createYearLabel("raw"), settings.klass.year_display) +
|
1176
|
+
_.node('div', createYearLabel("raw"), settings.klass.year_display) +
|
1177
|
+
_.node('span', createWeekdayLabel() + ', ', "picker__weekday-display") +
|
1066
1178
|
// Div for short Month
|
1067
|
-
'span', createMonthLabel("short_months") + ' ', settings.klass.month_display) +
|
1179
|
+
_.node('span', createMonthLabel("short_months") + ' ', settings.klass.month_display) +
|
1068
1180
|
// Div for Day
|
1069
|
-
'span', createDayLabel(), settings.klass.day_display),
|
1070
|
-
|
1071
|
-
|
1072
|
-
|
1073
|
-
|
1074
|
-
|
1075
|
-
|
1076
|
-
|
1077
|
-
|
1078
|
-
|
1079
|
-
|
1080
|
-
|
1081
|
-
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
|
1181
|
+
_.node('span', createDayLabel(), settings.klass.day_display),
|
1182
|
+
settings.klass.date_display
|
1183
|
+
) +
|
1184
|
+
// Calendar container
|
1185
|
+
_.node('div',
|
1186
|
+
_.node('div',
|
1187
|
+
_.node('div',
|
1188
|
+
(settings.selectYears ? createYearLabel() + createMonthLabel() : createMonthLabel() + createYearLabel()) +
|
1189
|
+
createMonthNav() + createMonthNav(1),
|
1190
|
+
settings.klass.header
|
1191
|
+
) +
|
1192
|
+
_.node('table',
|
1193
|
+
tableHead +
|
1194
|
+
_.node('tbody',
|
1195
|
+
_.group({
|
1196
|
+
min: 0,
|
1197
|
+
max: WEEKS_IN_CALENDAR - 1,
|
1086
1198
|
i: 1,
|
1087
|
-
node: '
|
1088
|
-
item: function
|
1089
|
-
|
1090
|
-
//
|
1091
|
-
|
1092
|
-
|
1093
|
-
var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
|
1094
|
-
isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
|
1095
|
-
isDisabled = disabledCollection && calendar.disabled(targetDate) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
|
1096
|
-
formattedDate = _.trigger(calendar.formats.toString, calendar, [settings.format, targetDate]);
|
1097
|
-
|
1098
|
-
return [_.node('div', targetDate.date, function (klasses) {
|
1099
|
-
|
1100
|
-
// Add the `infocus` or `outfocus` classes based on month in view.
|
1101
|
-
klasses.push(viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus);
|
1102
|
-
|
1103
|
-
// Add the `today` class if needed.
|
1104
|
-
if (nowObject.pick == targetDate.pick) {
|
1105
|
-
klasses.push(settings.klass.now);
|
1106
|
-
}
|
1107
|
-
|
1108
|
-
// Add the `selected` class if something's selected and the time matches.
|
1109
|
-
if (isSelected) {
|
1110
|
-
klasses.push(settings.klass.selected);
|
1111
|
-
}
|
1112
|
-
|
1113
|
-
// Add the `highlighted` class if something's highlighted and the time matches.
|
1114
|
-
if (isHighlighted) {
|
1115
|
-
klasses.push(settings.klass.highlighted);
|
1116
|
-
}
|
1117
|
-
|
1118
|
-
// Add the `disabled` class if something's disabled and the object matches.
|
1119
|
-
if (isDisabled) {
|
1120
|
-
klasses.push(settings.klass.disabled);
|
1121
|
-
}
|
1122
|
-
|
1123
|
-
return klasses.join(' ');
|
1124
|
-
}([settings.klass.day]), 'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
|
1125
|
-
role: 'gridcell',
|
1126
|
-
label: formattedDate,
|
1127
|
-
selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
|
1128
|
-
activedescendant: isHighlighted ? true : null,
|
1129
|
-
disabled: isDisabled ? true : null
|
1130
|
-
}) + ' ' + (isDisabled ? '' : 'tabindex="0"')), '', _.ariaAttr({ role: 'presentation' })]; //endreturn
|
1131
|
-
}
|
1132
|
-
})]; //endreturn
|
1133
|
-
}
|
1134
|
-
})), settings.klass.table, 'id="' + calendar.$node[0].id + '_table' + '" ' + _.ariaAttr({
|
1135
|
-
role: 'grid',
|
1136
|
-
controls: calendar.$node[0].id,
|
1137
|
-
readonly: true
|
1138
|
-
})), settings.klass.calendar_container) // end calendar
|
1199
|
+
node: 'tr',
|
1200
|
+
item: function( rowCounter ) {
|
1201
|
+
|
1202
|
+
// If Monday is the first day and the month starts on Sunday, shift the date back a week.
|
1203
|
+
var shiftDateBy = settings.firstDay && calendar.create([ viewsetObject.year, viewsetObject.month, 1 ]).day === 0 ? -7 : 0
|
1139
1204
|
|
1205
|
+
return [
|
1206
|
+
_.group({
|
1207
|
+
min: DAYS_IN_WEEK * rowCounter - viewsetObject.day + shiftDateBy + 1, // Add 1 for weekday 0index
|
1208
|
+
max: function() {
|
1209
|
+
return this.min + DAYS_IN_WEEK - 1
|
1210
|
+
},
|
1211
|
+
i: 1,
|
1212
|
+
node: 'td',
|
1213
|
+
item: function( targetDate ) {
|
1214
|
+
|
1215
|
+
// Convert the time date from a relative date to a target date.
|
1216
|
+
targetDate = calendar.create([ viewsetObject.year, viewsetObject.month, targetDate + ( settings.firstDay ? 1 : 0 ) ])
|
1217
|
+
|
1218
|
+
var isSelected = selectedObject && selectedObject.pick == targetDate.pick,
|
1219
|
+
isHighlighted = highlightedObject && highlightedObject.pick == targetDate.pick,
|
1220
|
+
isDisabled = disabledCollection && calendar.disabled( targetDate ) || targetDate.pick < minLimitObject.pick || targetDate.pick > maxLimitObject.pick,
|
1221
|
+
formattedDate = _.trigger( calendar.formats.toString, calendar, [ settings.format, targetDate ] )
|
1222
|
+
|
1223
|
+
return [
|
1224
|
+
_.node(
|
1225
|
+
'div',
|
1226
|
+
targetDate.date,
|
1227
|
+
(function( klasses ) {
|
1228
|
+
|
1229
|
+
// Add the `infocus` or `outfocus` classes based on month in view.
|
1230
|
+
klasses.push( viewsetObject.month == targetDate.month ? settings.klass.infocus : settings.klass.outfocus )
|
1231
|
+
|
1232
|
+
// Add the `today` class if needed.
|
1233
|
+
if ( nowObject.pick == targetDate.pick ) {
|
1234
|
+
klasses.push( settings.klass.now )
|
1235
|
+
}
|
1236
|
+
|
1237
|
+
// Add the `selected` class if something's selected and the time matches.
|
1238
|
+
if ( isSelected ) {
|
1239
|
+
klasses.push( settings.klass.selected )
|
1240
|
+
}
|
1241
|
+
|
1242
|
+
// Add the `highlighted` class if something's highlighted and the time matches.
|
1243
|
+
if ( isHighlighted ) {
|
1244
|
+
klasses.push( settings.klass.highlighted )
|
1245
|
+
}
|
1246
|
+
|
1247
|
+
// Add the `disabled` class if something's disabled and the object matches.
|
1248
|
+
if ( isDisabled ) {
|
1249
|
+
klasses.push( settings.klass.disabled )
|
1250
|
+
}
|
1251
|
+
|
1252
|
+
return klasses.join( ' ' )
|
1253
|
+
})([ settings.klass.day ]),
|
1254
|
+
'data-pick=' + targetDate.pick + ' ' + _.ariaAttr({
|
1255
|
+
role: 'gridcell',
|
1256
|
+
label: formattedDate,
|
1257
|
+
selected: isSelected && calendar.$node.val() === formattedDate ? true : null,
|
1258
|
+
activedescendant: isHighlighted ? true : null,
|
1259
|
+
disabled: isDisabled ? true : null
|
1260
|
+
})
|
1261
|
+
),
|
1262
|
+
'',
|
1263
|
+
_.ariaAttr({ role: 'presentation' })
|
1264
|
+
] //endreturn
|
1265
|
+
}
|
1266
|
+
})
|
1267
|
+
] //endreturn
|
1268
|
+
}
|
1269
|
+
})
|
1270
|
+
),
|
1271
|
+
settings.klass.table,
|
1272
|
+
'id="' + calendar.$node[0].id + '_table' + '" ' + _.ariaAttr({
|
1273
|
+
role: 'grid',
|
1274
|
+
controls: calendar.$node[0].id,
|
1275
|
+
readonly: true
|
1276
|
+
})
|
1277
|
+
),
|
1278
|
+
settings.klass.calendar_container
|
1279
|
+
) // end calendar
|
1140
1280
|
+
|
1141
1281
|
|
1142
1282
|
// * For Firefox forms to submit, make sure to set the buttons’ `type` attributes as “button”.
|
1143
|
-
_.node(
|
1144
|
-
|
1283
|
+
_.node(
|
1284
|
+
'div',
|
1285
|
+
_.node( 'button', settings.today, "btn-flat picker__today waves-effect",
|
1286
|
+
'type=button data-pick=' + nowObject.pick +
|
1287
|
+
( isOpen && !calendar.disabled(nowObject) ? '' : ' disabled' ) + ' ' +
|
1288
|
+
_.ariaAttr({ controls: calendar.$node[0].id }) ) +
|
1289
|
+
_.node( 'button', settings.clear, "btn-flat picker__clear waves-effect",
|
1290
|
+
'type=button data-clear=1' +
|
1291
|
+
( isOpen ? '' : ' disabled' ) + ' ' +
|
1292
|
+
_.ariaAttr({ controls: calendar.$node[0].id }) ) +
|
1293
|
+
_.node('button', settings.close, "btn-flat picker__close waves-effect",
|
1294
|
+
'type=button data-close=true ' +
|
1295
|
+
( isOpen ? '' : ' disabled' ) + ' ' +
|
1296
|
+
_.ariaAttr({ controls: calendar.$node[0].id }) ),
|
1297
|
+
settings.klass.footer
|
1298
|
+
),
|
1299
|
+
'picker__container__wrapper'
|
1300
|
+
) //endreturn
|
1301
|
+
} //DatePicker.prototype.nodes
|
1302
|
+
|
1303
|
+
|
1304
|
+
|
1305
|
+
|
1306
|
+
/**
|
1307
|
+
* The date picker defaults.
|
1308
|
+
*/
|
1309
|
+
DatePicker.defaults = (function( prefix ) {
|
1145
1310
|
|
1311
|
+
return {
|
1146
1312
|
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
DatePicker.defaults = function (prefix) {
|
1313
|
+
// The title label to use for the month nav buttons
|
1314
|
+
labelMonthNext: 'Next month',
|
1315
|
+
labelMonthPrev: 'Previous month',
|
1151
1316
|
|
1152
|
-
|
1317
|
+
// The title label to use for the dropdown selectors
|
1318
|
+
labelMonthSelect: 'Select a month',
|
1319
|
+
labelYearSelect: 'Select a year',
|
1153
1320
|
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1321
|
+
// Months and weekdays
|
1322
|
+
monthsFull: [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ],
|
1323
|
+
monthsShort: [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ],
|
1324
|
+
weekdaysFull: [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
|
1325
|
+
weekdaysShort: [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ],
|
1157
1326
|
|
1158
|
-
|
1159
|
-
|
1160
|
-
labelYearSelect: 'Select a year',
|
1327
|
+
// Materialize modified
|
1328
|
+
weekdaysLetter: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
|
1161
1329
|
|
1162
|
-
|
1163
|
-
|
1164
|
-
|
1165
|
-
|
1166
|
-
weekdaysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
|
1330
|
+
// Today and clear
|
1331
|
+
today: 'Today',
|
1332
|
+
clear: 'Clear',
|
1333
|
+
close: 'Close',
|
1167
1334
|
|
1168
|
-
|
1169
|
-
|
1335
|
+
// Picker close behavior
|
1336
|
+
closeOnSelect: true,
|
1337
|
+
closeOnClear: true,
|
1170
1338
|
|
1171
|
-
|
1172
|
-
|
1173
|
-
clear: 'Clear',
|
1174
|
-
close: 'Ok',
|
1339
|
+
// Update input value on select/clear
|
1340
|
+
updateInput: true,
|
1175
1341
|
|
1176
|
-
|
1177
|
-
|
1342
|
+
// The format to show on the `input` element
|
1343
|
+
format: 'd mmmm, yyyy',
|
1178
1344
|
|
1179
|
-
|
1180
|
-
|
1345
|
+
// Classes
|
1346
|
+
klass: {
|
1181
1347
|
|
1182
|
-
|
1183
|
-
klass: {
|
1348
|
+
table: prefix + 'table',
|
1184
1349
|
|
1185
|
-
|
1350
|
+
header: prefix + 'header',
|
1186
1351
|
|
1187
|
-
|
1352
|
+
// Materialize Added klasses
|
1353
|
+
date_display: prefix + 'date-display',
|
1354
|
+
day_display: prefix + 'day-display',
|
1355
|
+
month_display: prefix + 'month-display',
|
1356
|
+
year_display: prefix + 'year-display',
|
1357
|
+
calendar_container: prefix + 'calendar-container',
|
1358
|
+
// end
|
1188
1359
|
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
month_display: prefix + 'month-display',
|
1193
|
-
year_display: prefix + 'year-display',
|
1194
|
-
calendar_container: prefix + 'calendar-container',
|
1195
|
-
// end
|
1360
|
+
navPrev: prefix + 'nav--prev',
|
1361
|
+
navNext: prefix + 'nav--next',
|
1362
|
+
navDisabled: prefix + 'nav--disabled',
|
1196
1363
|
|
1364
|
+
month: prefix + 'month',
|
1365
|
+
year: prefix + 'year',
|
1197
1366
|
|
1198
|
-
|
1199
|
-
|
1200
|
-
navDisabled: prefix + 'nav--disabled',
|
1367
|
+
selectMonth: prefix + 'select--month',
|
1368
|
+
selectYear: prefix + 'select--year',
|
1201
1369
|
|
1202
|
-
|
1203
|
-
year: prefix + 'year',
|
1370
|
+
weekdays: prefix + 'weekday',
|
1204
1371
|
|
1205
|
-
|
1206
|
-
|
1372
|
+
day: prefix + 'day',
|
1373
|
+
disabled: prefix + 'day--disabled',
|
1374
|
+
selected: prefix + 'day--selected',
|
1375
|
+
highlighted: prefix + 'day--highlighted',
|
1376
|
+
now: prefix + 'day--today',
|
1377
|
+
infocus: prefix + 'day--infocus',
|
1378
|
+
outfocus: prefix + 'day--outfocus',
|
1207
1379
|
|
1208
|
-
|
1380
|
+
footer: prefix + 'footer',
|
1209
1381
|
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
1214
|
-
|
1215
|
-
|
1216
|
-
outfocus: prefix + 'day--outfocus',
|
1382
|
+
buttonClear: prefix + 'button--clear',
|
1383
|
+
buttonToday: prefix + 'button--today',
|
1384
|
+
buttonClose: prefix + 'button--close'
|
1385
|
+
}
|
1386
|
+
}
|
1387
|
+
})( Picker.klasses().picker + '__' )
|
1217
1388
|
|
1218
|
-
footer: prefix + 'footer',
|
1219
1389
|
|
1220
|
-
buttonClear: prefix + 'button--clear',
|
1221
|
-
buttonToday: prefix + 'button--today',
|
1222
|
-
buttonClose: prefix + 'button--close'
|
1223
|
-
}
|
1224
|
-
};
|
1225
|
-
}(Picker.klasses().picker + '__');
|
1226
1390
|
|
1227
|
-
|
1228
|
-
|
1229
|
-
|
1230
|
-
|
1391
|
+
|
1392
|
+
|
1393
|
+
/**
|
1394
|
+
* Extend the picker to add the date picker.
|
1395
|
+
*/
|
1396
|
+
Picker.extend( 'pickadate', DatePicker )
|
1397
|
+
|
1398
|
+
|
1231
1399
|
});
|