@elliemae/ds-time-picker 1.60.0 → 2.0.0-alpha.12
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/cjs/DSTimePicker.js +28 -71
- package/cjs/DSTimePickerMenu.js +17 -27
- package/cjs/PickerPanel.js +323 -340
- package/cjs/TimePickerDropdown.js +19 -29
- package/cjs/TimePickerImpl.js +89 -124
- package/cjs/TimePickerMenu.js +257 -295
- package/cjs/index.js +1 -30
- package/cjs/moveElementOnScroll.js +19 -28
- package/cjs/utils.js +14 -19
- package/esm/DSTimePicker.js +27 -69
- package/esm/DSTimePickerMenu.js +14 -25
- package/esm/PickerPanel.js +321 -330
- package/esm/TimePickerDropdown.js +18 -27
- package/esm/TimePickerImpl.js +84 -117
- package/esm/TimePickerMenu.js +254 -285
- package/esm/index.js +0 -29
- package/esm/moveElementOnScroll.js +18 -27
- package/esm/utils.js +14 -19
- package/package.json +66 -17
- package/types/DSTimePicker.d.ts +181 -0
- package/types/DSTimePickerMenu.d.ts +4 -0
- package/types/PickerPanel.d.ts +24 -0
- package/types/TimePickerDropdown.d.ts +25 -0
- package/types/TimePickerImpl.d.ts +35 -0
- package/types/TimePickerMenu.d.ts +19 -0
- package/types/index.d.ts +5 -0
- package/types/moveElementOnScroll.d.ts +13 -0
- package/types/utils.d.ts +8 -0
- package/DSTimePicker/package.json +0 -10
- package/DSTimePickerMenu/package.json +0 -10
- package/PickerPanel/package.json +0 -10
- package/TimePickerDropdown/package.json +0 -10
- package/TimePickerImpl/package.json +0 -10
- package/TimePickerMenu/package.json +0 -10
- package/cjs/DSTimePicker.js.map +0 -1
- package/cjs/DSTimePickerMenu.js.map +0 -1
- package/cjs/PickerPanel.js.map +0 -1
- package/cjs/TimePickerDropdown.js.map +0 -1
- package/cjs/TimePickerImpl.js.map +0 -1
- package/cjs/TimePickerMenu.js.map +0 -1
- package/cjs/index.js.map +0 -1
- package/cjs/moveElementOnScroll.js.map +0 -1
- package/cjs/utils.js.map +0 -1
- package/esm/DSTimePicker.js.map +0 -1
- package/esm/DSTimePickerMenu.js.map +0 -1
- package/esm/PickerPanel.js.map +0 -1
- package/esm/TimePickerDropdown.js.map +0 -1
- package/esm/TimePickerImpl.js.map +0 -1
- package/esm/TimePickerMenu.js.map +0 -1
- package/esm/index.js.map +0 -1
- package/esm/moveElementOnScroll.js.map +0 -1
- package/esm/utils.js.map +0 -1
- package/moveElementOnScroll/package.json +0 -10
- package/utils/package.json +0 -10
package/cjs/PickerPanel.js
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var _extends = require('@babel/runtime/helpers/extends');
|
|
4
|
-
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
5
|
-
var _toArray = require('@babel/runtime/helpers/toArray');
|
|
6
3
|
var _defineProperty = require('@babel/runtime/helpers/defineProperty');
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
var _jsx = require('@babel/runtime/helpers/jsx');
|
|
5
|
+
require('core-js/modules/web.dom-collections.iterator.js');
|
|
6
|
+
require('core-js/modules/esnext.async-iterator.find.js');
|
|
7
|
+
require('core-js/modules/esnext.iterator.constructor.js');
|
|
8
|
+
require('core-js/modules/esnext.iterator.find.js');
|
|
9
|
+
require('core-js/modules/esnext.async-iterator.map.js');
|
|
10
|
+
require('core-js/modules/esnext.iterator.map.js');
|
|
11
|
+
require('core-js/modules/esnext.async-iterator.filter.js');
|
|
12
|
+
require('core-js/modules/esnext.iterator.filter.js');
|
|
13
|
+
require('core-js/modules/esnext.async-iterator.for-each.js');
|
|
14
|
+
require('core-js/modules/esnext.iterator.for-each.js');
|
|
13
15
|
var React = require('react');
|
|
14
16
|
var lodash = require('lodash');
|
|
15
17
|
var dsClassnames = require('@elliemae/ds-classnames');
|
|
@@ -18,394 +20,376 @@ var dsIcons = require('@elliemae/ds-icons');
|
|
|
18
20
|
var DSButton = require('@elliemae/ds-button');
|
|
19
21
|
var moveElementOnScroll = require('./moveElementOnScroll.js');
|
|
20
22
|
var utils = require('./utils.js');
|
|
23
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
21
24
|
|
|
22
25
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
23
26
|
|
|
24
|
-
var _extends__default = /*#__PURE__*/_interopDefaultLegacy(_extends);
|
|
25
|
-
var _slicedToArray__default = /*#__PURE__*/_interopDefaultLegacy(_slicedToArray);
|
|
26
|
-
var _toArray__default = /*#__PURE__*/_interopDefaultLegacy(_toArray);
|
|
27
27
|
var _defineProperty__default = /*#__PURE__*/_interopDefaultLegacy(_defineProperty);
|
|
28
|
-
var
|
|
29
|
-
var _createClass__default = /*#__PURE__*/_interopDefaultLegacy(_createClass);
|
|
30
|
-
var _assertThisInitialized__default = /*#__PURE__*/_interopDefaultLegacy(_assertThisInitialized);
|
|
31
|
-
var _inherits__default = /*#__PURE__*/_interopDefaultLegacy(_inherits);
|
|
32
|
-
var _possibleConstructorReturn__default = /*#__PURE__*/_interopDefaultLegacy(_possibleConstructorReturn);
|
|
33
|
-
var _getPrototypeOf__default = /*#__PURE__*/_interopDefaultLegacy(_getPrototypeOf);
|
|
28
|
+
var _jsx__default = /*#__PURE__*/_interopDefaultLegacy(_jsx);
|
|
34
29
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
35
30
|
var memoizeOne__default = /*#__PURE__*/_interopDefaultLegacy(memoizeOne);
|
|
36
31
|
var DSButton__default = /*#__PURE__*/_interopDefaultLegacy(DSButton);
|
|
37
32
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default['default'](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
33
|
+
var _SelectedCircle, _ChevronSmallUp, _ChevronSmallDown;
|
|
41
34
|
|
|
42
|
-
function
|
|
35
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
|
|
43
36
|
|
|
44
|
-
function
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty__default["default"](target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
38
|
+
const blockName = 'time-picker-panel';
|
|
39
|
+
const Container = dsClassnames.aggregatedClasses('div')(blockName, null, _ref => {
|
|
40
|
+
let {
|
|
41
|
+
scrolling
|
|
42
|
+
} = _ref;
|
|
48
43
|
return {
|
|
49
|
-
scrolling
|
|
44
|
+
scrolling
|
|
50
45
|
};
|
|
51
46
|
});
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
const Wrapper = dsClassnames.aggregatedClasses('div')(blockName, 'wrapper');
|
|
48
|
+
const PickerItemListContainer = dsClassnames.aggregatedClasses('div')(blockName, 'item-list-container');
|
|
49
|
+
const PickerItemList = dsClassnames.aggregatedClasses('div')(blockName, 'item-list');
|
|
50
|
+
const PickerHeader = dsClassnames.aggregatedClasses('div')(blockName, 'header');
|
|
51
|
+
const PickerItemContainer = dsClassnames.aggregatedClasses('div')(blockName, 'item', _ref2 => {
|
|
52
|
+
let {
|
|
53
|
+
selected,
|
|
54
|
+
disabled
|
|
55
|
+
} = _ref2;
|
|
59
56
|
return {
|
|
60
|
-
selected
|
|
61
|
-
disabled
|
|
57
|
+
selected,
|
|
58
|
+
disabled
|
|
62
59
|
};
|
|
63
60
|
});
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return option[valueProperty] === selectedOption;
|
|
72
|
-
});
|
|
61
|
+
const PickerSelectedOptionSelected = dsClassnames.aggregatedClasses('div')(blockName, 'selected-container');
|
|
62
|
+
const SelectedCircle = dsClassnames.aggregatedClasses('div')(blockName, 'selected-circle');
|
|
63
|
+
const ArrowButtonContainer = dsClassnames.aggregatedClasses('div')(blockName, 'arrow-container');
|
|
64
|
+
|
|
65
|
+
const getOptionIndex = function (options, selectedOption) {
|
|
66
|
+
let valueProperty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value';
|
|
67
|
+
const index = options.findIndex(option => option[valueProperty] === selectedOption);
|
|
73
68
|
return utils.validateIndex(index, options);
|
|
74
69
|
};
|
|
75
70
|
|
|
76
|
-
|
|
71
|
+
const arrowProps = {
|
|
77
72
|
buttonType: 'text',
|
|
78
73
|
fluidHeight: true,
|
|
79
74
|
fluidWidth: true,
|
|
80
75
|
size: 's'
|
|
81
76
|
};
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
valueProperty = _this$props.valueProperty;
|
|
98
|
-
var _this$state = _this.state,
|
|
99
|
-
selectedOption = _this$state.selectedOption,
|
|
100
|
-
scrolling = _this$state.scrolling;
|
|
101
|
-
var selectedOptionIndex = index || getOptionIndex(options, selectedOption, valueProperty);
|
|
102
|
-
var listYPosition = _this.minYListPosition - selectedOptionIndex * _this.optionHeight;
|
|
103
|
-
if (_this.scrollHandler && !scrolling) _this.scrollHandler.updatePosition(listYPosition);
|
|
77
|
+
class PickerPanel extends React.Component {
|
|
78
|
+
constructor(props) {
|
|
79
|
+
super(props);
|
|
80
|
+
this.computeContainerTranslation = memoizeOne__default["default"](index => {
|
|
81
|
+
const {
|
|
82
|
+
options,
|
|
83
|
+
valueProperty
|
|
84
|
+
} = this.props;
|
|
85
|
+
const {
|
|
86
|
+
selectedOption,
|
|
87
|
+
scrolling
|
|
88
|
+
} = this.state;
|
|
89
|
+
const selectedOptionIndex = index || getOptionIndex(options, selectedOption, valueProperty);
|
|
90
|
+
const listYPosition = this.minYListPosition - selectedOptionIndex * this.optionHeight;
|
|
91
|
+
if (this.scrollHandler && !scrolling) this.scrollHandler.updatePosition(listYPosition);
|
|
104
92
|
return listYPosition;
|
|
105
93
|
});
|
|
106
94
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
95
|
+
this.renderHeader = () => {
|
|
96
|
+
const {
|
|
97
|
+
header
|
|
98
|
+
} = this.props;
|
|
99
|
+
return /*#__PURE__*/_jsx__default["default"](PickerHeader, {}, void 0, header);
|
|
110
100
|
};
|
|
111
101
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
102
|
+
this.pickerListContainerRef = /*#__PURE__*/React__default["default"].createRef();
|
|
103
|
+
this.pickerListRef = /*#__PURE__*/React__default["default"].createRef();
|
|
104
|
+
this.pickerItemRef = /*#__PURE__*/React__default["default"].createRef();
|
|
105
|
+
this.selectedOptionRef = /*#__PURE__*/React__default["default"].createRef();
|
|
106
|
+
this.state = {
|
|
117
107
|
selectedOption: props.selected,
|
|
118
108
|
activeIndex: 0,
|
|
119
109
|
// eslint-disable-next-line react/no-unused-state
|
|
120
110
|
prevProps: {}
|
|
121
111
|
};
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return _this;
|
|
112
|
+
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
113
|
+
this.handleStepMoveUp = this.handleStepMoveUp.bind(this);
|
|
114
|
+
this.handleStepMoveDown = this.handleStepMoveDown.bind(this);
|
|
126
115
|
}
|
|
127
116
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
onEndScroll: function onEndScroll() {
|
|
147
|
-
_this2.setState({
|
|
148
|
-
scrolling: false
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
});
|
|
152
|
-
this.computeContainerTranslation();
|
|
153
|
-
}
|
|
154
|
-
}, {
|
|
155
|
-
key: "componentWillUnmount",
|
|
156
|
-
value: function componentWillUnmount() {
|
|
157
|
-
this.scrollHandler.unsubscribe();
|
|
158
|
-
}
|
|
159
|
-
}, {
|
|
160
|
-
key: "getOptionValue",
|
|
161
|
-
value: function getOptionValue(option) {
|
|
162
|
-
var valueProperty = this.props.valueProperty;
|
|
163
|
-
return option[valueProperty];
|
|
164
|
-
}
|
|
165
|
-
}, {
|
|
166
|
-
key: "getOptionLabel",
|
|
167
|
-
value: function getOptionLabel(option) {
|
|
168
|
-
var labelProperty = this.props.labelProperty;
|
|
169
|
-
return option[labelProperty];
|
|
170
|
-
}
|
|
171
|
-
}, {
|
|
172
|
-
key: "computeSizes",
|
|
173
|
-
value: function computeSizes() {
|
|
174
|
-
var _this$props2 = this.props,
|
|
175
|
-
options = _this$props2.options,
|
|
176
|
-
numberItemsOnScreen = _this$props2.numberItemsOnScreen;
|
|
177
|
-
var optionHeight = this.pickerItemRef.current.offsetHeight;
|
|
178
|
-
this.optionHeight = optionHeight;
|
|
179
|
-
this.listHeight = this.optionHeight * numberItemsOnScreen;
|
|
180
|
-
this.minYListPosition = this.listHeight / 2 - this.optionHeight / 2;
|
|
181
|
-
this.maxYListPosition = this.optionHeight * (options.length - Math.ceil(numberItemsOnScreen / 2));
|
|
182
|
-
}
|
|
183
|
-
}, {
|
|
184
|
-
key: "handleOptionSelect",
|
|
185
|
-
value: function handleOptionSelect(optionValue, index, scrolling) {
|
|
186
|
-
var onChange = this.props.onChange;
|
|
187
|
-
this.setState(function (state) {
|
|
188
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
189
|
-
scrolling: scrolling,
|
|
190
|
-
selectedOption: optionValue,
|
|
191
|
-
activeIndex: index
|
|
117
|
+
componentDidMount() {
|
|
118
|
+
this.computeSizes();
|
|
119
|
+
const pickerListContainerEl = this.pickerListContainerRef.current;
|
|
120
|
+
const pickerListEl = this.pickerListRef.current;
|
|
121
|
+
this.scrollHandler = new moveElementOnScroll.MoveElementOnScroll(pickerListEl, {
|
|
122
|
+
container: pickerListContainerEl,
|
|
123
|
+
min: -this.minYListPosition,
|
|
124
|
+
max: this.maxYListPosition,
|
|
125
|
+
onUpdate: (pos, delta) => {
|
|
126
|
+
const {
|
|
127
|
+
options
|
|
128
|
+
} = this.props;
|
|
129
|
+
const index = options.length - -Math.floor((pos - this.maxYListPosition) / this.optionHeight) + (delta > 0 ? 1 : -1);
|
|
130
|
+
this.moveTo(index, true);
|
|
131
|
+
},
|
|
132
|
+
onEndScroll: () => {
|
|
133
|
+
this.setState({
|
|
134
|
+
scrolling: false
|
|
192
135
|
});
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// eslint-disable-next-line max-statements
|
|
198
|
-
|
|
199
|
-
}, {
|
|
200
|
-
key: "handleKeyDown",
|
|
201
|
-
value: function handleKeyDown(e) {
|
|
202
|
-
var activeIndex = this.state.activeIndex;
|
|
203
|
-
var options = this.props.options;
|
|
204
|
-
|
|
205
|
-
var _document$getElements = document.getElementsByClassName('em-ds-time-picker-panel'),
|
|
206
|
-
_document$getElements2 = _toArray__default['default'](_document$getElements),
|
|
207
|
-
firstColumn = _document$getElements2[0],
|
|
208
|
-
restColumns = _document$getElements2.slice(1);
|
|
209
|
-
|
|
210
|
-
var _restColumns$slice = restColumns.slice(-1),
|
|
211
|
-
_restColumns$slice2 = _slicedToArray__default['default'](_restColumns$slice, 1),
|
|
212
|
-
lastColumn = _restColumns$slice2[0];
|
|
213
|
-
|
|
214
|
-
var _document$getElements3 = document.getElementsByClassName('DayPickerNavigation_button'),
|
|
215
|
-
_document$getElements4 = _slicedToArray__default['default'](_document$getElements3, 1),
|
|
216
|
-
prev = _document$getElements4[0];
|
|
217
|
-
|
|
218
|
-
var focusedElement = document.activeElement;
|
|
219
|
-
|
|
220
|
-
switch (e.key) {
|
|
221
|
-
case 'Home':
|
|
222
|
-
this.moveTo(0);
|
|
223
|
-
break;
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
this.computeContainerTranslation();
|
|
139
|
+
}
|
|
224
140
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
141
|
+
componentWillUnmount() {
|
|
142
|
+
this.scrollHandler.unsubscribe();
|
|
143
|
+
}
|
|
228
144
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
145
|
+
static getDerivedStateFromProps(nextProps, _ref3) {
|
|
146
|
+
let {
|
|
147
|
+
prevProps
|
|
148
|
+
} = _ref3;
|
|
149
|
+
const {
|
|
150
|
+
selected,
|
|
151
|
+
valueProperty,
|
|
152
|
+
options
|
|
153
|
+
} = nextProps;
|
|
154
|
+
|
|
155
|
+
if (selected !== prevProps.selected) {
|
|
156
|
+
return {
|
|
157
|
+
selectedOption: selected,
|
|
158
|
+
activeIndex: getOptionIndex(options, selected, valueProperty),
|
|
159
|
+
prevProps: nextProps
|
|
160
|
+
};
|
|
161
|
+
}
|
|
232
162
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
break;
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
236
165
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
166
|
+
getOptionValue(option) {
|
|
167
|
+
const {
|
|
168
|
+
valueProperty
|
|
169
|
+
} = this.props;
|
|
170
|
+
return option[valueProperty];
|
|
171
|
+
}
|
|
240
172
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
restColumns[position + 1].focus();
|
|
248
|
-
}
|
|
173
|
+
getOptionLabel(option) {
|
|
174
|
+
const {
|
|
175
|
+
labelProperty
|
|
176
|
+
} = this.props;
|
|
177
|
+
return option[labelProperty];
|
|
178
|
+
}
|
|
249
179
|
|
|
250
|
-
|
|
180
|
+
computeSizes() {
|
|
181
|
+
const {
|
|
182
|
+
options,
|
|
183
|
+
numberItemsOnScreen
|
|
184
|
+
} = this.props;
|
|
185
|
+
const {
|
|
186
|
+
offsetHeight: optionHeight
|
|
187
|
+
} = this.pickerItemRef.current;
|
|
188
|
+
this.optionHeight = optionHeight;
|
|
189
|
+
this.listHeight = this.optionHeight * numberItemsOnScreen;
|
|
190
|
+
this.minYListPosition = this.listHeight / 2 - this.optionHeight / 2;
|
|
191
|
+
this.maxYListPosition = this.optionHeight * (options.length - Math.ceil(numberItemsOnScreen / 2));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
handleOptionSelect(optionValue, index, scrolling) {
|
|
195
|
+
const {
|
|
196
|
+
onChange
|
|
197
|
+
} = this.props;
|
|
198
|
+
this.setState(state => _objectSpread(_objectSpread({}, state), {}, {
|
|
199
|
+
scrolling,
|
|
200
|
+
selectedOption: optionValue,
|
|
201
|
+
activeIndex: index
|
|
202
|
+
}), () => {
|
|
203
|
+
onChange(optionValue, index);
|
|
204
|
+
});
|
|
205
|
+
} // TODO: this needs a refactor from de FocusGroup
|
|
206
|
+
// eslint-disable-next-line max-statements
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
handleKeyDown(e) {
|
|
210
|
+
const {
|
|
211
|
+
activeIndex
|
|
212
|
+
} = this.state;
|
|
213
|
+
const {
|
|
214
|
+
options
|
|
215
|
+
} = this.props;
|
|
216
|
+
const [firstColumn, ...restColumns] = document.getElementsByClassName('em-ds-time-picker-panel');
|
|
217
|
+
const [lastColumn] = restColumns.slice(-1);
|
|
218
|
+
const [prev] = document.getElementsByClassName('DayPickerNavigation_button');
|
|
219
|
+
const focusedElement = document.activeElement;
|
|
220
|
+
|
|
221
|
+
switch (e.key) {
|
|
222
|
+
case 'Home':
|
|
223
|
+
this.moveTo(0);
|
|
224
|
+
break;
|
|
225
|
+
|
|
226
|
+
case 'End':
|
|
227
|
+
this.moveTo(options.length - 1);
|
|
228
|
+
break;
|
|
229
|
+
|
|
230
|
+
case 'ArrowUp':
|
|
231
|
+
this.moveTo(activeIndex - 1);
|
|
232
|
+
break;
|
|
233
|
+
|
|
234
|
+
case 'ArrowDown':
|
|
235
|
+
this.moveTo(activeIndex + 1);
|
|
236
|
+
break;
|
|
237
|
+
|
|
238
|
+
case 'Tab':
|
|
239
|
+
{
|
|
240
|
+
e.preventDefault(); // If it is DateTimePicker, move focus to prev arrow element
|
|
241
|
+
|
|
242
|
+
if (prev && focusedElement === lastColumn) {
|
|
243
|
+
prev.focus();
|
|
244
|
+
} else if (focusedElement === lastColumn) {
|
|
245
|
+
firstColumn.focus();
|
|
246
|
+
} else {
|
|
247
|
+
const position = lodash.findIndex(restColumns, focusedElement);
|
|
248
|
+
restColumns[position + 1].focus();
|
|
251
249
|
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
}, {
|
|
255
|
-
key: "moveTo",
|
|
256
|
-
value: function moveTo(index, scrolling) {
|
|
257
|
-
var options = this.props.options;
|
|
258
|
-
var selectedOption = this.state.selectedOption;
|
|
259
|
-
var validIndex = utils.validateIndex(index, options);
|
|
260
|
-
var option = options[validIndex];
|
|
261
|
-
var optionValue = this.getOptionValue(option);
|
|
262
|
-
|
|
263
|
-
if (selectedOption !== optionValue && option.disabled !== true) {
|
|
264
|
-
this.handleOptionSelect(optionValue, validIndex, scrolling);
|
|
265
|
-
} // TO-DO: if date disabled, add nextValidOption selection
|
|
266
250
|
|
|
267
|
-
|
|
268
|
-
}, {
|
|
269
|
-
key: "handleStepMoveUp",
|
|
270
|
-
value: function handleStepMoveUp() {
|
|
271
|
-
var activeIndex = this.state.activeIndex;
|
|
272
|
-
var _this$props3 = this.props,
|
|
273
|
-
arrowStep = _this$props3.arrowStep,
|
|
274
|
-
options = _this$props3.options;
|
|
275
|
-
var supposedPos = activeIndex - arrowStep;
|
|
276
|
-
var nextPos = supposedPos >= 0 ? supposedPos : activeIndex - 1;
|
|
277
|
-
var nextValidOption = options.find(function (op) {
|
|
278
|
-
return !op.disabled;
|
|
279
|
-
});
|
|
280
|
-
this.moveTo(nextPos, true, nextValidOption);
|
|
281
|
-
}
|
|
282
|
-
}, {
|
|
283
|
-
key: "handleStepMoveDown",
|
|
284
|
-
value: function handleStepMoveDown() {
|
|
285
|
-
var activeIndex = this.state.activeIndex;
|
|
286
|
-
var _this$props4 = this.props,
|
|
287
|
-
arrowStep = _this$props4.arrowStep,
|
|
288
|
-
options = _this$props4.options;
|
|
289
|
-
var supposedPos = activeIndex + arrowStep;
|
|
290
|
-
var nextPos = supposedPos <= options.length ? supposedPos : activeIndex + 1;
|
|
291
|
-
this.moveTo(nextPos);
|
|
292
|
-
}
|
|
293
|
-
}, {
|
|
294
|
-
key: "render",
|
|
295
|
-
value: function render() {
|
|
296
|
-
var _this3 = this;
|
|
297
|
-
|
|
298
|
-
var _this$props5 = this.props,
|
|
299
|
-
options = _this$props5.options,
|
|
300
|
-
hasHeader = _this$props5.hasHeader,
|
|
301
|
-
type = _this$props5.type,
|
|
302
|
-
time = _this$props5.time,
|
|
303
|
-
meridiem = _this$props5.meridiem,
|
|
304
|
-
disabledTimes = _this$props5.disabledTimes;
|
|
305
|
-
var _this$state2 = this.state,
|
|
306
|
-
selectedOption = _this$state2.selectedOption,
|
|
307
|
-
activeIndex = _this$state2.activeIndex,
|
|
308
|
-
scrolling = _this$state2.scrolling;
|
|
309
|
-
var listYPosition = this.computeContainerTranslation(activeIndex);
|
|
310
|
-
return /*#__PURE__*/React__default['default'].createElement(Wrapper, null, hasHeader && this.renderHeader(), /*#__PURE__*/React__default['default'].createElement(Container, {
|
|
311
|
-
classProps: {
|
|
312
|
-
scrolling: scrolling
|
|
313
|
-
},
|
|
314
|
-
onKeyDown: this.handleKeyDown,
|
|
315
|
-
tabIndex: 0
|
|
316
|
-
}, /*#__PURE__*/React__default['default'].createElement(PickerSelectedOptionSelected, {
|
|
317
|
-
innerRef: this.selectedOptionRef
|
|
318
|
-
}, /*#__PURE__*/React__default['default'].createElement(SelectedCircle, null)), /*#__PURE__*/React__default['default'].createElement(ArrowButtonContainer, null, /*#__PURE__*/React__default['default'].createElement(DSButton__default['default'], _extends__default['default']({}, arrowProps, {
|
|
319
|
-
"aria-label": "Chevron Up",
|
|
320
|
-
"data-testid": "".concat(type, "-chevron-up"),
|
|
321
|
-
disabled: activeIndex <= 0,
|
|
322
|
-
icon: /*#__PURE__*/React__default['default'].createElement(dsIcons.ChevronSmallUp, null),
|
|
323
|
-
onClick: this.handleStepMoveUp,
|
|
324
|
-
tabIndex: -1
|
|
325
|
-
}))), /*#__PURE__*/React__default['default'].createElement(PickerItemListContainer, {
|
|
326
|
-
innerRef: this.pickerListContainerRef,
|
|
327
|
-
style: {
|
|
328
|
-
height: this.listHeight
|
|
329
|
-
}
|
|
330
|
-
}, /*#__PURE__*/React__default['default'].createElement(PickerItemList, {
|
|
331
|
-
"data-testid": "".concat(type, "-list"),
|
|
332
|
-
innerRef: this.pickerListRef,
|
|
333
|
-
style: {
|
|
334
|
-
transform: "translateY(".concat(listYPosition, "px)")
|
|
251
|
+
break;
|
|
335
252
|
}
|
|
336
|
-
|
|
337
|
-
|
|
253
|
+
}
|
|
254
|
+
}
|
|
338
255
|
|
|
339
|
-
|
|
256
|
+
moveTo(index, scrolling) {
|
|
257
|
+
const {
|
|
258
|
+
options
|
|
259
|
+
} = this.props;
|
|
260
|
+
const {
|
|
261
|
+
selectedOption
|
|
262
|
+
} = this.state;
|
|
263
|
+
const validIndex = utils.validateIndex(index, options);
|
|
264
|
+
const option = options[validIndex];
|
|
265
|
+
const optionValue = this.getOptionValue(option);
|
|
266
|
+
|
|
267
|
+
if (selectedOption !== optionValue && option.disabled !== true) {
|
|
268
|
+
this.handleOptionSelect(optionValue, validIndex, scrolling);
|
|
269
|
+
} // TO-DO: if date disabled, add nextValidOption selection
|
|
340
270
|
|
|
341
|
-
|
|
342
|
-
if (meridiem === 'AM') valueFormatted = value;else if (meridiem === 'PM' && value === 12) valueFormatted = value;else if (meridiem === 'PM') valueFormatted = value + 12;
|
|
343
|
-
var disabled = false;
|
|
271
|
+
}
|
|
344
272
|
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
273
|
+
handleStepMoveUp() {
|
|
274
|
+
const {
|
|
275
|
+
activeIndex
|
|
276
|
+
} = this.state;
|
|
277
|
+
const {
|
|
278
|
+
arrowStep,
|
|
279
|
+
options
|
|
280
|
+
} = this.props;
|
|
281
|
+
const supposedPos = activeIndex - arrowStep;
|
|
282
|
+
const nextPos = supposedPos >= 0 ? supposedPos : activeIndex - 1;
|
|
283
|
+
const nextValidOption = options.find(op => !op.disabled);
|
|
284
|
+
this.moveTo(nextPos, true, nextValidOption);
|
|
285
|
+
}
|
|
348
286
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
287
|
+
handleStepMoveDown() {
|
|
288
|
+
const {
|
|
289
|
+
activeIndex
|
|
290
|
+
} = this.state;
|
|
291
|
+
const {
|
|
292
|
+
arrowStep,
|
|
293
|
+
options
|
|
294
|
+
} = this.props;
|
|
295
|
+
const supposedPos = activeIndex + arrowStep;
|
|
296
|
+
const nextPos = supposedPos <= options.length ? supposedPos : activeIndex + 1;
|
|
297
|
+
this.moveTo(nextPos);
|
|
298
|
+
}
|
|
352
299
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
300
|
+
render() {
|
|
301
|
+
const {
|
|
302
|
+
options,
|
|
303
|
+
hasHeader,
|
|
304
|
+
type,
|
|
305
|
+
time,
|
|
306
|
+
meridiem,
|
|
307
|
+
disabledTimes
|
|
308
|
+
} = this.props;
|
|
309
|
+
const {
|
|
310
|
+
selectedOption,
|
|
311
|
+
activeIndex,
|
|
312
|
+
scrolling
|
|
313
|
+
} = this.state;
|
|
314
|
+
const listYPosition = this.computeContainerTranslation(activeIndex);
|
|
315
|
+
return /*#__PURE__*/_jsx__default["default"](Wrapper, {}, void 0, hasHeader && this.renderHeader(), /*#__PURE__*/_jsx__default["default"](Container, {
|
|
316
|
+
classProps: {
|
|
317
|
+
scrolling
|
|
318
|
+
},
|
|
319
|
+
onKeyDown: this.handleKeyDown,
|
|
320
|
+
tabIndex: 0
|
|
321
|
+
}, void 0, /*#__PURE__*/_jsx__default["default"](PickerSelectedOptionSelected, {
|
|
322
|
+
innerRef: this.selectedOptionRef
|
|
323
|
+
}, void 0, _SelectedCircle || (_SelectedCircle = /*#__PURE__*/_jsx__default["default"](SelectedCircle, {}))), /*#__PURE__*/_jsx__default["default"](ArrowButtonContainer, {}, void 0, /*#__PURE__*/jsxRuntime.jsx(DSButton__default["default"], _objectSpread(_objectSpread({}, arrowProps), {}, {
|
|
324
|
+
"aria-label": "Chevron Up",
|
|
325
|
+
"data-testid": "".concat(type, "-chevron-up"),
|
|
326
|
+
disabled: activeIndex <= 0,
|
|
327
|
+
icon: _ChevronSmallUp || (_ChevronSmallUp = /*#__PURE__*/_jsx__default["default"](dsIcons.ChevronSmallUp, {})),
|
|
328
|
+
onClick: this.handleStepMoveUp,
|
|
329
|
+
tabIndex: -1
|
|
330
|
+
}))), /*#__PURE__*/_jsx__default["default"](PickerItemListContainer, {
|
|
331
|
+
innerRef: this.pickerListContainerRef,
|
|
332
|
+
style: {
|
|
333
|
+
height: this.listHeight
|
|
334
|
+
}
|
|
335
|
+
}, void 0, /*#__PURE__*/_jsx__default["default"](PickerItemList, {
|
|
336
|
+
"data-testid": "".concat(type, "-list"),
|
|
337
|
+
innerRef: this.pickerListRef,
|
|
338
|
+
style: {
|
|
339
|
+
transform: "translateY(".concat(listYPosition, "px)")
|
|
340
|
+
}
|
|
341
|
+
}, void 0, options.map((option, index) => {
|
|
342
|
+
const value = this.getOptionValue(option);
|
|
343
|
+
const label = this.getOptionLabel(option);
|
|
344
|
+
let valueFormatted;
|
|
345
|
+
if (meridiem === 'AM') valueFormatted = value;else if (meridiem === 'PM' && value === 12) valueFormatted = value;else if (meridiem === 'PM') valueFormatted = value + 12;
|
|
346
|
+
let disabled = false;
|
|
347
|
+
|
|
348
|
+
if (disabledTimes) {
|
|
349
|
+
const {
|
|
350
|
+
from,
|
|
351
|
+
to
|
|
352
|
+
} = disabledTimes;
|
|
353
|
+
|
|
354
|
+
if (type === 'hour' && valueFormatted >= (from === null || from === void 0 ? void 0 : from.hour) && valueFormatted < (to === null || to === void 0 ? void 0 : to.hour) || type === 'minutes' && value >= (from === null || from === void 0 ? void 0 : from.min) && value < (to === null || to === void 0 ? void 0 : to.min)) {
|
|
355
|
+
disabled = true;
|
|
356
|
+
}
|
|
356
357
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
358
|
+
if (type === 'minutes' && ((time === null || time === void 0 ? void 0 : time.hour()) > (to === null || to === void 0 ? void 0 : to.hour) || (time === null || time === void 0 ? void 0 : time.hour()) < (from === null || from === void 0 ? void 0 : from.hour))) {
|
|
359
|
+
disabled = false;
|
|
360
|
+
}
|
|
360
361
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
}
|
|
362
|
+
if (label === 'am' && (from === null || from === void 0 ? void 0 : from.hour) == 0 && (to === null || to === void 0 ? void 0 : to.hour) >= 12) {
|
|
363
|
+
disabled = true;
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
classProps: {
|
|
370
|
-
selected: selectedOption ? value === selectedOption : index === 0,
|
|
371
|
-
disabled: disabled
|
|
372
|
-
},
|
|
373
|
-
innerRef: _this3.pickerItemRef,
|
|
374
|
-
onClick: function onClick() {
|
|
375
|
-
if (!disabled) _this3.handleOptionSelect(value, index);
|
|
376
|
-
}
|
|
377
|
-
}, label);
|
|
378
|
-
}))), /*#__PURE__*/React__default['default'].createElement(ArrowButtonContainer, null, /*#__PURE__*/React__default['default'].createElement(DSButton__default['default'], _extends__default['default']({}, arrowProps, {
|
|
379
|
-
"aria-label": "Chevron Down",
|
|
380
|
-
"data-testid": "".concat(type, "-chevron-down"),
|
|
381
|
-
disabled: activeIndex >= options.length - 1,
|
|
382
|
-
icon: /*#__PURE__*/React__default['default'].createElement(dsIcons.ChevronSmallDown, null),
|
|
383
|
-
onClick: this.handleStepMoveDown,
|
|
384
|
-
tabIndex: -1
|
|
385
|
-
})))));
|
|
386
|
-
}
|
|
387
|
-
}], [{
|
|
388
|
-
key: "getDerivedStateFromProps",
|
|
389
|
-
value: function getDerivedStateFromProps(nextProps, _ref3) {
|
|
390
|
-
var prevProps = _ref3.prevProps;
|
|
391
|
-
var selected = nextProps.selected,
|
|
392
|
-
valueProperty = nextProps.valueProperty,
|
|
393
|
-
options = nextProps.options;
|
|
394
|
-
|
|
395
|
-
if (selected !== prevProps.selected) {
|
|
396
|
-
return {
|
|
397
|
-
selectedOption: selected,
|
|
398
|
-
activeIndex: getOptionIndex(options, selected, valueProperty),
|
|
399
|
-
prevProps: nextProps
|
|
400
|
-
};
|
|
366
|
+
if (label === 'pm' && (to === null || to === void 0 ? void 0 : to.hour) == 24) {
|
|
367
|
+
disabled = true;
|
|
368
|
+
}
|
|
401
369
|
}
|
|
402
370
|
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
371
|
+
option.disabled = disabled;
|
|
372
|
+
return /*#__PURE__*/_jsx__default["default"](PickerItemContainer, {
|
|
373
|
+
classProps: {
|
|
374
|
+
selected: selectedOption ? value === selectedOption : index === 0,
|
|
375
|
+
disabled
|
|
376
|
+
},
|
|
377
|
+
innerRef: this.pickerItemRef,
|
|
378
|
+
onClick: () => {
|
|
379
|
+
if (!disabled) this.handleOptionSelect(value, index);
|
|
380
|
+
}
|
|
381
|
+
}, value, label);
|
|
382
|
+
}))), /*#__PURE__*/_jsx__default["default"](ArrowButtonContainer, {}, void 0, /*#__PURE__*/jsxRuntime.jsx(DSButton__default["default"], _objectSpread(_objectSpread({}, arrowProps), {}, {
|
|
383
|
+
"aria-label": "Chevron Down",
|
|
384
|
+
"data-testid": "".concat(type, "-chevron-down"),
|
|
385
|
+
disabled: activeIndex >= options.length - 1,
|
|
386
|
+
icon: _ChevronSmallDown || (_ChevronSmallDown = /*#__PURE__*/_jsx__default["default"](dsIcons.ChevronSmallDown, {})),
|
|
387
|
+
onClick: this.handleStepMoveDown,
|
|
388
|
+
tabIndex: -1
|
|
389
|
+
})))));
|
|
390
|
+
}
|
|
406
391
|
|
|
407
|
-
|
|
408
|
-
}(React.Component);
|
|
392
|
+
}
|
|
409
393
|
PickerPanel.defaultProps = {
|
|
410
394
|
valueProperty: 'value',
|
|
411
395
|
labelProperty: 'label',
|
|
@@ -416,4 +400,3 @@ PickerPanel.defaultProps = {
|
|
|
416
400
|
};
|
|
417
401
|
|
|
418
402
|
module.exports = PickerPanel;
|
|
419
|
-
//# sourceMappingURL=PickerPanel.js.map
|