Skip to content

Commit b4bbdff

Browse files
committed
refactor(CDatePicker, CDateRangePicker): improve syntax
1 parent 24063f9 commit b4bbdff

File tree

9 files changed

+330
-159
lines changed

9 files changed

+330
-159
lines changed

js/src/calendar.js

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const SELECTOR_CALENDAR_CELL_INNER = '.calendar-cell-inner'
4949

5050
const Default = {
5151
calendarDate: new Date(),
52+
calendars: 1,
5253
disabledDates: null,
5354
endDate: null,
5455
firstDayOfWeek: 1,
@@ -63,6 +64,7 @@ const Default = {
6364

6465
const DefaultType = {
6566
calendarDate: '(date|string|null)',
67+
calendars: 'number',
6668
disabledDates: '(array|null)',
6769
endDate: '(date|string|null)',
6870
firstDayOfWeek: 'number',
@@ -89,8 +91,10 @@ class Calendar extends BaseComponent {
8991
this._calendarDate = this._config.calendarDate
9092
this._startDate = this._config.startDate
9193
this._endDate = this._config.endDate
94+
this._hoverDate = null
9295
this._selectEndDate = this._config.selectEndDate
9396
this._view = 'days'
97+
9498
this._createCalendar()
9599
this._addEventListeners()
96100
}
@@ -135,13 +139,18 @@ class Calendar extends BaseComponent {
135139
return
136140
}
137141

142+
this._hoverDate = new Date(Manipulator.getDataAttribute(event.target, 'date'))
143+
138144
EventHandler.trigger(this._element, EVENT_CELL_HOVER, {
139145
date: new Date(Manipulator.getDataAttribute(event.target, 'date'))
140146
})
141147
})
142148

143149
EventHandler.on(this._element, EVENT_MOUSELEAVE, SELECTOR_CALENDAR_CELL_INNER, event => {
144150
event.preventDefault()
151+
152+
this._hoverDate = null
153+
145154
EventHandler.trigger(this._element, EVENT_CELL_HOVER, {
146155
date: null
147156
})
@@ -172,14 +181,14 @@ class Calendar extends BaseComponent {
172181
event.preventDefault()
173182
this._view = 'months'
174183
this._element.innerHTML = ''
175-
this._createCalendar()
184+
this._createCalendarPanel()
176185
})
177186

178187
EventHandler.on(this._element, 'click', '.btn-year', event => {
179188
event.preventDefault()
180189
this._view = 'years'
181190
this._element.innerHTML = ''
182-
this._createCalendar()
191+
this._createCalendarPanel()
183192
})
184193
}
185194

@@ -252,10 +261,18 @@ class Calendar extends BaseComponent {
252261
}
253262
}
254263

255-
_createCalendar() {
256-
const { firstDayOfWeek, locale, weekdayFormat } = this._config
257-
const year = this._calendarDate.getFullYear()
258-
const month = this._calendarDate.getMonth()
264+
_createCalendarPanel(addMonths) {
265+
let date = this._calendarDate
266+
267+
if (addMonths !== 0) {
268+
date = new Date(this._calendarDate.getFullYear(), this._calendarDate.getMonth() + addMonths, 1)
269+
}
270+
271+
const year = date.getFullYear()
272+
const month = date.getMonth()
273+
274+
const calendarPanelEl = document.createElement('div')
275+
calendarPanelEl.classList.add('calendar-panel')
259276

260277
// Create navigation
261278
const navigationElement = document.createElement('div')
@@ -271,10 +288,10 @@ class Calendar extends BaseComponent {
271288
</div>
272289
<div class="calendar-nav-date">
273290
<button class="btn btn-transparent btn-sm btn-month">
274-
${this._calendarDate.toLocaleDateString(locale, { month: 'long' })}
291+
${date.toLocaleDateString(this._config.locale, { month: 'long' })}
275292
</button>
276293
<button class="btn btn-transparent btn-sm btn-year">
277-
${this._calendarDate.toLocaleDateString(locale, { year: 'numeric' })}
294+
${date.toLocaleDateString(this._config.locale, { year: 'numeric' })}
278295
</button>
279296
</div>
280297
<div class="calendar-nav-next">
@@ -287,9 +304,9 @@ class Calendar extends BaseComponent {
287304
</div>
288305
`
289306

290-
const monthDetails = getMonthDetails(year, month, firstDayOfWeek)
291-
const listOfMonths = createGroupsInArray(getMonthsNames(locale), 4)
292-
const listOfYears = createGroupsInArray(getYears(this._calendarDate.getFullYear()), 4)
307+
const monthDetails = getMonthDetails(year, month, this._config.firstDayOfWeek)
308+
const listOfMonths = createGroupsInArray(getMonthsNames(this._config.locale), 4)
309+
const listOfYears = createGroupsInArray(getYears(date.getFullYear()), 4)
293310
const weekDays = monthDetails[0]
294311

295312
const calendarTable = document.createElement('table')
@@ -300,11 +317,11 @@ class Calendar extends BaseComponent {
300317
${weekDays.map(({ date }) => (
301318
`<th class="calendar-cell">
302319
<div class="calendar-header-cell-inner">
303-
${typeof weekdayFormat === 'string' ?
304-
date.toLocaleDateString(locale, { weekday: weekdayFormat }) :
320+
${typeof this._config.weekdayFormat === 'string' ?
321+
date.toLocaleDateString(this._config.locale, { weekday: this._config.weekdayFormat }) :
305322
date
306-
.toLocaleDateString(locale, { weekday: 'long' })
307-
.slice(0, weekdayFormat)}
323+
.toLocaleDateString(this._config.locale, { weekday: 'long' })
324+
.slice(0, this._config.weekdayFormat)}
308325
</div>
309326
</th>`
310327
)).join('')}
@@ -315,7 +332,7 @@ class Calendar extends BaseComponent {
315332
`<tr>${week.map(({ date, month }) => (
316333
`<td class="calendar-cell ${this._dayClassNames(date, month)}">
317334
<div class="calendar-cell-inner day" data-coreui-date="${date}">
318-
${date.toLocaleDateString(locale, { day: 'numeric' })}
335+
${date.toLocaleDateString(this._config.locale, { day: 'numeric' })}
319336
</div>
320337
</td>`
321338
)).join('')}</tr>`
@@ -340,28 +357,50 @@ class Calendar extends BaseComponent {
340357
)).join('') : ''}
341358
</tbody>
342359
`
360+
calendarPanelEl.append(navigationElement, calendarTable)
361+
362+
return calendarPanelEl
363+
}
364+
365+
_createCalendar() {
366+
const calendarsEl = document.createElement('div')
367+
calendarsEl.classList.add('calendars')
368+
Array.from({ length: this._config.calendars }).forEach((_, index) => (
369+
calendarsEl.append(this._createCalendarPanel(index))
370+
))
343371

344372
this._element.classList.add(CLASS_NAME_CALENDAR)
345-
this._element.append(navigationElement, calendarTable)
373+
this._element.append(calendarsEl)
346374
}
347375

348376
_updateCalendar() {
349377
this._element.innerHTML = ''
350-
this._createCalendar()
378+
this._createCalendarPanel()
351379
}
352380

353381
_dayClassNames(date, month) {
354-
const classNames = [
355-
isToday(date) && 'today',
356-
isDateDisabled(date, this._config.minDate, this._config.maxDate, this._config.disabledDates) && 'disabled',
357-
`${month}`,
358-
isLastDayOfMonth(date) && 'last',
359-
month === 'current' && isDateInRange(date, this._startDate, this._endDate) && 'range',
360-
isDateSelected(date, this._startDate, this._endDate) && 'selected',
361-
isStartDate(date, this._startDate, this._endDate) && 'start',
362-
isEndDate(date, this._startDate, this._endDate) && 'end'
363-
]
364-
return classNames.filter(Boolean).join(' ')
382+
const classNames = {
383+
today: isToday(date),
384+
disabled: isDateDisabled(date, this._config.minDate, this._config.maxDate, this._config.disabledDates),
385+
[month]: true,
386+
last: isLastDayOfMonth(date),
387+
range: month === 'current' && isDateInRange(date, this._startDate, this._endDate),
388+
'range-hover': month === 'current' && (this._hoverDate && this._selectEndDate ?
389+
isDateInRange(date, this._startDate, this._hoverDate) :
390+
isDateInRange(date, this._hoverDate, this._endDate)),
391+
selected: isDateSelected(date, this._startDate, this._endDate),
392+
start: isStartDate(date, this._startDate, this._endDate),
393+
end: isEndDate(date, this._startDate, this._endDate)
394+
}
395+
396+
// eslint-disable-next-line unicorn/no-array-reduce, unicorn/prefer-object-from-entries
397+
const result = Object.keys(classNames).reduce((o, key) => {
398+
// eslint-disable-next-line no-unused-expressions
399+
classNames[key] === true && (o[key] = classNames[key])
400+
return o
401+
}, {})
402+
403+
return Object.keys(result).join(' ')
365404
}
366405

367406
_getConfig(config) {

js/src/date-picker.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ class DatePicker extends DateRangePicker {
7272
this._updateCalendars()
7373

7474
EventHandler.trigger(this._element, EVENT_DATE_CHANGE, {
75-
date: event.date
75+
date: event.date,
76+
formatedDate: event.date ? this._formatDate(event.date) : undefined
7677
})
7778
})
7879
})

0 commit comments

Comments
 (0)