@contentful/field-editor-date 1.3.5 → 1.4.0
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.
- package/CHANGELOG.md +6 -0
- package/dist/field-editor-date.cjs.development.js +122 -155
- package/dist/field-editor-date.cjs.development.js.map +1 -1
- package/dist/field-editor-date.cjs.production.min.js +1 -1
- package/dist/field-editor-date.cjs.production.min.js.map +1 -1
- package/dist/field-editor-date.esm.js +122 -155
- package/dist/field-editor-date.esm.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.4.0](https://github.com/contentful/field-editors/compare/@contentful/field-editor-date@1.3.5...@contentful/field-editor-date@1.4.0) (2023-04-19)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- upgrade cypress [TOL-1036] ([#1391](https://github.com/contentful/field-editors/issues/1391)) ([9c1aec9](https://github.com/contentful/field-editors/commit/9c1aec98aabbe464cdc3f1236c3bb1cc29b8208d))
|
|
11
|
+
|
|
6
12
|
## [1.3.5](https://github.com/contentful/field-editors/compare/@contentful/field-editor-date@1.3.4...@contentful/field-editor-date@1.3.5) (2023-03-21)
|
|
7
13
|
|
|
8
14
|
### Bug Fixes
|
|
@@ -12,56 +12,35 @@ var fieldEditorShared = require('@contentful/field-editor-shared');
|
|
|
12
12
|
var emotion = require('emotion');
|
|
13
13
|
var moment = _interopDefault(require('moment'));
|
|
14
14
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
for (var i = 1; i < arguments.length; i++) {
|
|
18
|
-
var source = arguments[i];
|
|
19
|
-
|
|
20
|
-
for (var key in source) {
|
|
21
|
-
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
22
|
-
target[key] = source[key];
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return target;
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
return _extends.apply(this, arguments);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
var YEAR_RANGE = 100;
|
|
34
|
-
var styles = {
|
|
15
|
+
const YEAR_RANGE = 100;
|
|
16
|
+
const styles = {
|
|
35
17
|
root: /*#__PURE__*/emotion.css({
|
|
36
18
|
maxWidth: '270px'
|
|
37
19
|
})
|
|
38
20
|
};
|
|
39
|
-
|
|
21
|
+
const DatepickerInput = props => {
|
|
40
22
|
var _props$value;
|
|
41
23
|
|
|
42
|
-
|
|
43
|
-
|
|
24
|
+
const [fromDate, toDate] = React.useMemo(() => {
|
|
25
|
+
const fromDate = new Date();
|
|
44
26
|
fromDate.setFullYear(fromDate.getFullYear() - YEAR_RANGE);
|
|
45
|
-
|
|
27
|
+
const toDate = new Date();
|
|
46
28
|
toDate.setFullYear(toDate.getFullYear() + YEAR_RANGE);
|
|
47
29
|
return [fromDate, toDate];
|
|
48
|
-
}, []),
|
|
49
|
-
fromDate = _useMemo[0],
|
|
50
|
-
toDate = _useMemo[1]; // The DatepickerInput should be time and timezone agnostic,
|
|
30
|
+
}, []); // The DatepickerInput should be time and timezone agnostic,
|
|
51
31
|
// thats why we don't use moment().toDate() to get Date object.
|
|
52
32
|
// moment().toDate() takes into account time and timezone and converts it
|
|
53
33
|
// based on your system timezone which can result in the date change.
|
|
54
34
|
// e.g. if user has a timezone +02:00, moment('2022-09-16T00:00+04:00').toDate()
|
|
55
35
|
// will return September 15 instead of September 16
|
|
56
36
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var selectedDate = dateObj ? new Date(dateObj.years, dateObj.months, dateObj.date) : undefined;
|
|
37
|
+
const dateObj = (_props$value = props.value) == null ? void 0 : _props$value.toObject();
|
|
38
|
+
const selectedDate = dateObj ? new Date(dateObj.years, dateObj.months, dateObj.date) : undefined;
|
|
60
39
|
return React__default.createElement(f36Components.Datepicker, {
|
|
61
40
|
className: styles.root,
|
|
62
41
|
selected: selectedDate,
|
|
63
|
-
onSelect:
|
|
64
|
-
|
|
42
|
+
onSelect: day => {
|
|
43
|
+
const momentDay = day ? moment(day) : undefined;
|
|
65
44
|
props.onChange(momentDay);
|
|
66
45
|
},
|
|
67
46
|
inputProps: {
|
|
@@ -73,13 +52,13 @@ var DatepickerInput = function DatepickerInput(props) {
|
|
|
73
52
|
});
|
|
74
53
|
};
|
|
75
54
|
|
|
76
|
-
|
|
55
|
+
const validInputFormats = ['hh:mm a', 'hh:mm A', 'h:mm a', 'h:mm A', 'hh:mm', 'k:mm', 'kk:mm', 'h a', 'h A', 'h', 'hh', 'HH'];
|
|
77
56
|
|
|
78
57
|
function parseRawInput(raw) {
|
|
79
|
-
|
|
58
|
+
let time = null; // eslint-disable-next-line -- TODO: refactor to use for of loop
|
|
80
59
|
|
|
81
|
-
for (
|
|
82
|
-
|
|
60
|
+
for (let i = 0; i < validInputFormats.length; i++) {
|
|
61
|
+
const date = moment(raw, validInputFormats[i]);
|
|
83
62
|
|
|
84
63
|
if (date.isValid()) {
|
|
85
64
|
time = date;
|
|
@@ -90,43 +69,38 @@ function parseRawInput(raw) {
|
|
|
90
69
|
return time;
|
|
91
70
|
}
|
|
92
71
|
|
|
93
|
-
|
|
94
|
-
return moment(
|
|
72
|
+
const getDefaultTime = () => {
|
|
73
|
+
return moment(`12:00 AM`, 'hh:mm A');
|
|
95
74
|
};
|
|
96
75
|
|
|
97
|
-
|
|
76
|
+
const formatToString = (uses12hClock, value) => {
|
|
98
77
|
return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');
|
|
99
78
|
};
|
|
100
79
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
var _useState = React.useState(function () {
|
|
80
|
+
const TimepickerInput = ({
|
|
81
|
+
disabled,
|
|
82
|
+
uses12hClock,
|
|
83
|
+
time = '12:00',
|
|
84
|
+
ampm = 'AM',
|
|
85
|
+
onChange
|
|
86
|
+
}) => {
|
|
87
|
+
const [selectedTime, setSelectedTime] = React.useState(() => {
|
|
111
88
|
return formatToString(uses12hClock, getDefaultTime());
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
React.useEffect(function () {
|
|
117
|
-
setSelectedTime(formatToString(uses12hClock, moment(time + " " + ampm, 'hh:mm A')));
|
|
89
|
+
});
|
|
90
|
+
React.useEffect(() => {
|
|
91
|
+
setSelectedTime(formatToString(uses12hClock, moment(`${time} ${ampm}`, 'hh:mm A')));
|
|
118
92
|
}, [time, ampm, uses12hClock]);
|
|
119
|
-
|
|
93
|
+
const handleChange = React.useCallback(e => {
|
|
120
94
|
setSelectedTime(e.currentTarget.value);
|
|
121
95
|
}, []);
|
|
122
|
-
|
|
96
|
+
const handleFocus = React.useCallback(e => {
|
|
123
97
|
e.preventDefault();
|
|
124
98
|
e.target.select();
|
|
125
99
|
}, []);
|
|
126
100
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
101
|
+
const handleBlur = () => {
|
|
102
|
+
const parsedTime = parseRawInput(selectedTime);
|
|
103
|
+
const value = parsedTime ?? getDefaultTime();
|
|
130
104
|
setSelectedTime(formatToString(uses12hClock, value));
|
|
131
105
|
onChange({
|
|
132
106
|
time: value.format('hh:mm'),
|
|
@@ -151,32 +125,30 @@ var TimepickerInput = function TimepickerInput(_ref) {
|
|
|
151
125
|
}));
|
|
152
126
|
};
|
|
153
127
|
|
|
154
|
-
|
|
155
|
-
|
|
128
|
+
const defaultZoneOffset = '+00:00';
|
|
129
|
+
const zoneOffsets = ['-12:00', '-11:00', '-10:00', '-09:30', '-09:00', '-08:00', '-07:00', '-06:00', '-05:00', '-04:30', '-04:00', '-03:30', '-03:00', '-02:00', '-01:00', '+00:00', '+01:00', '+02:00', '+03:00', '+03:30', '+04:00', '+04:30', '+05:00', '+05:30', '+05:45', '+06:00', '+06:30', '+07:00', '+08:00', '+08:45', '+09:00', '+09:30', '+10:00', '+10:30', '+11:00', '+11:30', '+12:00', '+12:45', '+13:00', '+14:00'];
|
|
156
130
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
131
|
+
const TimezonepickerInput = ({
|
|
132
|
+
disabled,
|
|
133
|
+
onChange,
|
|
134
|
+
value = defaultZoneOffset
|
|
135
|
+
}) => {
|
|
162
136
|
return React__default.createElement(f36Components.Select, {
|
|
163
137
|
"aria-label": "Select timezone",
|
|
164
138
|
testId: "timezone-input",
|
|
165
139
|
value: value,
|
|
166
140
|
isDisabled: disabled,
|
|
167
|
-
onChange:
|
|
168
|
-
|
|
141
|
+
onChange: e => {
|
|
142
|
+
onChange(e.currentTarget.value);
|
|
169
143
|
}
|
|
170
|
-
}, zoneOffsets.map(
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}, "UTC", offset);
|
|
175
|
-
}));
|
|
144
|
+
}, zoneOffsets.map(offset => React__default.createElement(f36Components.Select.Option, {
|
|
145
|
+
key: offset,
|
|
146
|
+
value: offset
|
|
147
|
+
}, "UTC", offset)));
|
|
176
148
|
};
|
|
177
149
|
|
|
178
150
|
// eslint-disable-next-line -- TODO: move to date-fns
|
|
179
|
-
|
|
151
|
+
const ZONE_RX = /(Z|[+-]\d{2}[:+]?\d{2})$/;
|
|
180
152
|
|
|
181
153
|
function startOfToday(format) {
|
|
182
154
|
return moment().set({
|
|
@@ -190,7 +162,7 @@ function fieldValueToMoment(datetimeString) {
|
|
|
190
162
|
return null;
|
|
191
163
|
}
|
|
192
164
|
|
|
193
|
-
|
|
165
|
+
const datetime = moment(datetimeString);
|
|
194
166
|
|
|
195
167
|
if (ZONE_RX.test(datetimeString)) {
|
|
196
168
|
datetime.utcOffset(datetimeString);
|
|
@@ -200,7 +172,7 @@ function fieldValueToMoment(datetimeString) {
|
|
|
200
172
|
}
|
|
201
173
|
|
|
202
174
|
function timeFromUserInput(input) {
|
|
203
|
-
|
|
175
|
+
const timeInput = input.time || '00:00';
|
|
204
176
|
return moment.utc(timeInput + '!' + input.ampm, 'HH:mm!A');
|
|
205
177
|
}
|
|
206
178
|
/**
|
|
@@ -220,8 +192,8 @@ function datetimeFromUserInput(input) {
|
|
|
220
192
|
};
|
|
221
193
|
}
|
|
222
194
|
|
|
223
|
-
|
|
224
|
-
|
|
195
|
+
const time = timeFromUserInput(input);
|
|
196
|
+
const date = moment.parseZone(input.utcOffset, 'Z').set(input.date.toObject()).set({
|
|
225
197
|
hours: time.hours(),
|
|
226
198
|
minutes: time.minutes()
|
|
227
199
|
});
|
|
@@ -245,11 +217,12 @@ function datetimeFromUserInput(input) {
|
|
|
245
217
|
*/
|
|
246
218
|
|
|
247
219
|
|
|
248
|
-
function buildFieldValue(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
220
|
+
function buildFieldValue({
|
|
221
|
+
data,
|
|
222
|
+
usesTime,
|
|
223
|
+
usesTimezone
|
|
224
|
+
}) {
|
|
225
|
+
const date = datetimeFromUserInput(data);
|
|
253
226
|
|
|
254
227
|
if (date.invalid) {
|
|
255
228
|
return {
|
|
@@ -257,7 +230,7 @@ function buildFieldValue(_ref) {
|
|
|
257
230
|
};
|
|
258
231
|
}
|
|
259
232
|
|
|
260
|
-
|
|
233
|
+
let format;
|
|
261
234
|
|
|
262
235
|
if (usesTimezone) {
|
|
263
236
|
format = 'YYYY-MM-DDTHH:mmZ';
|
|
@@ -282,13 +255,14 @@ function getDefaultUtcOffset() {
|
|
|
282
255
|
* Create the user input object from the field value.
|
|
283
256
|
*/
|
|
284
257
|
|
|
285
|
-
function userInputFromDatetime(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
258
|
+
function userInputFromDatetime({
|
|
259
|
+
value,
|
|
260
|
+
uses12hClock
|
|
261
|
+
}) {
|
|
262
|
+
const datetime = fieldValueToMoment(value);
|
|
289
263
|
|
|
290
264
|
if (datetime) {
|
|
291
|
-
|
|
265
|
+
const timeFormat = uses12hClock ? 'hh:mm' : 'HH:mm';
|
|
292
266
|
return {
|
|
293
267
|
date: datetime,
|
|
294
268
|
time: datetime.format(timeFormat),
|
|
@@ -303,7 +277,7 @@ function userInputFromDatetime(_ref2) {
|
|
|
303
277
|
}
|
|
304
278
|
}
|
|
305
279
|
|
|
306
|
-
|
|
280
|
+
const styles$1 = {
|
|
307
281
|
root: /*#__PURE__*/emotion.css({
|
|
308
282
|
display: 'flex',
|
|
309
283
|
alignItems: 'center'
|
|
@@ -314,8 +288,8 @@ var styles$1 = {
|
|
|
314
288
|
};
|
|
315
289
|
|
|
316
290
|
function useEffectWithoutFirstRender(callback, deps) {
|
|
317
|
-
|
|
318
|
-
React.useEffect(
|
|
291
|
+
const isFirstRun = React.useRef(true);
|
|
292
|
+
React.useEffect(() => {
|
|
319
293
|
if (isFirstRun.current) {
|
|
320
294
|
isFirstRun.current = false;
|
|
321
295
|
return;
|
|
@@ -325,22 +299,17 @@ function useEffectWithoutFirstRender(callback, deps) {
|
|
|
325
299
|
}, deps);
|
|
326
300
|
}
|
|
327
301
|
|
|
328
|
-
function DateEditorContainer(
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
}),
|
|
340
|
-
value = _React$useState[0],
|
|
341
|
-
setValue = _React$useState[1];
|
|
342
|
-
|
|
343
|
-
useEffectWithoutFirstRender(function () {
|
|
302
|
+
function DateEditorContainer({
|
|
303
|
+
initialValue,
|
|
304
|
+
usesTime,
|
|
305
|
+
usesTimezone,
|
|
306
|
+
uses12hClock,
|
|
307
|
+
disabled,
|
|
308
|
+
hasClear,
|
|
309
|
+
onChange
|
|
310
|
+
}) {
|
|
311
|
+
const [value, setValue] = React.useState(() => initialValue);
|
|
312
|
+
useEffectWithoutFirstRender(() => {
|
|
344
313
|
onChange(value);
|
|
345
314
|
}, [value]);
|
|
346
315
|
return React.createElement("div", {
|
|
@@ -349,12 +318,10 @@ function DateEditorContainer(_ref) {
|
|
|
349
318
|
}, React.createElement(DatepickerInput, {
|
|
350
319
|
disabled: disabled,
|
|
351
320
|
value: value.date,
|
|
352
|
-
onChange:
|
|
353
|
-
setValue(
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
});
|
|
357
|
-
});
|
|
321
|
+
onChange: date => {
|
|
322
|
+
setValue(value => ({ ...value,
|
|
323
|
+
date
|
|
324
|
+
}));
|
|
358
325
|
}
|
|
359
326
|
}), usesTime && React.createElement(React.Fragment, null, React.createElement("div", {
|
|
360
327
|
className: styles$1.separator
|
|
@@ -362,15 +329,14 @@ function DateEditorContainer(_ref) {
|
|
|
362
329
|
disabled: disabled,
|
|
363
330
|
time: value.time,
|
|
364
331
|
ampm: value.ampm,
|
|
365
|
-
onChange:
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
});
|
|
332
|
+
onChange: ({
|
|
333
|
+
time,
|
|
334
|
+
ampm
|
|
335
|
+
}) => {
|
|
336
|
+
setValue(value => ({ ...value,
|
|
337
|
+
time,
|
|
338
|
+
ampm
|
|
339
|
+
}));
|
|
374
340
|
},
|
|
375
341
|
uses12hClock: uses12hClock
|
|
376
342
|
})), usesTimezone && React.createElement(React.Fragment, null, React.createElement("div", {
|
|
@@ -378,12 +344,10 @@ function DateEditorContainer(_ref) {
|
|
|
378
344
|
}), React.createElement(TimezonepickerInput, {
|
|
379
345
|
disabled: disabled,
|
|
380
346
|
value: value.utcOffset,
|
|
381
|
-
onChange:
|
|
382
|
-
setValue(
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
});
|
|
386
|
-
});
|
|
347
|
+
onChange: utcOffset => {
|
|
348
|
+
setValue(value => ({ ...value,
|
|
349
|
+
utcOffset
|
|
350
|
+
}));
|
|
387
351
|
}
|
|
388
352
|
})), hasClear && React.createElement(React.Fragment, null, React.createElement("div", {
|
|
389
353
|
className: styles$1.separator
|
|
@@ -391,7 +355,7 @@ function DateEditorContainer(_ref) {
|
|
|
391
355
|
as: "button",
|
|
392
356
|
isDisabled: disabled,
|
|
393
357
|
testId: "date-clear",
|
|
394
|
-
onClick:
|
|
358
|
+
onClick: () => {
|
|
395
359
|
setValue({
|
|
396
360
|
date: undefined,
|
|
397
361
|
time: undefined,
|
|
@@ -403,28 +367,31 @@ function DateEditorContainer(_ref) {
|
|
|
403
367
|
}
|
|
404
368
|
|
|
405
369
|
function DateEditor(props) {
|
|
406
|
-
var _parameters$instance
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
370
|
+
var _parameters$instance, _parameters$instance2;
|
|
371
|
+
|
|
372
|
+
const {
|
|
373
|
+
field,
|
|
374
|
+
parameters
|
|
375
|
+
} = props;
|
|
376
|
+
const formatParam = (parameters == null ? void 0 : (_parameters$instance = parameters.instance) == null ? void 0 : _parameters$instance.format) ?? 'timeZ';
|
|
377
|
+
const ampmParam = (parameters == null ? void 0 : (_parameters$instance2 = parameters.instance) == null ? void 0 : _parameters$instance2.ampm) ?? '24';
|
|
378
|
+
const usesTime = formatParam !== 'dateonly';
|
|
379
|
+
const usesTimezone = formatParam === 'timeZ';
|
|
380
|
+
const uses12hClock = ampmParam === '12';
|
|
415
381
|
return React.createElement(fieldEditorShared.FieldConnector, {
|
|
416
382
|
field: field,
|
|
417
383
|
isInitiallyDisabled: props.isInitiallyDisabled,
|
|
418
384
|
isDisabled: props.isDisabled,
|
|
419
385
|
throttle: 0
|
|
420
|
-
},
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
386
|
+
}, ({
|
|
387
|
+
value,
|
|
388
|
+
disabled,
|
|
389
|
+
setValue,
|
|
390
|
+
externalReset
|
|
391
|
+
}) => {
|
|
392
|
+
const datetimeValue = userInputFromDatetime({
|
|
393
|
+
value,
|
|
394
|
+
uses12hClock
|
|
428
395
|
});
|
|
429
396
|
return React.createElement(DateEditorContainer, {
|
|
430
397
|
initialValue: datetimeValue,
|
|
@@ -433,11 +400,11 @@ function DateEditor(props) {
|
|
|
433
400
|
usesTime: usesTime,
|
|
434
401
|
disabled: disabled,
|
|
435
402
|
hasClear: Boolean(value),
|
|
436
|
-
onChange:
|
|
437
|
-
|
|
438
|
-
data
|
|
439
|
-
usesTime
|
|
440
|
-
usesTimezone
|
|
403
|
+
onChange: data => {
|
|
404
|
+
const fieldValue = buildFieldValue({
|
|
405
|
+
data,
|
|
406
|
+
usesTime,
|
|
407
|
+
usesTimezone
|
|
441
408
|
});
|
|
442
409
|
|
|
443
410
|
if (fieldValue.invalid) {
|
|
@@ -450,7 +417,7 @@ function DateEditor(props) {
|
|
|
450
417
|
setValue(fieldValue.valid);
|
|
451
418
|
}
|
|
452
419
|
},
|
|
453
|
-
key:
|
|
420
|
+
key: `date-container-${externalReset}`
|
|
454
421
|
});
|
|
455
422
|
});
|
|
456
423
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-date.cjs.development.js","sources":["../src/DatepickerInput.tsx","../src/TimepickerInput.tsx","../src/utils/zoneOffsets.ts","../src/TimezonePickerInput.tsx","../src/utils/date.ts","../src/DateEditor.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\n\nimport { Datepicker } from '@contentful/f36-components';\nimport { css } from 'emotion';\n// eslint-disable-next-line -- TODO: move to date-fns\nimport moment from 'moment';\n\nconst YEAR_RANGE = 100;\n\nconst styles = {\n root: css({\n maxWidth: '270px',\n }),\n};\n\nexport type DatePickerProps = {\n value?: moment.Moment;\n onChange: (val: moment.Moment | undefined) => void;\n disabled?: boolean;\n};\n\nexport const DatepickerInput = (props: DatePickerProps) => {\n const [fromDate, toDate] = useMemo(() => {\n const fromDate = new Date();\n fromDate.setFullYear(fromDate.getFullYear() - YEAR_RANGE);\n const toDate = new Date();\n toDate.setFullYear(toDate.getFullYear() + YEAR_RANGE);\n\n return [fromDate, toDate];\n }, []);\n\n // The DatepickerInput should be time and timezone agnostic,\n // thats why we don't use moment().toDate() to get Date object.\n // moment().toDate() takes into account time and timezone and converts it\n // based on your system timezone which can result in the date change.\n // e.g. if user has a timezone +02:00, moment('2022-09-16T00:00+04:00').toDate()\n // will return September 15 instead of September 16\n const dateObj = props.value?.toObject();\n const selectedDate = dateObj ? new Date(dateObj.years, dateObj.months, dateObj.date) : undefined;\n\n return (\n <Datepicker\n className={styles.root}\n selected={selectedDate}\n onSelect={(day) => {\n const momentDay = day ? moment(day) : undefined;\n props.onChange(momentDay);\n }}\n inputProps={{ isDisabled: props.disabled, placeholder: '' }}\n fromDate={fromDate}\n toDate={toDate}\n />\n );\n};\n","import React, { useState, useCallback, useEffect } from 'react';\n// eslint-disable-next-line -- TODO: move to date-fns\nimport moment from 'moment';\nimport { css } from 'emotion';\n\nimport { TextInput, Flex } from '@contentful/f36-components';\n\nexport type TimepickerProps = {\n disabled: boolean;\n uses12hClock: boolean;\n onChange: (value: { time: string; ampm: string }) => void;\n time?: string;\n ampm?: string;\n};\n\nconst validInputFormats = [\n 'hh:mm a',\n 'hh:mm A',\n 'h:mm a',\n 'h:mm A',\n 'hh:mm',\n 'k:mm',\n 'kk:mm',\n 'h a',\n 'h A',\n 'h',\n 'hh',\n 'HH',\n];\n\nfunction parseRawInput(raw: string): moment.Moment | null {\n let time: moment.Moment | null = null;\n\n // eslint-disable-next-line -- TODO: refactor to use for of loop\n for (let i = 0; i < validInputFormats.length; i++) {\n const date = moment(raw, validInputFormats[i]);\n if (date.isValid()) {\n time = date;\n break;\n }\n }\n\n return time;\n}\n\nconst getDefaultTime = () => {\n return moment(`12:00 AM`, 'hh:mm A');\n};\n\nconst formatToString = (uses12hClock: boolean, value: moment.Moment): string => {\n return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');\n};\n\nexport const TimepickerInput = ({\n disabled,\n uses12hClock,\n time = '12:00',\n ampm = 'AM',\n onChange,\n}: TimepickerProps) => {\n const [selectedTime, setSelectedTime] = useState<string>(() => {\n return formatToString(uses12hClock, getDefaultTime());\n });\n\n useEffect(() => {\n setSelectedTime(formatToString(uses12hClock, moment(`${time} ${ampm}`, 'hh:mm A')));\n }, [time, ampm, uses12hClock]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSelectedTime(e.currentTarget.value);\n }, []);\n\n const handleFocus = useCallback((e) => {\n e.preventDefault();\n e.target.select();\n }, []);\n\n const handleBlur = () => {\n const parsedTime = parseRawInput(selectedTime);\n const value = parsedTime ?? getDefaultTime();\n setSelectedTime(formatToString(uses12hClock, value));\n onChange({ time: value.format('hh:mm'), ampm: value.format('A') });\n };\n\n return (\n <Flex className={css({ width: '145px' })}>\n <TextInput\n aria-label=\"Select time\"\n placeholder={uses12hClock ? '12:00 AM' : '00:00'}\n date-time-type={uses12hClock ? '12' : '24'}\n testId=\"time-input\"\n value={selectedTime}\n isDisabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n />\n </Flex>\n );\n};\n","export const defaultZoneOffset = '+00:00';\n\nexport const zoneOffsets = [\n '-12:00',\n '-11:00',\n '-10:00',\n '-09:30',\n '-09:00',\n '-08:00',\n '-07:00',\n '-06:00',\n '-05:00',\n '-04:30',\n '-04:00',\n '-03:30',\n '-03:00',\n '-02:00',\n '-01:00',\n '+00:00',\n '+01:00',\n '+02:00',\n '+03:00',\n '+03:30',\n '+04:00',\n '+04:30',\n '+05:00',\n '+05:30',\n '+05:45',\n '+06:00',\n '+06:30',\n '+07:00',\n '+08:00',\n '+08:45',\n '+09:00',\n '+09:30',\n '+10:00',\n '+10:30',\n '+11:00',\n '+11:30',\n '+12:00',\n '+12:45',\n '+13:00',\n '+14:00',\n];\n","import React, { ChangeEvent } from 'react';\nimport { zoneOffsets, defaultZoneOffset } from './utils/zoneOffsets';\n\nimport { Select } from '@contentful/f36-components';\n\nexport type TimezonepickerProps = {\n disabled: boolean;\n onChange: (value: string) => void;\n value?: string;\n};\nexport const TimezonepickerInput = ({\n disabled,\n onChange,\n value = defaultZoneOffset,\n}: TimezonepickerProps) => {\n return (\n <Select\n aria-label=\"Select timezone\"\n testId=\"timezone-input\"\n value={value}\n isDisabled={disabled}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n onChange(e.currentTarget.value);\n }}>\n {zoneOffsets.map((offset) => (\n <Select.Option key={offset} value={offset}>\n UTC{offset}\n </Select.Option>\n ))}\n </Select>\n );\n};\n","// eslint-disable-next-line -- TODO: move to date-fns\nimport moment from 'moment';\nimport { TimeResult } from '../types';\n\nconst ZONE_RX = /(Z|[+-]\\d{2}[:+]?\\d{2})$/;\n\nfunction startOfToday(format: string) {\n return moment().set({ hours: 0, minutes: 0 }).format(format);\n}\n\nfunction fieldValueToMoment(datetimeString: string | null | undefined): moment.Moment | null {\n if (!datetimeString) {\n return null;\n }\n\n const datetime = moment(datetimeString);\n if (ZONE_RX.test(datetimeString)) {\n datetime.utcOffset(datetimeString);\n }\n return datetime;\n}\n\nfunction timeFromUserInput(input: TimeResult) {\n const timeInput = input.time || '00:00';\n return moment.utc(timeInput + '!' + input.ampm, 'HH:mm!A');\n}\n\n/**\n * Convert the user input object into either a 'moment' value or an\n * invalid symbol.\n *\n * Success is indicated by returning '{valid: value}' and failure is\n * indicated by returning '{invalid: true}'. If 'input.date' is\n * 'null' we return '{valid: null}'\n */\nfunction datetimeFromUserInput(input: TimeResult): {\n invalid?: boolean;\n valid: moment.Moment | null;\n} {\n if (!input.date) {\n return { valid: null };\n }\n\n const time = timeFromUserInput(input);\n\n const date = moment\n .parseZone(input.utcOffset, 'Z')\n .set(input.date.toObject())\n .set({ hours: time.hours(), minutes: time.minutes() });\n\n if (date.isValid()) {\n return { valid: date };\n } else {\n return { invalid: true, valid: null };\n }\n}\n\n/**\n * Parse user input into a string that is stored in the API.\n *\n * Returns a sum type with either the string as the `valid` property\n * or the `invalid` property set to `false`.\n */\nexport function buildFieldValue({\n data,\n usesTime,\n usesTimezone,\n}: {\n data: TimeResult;\n usesTime: boolean;\n usesTimezone: boolean;\n}) {\n const date = datetimeFromUserInput(data);\n if (date.invalid) {\n return {\n invalid: true,\n };\n }\n\n let format;\n if (usesTimezone) {\n format = 'YYYY-MM-DDTHH:mmZ';\n } else if (usesTime) {\n format = 'YYYY-MM-DDTHH:mm';\n } else {\n format = 'YYYY-MM-DD';\n }\n return { valid: date?.valid ? date.valid.format(format) : null, invalid: false };\n}\n\nexport function getDefaultAMPM() {\n return 'AM';\n}\n\nexport function getDefaultUtcOffset() {\n return startOfToday('Z');\n}\n\n/**\n * Create the user input object from the field value.\n */\nexport function userInputFromDatetime({\n value,\n uses12hClock,\n}: {\n value: string | undefined | null;\n uses12hClock: boolean;\n}): TimeResult {\n const datetime = fieldValueToMoment(value);\n\n if (datetime) {\n const timeFormat = uses12hClock ? 'hh:mm' : 'HH:mm';\n return {\n date: datetime,\n time: datetime.format(timeFormat),\n ampm: datetime.format('A'),\n utcOffset: datetime.format('Z'),\n };\n } else {\n return {\n ampm: getDefaultAMPM(),\n utcOffset: getDefaultUtcOffset(),\n };\n }\n}\n","import * as React from 'react';\n\nimport { TextLink } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport { css } from 'emotion';\n\nimport { DatepickerInput } from './DatepickerInput';\nimport { TimepickerInput } from './TimepickerInput';\nimport { TimezonepickerInput } from './TimezonePickerInput';\nimport { TimeFormat, DateTimeFormat, TimeResult } from './types';\nimport {\n userInputFromDatetime,\n buildFieldValue,\n getDefaultAMPM,\n getDefaultUtcOffset,\n} from './utils/date';\n\nexport interface DateEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /*\n * is the field manually disabled\n */\n isDisabled?: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n\n /**\n * sdk.parameters\n */\n parameters?: ParametersAPI & {\n instance?: {\n format?: DateTimeFormat;\n ampm?: TimeFormat;\n };\n };\n}\n\nconst styles = {\n root: css({\n display: 'flex',\n alignItems: 'center',\n }),\n separator: css({\n marginLeft: tokens.spacingM,\n }),\n};\n\nfunction useEffectWithoutFirstRender(callback: Function, deps: Array<any>) {\n const isFirstRun = React.useRef(true);\n React.useEffect(() => {\n if (isFirstRun.current) {\n isFirstRun.current = false;\n return;\n }\n callback();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies\n }, deps);\n}\n\nfunction DateEditorContainer({\n initialValue,\n usesTime,\n usesTimezone,\n uses12hClock,\n disabled,\n hasClear,\n onChange,\n}: {\n initialValue: TimeResult;\n usesTime: boolean;\n usesTimezone: boolean;\n uses12hClock: boolean;\n disabled: boolean;\n hasClear: boolean;\n onChange: (value: TimeResult) => void;\n}) {\n const [value, setValue] = React.useState<TimeResult>(() => initialValue);\n\n useEffectWithoutFirstRender(() => {\n onChange(value);\n }, [value]);\n\n return (\n <div data-test-id=\"date-editor\" className={styles.root}>\n <DatepickerInput\n disabled={disabled}\n value={value.date}\n onChange={(date) => {\n setValue((value) => ({\n ...value,\n date,\n }));\n }}\n />\n {usesTime && (\n <>\n <div className={styles.separator} />\n <TimepickerInput\n disabled={disabled}\n time={value.time}\n ampm={value.ampm}\n onChange={({ time, ampm }) => {\n setValue((value) => ({\n ...value,\n time,\n ampm,\n }));\n }}\n uses12hClock={uses12hClock}\n />\n </>\n )}\n {usesTimezone && (\n <>\n <div className={styles.separator} />\n <TimezonepickerInput\n disabled={disabled}\n value={value.utcOffset}\n onChange={(utcOffset) => {\n setValue((value) => ({\n ...value,\n utcOffset,\n }));\n }}\n />\n </>\n )}\n {hasClear && (\n <>\n <div className={styles.separator} />\n <TextLink\n as=\"button\"\n isDisabled={disabled}\n testId=\"date-clear\"\n onClick={() => {\n setValue({\n date: undefined,\n time: undefined,\n ampm: getDefaultAMPM(),\n utcOffset: getDefaultUtcOffset(),\n });\n }}>\n Clear\n </TextLink>\n </>\n )}\n </div>\n );\n}\n\nexport function DateEditor(props: DateEditorProps) {\n const { field, parameters } = props;\n\n const formatParam = parameters?.instance?.format ?? 'timeZ';\n const ampmParam = parameters?.instance?.ampm ?? '24';\n\n const usesTime = formatParam !== 'dateonly';\n const usesTimezone = formatParam === 'timeZ';\n const uses12hClock = ampmParam === '12';\n\n return (\n <FieldConnector<string>\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}\n isDisabled={props.isDisabled}\n throttle={0}>\n {({ value, disabled, setValue, externalReset }) => {\n const datetimeValue = userInputFromDatetime({\n value,\n uses12hClock,\n });\n return (\n <DateEditorContainer\n initialValue={datetimeValue}\n uses12hClock={uses12hClock}\n usesTimezone={usesTimezone}\n usesTime={usesTime}\n disabled={disabled}\n hasClear={Boolean(value)}\n onChange={(data) => {\n const fieldValue = buildFieldValue({ data, usesTime, usesTimezone });\n if (fieldValue.invalid) {\n return;\n }\n // if value is present - then override it with a new one\n // if value is not present - then set a new one if it's not nullable only\n if (Boolean(value) || (!value && Boolean(fieldValue.valid))) {\n setValue(fieldValue.valid);\n }\n }}\n key={`date-container-${externalReset}`}\n />\n );\n }}\n </FieldConnector>\n );\n}\n\nDateEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["YEAR_RANGE","styles","root","css","maxWidth","DatepickerInput","props","useMemo","fromDate","Date","setFullYear","getFullYear","toDate","dateObj","value","toObject","selectedDate","years","months","date","undefined","React","Datepicker","className","selected","onSelect","day","momentDay","moment","onChange","inputProps","isDisabled","disabled","placeholder","validInputFormats","parseRawInput","raw","time","i","length","isValid","getDefaultTime","formatToString","uses12hClock","format","TimepickerInput","ampm","useState","selectedTime","setSelectedTime","useEffect","handleChange","useCallback","e","currentTarget","handleFocus","preventDefault","target","select","handleBlur","parsedTime","Flex","width","TextInput","testId","onFocus","onBlur","defaultZoneOffset","zoneOffsets","TimezonepickerInput","Select","map","offset","Option","key","ZONE_RX","startOfToday","set","hours","minutes","fieldValueToMoment","datetimeString","datetime","test","utcOffset","timeFromUserInput","input","timeInput","utc","datetimeFromUserInput","valid","parseZone","invalid","buildFieldValue","data","usesTime","usesTimezone","getDefaultAMPM","getDefaultUtcOffset","userInputFromDatetime","timeFormat","display","alignItems","separator","marginLeft","tokens","spacingM","useEffectWithoutFirstRender","callback","deps","isFirstRun","current","DateEditorContainer","initialValue","hasClear","setValue","TextLink","as","onClick","DateEditor","field","parameters","formatParam","instance","ampmParam","FieldConnector","isInitiallyDisabled","throttle","externalReset","datetimeValue","Boolean","fieldValue","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"field-editor-date.cjs.development.js","sources":["../src/DatepickerInput.tsx","../src/TimepickerInput.tsx","../src/utils/zoneOffsets.ts","../src/TimezonePickerInput.tsx","../src/utils/date.ts","../src/DateEditor.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\n\nimport { Datepicker } from '@contentful/f36-components';\nimport { css } from 'emotion';\n// eslint-disable-next-line -- TODO: move to date-fns\nimport moment from 'moment';\n\nconst YEAR_RANGE = 100;\n\nconst styles = {\n root: css({\n maxWidth: '270px',\n }),\n};\n\nexport type DatePickerProps = {\n value?: moment.Moment;\n onChange: (val: moment.Moment | undefined) => void;\n disabled?: boolean;\n};\n\nexport const DatepickerInput = (props: DatePickerProps) => {\n const [fromDate, toDate] = useMemo(() => {\n const fromDate = new Date();\n fromDate.setFullYear(fromDate.getFullYear() - YEAR_RANGE);\n const toDate = new Date();\n toDate.setFullYear(toDate.getFullYear() + YEAR_RANGE);\n\n return [fromDate, toDate];\n }, []);\n\n // The DatepickerInput should be time and timezone agnostic,\n // thats why we don't use moment().toDate() to get Date object.\n // moment().toDate() takes into account time and timezone and converts it\n // based on your system timezone which can result in the date change.\n // e.g. if user has a timezone +02:00, moment('2022-09-16T00:00+04:00').toDate()\n // will return September 15 instead of September 16\n const dateObj = props.value?.toObject();\n const selectedDate = dateObj ? new Date(dateObj.years, dateObj.months, dateObj.date) : undefined;\n\n return (\n <Datepicker\n className={styles.root}\n selected={selectedDate}\n onSelect={(day) => {\n const momentDay = day ? moment(day) : undefined;\n props.onChange(momentDay);\n }}\n inputProps={{ isDisabled: props.disabled, placeholder: '' }}\n fromDate={fromDate}\n toDate={toDate}\n />\n );\n};\n","import React, { useState, useCallback, useEffect } from 'react';\n\n// eslint-disable-next-line -- TODO: move to date-fns\nimport { TextInput, Flex } from '@contentful/f36-components';\nimport { css } from 'emotion';\n// eslint-disable-next-line no-restricted-imports -- will change\nimport moment from 'moment';\n\nexport type TimepickerProps = {\n disabled: boolean;\n uses12hClock: boolean;\n onChange: (value: { time: string; ampm: string }) => void;\n time?: string;\n ampm?: string;\n};\n\nconst validInputFormats = [\n 'hh:mm a',\n 'hh:mm A',\n 'h:mm a',\n 'h:mm A',\n 'hh:mm',\n 'k:mm',\n 'kk:mm',\n 'h a',\n 'h A',\n 'h',\n 'hh',\n 'HH',\n];\n\nfunction parseRawInput(raw: string): moment.Moment | null {\n let time: moment.Moment | null = null;\n\n // eslint-disable-next-line -- TODO: refactor to use for of loop\n for (let i = 0; i < validInputFormats.length; i++) {\n const date = moment(raw, validInputFormats[i]);\n if (date.isValid()) {\n time = date;\n break;\n }\n }\n\n return time;\n}\n\nconst getDefaultTime = () => {\n return moment(`12:00 AM`, 'hh:mm A');\n};\n\nconst formatToString = (uses12hClock: boolean, value: moment.Moment): string => {\n return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');\n};\n\nexport const TimepickerInput = ({\n disabled,\n uses12hClock,\n time = '12:00',\n ampm = 'AM',\n onChange,\n}: TimepickerProps) => {\n const [selectedTime, setSelectedTime] = useState<string>(() => {\n return formatToString(uses12hClock, getDefaultTime());\n });\n\n useEffect(() => {\n setSelectedTime(formatToString(uses12hClock, moment(`${time} ${ampm}`, 'hh:mm A')));\n }, [time, ampm, uses12hClock]);\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n setSelectedTime(e.currentTarget.value);\n }, []);\n\n const handleFocus = useCallback((e) => {\n e.preventDefault();\n e.target.select();\n }, []);\n\n const handleBlur = () => {\n const parsedTime = parseRawInput(selectedTime);\n const value = parsedTime ?? getDefaultTime();\n setSelectedTime(formatToString(uses12hClock, value));\n onChange({ time: value.format('hh:mm'), ampm: value.format('A') });\n };\n\n return (\n <Flex className={css({ width: '145px' })}>\n <TextInput\n aria-label=\"Select time\"\n placeholder={uses12hClock ? '12:00 AM' : '00:00'}\n date-time-type={uses12hClock ? '12' : '24'}\n testId=\"time-input\"\n value={selectedTime}\n isDisabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n />\n </Flex>\n );\n};\n","export const defaultZoneOffset = '+00:00';\n\nexport const zoneOffsets = [\n '-12:00',\n '-11:00',\n '-10:00',\n '-09:30',\n '-09:00',\n '-08:00',\n '-07:00',\n '-06:00',\n '-05:00',\n '-04:30',\n '-04:00',\n '-03:30',\n '-03:00',\n '-02:00',\n '-01:00',\n '+00:00',\n '+01:00',\n '+02:00',\n '+03:00',\n '+03:30',\n '+04:00',\n '+04:30',\n '+05:00',\n '+05:30',\n '+05:45',\n '+06:00',\n '+06:30',\n '+07:00',\n '+08:00',\n '+08:45',\n '+09:00',\n '+09:30',\n '+10:00',\n '+10:30',\n '+11:00',\n '+11:30',\n '+12:00',\n '+12:45',\n '+13:00',\n '+14:00',\n];\n","import React, { ChangeEvent } from 'react';\n\nimport { Select } from '@contentful/f36-components';\n\nimport { zoneOffsets, defaultZoneOffset } from './utils/zoneOffsets';\n\n\nexport type TimezonepickerProps = {\n disabled: boolean;\n onChange: (value: string) => void;\n value?: string;\n};\nexport const TimezonepickerInput = ({\n disabled,\n onChange,\n value = defaultZoneOffset,\n}: TimezonepickerProps) => {\n return (\n <Select\n aria-label=\"Select timezone\"\n testId=\"timezone-input\"\n value={value}\n isDisabled={disabled}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => {\n onChange(e.currentTarget.value);\n }}>\n {zoneOffsets.map((offset) => (\n <Select.Option key={offset} value={offset}>\n UTC{offset}\n </Select.Option>\n ))}\n </Select>\n );\n};\n","// eslint-disable-next-line -- TODO: move to date-fns\nimport moment from 'moment';\nimport { TimeResult } from '../types';\n\nconst ZONE_RX = /(Z|[+-]\\d{2}[:+]?\\d{2})$/;\n\nfunction startOfToday(format: string) {\n return moment().set({ hours: 0, minutes: 0 }).format(format);\n}\n\nfunction fieldValueToMoment(datetimeString: string | null | undefined): moment.Moment | null {\n if (!datetimeString) {\n return null;\n }\n\n const datetime = moment(datetimeString);\n if (ZONE_RX.test(datetimeString)) {\n datetime.utcOffset(datetimeString);\n }\n return datetime;\n}\n\nfunction timeFromUserInput(input: TimeResult) {\n const timeInput = input.time || '00:00';\n return moment.utc(timeInput + '!' + input.ampm, 'HH:mm!A');\n}\n\n/**\n * Convert the user input object into either a 'moment' value or an\n * invalid symbol.\n *\n * Success is indicated by returning '{valid: value}' and failure is\n * indicated by returning '{invalid: true}'. If 'input.date' is\n * 'null' we return '{valid: null}'\n */\nfunction datetimeFromUserInput(input: TimeResult): {\n invalid?: boolean;\n valid: moment.Moment | null;\n} {\n if (!input.date) {\n return { valid: null };\n }\n\n const time = timeFromUserInput(input);\n\n const date = moment\n .parseZone(input.utcOffset, 'Z')\n .set(input.date.toObject())\n .set({ hours: time.hours(), minutes: time.minutes() });\n\n if (date.isValid()) {\n return { valid: date };\n } else {\n return { invalid: true, valid: null };\n }\n}\n\n/**\n * Parse user input into a string that is stored in the API.\n *\n * Returns a sum type with either the string as the `valid` property\n * or the `invalid` property set to `false`.\n */\nexport function buildFieldValue({\n data,\n usesTime,\n usesTimezone,\n}: {\n data: TimeResult;\n usesTime: boolean;\n usesTimezone: boolean;\n}) {\n const date = datetimeFromUserInput(data);\n if (date.invalid) {\n return {\n invalid: true,\n };\n }\n\n let format;\n if (usesTimezone) {\n format = 'YYYY-MM-DDTHH:mmZ';\n } else if (usesTime) {\n format = 'YYYY-MM-DDTHH:mm';\n } else {\n format = 'YYYY-MM-DD';\n }\n return { valid: date?.valid ? date.valid.format(format) : null, invalid: false };\n}\n\nexport function getDefaultAMPM() {\n return 'AM';\n}\n\nexport function getDefaultUtcOffset() {\n return startOfToday('Z');\n}\n\n/**\n * Create the user input object from the field value.\n */\nexport function userInputFromDatetime({\n value,\n uses12hClock,\n}: {\n value: string | undefined | null;\n uses12hClock: boolean;\n}): TimeResult {\n const datetime = fieldValueToMoment(value);\n\n if (datetime) {\n const timeFormat = uses12hClock ? 'hh:mm' : 'HH:mm';\n return {\n date: datetime,\n time: datetime.format(timeFormat),\n ampm: datetime.format('A'),\n utcOffset: datetime.format('Z'),\n };\n } else {\n return {\n ampm: getDefaultAMPM(),\n utcOffset: getDefaultUtcOffset(),\n };\n }\n}\n","import * as React from 'react';\n\nimport { TextLink } from '@contentful/f36-components';\nimport tokens from '@contentful/f36-tokens';\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport { css } from 'emotion';\n\nimport { DatepickerInput } from './DatepickerInput';\nimport { TimepickerInput } from './TimepickerInput';\nimport { TimezonepickerInput } from './TimezonePickerInput';\nimport { TimeFormat, DateTimeFormat, TimeResult } from './types';\nimport {\n userInputFromDatetime,\n buildFieldValue,\n getDefaultAMPM,\n getDefaultUtcOffset,\n} from './utils/date';\n\nexport interface DateEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /*\n * is the field manually disabled\n */\n isDisabled?: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n\n /**\n * sdk.parameters\n */\n parameters?: ParametersAPI & {\n instance?: {\n format?: DateTimeFormat;\n ampm?: TimeFormat;\n };\n };\n}\n\nconst styles = {\n root: css({\n display: 'flex',\n alignItems: 'center',\n }),\n separator: css({\n marginLeft: tokens.spacingM,\n }),\n};\n\nfunction useEffectWithoutFirstRender(callback: Function, deps: Array<any>) {\n const isFirstRun = React.useRef(true);\n React.useEffect(() => {\n if (isFirstRun.current) {\n isFirstRun.current = false;\n return;\n }\n callback();\n // eslint-disable-next-line react-hooks/exhaustive-deps -- TODO: Evaluate the dependencies\n }, deps);\n}\n\nfunction DateEditorContainer({\n initialValue,\n usesTime,\n usesTimezone,\n uses12hClock,\n disabled,\n hasClear,\n onChange,\n}: {\n initialValue: TimeResult;\n usesTime: boolean;\n usesTimezone: boolean;\n uses12hClock: boolean;\n disabled: boolean;\n hasClear: boolean;\n onChange: (value: TimeResult) => void;\n}) {\n const [value, setValue] = React.useState<TimeResult>(() => initialValue);\n\n useEffectWithoutFirstRender(() => {\n onChange(value);\n }, [value]);\n\n return (\n <div data-test-id=\"date-editor\" className={styles.root}>\n <DatepickerInput\n disabled={disabled}\n value={value.date}\n onChange={(date) => {\n setValue((value) => ({\n ...value,\n date,\n }));\n }}\n />\n {usesTime && (\n <>\n <div className={styles.separator} />\n <TimepickerInput\n disabled={disabled}\n time={value.time}\n ampm={value.ampm}\n onChange={({ time, ampm }) => {\n setValue((value) => ({\n ...value,\n time,\n ampm,\n }));\n }}\n uses12hClock={uses12hClock}\n />\n </>\n )}\n {usesTimezone && (\n <>\n <div className={styles.separator} />\n <TimezonepickerInput\n disabled={disabled}\n value={value.utcOffset}\n onChange={(utcOffset) => {\n setValue((value) => ({\n ...value,\n utcOffset,\n }));\n }}\n />\n </>\n )}\n {hasClear && (\n <>\n <div className={styles.separator} />\n <TextLink\n as=\"button\"\n isDisabled={disabled}\n testId=\"date-clear\"\n onClick={() => {\n setValue({\n date: undefined,\n time: undefined,\n ampm: getDefaultAMPM(),\n utcOffset: getDefaultUtcOffset(),\n });\n }}>\n Clear\n </TextLink>\n </>\n )}\n </div>\n );\n}\n\nexport function DateEditor(props: DateEditorProps) {\n const { field, parameters } = props;\n\n const formatParam = parameters?.instance?.format ?? 'timeZ';\n const ampmParam = parameters?.instance?.ampm ?? '24';\n\n const usesTime = formatParam !== 'dateonly';\n const usesTimezone = formatParam === 'timeZ';\n const uses12hClock = ampmParam === '12';\n\n return (\n <FieldConnector<string>\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}\n isDisabled={props.isDisabled}\n throttle={0}>\n {({ value, disabled, setValue, externalReset }) => {\n const datetimeValue = userInputFromDatetime({\n value,\n uses12hClock,\n });\n return (\n <DateEditorContainer\n initialValue={datetimeValue}\n uses12hClock={uses12hClock}\n usesTimezone={usesTimezone}\n usesTime={usesTime}\n disabled={disabled}\n hasClear={Boolean(value)}\n onChange={(data) => {\n const fieldValue = buildFieldValue({ data, usesTime, usesTimezone });\n if (fieldValue.invalid) {\n return;\n }\n // if value is present - then override it with a new one\n // if value is not present - then set a new one if it's not nullable only\n if (Boolean(value) || (!value && Boolean(fieldValue.valid))) {\n setValue(fieldValue.valid);\n }\n }}\n key={`date-container-${externalReset}`}\n />\n );\n }}\n </FieldConnector>\n );\n}\n\nDateEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["YEAR_RANGE","styles","root","css","maxWidth","DatepickerInput","props","fromDate","toDate","useMemo","Date","setFullYear","getFullYear","dateObj","value","toObject","selectedDate","years","months","date","undefined","React","Datepicker","className","selected","onSelect","day","momentDay","moment","onChange","inputProps","isDisabled","disabled","placeholder","validInputFormats","parseRawInput","raw","time","i","length","isValid","getDefaultTime","formatToString","uses12hClock","format","TimepickerInput","ampm","selectedTime","setSelectedTime","useState","useEffect","handleChange","useCallback","e","currentTarget","handleFocus","preventDefault","target","select","handleBlur","parsedTime","Flex","width","TextInput","testId","onFocus","onBlur","defaultZoneOffset","zoneOffsets","TimezonepickerInput","Select","map","offset","Option","key","ZONE_RX","startOfToday","set","hours","minutes","fieldValueToMoment","datetimeString","datetime","test","utcOffset","timeFromUserInput","input","timeInput","utc","datetimeFromUserInput","valid","parseZone","invalid","buildFieldValue","data","usesTime","usesTimezone","getDefaultAMPM","getDefaultUtcOffset","userInputFromDatetime","timeFormat","display","alignItems","separator","marginLeft","tokens","spacingM","useEffectWithoutFirstRender","callback","deps","isFirstRun","current","DateEditorContainer","initialValue","hasClear","setValue","TextLink","as","onClick","DateEditor","field","parameters","formatParam","instance","ampmParam","FieldConnector","isInitiallyDisabled","throttle","externalReset","datetimeValue","Boolean","fieldValue","defaultProps"],"mappings":"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"}
|