jsl-ui 9.28.2 → 9.28.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/IntervalComponent.d.ts +17 -17
- package/lib/components/IntervalComponent.js +65 -68
- package/lib/components/auto-suggest/AutoSuggestComponent.d.ts +22 -22
- package/lib/components/auto-suggest/AutoSuggestComponent.js +47 -49
- package/lib/components/button/ButtonComponent.d.ts +18 -18
- package/lib/components/button/ButtonComponent.js +29 -46
- package/lib/components/checkbox/CheckBoxComponent.d.ts +28 -28
- package/lib/components/checkbox/CheckBoxComponent.js +81 -98
- package/lib/components/date/DateComponent.d.ts +32 -32
- package/lib/components/date/DateComponent.js +89 -106
- package/lib/components/date-range/DateRangeComponent.d.ts +35 -35
- package/lib/components/date-range/DateRangeComponent.js +123 -136
- package/lib/components/date-time/DateTimeComponent.d.ts +15 -15
- package/lib/components/date-time/DateTimeComponent.js +39 -53
- package/lib/components/dialog/DialogComponent.d.ts +67 -67
- package/lib/components/dialog/DialogComponent.js +198 -251
- package/lib/components/drop-down/DropDownComponent.d.ts +27 -27
- package/lib/components/drop-down/DropDownComponent.js +60 -74
- package/lib/components/expander/ExpanderComponent.d.ts +27 -27
- package/lib/components/expander/ExpanderComponent.js +89 -90
- package/lib/components/form-field/FormComponent.d.ts +12 -12
- package/lib/components/form-field/FormComponent.js +23 -26
- package/lib/components/form-field/FormFieldComponent.d.ts +39 -39
- package/lib/components/form-field/FormFieldComponent.js +138 -140
- package/lib/components/grid/GridComponent.d.ts +26 -26
- package/lib/components/grid/GridComponent.js +110 -116
- package/lib/components/input/InputComponent.d.ts +33 -33
- package/lib/components/input/InputComponent.js +126 -147
- package/lib/components/loading/LoadingComponent.d.ts +8 -8
- package/lib/components/loading/LoadingComponent.js +20 -22
- package/lib/components/navigation/NavigationComponent.d.ts +34 -34
- package/lib/components/navigation/NavigationComponent.js +45 -70
- package/lib/components/notification/Notification.d.ts +19 -19
- package/lib/components/notification/Notification.js +65 -69
- package/lib/components/number/NumberComponent.d.ts +26 -26
- package/lib/components/number/NumberComponent.js +80 -98
- package/lib/components/overlay/OverlayComponent.d.ts +27 -27
- package/lib/components/overlay/OverlayComponent.js +137 -149
- package/lib/components/progress/ProgressComponent.d.ts +18 -18
- package/lib/components/progress/ProgressComponent.js +40 -42
- package/lib/components/ribbon-menu/RibbonMenuComponent.d.ts +12 -12
- package/lib/components/ribbon-menu/RibbonMenuComponent.js +23 -34
- package/lib/components/select/SelectComponent.d.ts +79 -79
- package/lib/components/select/SelectComponent.js +356 -369
- package/lib/components/select/SelectDDAreaComponent.d.ts +32 -32
- package/lib/components/select/SelectDDAreaComponent.js +303 -317
- package/lib/components/slider/nouislider.d.ts +44 -44
- package/lib/components/slider/nouislider.js +2158 -2158
- package/lib/components/stack-panel/SplitterComponent.d.ts +21 -21
- package/lib/components/stack-panel/SplitterComponent.js +124 -126
- package/lib/components/stack-panel/StackPanelComponent.d.ts +20 -20
- package/lib/components/stack-panel/StackPanelComponent.js +50 -64
- package/lib/components/tabs/TabsComponent.d.ts +40 -40
- package/lib/components/tabs/TabsComponent.js +200 -204
- package/lib/components/time/TimeComponent.d.ts +29 -29
- package/lib/components/time/TimeComponent.js +104 -113
- package/lib/components/tree-view/TreeViewComponent.d.ts +23 -23
- package/lib/components/tree-view/TreeViewComponent.js +43 -45
- package/lib/components/virtual-render/VirtualRenderComponent.d.ts +30 -30
- package/lib/components/virtual-render/VirtualRenderComponent.js +92 -104
- package/lib/core/culture.d.ts +5 -5
- package/lib/core/culture.js +385 -385
- package/lib/core/date.d.ts +14 -14
- package/lib/core/date.js +346 -350
- package/lib/core/helper.d.ts +13 -13
- package/lib/core/helper.js +100 -104
- package/lib/core/jq.d.ts +37 -37
- package/lib/core/jq.js +362 -371
- package/lib/core/lang.d.ts +24 -24
- package/lib/core/lang.js +24 -28
- package/lib/core/numeric.d.ts +7 -7
- package/lib/core/numeric.js +139 -143
- package/lib/core/polyfills.js +22 -22
- package/lib/core.d.ts +6 -6
- package/lib/core.js +6 -6
- package/lib/grid/filterDialogs/dateRangeFilter.d.ts +7 -7
- package/lib/grid/filterDialogs/dateRangeFilter.js +106 -156
- package/lib/grid/filterDialogs/excelFilter.d.ts +9 -9
- package/lib/grid/filterDialogs/excelFilter.js +250 -316
- package/lib/grid/plugins/ext.overlay.d.ts +2 -2
- package/lib/grid/plugins/ext.overlay.js +295 -295
- package/lib/grid/plugins/slick.cellrangedecorator.d.ts +12 -12
- package/lib/grid/plugins/slick.cellrangedecorator.js +68 -68
- package/lib/grid/plugins/slick.cellrangeselector.d.ts +1 -1
- package/lib/grid/plugins/slick.cellrangeselector.js +144 -144
- package/lib/grid/plugins/slick.cellselectionmodel.d.ts +1 -1
- package/lib/grid/plugins/slick.cellselectionmodel.js +194 -194
- package/lib/grid/plugins/slick.headerbuttons.d.ts +55 -55
- package/lib/grid/plugins/slick.headerbuttons.js +156 -156
- package/lib/grid/plugins/slick.headermenu.d.ts +74 -74
- package/lib/grid/plugins/slick.headermenu.js +260 -260
- package/lib/grid/plugins/slick.rowmovemanager.d.ts +18 -18
- package/lib/grid/plugins/slick.rowmovemanager.js +249 -249
- package/lib/grid/plugins/slick.rowselectionmodel.d.ts +1 -1
- package/lib/grid/plugins/slick.rowselectionmodel.js +167 -167
- package/lib/grid/slick.core.d.ts +91 -91
- package/lib/grid/slick.core.js +574 -574
- package/lib/grid/slick.creator.d.ts +81 -81
- package/lib/grid/slick.creator.js +726 -726
- package/lib/grid/slick.dataview.d.ts +71 -71
- package/lib/grid/slick.dataview.js +1069 -1080
- package/lib/grid/slick.editors.core.d.ts +4 -4
- package/lib/grid/slick.editors.core.js +235 -235
- package/lib/grid/slick.editors.date.d.ts +2 -2
- package/lib/grid/slick.editors.date.js +125 -125
- package/lib/grid/slick.editors.lookup.d.ts +14 -14
- package/lib/grid/slick.editors.lookup.js +352 -353
- package/lib/grid/slick.editors.nav.d.ts +6 -6
- package/lib/grid/slick.editors.nav.js +22 -22
- package/lib/grid/slick.formatters.d.ts +17 -17
- package/lib/grid/slick.formatters.js +144 -144
- package/lib/grid/slick.grid.d.ts +285 -285
- package/lib/grid/slick.grid.js +5409 -5412
- package/lib/grid/slick.groupitemmetadataprovider.d.ts +39 -39
- package/lib/grid/slick.groupitemmetadataprovider.js +165 -165
- package/lib/grid/slick.tree.d.ts +33 -33
- package/lib/grid/slick.tree.js +208 -220
- package/lib/grid.css +1 -705
- package/lib/grid.d.ts +13 -13
- package/lib/grid.js +13 -13
- package/lib/index.css +8 -2195
- package/lib/index.css.map +1 -1
- package/lib/index.d.ts +56 -55
- package/lib/index.js +61 -61
- package/lib/index.js.map +1 -1
- package/lib/interaction/dataconverter.d.ts +4 -4
- package/lib/interaction/dataconverter.js +0 -1
- package/lib/interaction/eventhandler.d.ts +13 -13
- package/lib/interaction/eventhandler.js +39 -42
- package/lib/interaction/moveable.d.ts +39 -39
- package/lib/interaction/moveable.js +160 -174
- package/lib/interaction/resizable.d.ts +37 -37
- package/lib/interaction/resizable.js +109 -123
- package/lib/ui/auto.suggest.d.ts +18 -18
- package/lib/ui/auto.suggest.js +244 -259
- package/lib/ui/date.picker/date-picker-options.d.ts +11 -11
- package/lib/ui/date.picker/date-picker-options.js +76 -76
- package/lib/ui/date.picker/lib/date-manip.d.ts +74 -74
- package/lib/ui/date.picker/lib/date-manip.js +120 -120
- package/lib/ui/date.picker/lib/dom.d.ts +23 -23
- package/lib/ui/date.picker/lib/dom.js +28 -28
- package/lib/ui/date.picker/lib/emitter.d.ts +13 -13
- package/lib/ui/date.picker/lib/emitter.js +49 -49
- package/lib/ui/date.picker/lib/fns.d.ts +23 -23
- package/lib/ui/date.picker/lib/fns.js +39 -43
- package/lib/ui/date.picker/mode/base-mode.d.ts +26 -26
- package/lib/ui/date.picker/mode/base-mode.js +248 -248
- package/lib/ui/date.picker/mode/dropdown-mode.d.ts +28 -28
- package/lib/ui/date.picker/mode/dropdown-mode.js +50 -50
- package/lib/ui/date.picker/mode/index.d.ts +28 -28
- package/lib/ui/date.picker/mode/index.js +18 -18
- package/lib/ui/date.picker/mode/modal-mode.d.ts +25 -25
- package/lib/ui/date.picker/mode/modal-mode.js +17 -17
- package/lib/ui/date.picker/mode/permanent-mode.d.ts +29 -29
- package/lib/ui/date.picker/mode/permanent-mode.js +19 -19
- package/lib/ui/date.picker/views/day-picker.d.ts +40 -40
- package/lib/ui/date.picker/views/day-picker.js +155 -155
- package/lib/ui/date.picker/views/month-picker.d.ts +26 -26
- package/lib/ui/date.picker/views/month-picker.js +65 -65
- package/lib/ui/date.picker/views/year-picker.d.ts +20 -20
- package/lib/ui/date.picker/views/year-picker.js +66 -66
- package/lib/ui/date.picker.d.ts +66 -66
- package/lib/ui/date.picker.js +32 -32
- package/lib/ui/dialog.d.ts +22 -22
- package/lib/ui/dialog.js +98 -113
- package/lib/ui/drop.down.d.ts +52 -52
- package/lib/ui/drop.down.js +2112 -2112
- package/lib/ui/number.input.d.ts +13 -13
- package/lib/ui/number.input.js +56 -67
- package/package.json +1 -1
|
@@ -1,248 +1,248 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Defines the base date picker behavior, overridden by various modes.
|
|
3
|
-
*/
|
|
4
|
-
import dayPicker from '../views/day-picker';
|
|
5
|
-
import monthPicker from '../views/month-picker';
|
|
6
|
-
import yearPicker from '../views/year-picker';
|
|
7
|
-
import { bufferFn, noop } from '../lib/fns';
|
|
8
|
-
import { on, CustomEvent, Key } from '../lib/dom';
|
|
9
|
-
import { constrainDate } from '../lib/date-manip';
|
|
10
|
-
var views = {
|
|
11
|
-
day: dayPicker,
|
|
12
|
-
year: yearPicker,
|
|
13
|
-
month: monthPicker
|
|
14
|
-
};
|
|
15
|
-
export default function BaseMode(input, emit, opts) {
|
|
16
|
-
var detatchInputEvents; // A function that detaches all events from the input
|
|
17
|
-
var closing = false; // A hack to prevent calendar from re-opening when closing.
|
|
18
|
-
var selectedDate; // The currently selected date
|
|
19
|
-
var dp = {
|
|
20
|
-
// The root DOM element for the date picker, initialized on first open.
|
|
21
|
-
el: undefined,
|
|
22
|
-
opts: opts,
|
|
23
|
-
shouldFocusOnBlur: true,
|
|
24
|
-
shouldFocusOnRender: true,
|
|
25
|
-
state: initialState(),
|
|
26
|
-
adjustPosition: noop,
|
|
27
|
-
containerHTML: '<div class="dp"></div>',
|
|
28
|
-
attachToDom: function () {
|
|
29
|
-
opts.appendTo.appendChild(dp.el);
|
|
30
|
-
},
|
|
31
|
-
updateInput: function (selectedDate) {
|
|
32
|
-
var e = new CustomEvent('change', { bubbles: true });
|
|
33
|
-
e.simulated = true;
|
|
34
|
-
input.value = selectedDate ? opts.format(selectedDate) : '';
|
|
35
|
-
input.dispatchEvent(e);
|
|
36
|
-
},
|
|
37
|
-
computeSelectedDate: function () {
|
|
38
|
-
return opts.parse(input.value);
|
|
39
|
-
},
|
|
40
|
-
currentView: function () {
|
|
41
|
-
return views[dp.state.view];
|
|
42
|
-
},
|
|
43
|
-
open: function () {
|
|
44
|
-
if (closing) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
if (!dp.el) {
|
|
48
|
-
dp.el = createContainerElement(opts, dp.containerHTML);
|
|
49
|
-
attachContainerEvents(dp);
|
|
50
|
-
}
|
|
51
|
-
selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);
|
|
52
|
-
dp.state.hilightedDate = selectedDate || opts.hilightedDate;
|
|
53
|
-
dp.state.view = 'day';
|
|
54
|
-
dp.attachToDom();
|
|
55
|
-
dp.render();
|
|
56
|
-
emit('open');
|
|
57
|
-
},
|
|
58
|
-
isVisible: function () {
|
|
59
|
-
return !!dp.el && !!dp.el.parentNode;
|
|
60
|
-
},
|
|
61
|
-
hasFocus: function () {
|
|
62
|
-
var focused = document.activeElement;
|
|
63
|
-
return dp.el &&
|
|
64
|
-
dp.el.contains(focused) &&
|
|
65
|
-
focused.className.indexOf('dp-focuser') < 0;
|
|
66
|
-
},
|
|
67
|
-
shouldHide: function () {
|
|
68
|
-
return dp.isVisible();
|
|
69
|
-
},
|
|
70
|
-
close: function (becauseOfBlur) {
|
|
71
|
-
var el = dp.el;
|
|
72
|
-
if (!dp.isVisible()) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
if (el) {
|
|
76
|
-
var parent = el.parentNode;
|
|
77
|
-
parent && parent.removeChild(el);
|
|
78
|
-
}
|
|
79
|
-
closing = true;
|
|
80
|
-
if (becauseOfBlur && dp.shouldFocusOnBlur) {
|
|
81
|
-
focusInput(input);
|
|
82
|
-
}
|
|
83
|
-
// When we close, the input often gains refocus, which
|
|
84
|
-
// can then launch the date picker again, so we buffer
|
|
85
|
-
// a bit and don't show the date picker within N ms of closing
|
|
86
|
-
setTimeout(function () {
|
|
87
|
-
closing = false;
|
|
88
|
-
}, 100);
|
|
89
|
-
emit('close');
|
|
90
|
-
},
|
|
91
|
-
destroy: function () {
|
|
92
|
-
dp.close();
|
|
93
|
-
detatchInputEvents();
|
|
94
|
-
},
|
|
95
|
-
render: function () {
|
|
96
|
-
if (!dp.el) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
var hadFocus = dp.hasFocus();
|
|
100
|
-
var html = dp.currentView().render(dp);
|
|
101
|
-
html && (dp.el.firstChild.innerHTML = html);
|
|
102
|
-
dp.adjustPosition();
|
|
103
|
-
if (hadFocus || dp.shouldFocusOnRender) {
|
|
104
|
-
focusCurrent(dp);
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
// Conceptually similar to setState in React, updates
|
|
108
|
-
// the view state and re-renders.
|
|
109
|
-
setState: function (state) {
|
|
110
|
-
for (var key in state) {
|
|
111
|
-
dp.state[key] = state[key];
|
|
112
|
-
}
|
|
113
|
-
emit('statechange');
|
|
114
|
-
dp.render();
|
|
115
|
-
},
|
|
116
|
-
};
|
|
117
|
-
detatchInputEvents = attachInputEvents(input, dp);
|
|
118
|
-
// Builds the initial view state
|
|
119
|
-
// selectedDate is a special case and causes changes to hilightedDate
|
|
120
|
-
// hilightedDate is set on open, so remains undefined initially
|
|
121
|
-
// view is the current view (day, month, year)
|
|
122
|
-
function initialState() {
|
|
123
|
-
return {
|
|
124
|
-
get selectedDate() {
|
|
125
|
-
return selectedDate;
|
|
126
|
-
},
|
|
127
|
-
set selectedDate(dt) {
|
|
128
|
-
if (dt && !opts.inRange(dt)) {
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
if (dt) {
|
|
132
|
-
selectedDate = new Date(dt);
|
|
133
|
-
dp.state.hilightedDate = selectedDate;
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
selectedDate = dt;
|
|
137
|
-
}
|
|
138
|
-
dp.updateInput(selectedDate);
|
|
139
|
-
emit('select');
|
|
140
|
-
dp.close();
|
|
141
|
-
},
|
|
142
|
-
view: 'day',
|
|
143
|
-
hilightedDate: undefined
|
|
144
|
-
};
|
|
145
|
-
}
|
|
146
|
-
return dp;
|
|
147
|
-
}
|
|
148
|
-
function createContainerElement(opts, containerHTML) {
|
|
149
|
-
var el = document.createElement('div');
|
|
150
|
-
el.className = opts.mode;
|
|
151
|
-
el.innerHTML = containerHTML;
|
|
152
|
-
return el;
|
|
153
|
-
}
|
|
154
|
-
function attachInputEvents(input, dp) {
|
|
155
|
-
var bufferShow = bufferFn(5, function () {
|
|
156
|
-
if (dp.shouldHide()) {
|
|
157
|
-
dp.close();
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
dp.open();
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
var off = [
|
|
164
|
-
on('blur', input, bufferFn(150, function () {
|
|
165
|
-
if (!dp.hasFocus()) {
|
|
166
|
-
dp.close(true);
|
|
167
|
-
}
|
|
168
|
-
})),
|
|
169
|
-
on('mousedown', input, function () {
|
|
170
|
-
if (input === document.activeElement && !dp.isVisible()) {
|
|
171
|
-
bufferShow();
|
|
172
|
-
}
|
|
173
|
-
}),
|
|
174
|
-
on('focus', input, bufferShow),
|
|
175
|
-
on('input', input, function (e) {
|
|
176
|
-
try {
|
|
177
|
-
var date = dp.opts.parse(e.target.value);
|
|
178
|
-
dp.setState({
|
|
179
|
-
hilightedDate: date
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
catch (e) {
|
|
183
|
-
//ignore invalid dates while input
|
|
184
|
-
}
|
|
185
|
-
}),
|
|
186
|
-
];
|
|
187
|
-
// Unregister all events that were registered above.
|
|
188
|
-
return function () {
|
|
189
|
-
off.forEach(function (f) {
|
|
190
|
-
f();
|
|
191
|
-
});
|
|
192
|
-
};
|
|
193
|
-
}
|
|
194
|
-
function focusCurrent(dp) {
|
|
195
|
-
var current = dp.el.querySelector('.dp-current');
|
|
196
|
-
return current && current.focus();
|
|
197
|
-
}
|
|
198
|
-
function attachContainerEvents(dp) {
|
|
199
|
-
var el = dp.el;
|
|
200
|
-
var calEl = el.querySelector('.dp');
|
|
201
|
-
// Hack to get iOS to show active CSS states
|
|
202
|
-
el.ontouchstart = noop;
|
|
203
|
-
function onClick(e) {
|
|
204
|
-
e.target.className.split(' ').forEach(function (evt) {
|
|
205
|
-
var handler = dp.currentView().onClick[evt];
|
|
206
|
-
handler && handler(e, dp);
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
// The calender fires a blur event *every* time we redraw
|
|
210
|
-
// this means we need to buffer the blur event to see if
|
|
211
|
-
// it still has no focus after redrawing, and only then
|
|
212
|
-
// do we return focus to the input. A possible other approach
|
|
213
|
-
// would be to set context.redrawing = true on redraw and
|
|
214
|
-
// set it to false in the blur event.
|
|
215
|
-
on('blur', calEl, bufferFn(150, function () {
|
|
216
|
-
if (!dp.hasFocus()) {
|
|
217
|
-
dp.close(true);
|
|
218
|
-
}
|
|
219
|
-
}));
|
|
220
|
-
on('keydown', el, function (e) {
|
|
221
|
-
if (e.keyCode === Key.enter) {
|
|
222
|
-
onClick(e);
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
dp.currentView().onKeyDown(e, dp);
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
// If the user clicks in non-focusable space, but
|
|
229
|
-
// still within the date picker, we don't want to
|
|
230
|
-
// hide, so we need to hack some things...
|
|
231
|
-
on('mousedown', calEl, function (e) {
|
|
232
|
-
e.target.focus && e.target.focus(); // IE hack
|
|
233
|
-
if (document.activeElement !== e.target) {
|
|
234
|
-
e.preventDefault();
|
|
235
|
-
focusCurrent(dp);
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
on('click', el, onClick);
|
|
239
|
-
}
|
|
240
|
-
function focusInput(input) {
|
|
241
|
-
// When the modal closes, we need to focus the original input so the
|
|
242
|
-
// user can continue tabbing from where they left off.
|
|
243
|
-
input.focus();
|
|
244
|
-
// iOS zonks out if we don't blur the input, so...
|
|
245
|
-
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
|
246
|
-
input.blur();
|
|
247
|
-
}
|
|
248
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @file Defines the base date picker behavior, overridden by various modes.
|
|
3
|
+
*/
|
|
4
|
+
import dayPicker from '../views/day-picker';
|
|
5
|
+
import monthPicker from '../views/month-picker';
|
|
6
|
+
import yearPicker from '../views/year-picker';
|
|
7
|
+
import { bufferFn, noop } from '../lib/fns';
|
|
8
|
+
import { on, CustomEvent, Key } from '../lib/dom';
|
|
9
|
+
import { constrainDate } from '../lib/date-manip';
|
|
10
|
+
var views = {
|
|
11
|
+
day: dayPicker,
|
|
12
|
+
year: yearPicker,
|
|
13
|
+
month: monthPicker
|
|
14
|
+
};
|
|
15
|
+
export default function BaseMode(input, emit, opts) {
|
|
16
|
+
var detatchInputEvents; // A function that detaches all events from the input
|
|
17
|
+
var closing = false; // A hack to prevent calendar from re-opening when closing.
|
|
18
|
+
var selectedDate; // The currently selected date
|
|
19
|
+
var dp = {
|
|
20
|
+
// The root DOM element for the date picker, initialized on first open.
|
|
21
|
+
el: undefined,
|
|
22
|
+
opts: opts,
|
|
23
|
+
shouldFocusOnBlur: true,
|
|
24
|
+
shouldFocusOnRender: true,
|
|
25
|
+
state: initialState(),
|
|
26
|
+
adjustPosition: noop,
|
|
27
|
+
containerHTML: '<div class="dp"></div>',
|
|
28
|
+
attachToDom: function () {
|
|
29
|
+
opts.appendTo.appendChild(dp.el);
|
|
30
|
+
},
|
|
31
|
+
updateInput: function (selectedDate) {
|
|
32
|
+
var e = new CustomEvent('change', { bubbles: true });
|
|
33
|
+
e.simulated = true;
|
|
34
|
+
input.value = selectedDate ? opts.format(selectedDate) : '';
|
|
35
|
+
input.dispatchEvent(e);
|
|
36
|
+
},
|
|
37
|
+
computeSelectedDate: function () {
|
|
38
|
+
return opts.parse(input.value);
|
|
39
|
+
},
|
|
40
|
+
currentView: function () {
|
|
41
|
+
return views[dp.state.view];
|
|
42
|
+
},
|
|
43
|
+
open: function () {
|
|
44
|
+
if (closing) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (!dp.el) {
|
|
48
|
+
dp.el = createContainerElement(opts, dp.containerHTML);
|
|
49
|
+
attachContainerEvents(dp);
|
|
50
|
+
}
|
|
51
|
+
selectedDate = constrainDate(dp.computeSelectedDate(), opts.min, opts.max);
|
|
52
|
+
dp.state.hilightedDate = selectedDate || opts.hilightedDate;
|
|
53
|
+
dp.state.view = 'day';
|
|
54
|
+
dp.attachToDom();
|
|
55
|
+
dp.render();
|
|
56
|
+
emit('open');
|
|
57
|
+
},
|
|
58
|
+
isVisible: function () {
|
|
59
|
+
return !!dp.el && !!dp.el.parentNode;
|
|
60
|
+
},
|
|
61
|
+
hasFocus: function () {
|
|
62
|
+
var focused = document.activeElement;
|
|
63
|
+
return dp.el &&
|
|
64
|
+
dp.el.contains(focused) &&
|
|
65
|
+
focused.className.indexOf('dp-focuser') < 0;
|
|
66
|
+
},
|
|
67
|
+
shouldHide: function () {
|
|
68
|
+
return dp.isVisible();
|
|
69
|
+
},
|
|
70
|
+
close: function (becauseOfBlur) {
|
|
71
|
+
var el = dp.el;
|
|
72
|
+
if (!dp.isVisible()) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (el) {
|
|
76
|
+
var parent = el.parentNode;
|
|
77
|
+
parent && parent.removeChild(el);
|
|
78
|
+
}
|
|
79
|
+
closing = true;
|
|
80
|
+
if (becauseOfBlur && dp.shouldFocusOnBlur) {
|
|
81
|
+
focusInput(input);
|
|
82
|
+
}
|
|
83
|
+
// When we close, the input often gains refocus, which
|
|
84
|
+
// can then launch the date picker again, so we buffer
|
|
85
|
+
// a bit and don't show the date picker within N ms of closing
|
|
86
|
+
setTimeout(function () {
|
|
87
|
+
closing = false;
|
|
88
|
+
}, 100);
|
|
89
|
+
emit('close');
|
|
90
|
+
},
|
|
91
|
+
destroy: function () {
|
|
92
|
+
dp.close();
|
|
93
|
+
detatchInputEvents();
|
|
94
|
+
},
|
|
95
|
+
render: function () {
|
|
96
|
+
if (!dp.el) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
var hadFocus = dp.hasFocus();
|
|
100
|
+
var html = dp.currentView().render(dp);
|
|
101
|
+
html && (dp.el.firstChild.innerHTML = html);
|
|
102
|
+
dp.adjustPosition();
|
|
103
|
+
if (hadFocus || dp.shouldFocusOnRender) {
|
|
104
|
+
focusCurrent(dp);
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
// Conceptually similar to setState in React, updates
|
|
108
|
+
// the view state and re-renders.
|
|
109
|
+
setState: function (state) {
|
|
110
|
+
for (var key in state) {
|
|
111
|
+
dp.state[key] = state[key];
|
|
112
|
+
}
|
|
113
|
+
emit('statechange');
|
|
114
|
+
dp.render();
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
detatchInputEvents = attachInputEvents(input, dp);
|
|
118
|
+
// Builds the initial view state
|
|
119
|
+
// selectedDate is a special case and causes changes to hilightedDate
|
|
120
|
+
// hilightedDate is set on open, so remains undefined initially
|
|
121
|
+
// view is the current view (day, month, year)
|
|
122
|
+
function initialState() {
|
|
123
|
+
return {
|
|
124
|
+
get selectedDate() {
|
|
125
|
+
return selectedDate;
|
|
126
|
+
},
|
|
127
|
+
set selectedDate(dt) {
|
|
128
|
+
if (dt && !opts.inRange(dt)) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (dt) {
|
|
132
|
+
selectedDate = new Date(dt);
|
|
133
|
+
dp.state.hilightedDate = selectedDate;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
selectedDate = dt;
|
|
137
|
+
}
|
|
138
|
+
dp.updateInput(selectedDate);
|
|
139
|
+
emit('select');
|
|
140
|
+
dp.close();
|
|
141
|
+
},
|
|
142
|
+
view: 'day',
|
|
143
|
+
hilightedDate: undefined
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return dp;
|
|
147
|
+
}
|
|
148
|
+
function createContainerElement(opts, containerHTML) {
|
|
149
|
+
var el = document.createElement('div');
|
|
150
|
+
el.className = opts.mode;
|
|
151
|
+
el.innerHTML = containerHTML;
|
|
152
|
+
return el;
|
|
153
|
+
}
|
|
154
|
+
function attachInputEvents(input, dp) {
|
|
155
|
+
var bufferShow = bufferFn(5, function () {
|
|
156
|
+
if (dp.shouldHide()) {
|
|
157
|
+
dp.close();
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
dp.open();
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
var off = [
|
|
164
|
+
on('blur', input, bufferFn(150, function () {
|
|
165
|
+
if (!dp.hasFocus()) {
|
|
166
|
+
dp.close(true);
|
|
167
|
+
}
|
|
168
|
+
})),
|
|
169
|
+
on('mousedown', input, function () {
|
|
170
|
+
if (input === document.activeElement && !dp.isVisible()) {
|
|
171
|
+
bufferShow();
|
|
172
|
+
}
|
|
173
|
+
}),
|
|
174
|
+
on('focus', input, bufferShow),
|
|
175
|
+
on('input', input, function (e) {
|
|
176
|
+
try {
|
|
177
|
+
var date = dp.opts.parse(e.target.value);
|
|
178
|
+
dp.setState({
|
|
179
|
+
hilightedDate: date
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
//ignore invalid dates while input
|
|
184
|
+
}
|
|
185
|
+
}),
|
|
186
|
+
];
|
|
187
|
+
// Unregister all events that were registered above.
|
|
188
|
+
return function () {
|
|
189
|
+
off.forEach(function (f) {
|
|
190
|
+
f();
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function focusCurrent(dp) {
|
|
195
|
+
var current = dp.el.querySelector('.dp-current');
|
|
196
|
+
return current && current.focus();
|
|
197
|
+
}
|
|
198
|
+
function attachContainerEvents(dp) {
|
|
199
|
+
var el = dp.el;
|
|
200
|
+
var calEl = el.querySelector('.dp');
|
|
201
|
+
// Hack to get iOS to show active CSS states
|
|
202
|
+
el.ontouchstart = noop;
|
|
203
|
+
function onClick(e) {
|
|
204
|
+
e.target.className.split(' ').forEach(function (evt) {
|
|
205
|
+
var handler = dp.currentView().onClick[evt];
|
|
206
|
+
handler && handler(e, dp);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
// The calender fires a blur event *every* time we redraw
|
|
210
|
+
// this means we need to buffer the blur event to see if
|
|
211
|
+
// it still has no focus after redrawing, and only then
|
|
212
|
+
// do we return focus to the input. A possible other approach
|
|
213
|
+
// would be to set context.redrawing = true on redraw and
|
|
214
|
+
// set it to false in the blur event.
|
|
215
|
+
on('blur', calEl, bufferFn(150, function () {
|
|
216
|
+
if (!dp.hasFocus()) {
|
|
217
|
+
dp.close(true);
|
|
218
|
+
}
|
|
219
|
+
}));
|
|
220
|
+
on('keydown', el, function (e) {
|
|
221
|
+
if (e.keyCode === Key.enter) {
|
|
222
|
+
onClick(e);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
dp.currentView().onKeyDown(e, dp);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
// If the user clicks in non-focusable space, but
|
|
229
|
+
// still within the date picker, we don't want to
|
|
230
|
+
// hide, so we need to hack some things...
|
|
231
|
+
on('mousedown', calEl, function (e) {
|
|
232
|
+
e.target.focus && e.target.focus(); // IE hack
|
|
233
|
+
if (document.activeElement !== e.target) {
|
|
234
|
+
e.preventDefault();
|
|
235
|
+
focusCurrent(dp);
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
on('click', el, onClick);
|
|
239
|
+
}
|
|
240
|
+
function focusInput(input) {
|
|
241
|
+
// When the modal closes, we need to focus the original input so the
|
|
242
|
+
// user can continue tabbing from where they left off.
|
|
243
|
+
input.focus();
|
|
244
|
+
// iOS zonks out if we don't blur the input, so...
|
|
245
|
+
if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream) {
|
|
246
|
+
input.blur();
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Defines the dropdown date picker behavior.
|
|
3
|
-
*/
|
|
4
|
-
export default function DropdownMode(input: any, emit: any, opts: any): {
|
|
5
|
-
el: any;
|
|
6
|
-
opts: any;
|
|
7
|
-
shouldFocusOnBlur: boolean;
|
|
8
|
-
shouldFocusOnRender: boolean;
|
|
9
|
-
state: {
|
|
10
|
-
selectedDate: Date;
|
|
11
|
-
view: string;
|
|
12
|
-
hilightedDate: any;
|
|
13
|
-
};
|
|
14
|
-
adjustPosition: typeof import("../lib/fns").noop;
|
|
15
|
-
containerHTML: string;
|
|
16
|
-
attachToDom: () => void;
|
|
17
|
-
updateInput: (selectedDate: any) => void;
|
|
18
|
-
computeSelectedDate: () => any;
|
|
19
|
-
currentView: () => any;
|
|
20
|
-
open: () => void;
|
|
21
|
-
isVisible: () => boolean;
|
|
22
|
-
hasFocus: () => boolean;
|
|
23
|
-
shouldHide: () => boolean;
|
|
24
|
-
close: (becauseOfBlur?: boolean) => void;
|
|
25
|
-
destroy: () => void;
|
|
26
|
-
render: () => void;
|
|
27
|
-
setState: (state: any) => void;
|
|
28
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* @file Defines the dropdown date picker behavior.
|
|
3
|
+
*/
|
|
4
|
+
export default function DropdownMode(input: any, emit: any, opts: any): {
|
|
5
|
+
el: any;
|
|
6
|
+
opts: any;
|
|
7
|
+
shouldFocusOnBlur: boolean;
|
|
8
|
+
shouldFocusOnRender: boolean;
|
|
9
|
+
state: {
|
|
10
|
+
selectedDate: Date;
|
|
11
|
+
view: string;
|
|
12
|
+
hilightedDate: any;
|
|
13
|
+
};
|
|
14
|
+
adjustPosition: typeof import("../lib/fns").noop;
|
|
15
|
+
containerHTML: string;
|
|
16
|
+
attachToDom: () => void;
|
|
17
|
+
updateInput: (selectedDate: any) => void;
|
|
18
|
+
computeSelectedDate: () => any;
|
|
19
|
+
currentView: () => any;
|
|
20
|
+
open: () => void;
|
|
21
|
+
isVisible: () => boolean;
|
|
22
|
+
hasFocus: () => boolean;
|
|
23
|
+
shouldHide: () => boolean;
|
|
24
|
+
close: (becauseOfBlur?: boolean) => void;
|
|
25
|
+
destroy: () => void;
|
|
26
|
+
render: () => void;
|
|
27
|
+
setState: (state: any) => void;
|
|
28
|
+
};
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Defines the dropdown date picker behavior.
|
|
3
|
-
*/
|
|
4
|
-
import BaseMode from './base-mode';
|
|
5
|
-
export default function DropdownMode(input, emit, opts) {
|
|
6
|
-
var dp = BaseMode(input, emit, opts);
|
|
7
|
-
dp.shouldFocusOnBlur = false;
|
|
8
|
-
Object.defineProperty(dp, 'shouldFocusOnRender', {
|
|
9
|
-
get: function () {
|
|
10
|
-
return input !== document.activeElement;
|
|
11
|
-
}
|
|
12
|
-
});
|
|
13
|
-
dp.adjustPosition = function () {
|
|
14
|
-
autoPosition(input, dp);
|
|
15
|
-
};
|
|
16
|
-
return dp;
|
|
17
|
-
}
|
|
18
|
-
function autoPosition(input, dp) {
|
|
19
|
-
var inputPos = input.getBoundingClientRect();
|
|
20
|
-
var win = window;
|
|
21
|
-
adjustCalY(dp, inputPos, win);
|
|
22
|
-
adjustCalX(dp, inputPos, win);
|
|
23
|
-
dp.el.style.visibility = '';
|
|
24
|
-
}
|
|
25
|
-
function adjustCalX(dp, inputPos, win) {
|
|
26
|
-
var cal = dp.el;
|
|
27
|
-
var scrollLeft = win.pageXOffset;
|
|
28
|
-
var inputLeft = inputPos.left + scrollLeft;
|
|
29
|
-
var maxRight = win.innerWidth + scrollLeft;
|
|
30
|
-
var offsetWidth = cal.offsetWidth;
|
|
31
|
-
var calRight = inputLeft + offsetWidth;
|
|
32
|
-
var shiftedLeft = maxRight - offsetWidth;
|
|
33
|
-
var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;
|
|
34
|
-
cal.style.left = left + 'px';
|
|
35
|
-
}
|
|
36
|
-
function adjustCalY(dp, inputPos, win) {
|
|
37
|
-
var cal = dp.el;
|
|
38
|
-
var scrollTop = win.pageYOffset;
|
|
39
|
-
var inputTop = scrollTop + inputPos.top;
|
|
40
|
-
var calHeight = cal.offsetHeight;
|
|
41
|
-
var belowTop = inputTop + inputPos.height + 8;
|
|
42
|
-
var aboveTop = inputTop - calHeight - 8;
|
|
43
|
-
var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);
|
|
44
|
-
var top = isAbove ? aboveTop : belowTop;
|
|
45
|
-
if (cal.classList) {
|
|
46
|
-
cal.classList.toggle('dp-is-above', isAbove);
|
|
47
|
-
cal.classList.toggle('dp-is-below', !isAbove);
|
|
48
|
-
}
|
|
49
|
-
cal.style.top = top + 'px';
|
|
50
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* @file Defines the dropdown date picker behavior.
|
|
3
|
+
*/
|
|
4
|
+
import BaseMode from './base-mode';
|
|
5
|
+
export default function DropdownMode(input, emit, opts) {
|
|
6
|
+
var dp = BaseMode(input, emit, opts);
|
|
7
|
+
dp.shouldFocusOnBlur = false;
|
|
8
|
+
Object.defineProperty(dp, 'shouldFocusOnRender', {
|
|
9
|
+
get: function () {
|
|
10
|
+
return input !== document.activeElement;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
dp.adjustPosition = function () {
|
|
14
|
+
autoPosition(input, dp);
|
|
15
|
+
};
|
|
16
|
+
return dp;
|
|
17
|
+
}
|
|
18
|
+
function autoPosition(input, dp) {
|
|
19
|
+
var inputPos = input.getBoundingClientRect();
|
|
20
|
+
var win = window;
|
|
21
|
+
adjustCalY(dp, inputPos, win);
|
|
22
|
+
adjustCalX(dp, inputPos, win);
|
|
23
|
+
dp.el.style.visibility = '';
|
|
24
|
+
}
|
|
25
|
+
function adjustCalX(dp, inputPos, win) {
|
|
26
|
+
var cal = dp.el;
|
|
27
|
+
var scrollLeft = win.pageXOffset;
|
|
28
|
+
var inputLeft = inputPos.left + scrollLeft;
|
|
29
|
+
var maxRight = win.innerWidth + scrollLeft;
|
|
30
|
+
var offsetWidth = cal.offsetWidth;
|
|
31
|
+
var calRight = inputLeft + offsetWidth;
|
|
32
|
+
var shiftedLeft = maxRight - offsetWidth;
|
|
33
|
+
var left = calRight > maxRight && shiftedLeft > 0 ? shiftedLeft : inputLeft;
|
|
34
|
+
cal.style.left = left + 'px';
|
|
35
|
+
}
|
|
36
|
+
function adjustCalY(dp, inputPos, win) {
|
|
37
|
+
var cal = dp.el;
|
|
38
|
+
var scrollTop = win.pageYOffset;
|
|
39
|
+
var inputTop = scrollTop + inputPos.top;
|
|
40
|
+
var calHeight = cal.offsetHeight;
|
|
41
|
+
var belowTop = inputTop + inputPos.height + 8;
|
|
42
|
+
var aboveTop = inputTop - calHeight - 8;
|
|
43
|
+
var isAbove = (aboveTop > 0 && belowTop + calHeight > scrollTop + win.innerHeight);
|
|
44
|
+
var top = isAbove ? aboveTop : belowTop;
|
|
45
|
+
if (cal.classList) {
|
|
46
|
+
cal.classList.toggle('dp-is-above', isAbove);
|
|
47
|
+
cal.classList.toggle('dp-is-below', !isAbove);
|
|
48
|
+
}
|
|
49
|
+
cal.style.top = top + 'px';
|
|
50
|
+
}
|