@@ -59,6 +59,7 @@ const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
59
59
const CLASS_NAME_CALENDAR_CELL = 'calendar-cell'
60
60
const CLASS_NAME_CALENDAR_ROW = 'calendar-row'
61
61
const CLASS_NAME_CALENDARS = 'calendars'
62
+ const CLASS_NAME_SHOW_WEEK_NUMBERS = 'show-week-numbers'
62
63
63
64
const SELECTOR_BTN_DOUBLE_NEXT = '.btn-double-next'
64
65
const SELECTOR_BTN_DOUBLE_PREV = '.btn-double-prev'
@@ -68,7 +69,9 @@ const SELECTOR_BTN_PREV = '.btn-prev'
68
69
const SELECTOR_BTN_YEAR = '.btn-year'
69
70
const SELECTOR_CALENDAR = '.calendar'
70
71
const SELECTOR_CALENDAR_CELL = '.calendar-cell'
72
+ const SELECTOR_CALENDAR_CELL_CLICKABLE = `${ SELECTOR_CALENDAR_CELL } [tabindex="0"]`
71
73
const SELECTOR_CALENDAR_ROW = '.calendar-row'
74
+ const SELECTOR_CALENDAR_ROW_CLICKABLE = `${ SELECTOR_CALENDAR_ROW } [tabindex="0"]`
72
75
const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="calendar"]'
73
76
74
77
const Default = {
@@ -128,26 +131,8 @@ class Calendar extends BaseComponent {
128
131
super ( element )
129
132
130
133
this . _config = this . _getConfig ( config )
131
- this . _calendarDate = convertToDateObject (
132
- this . _config . calendarDate || this . _config . startDate || this . _config . endDate || new Date ( ) , this . _config . selectionType
133
- )
134
- this . _startDate = convertToDateObject ( this . _config . startDate , this . _config . selectionType )
135
- this . _endDate = convertToDateObject ( this . _config . endDate , this . _config . selectionType )
136
- this . _hoverDate = null
137
- this . _selectEndDate = this . _config . selectEndDate
138
-
139
- if ( this . _config . selectionType === 'day' || this . _config . selectionType === 'week' ) {
140
- this . _view = 'days'
141
- }
142
-
143
- if ( this . _config . selectionType === 'month' ) {
144
- this . _view = 'months'
145
- }
146
-
147
- if ( this . _config . selectionType === 'year' ) {
148
- this . _view = 'years'
149
- }
150
-
134
+ this . _initializeDates ( )
135
+ this . _initializeView ( )
151
136
this . _createCalendar ( )
152
137
this . _addEventListeners ( )
153
138
}
@@ -168,31 +153,37 @@ class Calendar extends BaseComponent {
168
153
// Public
169
154
update ( config ) {
170
155
this . _config = this . _getConfig ( config )
156
+ this . _initializeDates ( )
157
+ this . _initializeView ( )
158
+
159
+ // Clear the current calendar content
160
+ this . _element . innerHTML = ''
161
+ this . _createCalendar ( )
162
+ }
163
+
164
+ // Private
165
+ _initializeDates ( ) {
166
+ // Convert dates to date objects based on the selection type
171
167
this . _calendarDate = convertToDateObject (
172
168
this . _config . calendarDate || this . _config . startDate || this . _config . endDate || new Date ( ) , this . _config . selectionType
173
169
)
174
170
this . _startDate = convertToDateObject ( this . _config . startDate , this . _config . selectionType )
175
171
this . _endDate = convertToDateObject ( this . _config . endDate , this . _config . selectionType )
176
172
this . _hoverDate = null
177
173
this . _selectEndDate = this . _config . selectEndDate
174
+ }
178
175
179
- if ( this . _config . selectionType === 'day' || this . _config . selectionType === 'week' ) {
180
- this . _view = 'days'
181
- }
182
-
183
- if ( this . _config . selectionType === 'month' ) {
184
- this . _view = 'months'
185
- }
186
-
187
- if ( this . _config . selectionType === 'year' ) {
188
- this . _view = 'years'
176
+ _initializeView ( ) {
177
+ const viewMap = {
178
+ day : 'days' ,
179
+ week : 'days' ,
180
+ month : 'months' ,
181
+ year : 'years'
189
182
}
190
183
191
- this . _element . innerHTML = ''
192
- this . _createCalendar ( )
184
+ this . _view = viewMap [ this . _config . selectionType ] || 'days'
193
185
}
194
186
195
- // Private
196
187
_getDate ( target ) {
197
188
if ( this . _config . selectionType === 'week' ) {
198
189
const firstCell = SelectorEngine . findOne ( SELECTOR_CALENDAR_CELL , target . closest ( SELECTOR_CALENDAR_ROW ) )
@@ -270,11 +261,11 @@ class Calendar extends BaseComponent {
270
261
let element = event . target
271
262
272
263
if ( this . _config . selectionType === 'week' && element . tabIndex === - 1 ) {
273
- element = element . closest ( ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` )
264
+ element = element . closest ( SELECTOR_CALENDAR_ROW_CLICKABLE )
274
265
}
275
266
276
267
const list = SelectorEngine . find (
277
- this . _config . selectionType === 'week' ? ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` : ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` ,
268
+ this . _config . selectionType === 'week' ? SELECTOR_CALENDAR_ROW_CLICKABLE : SELECTOR_CALENDAR_CELL_CLICKABLE ,
278
269
this . _element
279
270
)
280
271
@@ -303,7 +294,7 @@ class Calendar extends BaseComponent {
303
294
const callback = key => {
304
295
setTimeout ( ( ) => {
305
296
const _list = SelectorEngine . find (
306
- `${ SELECTOR_CALENDAR_CELL } [tabindex="0"] , ${ SELECTOR_CALENDAR_ROW } [tabindex="0"] ` ,
297
+ `${ SELECTOR_CALENDAR_CELL_CLICKABLE } , ${ SELECTOR_CALENDAR_ROW_CLICKABLE } ` ,
307
298
SelectorEngine . find ( '.calendar' , this . _element ) . pop ( )
308
299
)
309
300
@@ -382,92 +373,86 @@ class Calendar extends BaseComponent {
382
373
}
383
374
384
375
_addEventListeners ( ) {
385
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , event => {
376
+ EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_CALENDAR_CELL_CLICKABLE , event => {
386
377
this . _handleCalendarClick ( event )
387
378
} )
388
379
389
- EventHandler . on ( this . _element , EVENT_KEYDOWN , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , event => {
380
+ EventHandler . on ( this . _element , EVENT_KEYDOWN , SELECTOR_CALENDAR_CELL_CLICKABLE , event => {
390
381
this . _handleCalendarKeydown ( event )
391
382
} )
392
383
393
- EventHandler . on ( this . _element , EVENT_MOUSEENTER , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , event => {
384
+ EventHandler . on ( this . _element , EVENT_MOUSEENTER , SELECTOR_CALENDAR_CELL_CLICKABLE , event => {
394
385
this . _handleCalendarMouseEnter ( event )
395
386
} )
396
387
397
- EventHandler . on ( this . _element , EVENT_MOUSELEAVE , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , ( ) => {
388
+ EventHandler . on ( this . _element , EVENT_MOUSELEAVE , SELECTOR_CALENDAR_CELL_CLICKABLE , ( ) => {
398
389
this . _handleCalendarMouseLeave ( )
399
390
} )
400
391
401
- EventHandler . on ( this . _element , EVENT_FOCUS , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , event => {
392
+ EventHandler . on ( this . _element , EVENT_FOCUS , SELECTOR_CALENDAR_CELL_CLICKABLE , event => {
402
393
this . _handleCalendarMouseEnter ( event )
403
394
} )
404
395
405
- EventHandler . on ( this . _element , EVENT_BLUR , ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , ( ) => {
396
+ EventHandler . on ( this . _element , EVENT_BLUR , SELECTOR_CALENDAR_CELL_CLICKABLE , ( ) => {
406
397
this . _handleCalendarMouseLeave ( )
407
398
} )
408
399
409
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , event => {
400
+ EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_CALENDAR_ROW_CLICKABLE , event => {
410
401
this . _handleCalendarClick ( event )
411
402
} )
412
403
413
- EventHandler . on ( this . _element , EVENT_KEYDOWN , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , event => {
404
+ EventHandler . on ( this . _element , EVENT_KEYDOWN , SELECTOR_CALENDAR_ROW_CLICKABLE , event => {
414
405
this . _handleCalendarKeydown ( event )
415
406
} )
416
407
417
- EventHandler . on ( this . _element , EVENT_MOUSEENTER , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , event => {
408
+ EventHandler . on ( this . _element , EVENT_MOUSEENTER , SELECTOR_CALENDAR_ROW_CLICKABLE , event => {
418
409
this . _handleCalendarMouseEnter ( event )
419
410
} )
420
411
421
- EventHandler . on ( this . _element , EVENT_MOUSELEAVE , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , ( ) => {
412
+ EventHandler . on ( this . _element , EVENT_MOUSELEAVE , SELECTOR_CALENDAR_ROW_CLICKABLE , ( ) => {
422
413
this . _handleCalendarMouseLeave ( )
423
414
} )
424
415
425
- EventHandler . on ( this . _element , EVENT_FOCUS , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , event => {
416
+ EventHandler . on ( this . _element , EVENT_FOCUS , SELECTOR_CALENDAR_ROW_CLICKABLE , event => {
426
417
this . _handleCalendarMouseEnter ( event )
427
418
} )
428
419
429
- EventHandler . on ( this . _element , EVENT_BLUR , ` ${ SELECTOR_CALENDAR_ROW } [tabindex="0"]` , ( ) => {
420
+ EventHandler . on ( this . _element , EVENT_BLUR , SELECTOR_CALENDAR_ROW_CLICKABLE , ( ) => {
430
421
this . _handleCalendarMouseLeave ( )
431
422
} )
432
423
433
424
// Navigation
434
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_PREV , event => {
435
- event . preventDefault ( )
436
- this . _modifyCalendarDate ( 0 , - 1 )
437
- } )
438
-
439
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_DOUBLE_PREV , event => {
440
- event . preventDefault ( )
441
- this . _modifyCalendarDate ( this . _view === 'years' ? - 10 : - 1 )
442
- } )
443
-
444
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_NEXT , event => {
445
- event . preventDefault ( )
446
- this . _modifyCalendarDate ( 0 , 1 )
447
- } )
448
-
449
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_DOUBLE_NEXT , event => {
450
- event . preventDefault ( )
451
- this . _modifyCalendarDate ( this . _view === 'years' ? 10 : 1 )
452
- } )
453
-
454
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_MONTH , event => {
455
- event . preventDefault ( )
456
- this . _view = 'months'
457
- this . _updateCalendar ( )
458
- } )
459
-
460
- EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , SELECTOR_BTN_YEAR , event => {
461
- event . preventDefault ( )
462
- this . _view = 'years'
463
- this . _updateCalendar ( )
464
- } )
425
+ this . _addNavigationEventListeners ( )
465
426
466
427
EventHandler . on ( this . _element , EVENT_MOUSELEAVE , 'table' , ( ) => {
467
428
EventHandler . trigger ( this . _element , EVENT_CALENDAR_MOUSE_LEAVE )
468
429
} )
469
430
}
470
431
432
+ _addNavigationEventListeners ( ) {
433
+ const navigationSelectors = {
434
+ [ SELECTOR_BTN_PREV ] : ( ) => this . _modifyCalendarDate ( 0 , - 1 ) ,
435
+ [ SELECTOR_BTN_DOUBLE_PREV ] : ( ) => this . _modifyCalendarDate ( this . _view === 'years' ? - 10 : - 1 ) ,
436
+ [ SELECTOR_BTN_NEXT ] : ( ) => this . _modifyCalendarDate ( 0 , 1 ) ,
437
+ [ SELECTOR_BTN_DOUBLE_NEXT ] : ( ) => this . _modifyCalendarDate ( this . _view === 'years' ? 10 : 1 ) ,
438
+ [ SELECTOR_BTN_MONTH ] : ( ) => {
439
+ this . _view = 'months'
440
+ this . _updateCalendar ( )
441
+ } ,
442
+ [ SELECTOR_BTN_YEAR ] : ( ) => {
443
+ this . _view = 'years'
444
+ this . _updateCalendar ( )
445
+ }
446
+ }
447
+
448
+ for ( const [ selector , handler ] of Object . entries ( navigationSelectors ) ) {
449
+ EventHandler . on ( this . _element , EVENT_CLICK_DATA_API , selector , event => {
450
+ event . preventDefault ( )
451
+ handler ( )
452
+ } )
453
+ }
454
+ }
455
+
471
456
_setCalendarDate ( date ) {
472
457
this . _calendarDate = date
473
458
@@ -618,7 +603,7 @@ class Calendar extends BaseComponent {
618
603
calendarTable . innerHTML = `
619
604
${ this . _view === 'days' ? `
620
605
<div class="calendar-row-group" role="rowgroup">
621
- <div class="calendar-header- row" role="row">
606
+ <div class="calendar-row-header " role="row">
622
607
${ this . _config . showWeekNumber ?
623
608
`<div class="calendar-cell-week-number" role="cell">
624
609
${ this . _config . weekNumbersLabel ?? '' }
@@ -725,7 +710,7 @@ class Calendar extends BaseComponent {
725
710
}
726
711
727
712
if ( this . _config . showWeekNumber ) {
728
- this . _element . classList . add ( 'show-week-numbers' )
713
+ this . _element . classList . add ( CLASS_NAME_SHOW_WEEK_NUMBERS )
729
714
}
730
715
731
716
for ( const [ index , _ ] of Array . from ( { length : this . _config . calendars } ) . entries ( ) ) {
@@ -765,7 +750,7 @@ class Calendar extends BaseComponent {
765
750
return
766
751
}
767
752
768
- const cells = SelectorEngine . find ( ` ${ SELECTOR_CALENDAR_CELL } [tabindex="0"]` , this . _element )
753
+ const cells = SelectorEngine . find ( SELECTOR_CALENDAR_CELL_CLICKABLE , this . _element )
769
754
770
755
for ( const cell of cells ) {
771
756
const date = new Date ( Manipulator . getDataAttribute ( cell , 'date' ) )
0 commit comments