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