1
1
/**
2
2
* --------------------------------------------------------------------------
3
- * CoreUI (v4.2.0-alpha.0 ): date-range-picker.js
4
- * Licensed under MIT (https://coreui.io/license)
3
+ * CoreUI PRO (v4.2.0-beta.2 ): date-range-picker.js
4
+ * License (https://coreui.io/pro/ license-new/ )
5
5
* --------------------------------------------------------------------------
6
6
*/
7
7
8
8
import { defineJQueryPlugin , typeCheckConfig } from './util/index'
9
9
import EventHandler from './dom/event-handler'
10
10
import Manipulator from './dom/manipulator'
11
11
import SelectorEngine from './dom/selector-engine'
12
+ import { isValidDate } from './util/calendar'
12
13
import Calendar from './calendar'
13
14
import Picker from './picker'
14
15
import TimePicker from './time-picker'
@@ -40,12 +41,15 @@ const Default = {
40
41
disabledDates : null ,
41
42
endDate : null ,
42
43
firstDayOfWeek : 1 ,
43
- locale : navigator . language ,
44
+ indicator : true ,
45
+ locale : 'default' ,
44
46
maxDate : null ,
45
47
minDate : null ,
46
48
placeholder : [ 'Start date' , 'End date' ] ,
47
49
range : true ,
48
50
ranges : { } ,
51
+ rangesButtonsClasses : [ 'btn' , 'btn-ghost-secondary' ] ,
52
+ separator : true ,
49
53
size : null ,
50
54
startDate : null ,
51
55
selectEndDate : false ,
@@ -62,12 +66,15 @@ const DefaultType = {
62
66
disabled : 'boolean' ,
63
67
endDate : '(date|string|null)' ,
64
68
firstDayOfWeek : 'number' ,
69
+ indicator : 'boolean' ,
65
70
locale : 'string' ,
66
71
maxDate : '(date|string|null)' ,
67
72
minDate : '(date|string|null)' ,
68
73
placeholder : '(array|string)' ,
69
74
range : 'boolean' ,
70
75
ranges : 'object' ,
76
+ rangesButtonsClasses : '(array|string)' ,
77
+ separator : 'boolean' ,
71
78
size : '(string|null)' ,
72
79
startDate : '(date|string|null)' ,
73
80
selectEndDate : 'boolean' ,
@@ -88,6 +95,8 @@ class DateRangePicker extends Picker {
88
95
this . _calendarDate = this . _convertStringToDate ( this . _config . calendarDate || this . _config . date || this . _config . startDate || new Date ( ) )
89
96
this . _startDate = this . _convertStringToDate ( this . _config . date || this . _config . startDate )
90
97
this . _endDate = this . _convertStringToDate ( this . _config . endDate )
98
+ this . _initialStartDate = null
99
+ this . _initialEndDate = null
91
100
this . _mobile = window . innerWidth < 768
92
101
this . _selectEndDate = this . _config . selectEndDate
93
102
@@ -106,6 +115,7 @@ class DateRangePicker extends Picker {
106
115
this . _addEventListeners ( )
107
116
this . _addCalendarEventListeners ( )
108
117
}
118
+
109
119
// Getters
110
120
111
121
static get Default ( ) {
@@ -122,8 +132,17 @@ class DateRangePicker extends Picker {
122
132
123
133
// Public
124
134
135
+ cancel ( ) {
136
+ this . _endDate = this . _initialEndDate
137
+ this . _endInput . value = this . _setInputValue ( this . _initialEndDate )
138
+ this . _startDate = this . _initialStartDate
139
+ this . _startInput . value = this . _setInputValue ( this . _initialStartDate )
140
+ this . _calendars . innerHTML = ''
141
+ this . _createCalendars ( )
142
+ this . _addCalendarEventListeners ( )
143
+ }
144
+
125
145
clear ( ) {
126
- this . _date = null
127
146
this . _endDate = null
128
147
this . _endInput . value = ''
129
148
this . _startDate = null
@@ -134,7 +153,6 @@ class DateRangePicker extends Picker {
134
153
}
135
154
136
155
reset ( ) {
137
- this . _date = null
138
156
this . _endDate = this . _config . endDate
139
157
this . _endInput . value = this . _setInputValue ( this . _config . endDate )
140
158
this . _startDate = this . _config . startDate
@@ -155,51 +173,85 @@ class DateRangePicker extends Picker {
155
173
156
174
// Private
157
175
_addEventListeners ( ) {
176
+ EventHandler . on ( this . _element , 'shown.coreui.dropdown' , ( ) => {
177
+ this . _initialStartDate = new Date ( this . _startDate )
178
+ this . _initialEndDate = new Date ( this . _endDate )
179
+ } )
180
+
158
181
EventHandler . on ( this . _startInput , 'click' , ( ) => {
182
+ this . _dropdown . show ( )
159
183
this . _selectEndDate = false
184
+ this . _updateCalendars ( )
160
185
} )
186
+
187
+ EventHandler . on ( this . _startInput , 'input' , event => {
188
+ if ( isValidDate ( event . target . value ) ) {
189
+ this . _startDate = this . _convertStringToDate ( event . target . value )
190
+ this . _calendarDate = this . _startDate
191
+ this . _updateCalendars ( )
192
+ }
193
+ } )
194
+
161
195
EventHandler . on ( this . _endInput , 'click' , ( ) => {
196
+ this . _dropdown . show ( )
162
197
this . _selectEndDate = true
198
+ this . _updateCalendars ( )
199
+ } )
200
+
201
+ EventHandler . on ( this . _endInput , 'input' , event => {
202
+ if ( isValidDate ( event . target . value ) ) {
203
+ this . _endDate = this . _convertStringToDate ( event . target . value )
204
+ this . _calendarDate = this . _endDate
205
+ this . _updateCalendars ( )
206
+ }
163
207
} )
208
+
164
209
EventHandler . on ( this . _element , 'click' , '.picker-input-group-cleaner' , event => {
165
210
event . stopPropagation ( )
166
211
this . clear ( )
167
212
} )
213
+
168
214
EventHandler . on ( this . _element , 'onCancelClick.coreui.picker' , ( ) => {
169
- this . reset ( )
215
+ this . cancel ( )
170
216
} )
217
+
171
218
EventHandler . on ( window , 'resize' , ( ) => {
172
219
this . _mobile = window . innerWidth < 768
173
220
} )
174
221
}
175
222
176
223
_addCalendarEventListeners ( ) {
177
224
SelectorEngine . find ( '.calendar' , this . _element ) . forEach ( calendar => {
178
- EventHandler . on ( calendar , 'calendarDateChange.coreui.calendar' , event => {
179
- this . _calendarDate = event . date
180
-
181
- this . _updateCalendars ( )
182
- } )
183
225
EventHandler . on ( calendar , 'startDateChange.coreui.calendar' , event => {
184
226
this . _startDate = event . date
185
227
this . _selectEndDate = event . selectEndDate
186
228
this . _startInput . value = this . _setInputValue ( event . date )
187
229
this . _updateCalendars ( )
188
230
231
+ if ( ! this . _config . range && ( ! this . _config . footer && ! this . _config . timepicker ) ) {
232
+ this . _dropdown . hide ( )
233
+ }
234
+
189
235
EventHandler . trigger ( this . _element , EVENT_START_DATE_CHANGE , {
190
236
date : event . date
191
237
} )
192
238
} )
239
+
193
240
EventHandler . on ( calendar , 'endDateChange.coreui.calendar' , event => {
194
241
this . _endDate = event . date
195
242
this . _selectEndDate = event . selectEndDate
196
243
this . _endInput . value = this . _setInputValue ( event . date )
197
244
this . _updateCalendars ( )
198
245
246
+ if ( this . _startDate && ( ! this . _config . footer && ! this . _config . timepicker ) ) {
247
+ this . _dropdown . hide ( )
248
+ }
249
+
199
250
EventHandler . trigger ( this . _element , EVENT_END_DATE_CHANGE , {
200
251
date : event . date
201
252
} )
202
253
} )
254
+
203
255
EventHandler . on ( calendar , 'cellHover.coreui.calendar' , event => {
204
256
if ( this . _selectEndDate ) {
205
257
this . _endInput . value = event . date ? event . date . toLocaleDateString ( this . _config . locale ) : ( this . _endDate ? this . _setInputValue ( this . _endDate ) : '' )
@@ -244,10 +296,12 @@ class DateRangePicker extends Picker {
244
296
245
297
const inputGroupTextEl = document . createElement ( 'span' )
246
298
inputGroupTextEl . classList . add ( 'input-group-text' )
247
- inputGroupTextEl . innerHTML = `
248
- <span class="picker-input-group-indicator">
249
- <span class="picker-input-group-icon time-picker-input-icon"></span>
250
- </span>`
299
+ if ( this . _config . indicator ) {
300
+ inputGroupTextEl . innerHTML = `
301
+ <span class="picker-input-group-indicator">
302
+ <span class="picker-input-group-icon time-picker-input-icon"></span>
303
+ </span>`
304
+ }
251
305
252
306
if ( this . _config . cleaner ) {
253
307
inputGroupTextEl . innerHTML += `
@@ -259,19 +313,24 @@ class DateRangePicker extends Picker {
259
313
this . _startInput = startInputEl
260
314
this . _endInput = endInputEl
261
315
316
+ inputGroupEl . append ( startInputEl )
317
+
318
+ if ( this . _config . separator ) {
319
+ inputGroupEl . append ( inputGroupTextSeparatorEl )
320
+ }
321
+
262
322
if ( this . _config . range ) {
263
- inputGroupEl . append ( startInputEl , inputGroupTextSeparatorEl , endInputEl , inputGroupTextEl )
264
- } else {
265
- inputGroupEl . append ( startInputEl , inputGroupTextEl )
323
+ inputGroupEl . append ( endInputEl )
324
+ }
325
+
326
+ if ( this . _config . indicator || this . _config . cleaner ) {
327
+ inputGroupEl . append ( inputGroupTextEl )
266
328
}
267
329
268
330
return inputGroupEl
269
331
}
270
332
271
333
_createCalendars ( ) {
272
- const calendarStartElement = document . createElement ( 'div' )
273
- calendarStartElement . classList . add ( 'date-picker-calendar' )
274
-
275
334
Array . from ( { length : this . _mobile ? 1 : this . _config . calendars } ) . forEach ( ( _ , index ) => {
276
335
const calendarEl = document . createElement ( 'div' )
277
336
calendarEl . classList . add ( 'date-picker-calendar' )
@@ -296,6 +355,15 @@ class DateRangePicker extends Picker {
296
355
startDate : this . _startDate
297
356
} )
298
357
358
+ EventHandler . one ( calendarEl , 'calendarDateChange.coreui.calendar' , event => {
359
+ this . _calendarDate = new Date (
360
+ event . date . getFullYear ( ) ,
361
+ event . date . getMonth ( ) - index ,
362
+ 1
363
+ )
364
+ this . _updateCalendars ( )
365
+ } )
366
+
299
367
if ( this . _config . timepicker ) {
300
368
if ( ( this . _config . calendars === 1 || this . _mobile ) && this . _config . range ) {
301
369
const timePickerStartEl = document . createElement ( 'div' )
@@ -306,12 +374,12 @@ class DateRangePicker extends Picker {
306
374
container : 'inline' ,
307
375
disabled : ! this . _startDate ,
308
376
locale : this . _config . locale ,
309
- value : this . _startDate ,
377
+ time : this . _startDate ,
310
378
variant : 'select'
311
379
} )
312
380
calendarEl . append ( timePickerStartEl )
313
381
314
- EventHandler . one ( timePickerStartEl , 'change .coreui.timepicker ' , event => {
382
+ EventHandler . one ( timePickerStartEl , 'timeChange .coreui.time-picker ' , event => {
315
383
this . _startDate = event . date
316
384
this . _startInput . value = this . _setInputValue ( this . _startDate )
317
385
this . _updateCalendars ( )
@@ -325,12 +393,12 @@ class DateRangePicker extends Picker {
325
393
container : 'inline' ,
326
394
disabled : ! this . _endDate ,
327
395
locale : this . _config . locale ,
328
- value : this . _endDate ,
396
+ time : this . _endDate ,
329
397
variant : 'select'
330
398
} )
331
399
calendarEl . append ( timePickerEndEl )
332
400
333
- EventHandler . one ( timePickerEndEl , 'change .coreui.time-picker' , event => {
401
+ EventHandler . one ( timePickerEndEl , 'timeChange .coreui.time-picker' , event => {
334
402
this . _endDate = event . date
335
403
this . _endInput . value = this . _setInputValue ( this . _endDate )
336
404
this . _updateCalendars ( )
@@ -346,12 +414,12 @@ class DateRangePicker extends Picker {
346
414
container : 'inline' ,
347
415
disabled : index === 0 ? ! this . _startDate : ! this . _endDate ,
348
416
locale : this . _config . locale ,
349
- value : index === 0 ? this . _startDate : this . _endDate ,
417
+ time : index === 0 ? this . _startDate : this . _endDate ,
350
418
variant : 'select'
351
419
} )
352
420
calendarEl . append ( timePickerEl )
353
421
354
- EventHandler . one ( timePickerEl , 'change .coreui.time-picker' , event => {
422
+ EventHandler . one ( timePickerEl , 'timeChange .coreui.time-picker' , event => {
355
423
if ( index === 0 ) {
356
424
this . _startDate = event . date
357
425
this . _startInput . value = this . _setInputValue ( this . _startDate )
@@ -385,7 +453,7 @@ class DateRangePicker extends Picker {
385
453
386
454
Object . keys ( this . _config . ranges ) . forEach ( key => {
387
455
const buttonEl = document . createElement ( 'button' )
388
- buttonEl . classList . add ( 'btn' , 'btn-ghost-secondary' )
456
+ buttonEl . classList . add ( ... this . _getButtonClasses ( this . _config . rangesButtonsClasses ) )
389
457
buttonEl . role = 'button'
390
458
buttonEl . addEventListener ( 'click' , ( ) => {
391
459
this . _startDate = this . _config . ranges [ key ] [ 0 ]
0 commit comments