@elliemae/ds-time-picker 2.3.0-alpha.8 → 2.3.0-next.2

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.
Files changed (64) hide show
  1. package/cjs/DSTimePicker.js +121 -0
  2. package/cjs/DSTimePickerMenu.js +35 -0
  3. package/cjs/PickerPanel.js +402 -0
  4. package/cjs/TimePickerDropdown.js +53 -0
  5. package/cjs/TimePickerImpl.js +175 -0
  6. package/cjs/TimePickerMenu.js +312 -0
  7. package/cjs/index.js +17 -0
  8. package/cjs/moveElementOnScroll.js +75 -0
  9. package/cjs/utils.js +38 -0
  10. package/esm/DSTimePicker.js +111 -0
  11. package/esm/DSTimePickerMenu.js +24 -0
  12. package/esm/PickerPanel.js +392 -0
  13. package/esm/TimePickerDropdown.js +45 -0
  14. package/esm/TimePickerImpl.js +165 -0
  15. package/esm/TimePickerMenu.js +301 -0
  16. package/esm/index.js +4 -0
  17. package/esm/moveElementOnScroll.js +70 -0
  18. package/esm/utils.js +31 -0
  19. package/package.json +38 -40
  20. package/types/DSTimePicker.d.ts +162 -0
  21. package/types/DSTimePickerMenu.d.ts +4 -0
  22. package/types/PickerPanel.d.ts +24 -0
  23. package/types/TimePickerDropdown.d.ts +25 -0
  24. package/types/TimePickerImpl.d.ts +35 -0
  25. package/types/TimePickerMenu.d.ts +19 -0
  26. package/types/index.d.ts +5 -0
  27. package/types/moveElementOnScroll.d.ts +13 -0
  28. package/types/utils.d.ts +8 -0
  29. package/dist/cjs/DSTimePicker.js +0 -106
  30. package/dist/cjs/DSTimePicker.js.map +0 -7
  31. package/dist/cjs/DSTimePickerMenu.js +0 -48
  32. package/dist/cjs/DSTimePickerMenu.js.map +0 -7
  33. package/dist/cjs/PickerPanel.js +0 -299
  34. package/dist/cjs/PickerPanel.js.map +0 -7
  35. package/dist/cjs/TimePickerDropdown.js +0 -74
  36. package/dist/cjs/TimePickerDropdown.js.map +0 -7
  37. package/dist/cjs/TimePickerImpl.js +0 -183
  38. package/dist/cjs/TimePickerImpl.js.map +0 -7
  39. package/dist/cjs/TimePickerMenu.js +0 -241
  40. package/dist/cjs/TimePickerMenu.js.map +0 -7
  41. package/dist/cjs/index.js +0 -40
  42. package/dist/cjs/index.js.map +0 -7
  43. package/dist/cjs/moveElementOnScroll.js +0 -93
  44. package/dist/cjs/moveElementOnScroll.js.map +0 -7
  45. package/dist/cjs/utils.js +0 -71
  46. package/dist/cjs/utils.js.map +0 -7
  47. package/dist/esm/DSTimePicker.js +0 -77
  48. package/dist/esm/DSTimePicker.js.map +0 -7
  49. package/dist/esm/DSTimePickerMenu.js +0 -19
  50. package/dist/esm/DSTimePickerMenu.js.map +0 -7
  51. package/dist/esm/PickerPanel.js +0 -270
  52. package/dist/esm/PickerPanel.js.map +0 -7
  53. package/dist/esm/TimePickerDropdown.js +0 -45
  54. package/dist/esm/TimePickerDropdown.js.map +0 -7
  55. package/dist/esm/TimePickerImpl.js +0 -154
  56. package/dist/esm/TimePickerImpl.js.map +0 -7
  57. package/dist/esm/TimePickerMenu.js +0 -212
  58. package/dist/esm/TimePickerMenu.js.map +0 -7
  59. package/dist/esm/index.js +0 -11
  60. package/dist/esm/index.js.map +0 -7
  61. package/dist/esm/moveElementOnScroll.js +0 -64
  62. package/dist/esm/moveElementOnScroll.js.map +0 -7
  63. package/dist/esm/utils.js +0 -42
  64. package/dist/esm/utils.js.map +0 -7
@@ -0,0 +1,165 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
6
+ import _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';
7
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
8
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
9
+ import 'core-js/modules/web.dom-collections.iterator.js';
10
+ import { useState, useRef, useEffect } from 'react';
11
+ import moment from 'moment';
12
+ import memoizeOne from 'memoize-one';
13
+ import { getVisibleTimeByFormat } from '@elliemae/ds-utilities';
14
+ import { aggregatedClasses, convertPropToCssClassName } from '@elliemae/ds-classnames';
15
+ import { DSInputGroup, DSInput, TimeInputImpl } from '@elliemae/ds-form';
16
+ import { TimePickerMenu } from './TimePickerMenu.js';
17
+ import TimePickerDropdown from './TimePickerDropdown.js';
18
+ import { convertTimeString } from './utils.js';
19
+ import { jsx } from 'react/jsx-runtime';
20
+
21
+ const _excluded = ["onChange"];
22
+
23
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
24
+
25
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
26
+ const blockName = 'time-picker';
27
+ const TimePickerContainer = aggregatedClasses(DSInputGroup)(blockName, null, _ref => {
28
+ let {
29
+ isMenuOpened
30
+ } = _ref;
31
+ return {
32
+ isMenuOpened
33
+ };
34
+ });
35
+
36
+ const TimePickerImpl = _ref2 => {
37
+ let {
38
+ value,
39
+ onChange,
40
+ onOpen,
41
+ format,
42
+ disabled,
43
+ hasHeader,
44
+ hasHeaderDisplay,
45
+ className,
46
+ containerProps,
47
+ placement,
48
+ zIndex,
49
+ disabledTimes,
50
+ minutesInterval
51
+ } = _ref2;
52
+ const [time, setTime] = useState();
53
+ const [isMenuOpened, setIsMenuOpened] = useState(false);
54
+ const [focusedColumn, setFocusedColumn] = useState(null);
55
+ const timePickerRef = useRef();
56
+ useEffect(() => {
57
+ if (moment(value).isValid()) setTime(moment(value));else if (value === null) setTime(undefined);
58
+ }, [value]);
59
+ useEffect(() => {
60
+ window.addEventListener('click', handleClickOutside, false);
61
+ return () => window.removeEventListener('click', handleClickOutside, false);
62
+ }, []);
63
+ useEffect(() => {
64
+ window.addEventListener('keydown', handleKeyDown, false);
65
+ return () => window.removeEventListener('keydown', handleKeyDown, false);
66
+ }, []);
67
+ useEffect(() => {
68
+ if (isMenuOpened) handleChangeFocus();
69
+ }, [isMenuOpened]);
70
+
71
+ const handleClickOutside = () => {
72
+ if (isMenuOpened) setIsMenuOpened(false);
73
+ };
74
+
75
+ const handleKeyDown = event => {
76
+ const {
77
+ key
78
+ } = event;
79
+ const menuOpenKeys = ['Escape', ' ', 'Enter'];
80
+ if (menuOpenKeys.includes(key)) setIsMenuOpened(false);
81
+ };
82
+
83
+ const handleChangeFocus = () => {
84
+ const [firstColumn] = document.getElementsByClassName('em-ds-time-picker-panel');
85
+
86
+ if (firstColumn && !focusedColumn) {
87
+ setFocusedColumn(firstColumn);
88
+ firstColumn.focus();
89
+ }
90
+ };
91
+
92
+ const handlePickerChange = newTime => {
93
+ setTime(moment(newTime));
94
+ onChange(moment(newTime));
95
+ };
96
+
97
+ const handleInputChange = newTime => {
98
+ setTime(newTime);
99
+ onChange(newTime);
100
+ };
101
+
102
+ const handleMenuOpen = isOpen => {
103
+ onOpen(isOpen);
104
+ setIsMenuOpened(isOpen);
105
+ if (!isOpen) setFocusedColumn(null);
106
+ };
107
+
108
+ const getVisibleTimePanels = memoizeOne(format => getVisibleTimeByFormat(format));
109
+ const timePickerBlockName = convertPropToCssClassName(blockName);
110
+ const visiblePanels = getVisibleTimePanels(format);
111
+ const disabledTimeRange = disabledTimes && {
112
+ from: convertTimeString(disabledTimes.from),
113
+ to: convertTimeString(disabledTimes.to)
114
+ };
115
+ return /*#__PURE__*/_jsx(TimePickerContainer, {
116
+ className: "".concat(className, " variant-").concat(!disabled ? 'default' : 'disabled'),
117
+ containerProps: containerProps,
118
+ disabled: disabled,
119
+ rightAddon: /*#__PURE__*/_jsx(TimePickerDropdown, {
120
+ blockName: timePickerBlockName,
121
+ disabled: disabled,
122
+ isOpen: isMenuOpened,
123
+ zIndex: zIndex,
124
+ placement: placement,
125
+ onOpen: handleMenuOpen,
126
+ onClick: e => {
127
+ e.preventDefault();
128
+ handleMenuOpen(!isMenuOpened);
129
+ },
130
+ menu: /*#__PURE__*/jsx("div", {
131
+ ref: timePickerRef,
132
+ children: /*#__PURE__*/jsx(TimePickerMenu, _objectSpread({
133
+ disabled: disabled,
134
+ disabledTimes: disabledTimeRange,
135
+ format: format,
136
+ hasHeader: hasHeader,
137
+ hasHeaderDisplay: hasHeaderDisplay,
138
+ onTimeChange: handlePickerChange,
139
+ minutesInterval: minutesInterval,
140
+ time: time
141
+ }, visiblePanels))
142
+ })
143
+ })
144
+ }, void 0, /*#__PURE__*/_jsx(DSInput, {
145
+ customInputType: _ref3 => {
146
+ let {
147
+ onChange: handleChange
148
+ } = _ref3,
149
+ restInputProps = _objectWithoutProperties(_ref3, _excluded);
150
+
151
+ return /*#__PURE__*/jsx(TimeInputImpl, _objectSpread({
152
+ clearable: true,
153
+ disabled: disabled,
154
+ format: format,
155
+ onChange: handleChange
156
+ }, restInputProps));
157
+ },
158
+ isShowElipsisActive: false,
159
+ disabled: disabled,
160
+ onChange: handleInputChange,
161
+ value: time
162
+ }));
163
+ };
164
+
165
+ export { TimePickerImpl as default };
@@ -0,0 +1,301 @@
1
+ import 'core-js/modules/esnext.async-iterator.filter.js';
2
+ import 'core-js/modules/esnext.iterator.constructor.js';
3
+ import 'core-js/modules/esnext.iterator.filter.js';
4
+ import 'core-js/modules/esnext.async-iterator.for-each.js';
5
+ import 'core-js/modules/esnext.iterator.for-each.js';
6
+ import _defineProperty from '@babel/runtime/helpers/esm/defineProperty';
7
+ import _jsx from '@babel/runtime/helpers/esm/jsx';
8
+ import 'core-js/modules/esnext.async-iterator.map.js';
9
+ import 'core-js/modules/esnext.iterator.map.js';
10
+ import { Component } from 'react';
11
+ import { aggregatedClasses } from '@elliemae/ds-classnames';
12
+ import moment from 'moment';
13
+ import { range, addLeadingZeros } from '@elliemae/ds-utilities';
14
+ import { isAM } from './utils.js';
15
+ import PickerPanel from './PickerPanel.js';
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
20
+ const blockName = 'time-picker-menu';
21
+ const TimePickerContainer = aggregatedClasses('div')(blockName);
22
+ const TimePickerHeader = aggregatedClasses('div')(blockName, 'header');
23
+ const TimePickerPanelContainer = aggregatedClasses('div')(blockName, 'panel-container');
24
+
25
+ const generateOption = format => option => ({
26
+ value: option,
27
+ label: typeof format === 'function' ? format(option) : option
28
+ });
29
+
30
+ class TimePickerMenu extends Component {
31
+ constructor(props) {
32
+ super(props);
33
+
34
+ this.renderHeader = () => {
35
+ const {
36
+ time
37
+ } = this.state;
38
+ return /*#__PURE__*/_jsx(TimePickerHeader, {}, void 0, time.format('hh:mma'));
39
+ };
40
+
41
+ this.state = {
42
+ time: moment(props.time || '', props.format) || moment()
43
+ };
44
+ this.handleHoursChange = this.handleHoursChange.bind(this);
45
+ this.handleMinuteChange = this.handleMinuteChange.bind(this);
46
+ this.handleSecondsChange = this.handleSecondsChange.bind(this);
47
+ this.handleAMPMChange = this.handleAMPMChange.bind(this);
48
+ }
49
+
50
+ static getDerivedStateFromProps(props, state) {
51
+ if (props.time) {
52
+ return _objectSpread(_objectSpread({}, state), {}, {
53
+ time: moment(props.time)
54
+ });
55
+ }
56
+
57
+ return _objectSpread(_objectSpread({}, state), {}, {
58
+ time: undefined
59
+ });
60
+ }
61
+
62
+ componentDidMount() {
63
+ const {
64
+ time
65
+ } = this.state;
66
+ this.setState({
67
+ time
68
+ });
69
+ }
70
+
71
+ handleMinuteChange(value) {
72
+ const {
73
+ time
74
+ } = this.state;
75
+ this.updateTime(time.minute(value));
76
+ }
77
+
78
+ handleHoursChange(value) {
79
+ const {
80
+ time
81
+ } = this.state;
82
+ const {
83
+ use12Hours
84
+ } = this.props;
85
+ let nextHour = value;
86
+
87
+ if (use12Hours) {
88
+ if (!isAM(time)) {
89
+ nextHour = value % 12 + 12;
90
+ }
91
+ }
92
+
93
+ this.updateTime(time.hour(nextHour));
94
+ }
95
+
96
+ handleSecondsChange(value) {
97
+ const {
98
+ time
99
+ } = this.state;
100
+ this.updateTime(time.second(value));
101
+ }
102
+
103
+ handleAMPMChange(value) {
104
+ const {
105
+ time
106
+ } = this.state;
107
+ const hour = time.hour();
108
+ const nextHour = value.toLowerCase() === 'am' ? hour % 12 : hour % 12 + 12;
109
+ this.updateTime(time.hour(nextHour));
110
+ }
111
+
112
+ updateTime(time) {
113
+ const {
114
+ onTimeChange
115
+ } = this.props;
116
+ onTimeChange(time);
117
+ this.setState({
118
+ time
119
+ });
120
+ }
121
+
122
+ renderHoursPanel() {
123
+ const {
124
+ time
125
+ } = this.state;
126
+ const {
127
+ showHours,
128
+ use12Hours,
129
+ format,
130
+ hasHeader,
131
+ disabledTimes
132
+ } = this.props;
133
+ if (!showHours) return null;
134
+ const hour = time.hour(); // in 24 format
135
+
136
+ let selectedHour = use12Hours ? hour % 12 || 12 : hour;
137
+
138
+ if (disabledTimes) {
139
+ const {
140
+ from,
141
+ to
142
+ } = disabledTimes;
143
+
144
+ if (hour > from.hour && hour < to.hour) {
145
+ if (to.hour < 24) {
146
+ const toFormatted = to.hour % 12 || 12;
147
+ if (selectedHour !== toFormatted) this.handleHoursChange(toFormatted);
148
+ selectedHour = toFormatted;
149
+ } else if (from) {
150
+ selectedHour = (from.hour - 1) % 12 || 12;
151
+ }
152
+ }
153
+ }
154
+
155
+ const meridiem = hour >= 12 ? 'PM' : 'AM';
156
+ const withLeadingZeros = format.indexOf('hh') > -1;
157
+ const rangeHours = use12Hours ? range(1, 13) : range(24);
158
+ const hoursOptions = rangeHours.map(generateOption(withLeadingZeros && addLeadingZeros(2)));
159
+ return /*#__PURE__*/_jsx(PickerPanel, {
160
+ type: "hour",
161
+ time: time,
162
+ meridiem: meridiem,
163
+ hasHeader: hasHeader,
164
+ header: "H",
165
+ onChange: this.handleHoursChange,
166
+ options: hoursOptions,
167
+ selected: selectedHour,
168
+ disabledTimes: disabledTimes
169
+ });
170
+ }
171
+
172
+ renderMinutesPanel() {
173
+ const {
174
+ time
175
+ } = this.state;
176
+ const {
177
+ showMinutes,
178
+ format,
179
+ hasHeader,
180
+ disabledTimes,
181
+ minutesInterval
182
+ } = this.props;
183
+ if (!showMinutes) return null;
184
+ const withLeadingZeros = format.indexOf('mm') > -1;
185
+ const rangeMinutes = range(0, 60, minutesInterval).map(generateOption(withLeadingZeros && addLeadingZeros(2)));
186
+ let selectedMinute = time.minute();
187
+ const selectedHour = time.hour();
188
+
189
+ if (disabledTimes) {
190
+ const {
191
+ from,
192
+ to
193
+ } = disabledTimes;
194
+
195
+ if (selectedHour <= to.hour && selectedHour > from.hour) {
196
+ if (to) {
197
+ if (selectedMinute < to.min) this.handleMinuteChange(to.min);
198
+ } else if (from) {
199
+ if (selectedMinute > from.min) this.handleMinuteChange(from.min - 1);
200
+ }
201
+ } else {
202
+ selectedMinute = time.minute();
203
+ }
204
+ }
205
+
206
+ return /*#__PURE__*/_jsx(PickerPanel, {
207
+ type: "minutes",
208
+ time: time,
209
+ hasHeader: hasHeader,
210
+ header: "M",
211
+ onChange: this.handleMinuteChange,
212
+ options: rangeMinutes,
213
+ selected: selectedMinute,
214
+ disabledTimes: disabledTimes
215
+ });
216
+ }
217
+
218
+ renderSecondsPanel() {
219
+ const {
220
+ time
221
+ } = this.state;
222
+ const {
223
+ showSeconds,
224
+ format,
225
+ hasHeader
226
+ } = this.props;
227
+ if (!showSeconds) return null;
228
+ const withLeadingZeros = format.indexOf('ss') > -1;
229
+ const rangeSeconds = range(60).map(generateOption(withLeadingZeros && addLeadingZeros(2)));
230
+ return /*#__PURE__*/_jsx(PickerPanel, {
231
+ type: "seconds",
232
+ hasHeader: hasHeader,
233
+ header: "S",
234
+ onChange: this.handleSecondsChange,
235
+ options: rangeSeconds,
236
+ selected: time.second()
237
+ });
238
+ }
239
+
240
+ renderAMPMPanel() {
241
+ const {
242
+ time
243
+ } = this.state;
244
+ const {
245
+ use12Hours,
246
+ hasHeader,
247
+ disabledTimes
248
+ } = this.props;
249
+ if (!use12Hours) return null;
250
+ let meridiemSelected = !isAM(time) ? 'pm' : 'am';
251
+
252
+ if (disabledTimes && disabledTimes.to && meridiemSelected === 'am') {
253
+ meridiemSelected = disabledTimes.to.hour >= 12 ? 'pm' : 'am';
254
+
255
+ if (meridiemSelected === 'am' && time.hour() > 12) {
256
+ this.handleAMPMChange('am');
257
+ }
258
+
259
+ if (meridiemSelected === 'pm' && time.hour() <= 12) {
260
+ this.handleAMPMChange('pm');
261
+ }
262
+ }
263
+
264
+ return /*#__PURE__*/_jsx(PickerPanel, {
265
+ type: "meridiem",
266
+ hasHeader: hasHeader,
267
+ header: "",
268
+ onChange: this.handleAMPMChange,
269
+ options: [{
270
+ value: 'am',
271
+ label: 'am'
272
+ }, {
273
+ value: 'pm',
274
+ label: 'pm'
275
+ }],
276
+ selected: meridiemSelected,
277
+ disabledTimes: disabledTimes
278
+ });
279
+ }
280
+
281
+ render() {
282
+ const {
283
+ hasHeaderDisplay
284
+ } = this.props;
285
+ return /*#__PURE__*/_jsx(TimePickerContainer, {}, void 0, hasHeaderDisplay && this.renderHeader(), /*#__PURE__*/_jsx(TimePickerPanelContainer, {}, void 0, this.renderHoursPanel(), this.renderMinutesPanel(), this.renderSecondsPanel(), this.renderAMPMPanel()));
286
+ }
287
+
288
+ }
289
+
290
+ TimePickerMenu.defaultProps = {
291
+ time: moment(),
292
+ hasHeader: false,
293
+ use12Hours: true,
294
+ showSeconds: true,
295
+ showMinutes: true,
296
+ showHours: true,
297
+ disabledTimes: undefined,
298
+ onTimeChange: () => null
299
+ };
300
+
301
+ export { TimePickerMenu, TimePickerMenu as default };
package/esm/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { DSTimePicker, DSTimePickerWithSchema, DSTimePicker as default } from './DSTimePicker.js';
2
+ export { TimePickerMenu } from './TimePickerMenu.js';
3
+ export { DSTimePickerMenu } from './DSTimePickerMenu.js';
4
+ export { convertTimeString } from './utils.js';
@@ -0,0 +1,70 @@
1
+ function MoveElementOnScroll(element, _ref) {
2
+ let {
3
+ container,
4
+ min = 0,
5
+ max = element.offsetHeight,
6
+ speed = 1,
7
+ smooth = 2,
8
+ onUpdate = () => null,
9
+ onEndScroll = () => null
10
+ } = _ref;
11
+ let moving = false;
12
+ let pos = min;
13
+ let lastPos = pos; // todo: move this to utils if we finally need it
14
+
15
+ const requestFrame = function () {
16
+ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (func) {
17
+ window.setTimeout(func, 1000 / 50);
18
+ };
19
+ }();
20
+
21
+ function update() {
22
+ moving = true;
23
+ const delta = (pos - lastPos) / smooth;
24
+ lastPos += delta;
25
+
26
+ if (Math.abs(delta) > 0.7) {
27
+ requestFrame(() => {
28
+ onUpdate(lastPos, delta);
29
+ update();
30
+ });
31
+ } else {
32
+ onEndScroll(pos);
33
+ moving = false;
34
+ }
35
+ }
36
+
37
+ function scrolling(e) {
38
+ e.preventDefault(); // disable default scrolling
39
+
40
+ let delta = e.delta || e.wheelDelta;
41
+
42
+ if (delta === undefined) {
43
+ // for firefox
44
+ delta = -e.detail;
45
+ delta *= 10 * speed;
46
+ }
47
+
48
+ pos += -delta * speed;
49
+ pos = Math.max(min, Math.min(pos, max)); // limit scrolling
50
+
51
+ if (!moving) {
52
+ update();
53
+ }
54
+ }
55
+
56
+ container.addEventListener('mousewheel', scrolling, false);
57
+ container.addEventListener('DOMMouseScroll', scrolling, false);
58
+ return {
59
+ unsubscribe: () => {
60
+ container.removeEventListener('mousewheel', scrolling);
61
+ container.removeEventListener('DOMMouseScroll', scrolling);
62
+ },
63
+ updatePosition: newPos => {
64
+ pos = -newPos;
65
+ lastPos = -pos;
66
+ }
67
+ };
68
+ }
69
+
70
+ export { MoveElementOnScroll, MoveElementOnScroll as default };
package/esm/utils.js ADDED
@@ -0,0 +1,31 @@
1
+ const validateIndex = (index, options) => {
2
+ if (index < 0) return 0;
3
+ if (index >= options.length) return options.length - 1;
4
+ return index;
5
+ };
6
+ const getOptionIndex = function (options, selectedOption) {
7
+ let valueProperty = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'value';
8
+ const index = options.findIndex(option => option[valueProperty] === selectedOption);
9
+ return validateIndex(index, options);
10
+ };
11
+ const isAM = time => time && time.hour() < 12;
12
+ const convertTimeString = string => {
13
+ if (!string) return null;
14
+ let meridiem = 'AM';
15
+ if (string.toUpperCase().includes('PM')) meridiem = 'PM';
16
+ const arr = string.split(':');
17
+ let hour = parseInt(arr[0], 10);
18
+ if (meridiem === 'PM' && hour !== 12) hour += 12; // formats to 24
19
+
20
+ if (meridiem === 'AM' && hour === 12) hour = 0;
21
+ if (meridiem === 'PM' && hour === 12) hour = 12;
22
+ const min = parseInt(arr[1], 10);
23
+ const sec = parseInt(arr[2], 10);
24
+ return {
25
+ hour,
26
+ min,
27
+ sec
28
+ };
29
+ };
30
+
31
+ export { convertTimeString, getOptionIndex, isAM, validateIndex };
package/package.json CHANGED
@@ -1,50 +1,47 @@
1
1
  {
2
2
  "name": "@elliemae/ds-time-picker",
3
- "version": "2.3.0-alpha.8",
3
+ "version": "2.3.0-next.2",
4
4
  "license": "MIT",
5
5
  "description": "ICE MT - Dimsum - Time Picker",
6
- "files": [
7
- "dist"
8
- ],
9
- "module": "./dist/esm/index.js",
10
- "main": "./dist/cjs/index.js",
11
- "types": "./dist/types/index.d.ts",
6
+ "module": "./esm/index.js",
7
+ "main": "./cjs/index.js",
8
+ "types": "./types/index.d.ts",
12
9
  "exports": {
13
10
  ".": {
14
- "import": "./dist/esm/index.js",
15
- "require": "./dist/cjs/index.js"
11
+ "import": "./esm/index.js",
12
+ "require": "./cjs/index.js"
16
13
  },
17
14
  "./utils": {
18
- "import": "./dist/esm/utils.js",
19
- "require": "./dist/cjs/utils.js"
15
+ "import": "./esm/utils.js",
16
+ "require": "./cjs/utils.js"
20
17
  },
21
18
  "./TimePickerMenu": {
22
- "import": "./dist/esm/TimePickerMenu.js",
23
- "require": "./dist/cjs/TimePickerMenu.js"
19
+ "import": "./esm/TimePickerMenu.js",
20
+ "require": "./cjs/TimePickerMenu.js"
24
21
  },
25
22
  "./TimePickerImpl": {
26
- "import": "./dist/esm/TimePickerImpl.js",
27
- "require": "./dist/cjs/TimePickerImpl.js"
23
+ "import": "./esm/TimePickerImpl.js",
24
+ "require": "./cjs/TimePickerImpl.js"
28
25
  },
29
26
  "./TimePickerDropdown": {
30
- "import": "./dist/esm/TimePickerDropdown.js",
31
- "require": "./dist/cjs/TimePickerDropdown.js"
27
+ "import": "./esm/TimePickerDropdown.js",
28
+ "require": "./cjs/TimePickerDropdown.js"
32
29
  },
33
30
  "./PickerPanel": {
34
- "import": "./dist/esm/PickerPanel.js",
35
- "require": "./dist/cjs/PickerPanel.js"
31
+ "import": "./esm/PickerPanel.js",
32
+ "require": "./cjs/PickerPanel.js"
36
33
  },
37
34
  "./moveElementOnScroll": {
38
- "import": "./dist/esm/moveElementOnScroll.js",
39
- "require": "./dist/cjs/moveElementOnScroll.js"
35
+ "import": "./esm/moveElementOnScroll.js",
36
+ "require": "./cjs/moveElementOnScroll.js"
40
37
  },
41
38
  "./DSTimePickerMenu": {
42
- "import": "./dist/esm/DSTimePickerMenu.js",
43
- "require": "./dist/cjs/DSTimePickerMenu.js"
39
+ "import": "./esm/DSTimePickerMenu.js",
40
+ "require": "./cjs/DSTimePickerMenu.js"
44
41
  },
45
42
  "./DSTimePicker": {
46
- "import": "./dist/esm/DSTimePicker.js",
47
- "require": "./dist/cjs/DSTimePicker.js"
43
+ "import": "./esm/DSTimePicker.js",
44
+ "require": "./cjs/DSTimePicker.js"
48
45
  }
49
46
  },
50
47
  "sideEffects": [
@@ -56,17 +53,23 @@
56
53
  "url": "https://git.elliemae.io/platform-ui/dimsum.git"
57
54
  },
58
55
  "engines": {
59
- "pnpm": ">=6",
60
- "node": ">=16"
56
+ "npm": ">=7",
57
+ "node": ">=14"
61
58
  },
62
59
  "author": "ICE MT",
60
+ "scripts": {
61
+ "dev": "cross-env NODE_ENV=development && node ../../scripts/build/build.js -w",
62
+ "prebuild": "exit 0",
63
+ "predev": "exit 0",
64
+ "build": "node ../../scripts/build/build.js"
65
+ },
63
66
  "dependencies": {
64
- "@elliemae/ds-button": "2.3.0-alpha.8",
65
- "@elliemae/ds-classnames": "2.3.0-alpha.8",
66
- "@elliemae/ds-form": "2.3.0-alpha.8",
67
- "@elliemae/ds-icons": "2.3.0-alpha.8",
68
- "@elliemae/ds-popper": "2.3.0-alpha.8",
69
- "@elliemae/ds-utilities": "2.3.0-alpha.8",
67
+ "@elliemae/ds-button": "2.3.0-next.2",
68
+ "@elliemae/ds-classnames": "2.3.0-next.2",
69
+ "@elliemae/ds-form": "2.3.0-next.2",
70
+ "@elliemae/ds-icons": "2.3.0-next.2",
71
+ "@elliemae/ds-popper": "2.3.0-next.2",
72
+ "@elliemae/ds-utilities": "2.3.0-next.2",
70
73
  "memoize-one": "~5.1.1",
71
74
  "moment": "~2.29.1",
72
75
  "prop-types": "~15.7.2",
@@ -83,12 +86,7 @@
83
86
  },
84
87
  "publishConfig": {
85
88
  "access": "public",
86
- "typeSafety": false
87
- },
88
- "scripts": {
89
- "dev": "cross-env NODE_ENV=development && node ../../scripts/build/build.js -w",
90
- "prebuild": "exit 0",
91
- "predev": "exit 0",
92
- "build": "node ../../scripts/build/build.js"
89
+ "directory": "dist",
90
+ "generateSubmodules": true
93
91
  }
94
92
  }