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