Skip to content

Commit 699b521

Browse files
committed
refactor(DatePicker, DateRangePicker, TimePicker): improve validation, component structure, and syntax; add new CSS variables
1 parent b20de85 commit 699b521

12 files changed

+1486
-839
lines changed

js/src/date-picker.js

Lines changed: 59 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,33 @@
55
* --------------------------------------------------------------------------
66
*/
77

8-
import { defineJQueryPlugin } from './util/index'
9-
import EventHandler from './dom/event-handler'
10-
import SelectorEngine from './dom/selector-engine'
11-
import DateRangePicker from './date-range-picker'
8+
import { defineJQueryPlugin } from './util/index.js'
9+
import EventHandler from './dom/event-handler.js'
10+
import SelectorEngine from './dom/selector-engine.js'
11+
import DateRangePicker from './date-range-picker.js'
1212

1313
/**
14-
* ------------------------------------------------------------------------
15-
* Constants
16-
* ------------------------------------------------------------------------
17-
*/
14+
* Constants
15+
*/
1816

1917
const NAME = 'date-picker'
2018
const DATA_KEY = 'coreui.date-picker'
2119
const EVENT_KEY = `.${DATA_KEY}`
2220
const DATA_API_KEY = '.data-api'
2321

22+
const TAB_KEY = 'Tab'
23+
const RIGHT_MOUSE_BUTTON = 2
24+
2425
const EVENT_DATE_CHANGE = `dateChange${EVENT_KEY}`
26+
const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`
27+
const EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`
2528
const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`
2629

27-
const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="date-picker"]'
30+
const CLASS_NAME_SHOW = 'show'
31+
32+
const SELECTOR_CALENDAR = '.calendar'
33+
const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle="date-picker"]:not(.disabled):not(:disabled)'
34+
const SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`
2835

2936
const Default = {
3037
...DateRangePicker.Default,
@@ -40,14 +47,11 @@ const DefaultType = {
4047
}
4148

4249
/**
43-
* ------------------------------------------------------------------------
44-
* Class Definition
45-
* ------------------------------------------------------------------------
46-
*/
50+
* Class definition
51+
*/
4752

4853
class DatePicker extends DateRangePicker {
4954
// Getters
50-
5155
static get Default() {
5256
return Default
5357
}
@@ -61,15 +65,14 @@ class DatePicker extends DateRangePicker {
6165
}
6266

6367
// Overrides
64-
6568
_addCalendarEventListeners() {
6669
super._addCalendarEventListeners()
67-
for (const calendar of SelectorEngine.find('.calendar', this._element)) {
70+
for (const calendar of SelectorEngine.find(SELECTOR_CALENDAR, this._element)) {
6871
EventHandler.on(calendar, 'startDateChange.coreui.calendar', event => {
6972
this._startDate = event.date
7073
this._selectEndDate = event.selectEndDate
7174
this._startInput.value = this._setInputValue(event.date)
72-
this._updateCalendars()
75+
this._updateDateRangePickerCalendars()
7376

7477
EventHandler.trigger(this._element, EVENT_DATE_CHANGE, {
7578
date: event.date,
@@ -108,13 +111,43 @@ class DatePicker extends DateRangePicker {
108111
data[config](this)
109112
})
110113
}
114+
115+
static clearMenus(event) {
116+
if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {
117+
return
118+
}
119+
120+
const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)
121+
122+
for (const toggle of openToggles) {
123+
const context = DatePicker.getInstance(toggle)
124+
125+
if (!context) {
126+
continue
127+
}
128+
129+
const composedPath = event.composedPath()
130+
131+
if (
132+
composedPath.includes(context._element)
133+
) {
134+
continue
135+
}
136+
137+
const relatedTarget = { relatedTarget: context._element }
138+
139+
if (event.type === 'click') {
140+
relatedTarget.clickEvent = event
141+
}
142+
143+
context.hide()
144+
}
145+
}
111146
}
112147

113148
/**
114-
* ------------------------------------------------------------------------
115-
* Data Api implementation
116-
* ------------------------------------------------------------------------
117-
*/
149+
* Data API implementation
150+
*/
118151

119152
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
120153
const datePickers = SelectorEngine.find(SELECTOR_DATA_TOGGLE)
@@ -123,12 +156,12 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
123156
}
124157
})
125158

159+
EventHandler.on(document, EVENT_CLICK_DATA_API, DatePicker.clearMenus)
160+
EventHandler.on(document, EVENT_KEYUP_DATA_API, DatePicker.clearMenus)
161+
126162
/**
127-
* ------------------------------------------------------------------------
128-
* jQuery
129-
* ------------------------------------------------------------------------
130-
* add .DatePicker to jQuery only if jQuery is present
131-
*/
163+
* jQuery
164+
*/
132165

133166
defineJQueryPlugin(DatePicker)
134167

0 commit comments

Comments
 (0)