5
5
* --------------------------------------------------------------------------
6
6
*/
7
7
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 '
12
12
13
13
/**
14
- * ------------------------------------------------------------------------
15
- * Constants
16
- * ------------------------------------------------------------------------
17
- */
14
+ * Constants
15
+ */
18
16
19
17
const NAME = 'date-picker'
20
18
const DATA_KEY = 'coreui.date-picker'
21
19
const EVENT_KEY = `.${ DATA_KEY } `
22
20
const DATA_API_KEY = '.data-api'
23
21
22
+ const TAB_KEY = 'Tab'
23
+ const RIGHT_MOUSE_BUTTON = 2
24
+
24
25
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 } `
25
28
const EVENT_LOAD_DATA_API = `load${ EVENT_KEY } ${ DATA_API_KEY } `
26
29
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 } `
28
35
29
36
const Default = {
30
37
...DateRangePicker . Default ,
@@ -40,14 +47,11 @@ const DefaultType = {
40
47
}
41
48
42
49
/**
43
- * ------------------------------------------------------------------------
44
- * Class Definition
45
- * ------------------------------------------------------------------------
46
- */
50
+ * Class definition
51
+ */
47
52
48
53
class DatePicker extends DateRangePicker {
49
54
// Getters
50
-
51
55
static get Default ( ) {
52
56
return Default
53
57
}
@@ -61,15 +65,14 @@ class DatePicker extends DateRangePicker {
61
65
}
62
66
63
67
// Overrides
64
-
65
68
_addCalendarEventListeners ( ) {
66
69
super . _addCalendarEventListeners ( )
67
- for ( const calendar of SelectorEngine . find ( '.calendar' , this . _element ) ) {
70
+ for ( const calendar of SelectorEngine . find ( SELECTOR_CALENDAR , this . _element ) ) {
68
71
EventHandler . on ( calendar , 'startDateChange.coreui.calendar' , event => {
69
72
this . _startDate = event . date
70
73
this . _selectEndDate = event . selectEndDate
71
74
this . _startInput . value = this . _setInputValue ( event . date )
72
- this . _updateCalendars ( )
75
+ this . _updateDateRangePickerCalendars ( )
73
76
74
77
EventHandler . trigger ( this . _element , EVENT_DATE_CHANGE , {
75
78
date : event . date ,
@@ -108,13 +111,43 @@ class DatePicker extends DateRangePicker {
108
111
data [ config ] ( this )
109
112
} )
110
113
}
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
+ }
111
146
}
112
147
113
148
/**
114
- * ------------------------------------------------------------------------
115
- * Data Api implementation
116
- * ------------------------------------------------------------------------
117
- */
149
+ * Data API implementation
150
+ */
118
151
119
152
EventHandler . on ( window , EVENT_LOAD_DATA_API , ( ) => {
120
153
const datePickers = SelectorEngine . find ( SELECTOR_DATA_TOGGLE )
@@ -123,12 +156,12 @@ EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
123
156
}
124
157
} )
125
158
159
+ EventHandler . on ( document , EVENT_CLICK_DATA_API , DatePicker . clearMenus )
160
+ EventHandler . on ( document , EVENT_KEYUP_DATA_API , DatePicker . clearMenus )
161
+
126
162
/**
127
- * ------------------------------------------------------------------------
128
- * jQuery
129
- * ------------------------------------------------------------------------
130
- * add .DatePicker to jQuery only if jQuery is present
131
- */
163
+ * jQuery
164
+ */
132
165
133
166
defineJQueryPlugin ( DatePicker )
134
167
0 commit comments