@elliemae/ds-time-picker 2.3.1 → 3.0.0-alpha.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.
Files changed (64) hide show
  1. package/dist/cjs/DSTimePicker.js +106 -0
  2. package/dist/cjs/DSTimePicker.js.map +7 -0
  3. package/dist/cjs/DSTimePickerMenu.js +60 -0
  4. package/dist/cjs/DSTimePickerMenu.js.map +7 -0
  5. package/dist/cjs/PickerPanel.js +313 -0
  6. package/dist/cjs/PickerPanel.js.map +7 -0
  7. package/dist/cjs/TimePickerDropdown.js +74 -0
  8. package/dist/cjs/TimePickerDropdown.js.map +7 -0
  9. package/dist/cjs/TimePickerImpl.js +210 -0
  10. package/dist/cjs/TimePickerImpl.js.map +7 -0
  11. package/dist/cjs/TimePickerMenu.js +258 -0
  12. package/dist/cjs/TimePickerMenu.js.map +7 -0
  13. package/dist/cjs/index.js +40 -0
  14. package/dist/cjs/index.js.map +7 -0
  15. package/dist/cjs/moveElementOnScroll.js +93 -0
  16. package/dist/cjs/moveElementOnScroll.js.map +7 -0
  17. package/dist/cjs/utils.js +71 -0
  18. package/dist/cjs/utils.js.map +7 -0
  19. package/dist/esm/DSTimePicker.js +77 -0
  20. package/dist/esm/DSTimePicker.js.map +7 -0
  21. package/dist/esm/DSTimePickerMenu.js +33 -0
  22. package/dist/esm/DSTimePickerMenu.js.map +7 -0
  23. package/dist/esm/PickerPanel.js +286 -0
  24. package/dist/esm/PickerPanel.js.map +7 -0
  25. package/dist/esm/TimePickerDropdown.js +45 -0
  26. package/dist/esm/TimePickerDropdown.js.map +7 -0
  27. package/dist/esm/TimePickerImpl.js +183 -0
  28. package/dist/esm/TimePickerImpl.js.map +7 -0
  29. package/dist/esm/TimePickerMenu.js +231 -0
  30. package/dist/esm/TimePickerMenu.js.map +7 -0
  31. package/dist/esm/index.js +11 -0
  32. package/dist/esm/index.js.map +7 -0
  33. package/dist/esm/moveElementOnScroll.js +64 -0
  34. package/dist/esm/moveElementOnScroll.js.map +7 -0
  35. package/dist/esm/utils.js +42 -0
  36. package/dist/esm/utils.js.map +7 -0
  37. package/package.json +46 -37
  38. package/cjs/DSTimePicker.js +0 -121
  39. package/cjs/DSTimePickerMenu.js +0 -35
  40. package/cjs/PickerPanel.js +0 -402
  41. package/cjs/TimePickerDropdown.js +0 -53
  42. package/cjs/TimePickerImpl.js +0 -175
  43. package/cjs/TimePickerMenu.js +0 -312
  44. package/cjs/index.js +0 -17
  45. package/cjs/moveElementOnScroll.js +0 -75
  46. package/cjs/utils.js +0 -38
  47. package/esm/DSTimePicker.js +0 -111
  48. package/esm/DSTimePickerMenu.js +0 -24
  49. package/esm/PickerPanel.js +0 -392
  50. package/esm/TimePickerDropdown.js +0 -45
  51. package/esm/TimePickerImpl.js +0 -165
  52. package/esm/TimePickerMenu.js +0 -301
  53. package/esm/index.js +0 -4
  54. package/esm/moveElementOnScroll.js +0 -70
  55. package/esm/utils.js +0 -31
  56. package/types/DSTimePicker.d.ts +0 -162
  57. package/types/DSTimePickerMenu.d.ts +0 -4
  58. package/types/PickerPanel.d.ts +0 -24
  59. package/types/TimePickerDropdown.d.ts +0 -25
  60. package/types/TimePickerImpl.d.ts +0 -35
  61. package/types/TimePickerMenu.d.ts +0 -19
  62. package/types/index.d.ts +0 -5
  63. package/types/moveElementOnScroll.d.ts +0 -13
  64. package/types/utils.d.ts +0 -8
@@ -1,165 +0,0 @@
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 };
@@ -1,301 +0,0 @@
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 DELETED
@@ -1,4 +0,0 @@
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';
@@ -1,70 +0,0 @@
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 DELETED
@@ -1,31 +0,0 @@
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 };