Skip to content

Commit 26236af

Browse files
committed
refactor(DateRangerPicker): add new options, improve syntax
1 parent 50db7a2 commit 26236af

File tree

1 file changed

+96
-28
lines changed

1 file changed

+96
-28
lines changed

js/src/date-range-picker.js

Lines changed: 96 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
/**
22
* --------------------------------------------------------------------------
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/)
55
* --------------------------------------------------------------------------
66
*/
77

88
import { defineJQueryPlugin, typeCheckConfig } from './util/index'
99
import EventHandler from './dom/event-handler'
1010
import Manipulator from './dom/manipulator'
1111
import SelectorEngine from './dom/selector-engine'
12+
import { isValidDate } from './util/calendar'
1213
import Calendar from './calendar'
1314
import Picker from './picker'
1415
import TimePicker from './time-picker'
@@ -40,12 +41,15 @@ const Default = {
4041
disabledDates: null,
4142
endDate: null,
4243
firstDayOfWeek: 1,
43-
locale: navigator.language,
44+
indicator: true,
45+
locale: 'default',
4446
maxDate: null,
4547
minDate: null,
4648
placeholder: ['Start date', 'End date'],
4749
range: true,
4850
ranges: {},
51+
rangesButtonsClasses: ['btn', 'btn-ghost-secondary'],
52+
separator: true,
4953
size: null,
5054
startDate: null,
5155
selectEndDate: false,
@@ -62,12 +66,15 @@ const DefaultType = {
6266
disabled: 'boolean',
6367
endDate: '(date|string|null)',
6468
firstDayOfWeek: 'number',
69+
indicator: 'boolean',
6570
locale: 'string',
6671
maxDate: '(date|string|null)',
6772
minDate: '(date|string|null)',
6873
placeholder: '(array|string)',
6974
range: 'boolean',
7075
ranges: 'object',
76+
rangesButtonsClasses: '(array|string)',
77+
separator: 'boolean',
7178
size: '(string|null)',
7279
startDate: '(date|string|null)',
7380
selectEndDate: 'boolean',
@@ -88,6 +95,8 @@ class DateRangePicker extends Picker {
8895
this._calendarDate = this._convertStringToDate(this._config.calendarDate || this._config.date || this._config.startDate || new Date())
8996
this._startDate = this._convertStringToDate(this._config.date || this._config.startDate)
9097
this._endDate = this._convertStringToDate(this._config.endDate)
98+
this._initialStartDate = null
99+
this._initialEndDate = null
91100
this._mobile = window.innerWidth < 768
92101
this._selectEndDate = this._config.selectEndDate
93102

@@ -106,6 +115,7 @@ class DateRangePicker extends Picker {
106115
this._addEventListeners()
107116
this._addCalendarEventListeners()
108117
}
118+
109119
// Getters
110120

111121
static get Default() {
@@ -122,8 +132,17 @@ class DateRangePicker extends Picker {
122132

123133
// Public
124134

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+
125145
clear() {
126-
this._date = null
127146
this._endDate = null
128147
this._endInput.value = ''
129148
this._startDate = null
@@ -134,7 +153,6 @@ class DateRangePicker extends Picker {
134153
}
135154

136155
reset() {
137-
this._date = null
138156
this._endDate = this._config.endDate
139157
this._endInput.value = this._setInputValue(this._config.endDate)
140158
this._startDate = this._config.startDate
@@ -155,51 +173,85 @@ class DateRangePicker extends Picker {
155173

156174
// Private
157175
_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+
158181
EventHandler.on(this._startInput, 'click', () => {
182+
this._dropdown.show()
159183
this._selectEndDate = false
184+
this._updateCalendars()
160185
})
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+
161195
EventHandler.on(this._endInput, 'click', () => {
196+
this._dropdown.show()
162197
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+
}
163207
})
208+
164209
EventHandler.on(this._element, 'click', '.picker-input-group-cleaner', event => {
165210
event.stopPropagation()
166211
this.clear()
167212
})
213+
168214
EventHandler.on(this._element, 'onCancelClick.coreui.picker', () => {
169-
this.reset()
215+
this.cancel()
170216
})
217+
171218
EventHandler.on(window, 'resize', () => {
172219
this._mobile = window.innerWidth < 768
173220
})
174221
}
175222

176223
_addCalendarEventListeners() {
177224
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-
})
183225
EventHandler.on(calendar, 'startDateChange.coreui.calendar', event => {
184226
this._startDate = event.date
185227
this._selectEndDate = event.selectEndDate
186228
this._startInput.value = this._setInputValue(event.date)
187229
this._updateCalendars()
188230

231+
if (!this._config.range && (!this._config.footer && !this._config.timepicker)) {
232+
this._dropdown.hide()
233+
}
234+
189235
EventHandler.trigger(this._element, EVENT_START_DATE_CHANGE, {
190236
date: event.date
191237
})
192238
})
239+
193240
EventHandler.on(calendar, 'endDateChange.coreui.calendar', event => {
194241
this._endDate = event.date
195242
this._selectEndDate = event.selectEndDate
196243
this._endInput.value = this._setInputValue(event.date)
197244
this._updateCalendars()
198245

246+
if (this._startDate && (!this._config.footer && !this._config.timepicker)) {
247+
this._dropdown.hide()
248+
}
249+
199250
EventHandler.trigger(this._element, EVENT_END_DATE_CHANGE, {
200251
date: event.date
201252
})
202253
})
254+
203255
EventHandler.on(calendar, 'cellHover.coreui.calendar', event => {
204256
if (this._selectEndDate) {
205257
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 {
244296

245297
const inputGroupTextEl = document.createElement('span')
246298
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+
}
251305

252306
if (this._config.cleaner) {
253307
inputGroupTextEl.innerHTML += `
@@ -259,19 +313,24 @@ class DateRangePicker extends Picker {
259313
this._startInput = startInputEl
260314
this._endInput = endInputEl
261315

316+
inputGroupEl.append(startInputEl)
317+
318+
if (this._config.separator) {
319+
inputGroupEl.append(inputGroupTextSeparatorEl)
320+
}
321+
262322
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)
266328
}
267329

268330
return inputGroupEl
269331
}
270332

271333
_createCalendars() {
272-
const calendarStartElement = document.createElement('div')
273-
calendarStartElement.classList.add('date-picker-calendar')
274-
275334
Array.from({ length: this._mobile ? 1 : this._config.calendars }).forEach((_, index) => {
276335
const calendarEl = document.createElement('div')
277336
calendarEl.classList.add('date-picker-calendar')
@@ -296,6 +355,15 @@ class DateRangePicker extends Picker {
296355
startDate: this._startDate
297356
})
298357

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+
299367
if (this._config.timepicker) {
300368
if ((this._config.calendars === 1 || this._mobile) && this._config.range) {
301369
const timePickerStartEl = document.createElement('div')
@@ -306,12 +374,12 @@ class DateRangePicker extends Picker {
306374
container: 'inline',
307375
disabled: !this._startDate,
308376
locale: this._config.locale,
309-
value: this._startDate,
377+
time: this._startDate,
310378
variant: 'select'
311379
})
312380
calendarEl.append(timePickerStartEl)
313381

314-
EventHandler.one(timePickerStartEl, 'change.coreui.timepicker', event => {
382+
EventHandler.one(timePickerStartEl, 'timeChange.coreui.time-picker', event => {
315383
this._startDate = event.date
316384
this._startInput.value = this._setInputValue(this._startDate)
317385
this._updateCalendars()
@@ -325,12 +393,12 @@ class DateRangePicker extends Picker {
325393
container: 'inline',
326394
disabled: !this._endDate,
327395
locale: this._config.locale,
328-
value: this._endDate,
396+
time: this._endDate,
329397
variant: 'select'
330398
})
331399
calendarEl.append(timePickerEndEl)
332400

333-
EventHandler.one(timePickerEndEl, 'change.coreui.time-picker', event => {
401+
EventHandler.one(timePickerEndEl, 'timeChange.coreui.time-picker', event => {
334402
this._endDate = event.date
335403
this._endInput.value = this._setInputValue(this._endDate)
336404
this._updateCalendars()
@@ -346,12 +414,12 @@ class DateRangePicker extends Picker {
346414
container: 'inline',
347415
disabled: index === 0 ? !this._startDate : !this._endDate,
348416
locale: this._config.locale,
349-
value: index === 0 ? this._startDate : this._endDate,
417+
time: index === 0 ? this._startDate : this._endDate,
350418
variant: 'select'
351419
})
352420
calendarEl.append(timePickerEl)
353421

354-
EventHandler.one(timePickerEl, 'change.coreui.time-picker', event => {
422+
EventHandler.one(timePickerEl, 'timeChange.coreui.time-picker', event => {
355423
if (index === 0) {
356424
this._startDate = event.date
357425
this._startInput.value = this._setInputValue(this._startDate)
@@ -385,7 +453,7 @@ class DateRangePicker extends Picker {
385453

386454
Object.keys(this._config.ranges).forEach(key => {
387455
const buttonEl = document.createElement('button')
388-
buttonEl.classList.add('btn', 'btn-ghost-secondary')
456+
buttonEl.classList.add(...this._getButtonClasses(this._config.rangesButtonsClasses))
389457
buttonEl.role = 'button'
390458
buttonEl.addEventListener('click', () => {
391459
this._startDate = this._config.ranges[key][0]

0 commit comments

Comments
 (0)