Skip to content

Commit e842aee

Browse files
committed
feat(Calendar, DatePicker, DateRangePicker): add the possibility to hide/show days in adjacent months and make them clickable
1 parent 6a35dee commit e842aee

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

js/src/calendar.js

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ const Default = {
5757
maxDate: null,
5858
minDate: null,
5959
range: true,
60-
startDate: null,
60+
selectAdjacementDays: false,
6161
selectEndDate: false,
62+
showAdjacementDays: true,
63+
startDate: null,
6264
weekdayFormat: 2
6365
}
6466

@@ -72,8 +74,10 @@ const DefaultType = {
7274
maxDate: '(date|string|null)',
7375
minDate: '(date|string|null)',
7476
range: 'boolean',
75-
startDate: '(date|string|null)',
77+
selectAdjacementDays: 'boolean',
7678
selectEndDate: 'boolean',
79+
showAdjacementDays: 'boolean',
80+
startDate: '(date|string|null)',
7781
weekdayFormat: '(number|string)'
7882
}
7983

@@ -116,7 +120,23 @@ class Calendar extends BaseComponent {
116120
_addEventListeners() {
117121
EventHandler.on(this._element, 'click', SELECTOR_CALENDAR_CELL_INNER, event => {
118122
event.preventDefault()
123+
if (event.target.parentElement.classList.contains('disabled')) {
124+
return
125+
}
126+
127+
if ((event.target.parentElement.classList.contains('next') || event.target.parentElement.classList.contains('previous')) && !this._config.selectAdjacementDays) {
128+
return
129+
}
130+
119131
if (event.target.classList.contains('day')) {
132+
const date = new Date(Manipulator.getDataAttribute(event.target, 'date'))
133+
const calendarIndex = Manipulator.getDataAttribute(event.target.closest('.calendar-panel'), 'calendar-index')
134+
if (calendarIndex) {
135+
this._setCalendarDate(new Date(date.setMonth(date.getMonth() - calendarIndex)))
136+
} else {
137+
this._setCalendarDate(date)
138+
}
139+
120140
this._selectDate(Manipulator.getDataAttribute(event.target, 'date'))
121141
}
122142

@@ -139,6 +159,10 @@ class Calendar extends BaseComponent {
139159
return
140160
}
141161

162+
if ((event.target.parentElement.classList.contains('next') || event.target.parentElement.classList.contains('previous')) && !this._config.selectAdjacementDays) {
163+
return
164+
}
165+
142166
this._hoverDate = new Date(Manipulator.getDataAttribute(event.target, 'date'))
143167

144168
EventHandler.trigger(this._element, EVENT_CELL_HOVER, {
@@ -274,6 +298,8 @@ class Calendar extends BaseComponent {
274298
const calendarPanelEl = document.createElement('div')
275299
calendarPanelEl.classList.add('calendar-panel')
276300

301+
Manipulator.setDataAttribute(calendarPanelEl, 'calendar-index', addMonths)
302+
277303
// Create navigation
278304
const navigationElement = document.createElement('div')
279305
navigationElement.classList.add('calendar-nav')
@@ -330,11 +356,13 @@ class Calendar extends BaseComponent {
330356
<tbody>
331357
${this._view === 'days' ? monthDetails.map(week => (
332358
`<tr>${week.map(({ date, month }) => (
333-
`<td class="calendar-cell ${this._dayClassNames(date, month)}">
334-
<div class="calendar-cell-inner day" data-coreui-date="${date}">
335-
${date.toLocaleDateString(this._config.locale, { day: 'numeric' })}
336-
</div>
337-
</td>`
359+
month === 'current' || this._config.showAdjacementDays ?
360+
`<td class="calendar-cell ${this._dayClassNames(date, month)}">
361+
<div class="calendar-cell-inner day" data-coreui-date="${date}">
362+
${date.toLocaleDateString(this._config.locale, { day: 'numeric' })}
363+
</div>
364+
</td>` :
365+
'<td></td>'
338366
)).join('')}</tr>`
339367
)).join('') : ''}
340368
${this._view === 'months' ? listOfMonths.map((row, index) => (
@@ -386,6 +414,7 @@ class Calendar extends BaseComponent {
386414
today: isToday(date),
387415
disabled: isDateDisabled(date, this._config.minDate, this._config.maxDate, this._config.disabledDates),
388416
[month]: true,
417+
clickable: month !== 'current' && this._config.selectAdjacementDays,
389418
last: isLastDayOfMonth(date),
390419
range: month === 'current' && isDateInRange(date, this._startDate, this._endDate),
391420
'range-hover': month === 'current' && (this._hoverDate && this._selectEndDate ?

js/src/date-range-picker.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ const Default = {
5656
separator: true,
5757
size: null,
5858
startDate: null,
59+
selectAdjacementDays: false,
5960
selectEndDate: false,
61+
showAdjacementDays: true,
6062
timepicker: false,
6163
todayButton: 'Today',
6264
todayButtonClasses: ['btn', 'btn-sm', 'btn-primary', 'me-auto'],
@@ -86,7 +88,9 @@ const DefaultType = {
8688
separator: 'boolean',
8789
size: '(string|null)',
8890
startDate: '(date|string|null)',
91+
selectAdjacementDays: 'boolean',
8992
selectEndDate: 'boolean',
93+
showAdjacementDays: 'boolean',
9094
timepicker: 'boolean',
9195
todayButton: '(boolean|string)',
9296
todayButtonClasses: '(array|string)',
@@ -396,7 +400,9 @@ class DateRangePicker extends Picker {
396400
maxDate: this._config.maxDate,
397401
minDate: this._config.minDate,
398402
range: this._config.range,
403+
selectAdjacementDays: this._config.selectAdjacementDays,
399404
selectEndDate: this._selectEndDate,
405+
showAdjacementDays: this._config.showAdjacementDays,
400406
startDate: this._startDate
401407
})
402408

0 commit comments

Comments
 (0)