@planningcenter/tapestry-react 2.9.0-rc.1 → 2.9.0-rc.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.
@@ -1,277 +1,304 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import _assertThisInitialized from "@babel/runtime/helpers/esm/assertThisInitialized";
4
- import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose";
5
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
6
- import React, { Component } from 'react';
3
+ import React, { useEffect, useRef, useState } from 'react';
7
4
  import Box from '../Box';
8
5
  import Input from '../Input/Input';
9
6
  import InputBox from '../Input/InputBox';
10
7
  import InputField from '../Input/InputField';
11
8
  import NumberField from '../NumberField';
12
- import { isIOS, noop, padNumber } from '../utils';
13
- import { HOURS_TO_NOON, HOURS_IN_DAY, addHoursToTime, addMinutesToTime, addTimeToDate, getMeridiem, getTimeFromDate } from './utils';
14
- var MIN_MINUTE = 0;
15
- var MAX_MINUTE = 59;
9
+ import { noop, padNumber } from '../utils';
10
+ import { addHoursToTime, addMinutesToTime, addTimeToDate, getTimeFromDate } from './utils';
16
11
 
17
- var _ref = /*#__PURE__*/React.createElement(Box, {
12
+ var _ref2 = /*#__PURE__*/React.createElement(Box, {
18
13
  as: "span",
19
14
  width: 0.5,
20
15
  textAlign: "center",
21
16
  userSelect: "none"
22
17
  }, ":");
23
18
 
24
- var TimeField = /*#__PURE__*/function (_Component) {
25
- _inheritsLoose(TimeField, _Component);
26
-
27
- function TimeField(props) {
28
- var _this;
29
-
30
- _this = _Component.call(this, props) || this;
31
-
32
- _defineProperty(_assertThisInitialized(_this), "setInputBoxRef", function (component) {
33
- _this.inputBox = component;
34
- });
35
-
36
- _defineProperty(_assertThisInitialized(_this), "updateTime", function (time) {
37
- if (time === void 0) {
38
- time = {};
19
+ var TimeField = function TimeField(_ref) {
20
+ var ignoredKeys = _ref.ignoredKeys,
21
+ interval = _ref.interval,
22
+ isIOS = _ref.isIOS,
23
+ max = _ref.max,
24
+ min = _ref.min,
25
+ onChange = _ref.onChange,
26
+ _ref$twelveHourClock = _ref.twelveHourClock,
27
+ twelveHourClock = _ref$twelveHourClock === void 0 ? true : _ref$twelveHourClock,
28
+ value = _ref.value,
29
+ restProps = _objectWithoutPropertiesLoose(_ref, ["ignoredKeys", "interval", "isIOS", "max", "min", "onChange", "twelveHourClock", "value"]);
30
+
31
+ var ref = useRef(null);
32
+
33
+ var _useState = useState(value[0]),
34
+ hours = _useState[0],
35
+ setHours = _useState[1];
36
+
37
+ var _useState2 = useState(value[1]),
38
+ minutes = _useState2[0],
39
+ setMinutes = _useState2[1];
40
+
41
+ var _useState3 = useState(hours < 12 ? 'AM' : 'PM'),
42
+ meridiem = _useState3[0],
43
+ setMeridiem = _useState3[1];
44
+
45
+ var _useState4 = useState(twelveHourClock && hours > 12 ? hours - 12 : hours),
46
+ hoursDisplay = _useState4[0],
47
+ setHoursDisplay = _useState4[1];
48
+
49
+ var decrementHoursBy = function decrementHoursBy(amount) {
50
+ var updatedHours = hours - amount;
51
+
52
+ if (twelveHourClock) {
53
+ if (updatedHours > 12) {
54
+ setHours(updatedHours);
55
+ setHoursDisplay(updatedHours - 12);
56
+ } else if (updatedHours <= 12 && updatedHours > 0) {
57
+ setHours(updatedHours);
58
+ setHoursDisplay(updatedHours);
59
+ } else if (updatedHours === 0) {
60
+ setHours(updatedHours);
61
+ setHoursDisplay(12);
62
+ } else {
63
+ setHours(23);
64
+ setHoursDisplay(11);
39
65
  }
40
-
41
- var _this$props$value = _this.props.value,
42
- hours = _this$props$value[0],
43
- minutes = _this$props$value[1];
44
-
45
- if (time.hours !== undefined) {
46
- hours = time.hours;
66
+ } else {
67
+ if (updatedHours < 0) {
68
+ setHours(23);
69
+ setHoursDisplay(23);
70
+ } else {
71
+ setHours(updatedHours);
72
+ setHoursDisplay(updatedHours);
47
73
  }
74
+ }
75
+ };
48
76
 
49
- if (time.minutes !== undefined) {
50
- minutes = time.minutes;
51
- }
77
+ var incrementHoursBy = function incrementHoursBy(amount) {
78
+ var updatedHours = hours + amount;
52
79
 
53
- if (_this.props.twelveHourClock && !_this.props.isIOS) {
54
- if (hours > 11 && _this.state.meridiem === 'AM') {
55
- hours -= 12;
56
- } else if (hours < 12 && _this.state.meridiem === 'PM') {
57
- hours += 12;
58
- }
80
+ if (twelveHourClock) {
81
+ if (updatedHours > 0 && updatedHours <= 12) {
82
+ setHours(updatedHours);
83
+ setHoursDisplay(updatedHours);
84
+ } else if (updatedHours > 12 && updatedHours < 24) {
85
+ setHours(updatedHours);
86
+ setHoursDisplay(updatedHours - 12);
87
+ } else {
88
+ setHours(0);
89
+ setHoursDisplay(12);
59
90
  }
60
-
61
- _this.props.onChange([hours, minutes]);
62
- });
63
-
64
- _defineProperty(_assertThisInitialized(_this), "updateHours", function (amount) {
65
- _this.props.onChange(addHoursToTime(_this.props.value, amount));
66
- });
67
-
68
- _defineProperty(_assertThisInitialized(_this), "updateMinutes", function (amount) {
69
- _this.props.onChange(addMinutesToTime(_this.props.value, amount));
70
- });
71
-
72
- _defineProperty(_assertThisInitialized(_this), "toggleMeridiem", function () {
73
- _this.setState(function (state) {
74
- return {
75
- meridiem: state.meridiem === 'AM' ? 'PM' : 'AM'
76
- };
77
- }, _this.updateTime);
78
- });
79
-
80
- _defineProperty(_assertThisInitialized(_this), "handleHoursChange", function (hours) {
81
- if (_this.twelveHourClock && hours === 0) {
82
- _this.updateTime({
83
- hours: 12
84
- });
91
+ } else {
92
+ if (updatedHours < 24) {
93
+ setHours(updatedHours);
94
+ setHoursDisplay(updatedHours);
85
95
  } else {
86
- _this.updateTime({
87
- hours: hours
88
- });
96
+ setHours(0);
97
+ setHoursDisplay(0);
89
98
  }
90
- });
99
+ }
100
+ };
91
101
 
92
- _defineProperty(_assertThisInitialized(_this), "handleHoursKeyDown", function (event) {
93
- var hour = Number(event.target.value);
94
- var isTwelveHourClock = _this.props.twelveHourClock;
95
- var isHourEleven = HOURS_TO_NOON - 1;
96
- var maxHour = isTwelveHourClock ? HOURS_TO_NOON : HOURS_IN_DAY - 1;
97
- var minHour = isTwelveHourClock ? 1 : 0;
102
+ var decrementMinutesBy = function decrementMinutesBy(amount) {
103
+ var updatedMinutes = minutes - amount;
98
104
 
99
- if (event.key === 'ArrowRight') {
100
- _this.inputBox.focus(1);
101
- }
105
+ if (updatedMinutes >= 0) {
106
+ setMinutes(updatedMinutes);
107
+ } else {
108
+ setMinutes(59);
109
+ decrementHoursBy(1);
110
+ }
111
+ };
102
112
 
103
- if (event.key === 'ArrowUp' && isTwelveHourClock && hour === isHourEleven) {
104
- _this.toggleMeridiem();
105
- }
113
+ var incrementMinutesBy = function incrementMinutesBy(amount) {
114
+ var updatedMinutes = minutes + amount;
106
115
 
107
- if (event.key === 'ArrowUp' && hour === maxHour) {
108
- _this.updateHours(1);
109
- }
116
+ if (updatedMinutes <= 59) {
117
+ setMinutes(updatedMinutes);
118
+ } else {
119
+ setMinutes(0);
120
+ incrementHoursBy(1);
121
+ }
122
+ };
110
123
 
111
- if (event.key === 'ArrowDown' && isTwelveHourClock && hour === minHour) {
112
- _this.toggleMeridiem();
124
+ var toggleMeridiem = function toggleMeridiem() {
125
+ if (meridiem === 'AM') {
126
+ setMeridiem('PM');
127
+
128
+ if (hours >= 0 && hours <= 12) {
129
+ setHours(hours + 12);
113
130
  }
131
+ } else {
132
+ setMeridiem('AM');
114
133
 
115
- if (event.key === 'ArrowDown' && hour === minHour) {
116
- _this.updateHours(-1);
134
+ if (hours >= 12 && hours < 24) {
135
+ setHours(hours - 12);
117
136
  }
118
- });
137
+ }
138
+ };
119
139
 
120
- _defineProperty(_assertThisInitialized(_this), "handleMinutesChange", function (minutes) {
121
- _this.updateTime({
122
- minutes: minutes
123
- });
124
- });
140
+ var handleHoursKeyDown = function handleHoursKeyDown(event) {
141
+ if (ignoredKeys && ignoredKeys.includes(event.key)) {
142
+ return;
143
+ }
125
144
 
126
- _defineProperty(_assertThisInitialized(_this), "handleMinutesKeyDown", function (event) {
127
- var minute = Number(event.target.value);
145
+ if (event.key === 'Backspace') {
146
+ event.preventDefault();
147
+ }
128
148
 
129
- if (_this.props.ignoredKeys.includes(event.key)) {
130
- return;
131
- }
149
+ if (event.key === 'ArrowRight') {
150
+ ref.current.node.children[2].focus();
151
+ }
132
152
 
133
- if (event.key === 'ArrowLeft') {
134
- _this.inputBox.focus(0);
135
- }
153
+ if (event.key === 'ArrowUp') {
154
+ incrementHoursBy(1);
155
+ }
136
156
 
137
- if (event.key === 'ArrowRight') {
138
- _this.inputBox.focus(2);
139
- }
157
+ if (event.key === 'ArrowDown') {
158
+ decrementHoursBy(1);
159
+ }
160
+ };
140
161
 
141
- if (event.key === 'ArrowUp' && minute >= MAX_MINUTE) {
142
- _this.updateMinutes(1);
143
- }
162
+ var handleHoursChange = function handleHoursChange(e) {
163
+ setHoursDisplay(e);
164
+ !twelveHourClock && setHours(e);
165
+ };
144
166
 
145
- if (event.key === 'ArrowDown' && minute <= MIN_MINUTE) {
146
- _this.updateMinutes(-1);
147
- }
148
- });
167
+ var handleHoursBlur = function handleHoursBlur(e) {
168
+ var updatedHoursValue = parseInt(e.target.value);
149
169
 
150
- _defineProperty(_assertThisInitialized(_this), "handleAMPMKeyDown", function (event) {
151
- if (_this.props.ignoredKeys.includes(event.key)) {
152
- return;
170
+ if (twelveHourClock) {
171
+ if (updatedHoursValue === 0) {
172
+ setHours(0);
173
+ setHoursDisplay(12);
174
+ } else if (hours <= 12) {
175
+ setHours(updatedHoursValue);
176
+ setHoursDisplay(updatedHoursValue);
177
+ } else {
178
+ setHours(updatedHoursValue + 12);
179
+ setHoursDisplay(updatedHoursValue);
153
180
  }
181
+ } else {
182
+ setHours(updatedHoursValue);
183
+ setHoursDisplay(updatedHoursValue);
184
+ }
185
+ };
154
186
 
155
- if (event.key !== 'Tab' && !(event.metaKey && event.key === 'r')) {
156
- event.preventDefault();
157
- }
187
+ var handleMinutesKeyDown = function handleMinutesKeyDown(event) {
188
+ if (event.key === 'ArrowLeft') {
189
+ ref.current.node.children[0].focus();
190
+ }
158
191
 
159
- if (event.key === 'ArrowLeft') {
160
- _this.inputBox.focus(1);
161
- }
192
+ if (event.key === 'ArrowRight') {
193
+ ref.current.node.children[3].focus();
194
+ }
162
195
 
163
- if (event.key.toLowerCase() === 'a' && _this.state.meridiem === 'PM' || event.key.toLowerCase() === 'p' && _this.state.meridiem === 'AM' || event.key === 'ArrowUp' || event.key === 'ArrowDown') {
164
- _this.toggleMeridiem();
165
- }
166
- });
167
-
168
- _defineProperty(_assertThisInitialized(_this), "handleIOSChange", function (event) {
169
- var _event$target$value$s = event.target.value.split(':'),
170
- hours = _event$target$value$s[0],
171
- minutes = _event$target$value$s[1];
172
-
173
- _this.updateTime({
174
- hours: +hours,
175
- minutes: +minutes
176
- });
177
- });
178
-
179
- _this.state = {
180
- meridiem: getMeridiem(props.value)
181
- };
182
- return _this;
183
- }
184
-
185
- var _proto = TimeField.prototype;
186
-
187
- _proto.componentDidUpdate = function componentDidUpdate(lastProps) {
188
- if (lastProps.value[0] !== this.props.value[0]) {
189
- this.setState({
190
- meridiem: getMeridiem(this.props.value)
191
- });
196
+ if (event.key === 'ArrowUp') {
197
+ incrementMinutesBy(1);
192
198
  }
193
- };
194
199
 
195
- _proto.render = function render() {
196
- var _this$props = this.props,
197
- ignoredKeys = _this$props.ignoredKeys,
198
- value = _this$props.value,
199
- min = _this$props.min,
200
- max = _this$props.max,
201
- interval = _this$props.interval,
202
- onChange = _this$props.onChange,
203
- twelveHourClock = _this$props.twelveHourClock,
204
- isIOS = _this$props.isIOS,
205
- restProps = _objectWithoutPropertiesLoose(_this$props, ["ignoredKeys", "value", "min", "max", "interval", "onChange", "twelveHourClock", "isIOS"]);
206
-
207
- var hours = value[0],
208
- minutes = value[1];
209
- return isIOS ? /*#__PURE__*/React.createElement(Input, _extends({}, restProps, {
210
- type: "time",
211
- autoWidth: hours + ":" + padNumber(minutes, 2) + " " + this.state.meridiem,
212
- value: padNumber(hours, 2) + ":" + padNumber(minutes, 2),
213
- onChange: this.handleIOSChange
214
- })) : /*#__PURE__*/React.createElement(InputBox, _extends({
215
- ref: this.setInputBoxRef,
216
- inline: true
217
- }, restProps), /*#__PURE__*/React.createElement(NumberField, {
218
- autoWidth: false,
219
- fontVariantNumeric: "tabular-nums",
220
- moveFocusOnMax: true,
221
- value: twelveHourClock ? hours % HOURS_TO_NOON || HOURS_TO_NOON : hours,
222
- min: 0,
223
- max: twelveHourClock ? HOURS_TO_NOON : HOURS_IN_DAY - 1,
224
- pad: 2,
225
- grow: 0,
226
- width: "2ch",
227
- textAlign: "center",
228
- "aria-label": "Hours",
229
- onChange: this.handleHoursChange,
230
- onKeyDown: this.handleHoursKeyDown,
231
- ignoredKeys: ignoredKeys
232
- }), _ref, /*#__PURE__*/React.createElement(NumberField, {
233
- autoWidth: false,
234
- fontVariantNumeric: "tabular-nums",
235
- moveFocusOnMax: true,
236
- value: minutes,
237
- min: MIN_MINUTE,
238
- max: MAX_MINUTE,
239
- pad: 2,
240
- grow: 0,
241
- width: "2ch",
242
- textAlign: "center",
243
- "aria-label": "Minutes",
244
- onChange: this.handleMinutesChange,
245
- onKeyDown: this.handleMinutesKeyDown,
246
- ignoredKeys: ignoredKeys
247
- }), twelveHourClock && /*#__PURE__*/React.createElement(InputField, {
248
- highlightOnInteraction: true,
249
- value: this.state.meridiem,
250
- grow: 0,
251
- width: "2em",
252
- textAlign: "center",
253
- "aria-label": "AM/PM",
254
- onChange: noop // prevent React warnings
255
- ,
256
- onKeyDown: this.handleAMPMKeyDown
257
- }));
200
+ if (event.key === 'ArrowDown') {
201
+ decrementMinutesBy(1);
202
+ }
258
203
  };
259
204
 
260
- return TimeField;
261
- }(Component);
205
+ var handleAMPMKeyDown = function handleAMPMKeyDown(event) {
206
+ if (ignoredKeys && ignoredKeys.includes(event.key)) {
207
+ return;
208
+ }
209
+
210
+ if (event.key !== 'Tab' && !(event.metaKey && event.key === 'r')) {
211
+ event.preventDefault();
212
+ }
213
+
214
+ if (event.key === 'ArrowLeft') {
215
+ ref.current.node.children[2].focus();
216
+ }
262
217
 
263
- _defineProperty(TimeField, "addHoursToTime", addHoursToTime);
218
+ if (event.key.toLowerCase() === 'a' && meridiem === 'PM' || event.key.toLowerCase() === 'p' && meridiem === 'AM' || event.key === 'ArrowUp' || event.key === 'ArrowDown') {
219
+ toggleMeridiem();
220
+ }
221
+ };
264
222
 
265
- _defineProperty(TimeField, "addMinutesToTime", addMinutesToTime);
223
+ var updateTime = function updateTime(time) {
224
+ var hours = time[0],
225
+ minutes = time[1];
226
+ return onChange([hours, minutes]);
227
+ };
266
228
 
267
- _defineProperty(TimeField, "addTimeToDate", addTimeToDate);
229
+ var handleIOSChange = function handleIOSChange(event) {
230
+ var _event$target$value$s = event.target.value.split(':'),
231
+ hours = _event$target$value$s[0],
232
+ minutes = _event$target$value$s[1];
268
233
 
269
- _defineProperty(TimeField, "getTimeFromDate", getTimeFromDate);
234
+ setHours(hours);
235
+ setMinutes(minutes);
236
+ };
270
237
 
271
- _defineProperty(TimeField, "defaultProps", {
272
- twelveHourClock: true,
273
- ignoredKeys: [],
274
- isIOS: isIOS
275
- });
238
+ useEffect(function () {
239
+ if (hours < 12) {
240
+ setMeridiem('AM');
241
+ } else {
242
+ setMeridiem('PM');
243
+ }
276
244
 
245
+ updateTime([hours, minutes]);
246
+ }, [hours, minutes]);
247
+ return isIOS ? /*#__PURE__*/React.createElement(Input, _extends({}, restProps, {
248
+ type: "time",
249
+ autoWidth: hours + ":" + padNumber(minutes, 2) + " " + meridiem,
250
+ value: padNumber(hours, 2) + ":" + padNumber(minutes, 2),
251
+ onChange: handleIOSChange
252
+ })) : /*#__PURE__*/React.createElement(InputBox, _extends({
253
+ ref: ref,
254
+ inline: true
255
+ }, restProps), /*#__PURE__*/React.createElement(NumberField, {
256
+ autoWidth: false,
257
+ fontVariantNumeric: "tabular-nums",
258
+ moveFocusOnMax: true,
259
+ value: hoursDisplay,
260
+ min: 0,
261
+ max: twelveHourClock ? 12 : 23,
262
+ pad: 2,
263
+ grow: 0,
264
+ width: "2ch",
265
+ textAlign: "center",
266
+ "aria-label": "Hours",
267
+ onChange: handleHoursChange,
268
+ onKeyDown: handleHoursKeyDown,
269
+ onBlur: handleHoursBlur,
270
+ ignoredKeys: ignoredKeys
271
+ }), _ref2, /*#__PURE__*/React.createElement(NumberField, {
272
+ autoWidth: false,
273
+ fontVariantNumeric: "tabular-nums",
274
+ moveFocusOnMax: true,
275
+ value: minutes,
276
+ min: 0,
277
+ max: 59,
278
+ pad: 2,
279
+ grow: 0,
280
+ width: "2ch",
281
+ textAlign: "center",
282
+ "aria-label": "Minutes",
283
+ onChange: function onChange(e) {
284
+ return setMinutes(e);
285
+ },
286
+ onKeyDown: handleMinutesKeyDown,
287
+ ignoredKeys: ignoredKeys
288
+ }), twelveHourClock && /*#__PURE__*/React.createElement(InputField, {
289
+ highlightOnInteraction: true,
290
+ value: meridiem,
291
+ grow: 0,
292
+ width: "2em",
293
+ textAlign: "center",
294
+ "aria-label": "AM/PM",
295
+ onChange: noop,
296
+ onKeyDown: handleAMPMKeyDown
297
+ }));
298
+ };
299
+
300
+ TimeField.addHoursToTime = addHoursToTime;
301
+ TimeField.addMinutesToTime = addMinutesToTime;
302
+ TimeField.addTimeToDate = addTimeToDate;
303
+ TimeField.getTimeFromDate = getTimeFromDate;
277
304
  export default TimeField;