@contentful/field-editor-date 1.1.10 → 1.2.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 CHANGED
@@ -3,6 +3,16 @@
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.2.0](https://github.com/contentful/field-editors/compare/@contentful/field-editor-date@1.1.10...@contentful/field-editor-date@1.2.0) (2022-09-14)
7
+
8
+ ### Bug Fixes
9
+
10
+ - cleanup console log ([#1235](https://github.com/contentful/field-editors/issues/1235)) ([823b09f](https://github.com/contentful/field-editors/commit/823b09f77c2576cf0e8ae33b8bec4dc9abb51999))
11
+
12
+ ### Features
13
+
14
+ - date editor with new f36 datepicker, do yarn deduplicate for f36-components [BAU-696] ([#1225](https://github.com/contentful/field-editors/issues/1225)) ([bc142a3](https://github.com/contentful/field-editors/commit/bc142a3522b7e55666eb3796f69f6cfcbab9a574))
15
+
6
16
  ## [1.1.10](https://github.com/contentful/field-editors/compare/@contentful/field-editor-date@1.1.9...@contentful/field-editor-date@1.1.10) (2022-07-29)
7
17
 
8
18
  **Note:** Version bump only for package @contentful/field-editor-date
@@ -1,20 +1,8 @@
1
- /// <reference types="pikaday" />
2
- import React, { Component, FocusEventHandler, FocusEvent } from 'react';
1
+ /// <reference types="react" />
3
2
  import moment from 'moment';
4
3
  export declare type DatePickerProps = {
5
4
  value?: moment.Moment;
6
5
  onChange: (val: moment.Moment | undefined) => void;
7
- onBlur: FocusEventHandler;
8
6
  disabled?: boolean;
9
7
  };
10
- export declare class DatepickerInput extends Component<DatePickerProps> {
11
- static defaultProps: Partial<DatePickerProps>;
12
- pikaday?: Pikaday;
13
- datePickerNode: React.RefObject<HTMLInputElement>;
14
- componentDidMount(): void;
15
- focusInput: () => void;
16
- componentWillUnmount(): void;
17
- handleOpen: () => void;
18
- handleBlur: (e: FocusEvent) => void;
19
- render(): JSX.Element;
20
- }
8
+ export declare const DatepickerInput: (props: DatePickerProps) => JSX.Element;
@@ -9,9 +9,8 @@ var React__default = _interopDefault(React);
9
9
  var emotion = require('emotion');
10
10
  var tokens = _interopDefault(require('@contentful/f36-tokens'));
11
11
  var fieldEditorShared = require('@contentful/field-editor-shared');
12
- var noop = _interopDefault(require('lodash/noop'));
12
+ var f36Datepicker = require('@contentful/f36-datepicker');
13
13
  var moment = _interopDefault(require('moment'));
14
- var Pikaday = _interopDefault(require('pikaday'));
15
14
  var f36Components = require('@contentful/f36-components');
16
15
 
17
16
  function _extends() {
@@ -32,21 +31,142 @@ function _extends() {
32
31
  return _extends.apply(this, arguments);
33
32
  }
34
33
 
35
- function _inheritsLoose(subClass, superClass) {
36
- subClass.prototype = Object.create(superClass.prototype);
37
- subClass.prototype.constructor = subClass;
34
+ var YEAR_RANGE = 100;
35
+ var styles = {
36
+ root: /*#__PURE__*/emotion.css({
37
+ maxWidth: '270px'
38
+ })
39
+ };
40
+ var DatepickerInput = function DatepickerInput(props) {
41
+ var _props$value;
42
+
43
+ var _useMemo = React.useMemo(function () {
44
+ var fromDate = new Date();
45
+ fromDate.setFullYear(fromDate.getFullYear() - YEAR_RANGE);
46
+ var toDate = new Date();
47
+ toDate.setFullYear(toDate.getFullYear() + YEAR_RANGE);
48
+ return [fromDate, toDate];
49
+ }, []),
50
+ fromDate = _useMemo[0],
51
+ toDate = _useMemo[1];
52
+
53
+ return React__default.createElement(f36Datepicker.Datepicker, {
54
+ className: styles.root,
55
+ selected: (_props$value = props.value) == null ? void 0 : _props$value.toDate(),
56
+ onSelect: function onSelect(day) {
57
+ var momentDay = day ? moment(day) : undefined;
58
+ props.onChange(momentDay);
59
+ },
60
+ inputProps: {
61
+ isDisabled: props.disabled,
62
+ placeholder: ''
63
+ },
64
+ fromDate: fromDate,
65
+ toDate: toDate
66
+ });
67
+ };
68
+
69
+ var 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'];
70
+
71
+ function parseRawInput(raw) {
72
+ var time = null; // eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/prefer-for-of
73
+
74
+ for (var i = 0; i < validInputFormats.length; i++) {
75
+ var date = moment(raw, validInputFormats[i]);
38
76
 
39
- _setPrototypeOf(subClass, superClass);
77
+ if (date.isValid()) {
78
+ time = date;
79
+ break;
80
+ }
81
+ }
82
+
83
+ return time;
40
84
  }
41
85
 
42
- function _setPrototypeOf(o, p) {
43
- _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
44
- o.__proto__ = p;
45
- return o;
86
+ var getDefaultTime = function getDefaultTime() {
87
+ return moment("12:00 AM", 'hh:mm A');
88
+ };
89
+
90
+ var formatToString = function formatToString(uses12hClock, value) {
91
+ return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');
92
+ };
93
+
94
+ var TimepickerInput = function TimepickerInput(_ref) {
95
+ var disabled = _ref.disabled,
96
+ uses12hClock = _ref.uses12hClock,
97
+ _ref$time = _ref.time,
98
+ time = _ref$time === void 0 ? '12:00' : _ref$time,
99
+ _ref$ampm = _ref.ampm,
100
+ ampm = _ref$ampm === void 0 ? 'AM' : _ref$ampm,
101
+ onChange = _ref.onChange;
102
+
103
+ var _useState = React.useState(function () {
104
+ return formatToString(uses12hClock, getDefaultTime());
105
+ }),
106
+ selectedTime = _useState[0],
107
+ setSelectedTime = _useState[1];
108
+
109
+ React.useEffect(function () {
110
+ setSelectedTime(formatToString(uses12hClock, moment(time + " " + ampm, 'hh:mm A')));
111
+ }, [time, ampm, uses12hClock]);
112
+ var handleChange = React.useCallback(function (e) {
113
+ setSelectedTime(e.currentTarget.value);
114
+ }, []);
115
+ var handleFocus = React.useCallback(function (e) {
116
+ e.preventDefault();
117
+ e.target.select();
118
+ }, []);
119
+
120
+ var handleBlur = function handleBlur() {
121
+ var parsedTime = parseRawInput(selectedTime);
122
+ var value = parsedTime != null ? parsedTime : getDefaultTime();
123
+ setSelectedTime(formatToString(uses12hClock, value));
124
+ onChange({
125
+ time: value.format('hh:mm'),
126
+ ampm: value.format('A')
127
+ });
46
128
  };
47
129
 
48
- return _setPrototypeOf(o, p);
49
- }
130
+ return React__default.createElement(f36Components.Flex, {
131
+ className: emotion.css({
132
+ width: '145px'
133
+ })
134
+ }, React__default.createElement(f36Components.TextInput, {
135
+ "aria-label": "Select time",
136
+ placeholder: uses12hClock ? '12:00 AM' : '00:00',
137
+ "date-time-type": uses12hClock ? '12' : '24',
138
+ testId: "time-input",
139
+ value: selectedTime,
140
+ isDisabled: disabled,
141
+ onFocus: handleFocus,
142
+ onBlur: handleBlur,
143
+ onChange: handleChange
144
+ }));
145
+ };
146
+
147
+ var defaultZoneOffset = '+00:00';
148
+ var 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'];
149
+
150
+ var TimezonepickerInput = function TimezonepickerInput(_ref) {
151
+ var disabled = _ref.disabled,
152
+ _onChange = _ref.onChange,
153
+ _ref$value = _ref.value,
154
+ value = _ref$value === void 0 ? defaultZoneOffset : _ref$value;
155
+ return React__default.createElement(f36Components.Select, {
156
+ "aria-label": "Select timezone",
157
+ testId: "timezone-input",
158
+ value: value,
159
+ isDisabled: disabled,
160
+ onChange: function onChange(e) {
161
+ _onChange(e.currentTarget.value);
162
+ }
163
+ }, zoneOffsets.map(function (offset) {
164
+ return React__default.createElement(f36Components.Select.Option, {
165
+ key: offset,
166
+ value: offset
167
+ }, "UTC", offset);
168
+ }));
169
+ };
50
170
 
51
171
  // eslint-disable-next-line -- TODO: describe this disable no-restricted-imports
52
172
  var ZONE_RX = /(Z|[+-]\d{2}[:+]?\d{2})$/;
@@ -110,14 +230,6 @@ function datetimeFromUserInput(input) {
110
230
  };
111
231
  }
112
232
  }
113
-
114
- function formatDateDisplay(date) {
115
- if (date) {
116
- return date.format('dddd, MMMM Do YYYY');
117
- } else {
118
- return '';
119
- }
120
- }
121
233
  /**
122
234
  * Parse user input into a string that is stored in the API.
123
235
  *
@@ -125,6 +237,7 @@ function formatDateDisplay(date) {
125
237
  * or the `invalid` property set to `false`.
126
238
  */
127
239
 
240
+
128
241
  function buildFieldValue(_ref) {
129
242
  var data = _ref.data,
130
243
  usesTime = _ref.usesTime,
@@ -183,261 +296,6 @@ function userInputFromDatetime(_ref2) {
183
296
  }
184
297
  }
185
298
 
186
- var I18N = {
187
- previousMonth: 'Previous Month',
188
- nextMonth: 'Next Month',
189
- months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
190
- weekdaysShort: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
191
- weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
192
- };
193
- var DEFAULTS = {
194
- i18n: I18N,
195
- yearRange: 100
196
- }; // Gets same options as Pikaday and returns a Pikaday instance
197
-
198
- var createPikaday = function createPikaday(opts) {
199
- return new Pikaday(Object.assign({}, DEFAULTS, opts));
200
- };
201
-
202
- function CalendarIcon(props) {
203
- return React__default.createElement("svg", {
204
- width: "16",
205
- height: "17",
206
- viewBox: "-1 -1 18 19",
207
- onClick: props.onClick,
208
- xmlns: "http://www.w3.org/2000/svg",
209
- className: props.className
210
- }, React__default.createElement("g", {
211
- fill: "none",
212
- fillRule: "evenodd"
213
- }, React__default.createElement("g", {
214
- fill: "#536171"
215
- }, React__default.createElement("path", {
216
- d: "M2.071 14.929v-2.411h2.411v2.41h-2.41zm2.947 0v-2.411h2.678v2.41H5.018zM2.07 11.982V9.304h2.411v2.678h-2.41zm2.947 0V9.304h2.678v2.678H5.018zM2.07 8.768v-2.41h2.411v2.41h-2.41zm6.161 6.16v-2.41h2.679v2.41H8.232zm-3.214-6.16v-2.41h2.678v2.41H5.018zm6.428 6.16v-2.41h2.411v2.41h-2.41zm-3.214-2.946V9.304h2.679v2.678H8.232zM5.286 4.75a.275.275 0 0 1-.268.268h-.536a.275.275 0 0 1-.268-.268V2.34c0-.143.126-.269.268-.269h.536c.142 0 .268.126.268.268V4.75zm6.16 7.232V9.304h2.411v2.678h-2.41zM8.232 8.768v-2.41h2.679v2.41H8.232zm3.214 0v-2.41h2.411v2.41h-2.41zm.268-4.018a.275.275 0 0 1-.268.268h-.535a.275.275 0 0 1-.268-.268V2.34c0-.143.125-.269.268-.269h.535c.143 0 .268.126.268.268V4.75zm3.215-.536c0-.586-.486-1.071-1.072-1.071h-1.071v-.804c0-.736-.603-1.339-1.34-1.339h-.535c-.737 0-1.34.603-1.34 1.34v.803H6.357v-.804C6.357 1.603 5.754 1 5.017 1h-.535c-.736 0-1.34.603-1.34 1.34v.803h-1.07C1.484 3.143 1 3.628 1 4.214V14.93C1 15.515 1.485 16 2.071 16h11.786c.586 0 1.072-.485 1.072-1.071V4.214z"
217
- }))));
218
- }
219
-
220
- var styles = {
221
- datePickerWrapper: /*#__PURE__*/emotion.css({
222
- position: 'relative',
223
- maxHeight: 70
224
- }),
225
- datePicker: /*#__PURE__*/emotion.css({
226
- zIndex: 1002,
227
- display: 'block',
228
- '.is-hidden': {
229
- display: 'none'
230
- }
231
- }),
232
- input: /*#__PURE__*/emotion.css({
233
- width: '270px',
234
- cursor: 'pointer',
235
- paddingRight: '40px',
236
- '&:disabled': {
237
- cursor: 'not-allowed'
238
- }
239
- }),
240
- icon: /*#__PURE__*/emotion.css({
241
- cursor: 'pointer',
242
- zIndex: 50,
243
- position: 'absolute',
244
- top: '12px',
245
- right: '12px'
246
- })
247
- };
248
- var DatepickerInput = /*#__PURE__*/function (_Component) {
249
- _inheritsLoose(DatepickerInput, _Component);
250
-
251
- function DatepickerInput() {
252
- var _this;
253
-
254
- _this = _Component.apply(this, arguments) || this;
255
- _this.datePickerNode = React__default.createRef();
256
-
257
- _this.focusInput = function () {
258
- if (_this.datePickerNode && _this.datePickerNode.current) {
259
- _this.datePickerNode.current.focus();
260
- }
261
- };
262
-
263
- _this.handleOpen = function () {
264
- if (_this.pikaday) {
265
- _this.pikaday.show();
266
- }
267
- };
268
-
269
- _this.handleBlur = function (e) {
270
- _this.props.onBlur(e);
271
-
272
- if (_this.pikaday && !_this.pikaday.el.contains(e.relatedTarget)) {
273
- _this.pikaday.hide();
274
- }
275
- };
276
-
277
- return _this;
278
- }
279
-
280
- var _proto = DatepickerInput.prototype;
281
-
282
- _proto.componentDidMount = function componentDidMount() {
283
- var onChange = this.props.onChange;
284
- var defaultDate = this.props.value ? this.props.value.toDate() : undefined;
285
- this.pikaday = createPikaday({
286
- field: this.datePickerNode && this.datePickerNode.current,
287
- defaultDate: defaultDate,
288
- setDefaultDate: defaultDate !== undefined,
289
- position: 'bottom left',
290
- reposition: false,
291
- theme: emotion.cx(styles.datePicker, 'hide-carret'),
292
- toString: function toString(date) {
293
- return formatDateDisplay(moment(date));
294
- },
295
- // we need to keep this function like this
296
- // so `this` refers to pikaday instance
297
- onSelect: function onSelect() {
298
- onChange(this.getMoment() || undefined);
299
- }
300
- });
301
- };
302
-
303
- _proto.componentWillUnmount = function componentWillUnmount() {
304
- if (this.pikaday) {
305
- this.pikaday.destroy();
306
- }
307
- };
308
-
309
- _proto.render = function render() {
310
- var _this2 = this;
311
-
312
- return React__default.createElement("div", {
313
- className: styles.datePickerWrapper
314
- }, React__default.createElement(f36Components.TextInput, {
315
- "aria-label": "Select date",
316
- testId: "date-input",
317
- isReadOnly: true,
318
- isDisabled: this.props.disabled,
319
- value: formatDateDisplay(this.props.value),
320
- ref: this.datePickerNode,
321
- onFocus: this.handleOpen,
322
- onBlur: this.handleBlur,
323
- className: styles.input
324
- }), React__default.createElement(CalendarIcon, {
325
- onClick: function onClick() {
326
- _this2.focusInput();
327
- },
328
- className: styles.icon
329
- }));
330
- };
331
-
332
- return DatepickerInput;
333
- }(React.Component);
334
- DatepickerInput.defaultProps = {
335
- onChange: noop,
336
- onBlur: noop
337
- };
338
-
339
- var 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'];
340
-
341
- function parseRawInput(raw) {
342
- var time = null; // eslint-disable-next-line -- TODO: describe this disable @typescript-eslint/prefer-for-of
343
-
344
- for (var i = 0; i < validInputFormats.length; i++) {
345
- var date = moment(raw, validInputFormats[i]);
346
-
347
- if (date.isValid()) {
348
- time = date;
349
- break;
350
- }
351
- }
352
-
353
- return time;
354
- }
355
-
356
- var getDefaultTime = function getDefaultTime() {
357
- return moment("12:00 AM", 'hh:mm A');
358
- };
359
-
360
- var formatToString = function formatToString(uses12hClock, value) {
361
- return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');
362
- };
363
-
364
- var TimepickerInput = function TimepickerInput(_ref) {
365
- var disabled = _ref.disabled,
366
- uses12hClock = _ref.uses12hClock,
367
- _ref$time = _ref.time,
368
- time = _ref$time === void 0 ? '12:00' : _ref$time,
369
- _ref$ampm = _ref.ampm,
370
- ampm = _ref$ampm === void 0 ? 'AM' : _ref$ampm,
371
- onChange = _ref.onChange;
372
-
373
- var _useState = React.useState(function () {
374
- return formatToString(uses12hClock, getDefaultTime());
375
- }),
376
- selectedTime = _useState[0],
377
- setSelectedTime = _useState[1];
378
-
379
- React.useEffect(function () {
380
- setSelectedTime(formatToString(uses12hClock, moment(time + " " + ampm, 'hh:mm A')));
381
- }, [time, ampm, uses12hClock]);
382
- var handleChange = React.useCallback(function (e) {
383
- setSelectedTime(e.currentTarget.value);
384
- }, []);
385
- var handleFocus = React.useCallback(function (e) {
386
- e.preventDefault();
387
- e.target.select();
388
- }, []);
389
-
390
- var handleBlur = function handleBlur() {
391
- var parsedTime = parseRawInput(selectedTime);
392
- var value = parsedTime != null ? parsedTime : getDefaultTime();
393
- setSelectedTime(formatToString(uses12hClock, value));
394
- onChange({
395
- time: value.format('hh:mm'),
396
- ampm: value.format('A')
397
- });
398
- };
399
-
400
- return React__default.createElement(f36Components.Flex, {
401
- className: emotion.css({
402
- width: '145px'
403
- })
404
- }, React__default.createElement(f36Components.TextInput, {
405
- "aria-label": "Select time",
406
- placeholder: uses12hClock ? '12:00 AM' : '00:00',
407
- "date-time-type": uses12hClock ? '12' : '24',
408
- testId: "time-input",
409
- value: selectedTime,
410
- isDisabled: disabled,
411
- onFocus: handleFocus,
412
- onBlur: handleBlur,
413
- onChange: handleChange
414
- }));
415
- };
416
-
417
- var defaultZoneOffset = '+00:00';
418
- var 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'];
419
-
420
- var TimezonepickerInput = function TimezonepickerInput(_ref) {
421
- var disabled = _ref.disabled,
422
- _onChange = _ref.onChange,
423
- _ref$value = _ref.value,
424
- value = _ref$value === void 0 ? defaultZoneOffset : _ref$value;
425
- return React__default.createElement(f36Components.Select, {
426
- "aria-label": "Select timezone",
427
- testId: "timezone-input",
428
- value: value,
429
- isDisabled: disabled,
430
- onChange: function onChange(e) {
431
- _onChange(e.currentTarget.value);
432
- }
433
- }, zoneOffsets.map(function (offset) {
434
- return React__default.createElement(f36Components.Select.Option, {
435
- key: offset,
436
- value: offset
437
- }, "UTC", offset);
438
- }));
439
- };
440
-
441
299
  var styles$1 = {
442
300
  root: /*#__PURE__*/emotion.css({
443
301
  display: 'flex',
@@ -593,6 +451,5 @@ DateEditor.defaultProps = {
593
451
  };
594
452
 
595
453
  exports.DateEditor = DateEditor;
596
- exports.createPikaday = createPikaday;
597
454
  exports.zoneOffsets = zoneOffsets;
598
455
  //# sourceMappingURL=field-editor-date.cjs.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"field-editor-date.cjs.development.js","sources":["../src/utils/date.ts","../src/utils/createPikaday.ts","../src/icons/CalendarIcon.tsx","../src/DatepickerInput.tsx","../src/TimepickerInput.tsx","../src/utils/zoneOffsets.ts","../src/TimezonePickerInput.tsx","../src/DateEditor.tsx"],"sourcesContent":["// eslint-disable-next-line -- TODO: describe this disable no-restricted-imports\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\nexport function formatDateDisplay(date?: moment.Moment) {\n if (date) {\n return date.format('dddd, MMMM Do YYYY');\n } else {\n return '';\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 Pikaday from 'pikaday';\n\nconst I18N = {\n previousMonth: 'Previous Month',\n nextMonth: 'Next Month',\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n weekdaysShort: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n weekdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n};\n\nconst DEFAULTS = {\n i18n: I18N,\n yearRange: 100,\n};\n\n// Gets same options as Pikaday and returns a Pikaday instance\nexport const createPikaday = (opts?: Pikaday.PikadayOptions) =>\n new Pikaday(Object.assign({}, DEFAULTS, opts));\n","import React from 'react';\n\nexport function CalendarIcon(props: {\n className?: string;\n onClick?: React.MouseEventHandler<SVGElement>;\n}) {\n return (\n <svg\n width=\"16\"\n height=\"17\"\n viewBox=\"-1 -1 18 19\"\n onClick={props.onClick}\n xmlns=\"http://www.w3.org/2000/svg\"\n className={props.className}>\n <g fill=\"none\" fillRule=\"evenodd\">\n <g fill=\"#536171\">\n <path d=\"M2.071 14.929v-2.411h2.411v2.41h-2.41zm2.947 0v-2.411h2.678v2.41H5.018zM2.07 11.982V9.304h2.411v2.678h-2.41zm2.947 0V9.304h2.678v2.678H5.018zM2.07 8.768v-2.41h2.411v2.41h-2.41zm6.161 6.16v-2.41h2.679v2.41H8.232zm-3.214-6.16v-2.41h2.678v2.41H5.018zm6.428 6.16v-2.41h2.411v2.41h-2.41zm-3.214-2.946V9.304h2.679v2.678H8.232zM5.286 4.75a.275.275 0 0 1-.268.268h-.536a.275.275 0 0 1-.268-.268V2.34c0-.143.126-.269.268-.269h.536c.142 0 .268.126.268.268V4.75zm6.16 7.232V9.304h2.411v2.678h-2.41zM8.232 8.768v-2.41h2.679v2.41H8.232zm3.214 0v-2.41h2.411v2.41h-2.41zm.268-4.018a.275.275 0 0 1-.268.268h-.535a.275.275 0 0 1-.268-.268V2.34c0-.143.125-.269.268-.269h.535c.143 0 .268.126.268.268V4.75zm3.215-.536c0-.586-.486-1.071-1.072-1.071h-1.071v-.804c0-.736-.603-1.339-1.34-1.339h-.535c-.737 0-1.34.603-1.34 1.34v.803H6.357v-.804C6.357 1.603 5.754 1 5.017 1h-.535c-.736 0-1.34.603-1.34 1.34v.803h-1.07C1.484 3.143 1 3.628 1 4.214V14.93C1 15.515 1.485 16 2.071 16h11.786c.586 0 1.072-.485 1.072-1.071V4.214z\" />\n </g>\n </g>\n </svg>\n );\n}\n","import React, { Component, FocusEventHandler, FocusEvent } from 'react';\nimport noop from 'lodash/noop';\n// eslint-disable-next-line -- TODO: describe this disable no-restricted-imports\nimport moment from 'moment';\nimport { css, cx } from 'emotion';\nimport { formatDateDisplay } from './utils/date';\nimport { createPikaday } from './utils/createPikaday';\nimport { CalendarIcon } from './icons/CalendarIcon';\n\nimport { TextInput } from '@contentful/f36-components';\n\nconst styles = {\n datePickerWrapper: css({\n position: 'relative',\n maxHeight: 70,\n }),\n datePicker: css({\n zIndex: 1002,\n display: 'block',\n '.is-hidden': {\n display: 'none',\n },\n }),\n input: css({\n width: '270px',\n cursor: 'pointer',\n paddingRight: '40px',\n '&:disabled': {\n cursor: 'not-allowed',\n },\n }),\n icon: css({\n cursor: 'pointer',\n zIndex: 50,\n position: 'absolute',\n top: '12px',\n right: '12px',\n }),\n};\n\nexport type DatePickerProps = {\n value?: moment.Moment;\n onChange: (val: moment.Moment | undefined) => void;\n onBlur: FocusEventHandler;\n disabled?: boolean;\n};\n\nexport class DatepickerInput extends Component<DatePickerProps> {\n static defaultProps: Partial<DatePickerProps> = {\n onChange: noop,\n onBlur: noop,\n };\n\n pikaday?: Pikaday;\n datePickerNode = React.createRef<HTMLInputElement>();\n\n componentDidMount() {\n const onChange = this.props.onChange;\n const defaultDate = this.props.value ? this.props.value.toDate() : undefined;\n this.pikaday = createPikaday({\n field: this.datePickerNode && this.datePickerNode.current,\n defaultDate,\n setDefaultDate: defaultDate !== undefined,\n position: 'bottom left',\n reposition: false,\n theme: cx(styles.datePicker, 'hide-carret'),\n toString: (date) => {\n return formatDateDisplay(moment(date));\n },\n // we need to keep this function like this\n // so `this` refers to pikaday instance\n onSelect: function onSelect() {\n onChange(this.getMoment() || undefined);\n },\n });\n }\n\n focusInput = () => {\n if (this.datePickerNode && this.datePickerNode.current) {\n this.datePickerNode.current.focus();\n }\n };\n\n componentWillUnmount() {\n if (this.pikaday) {\n this.pikaday.destroy();\n }\n }\n\n handleOpen = () => {\n if (this.pikaday) {\n this.pikaday.show();\n }\n };\n\n handleBlur = (e: FocusEvent) => {\n this.props.onBlur(e);\n if (this.pikaday && !this.pikaday.el.contains(e.relatedTarget as HTMLInputElement)) {\n this.pikaday.hide();\n }\n };\n\n render() {\n return (\n <div className={styles.datePickerWrapper}>\n <TextInput\n aria-label=\"Select date\"\n testId=\"date-input\"\n isReadOnly\n isDisabled={this.props.disabled}\n value={formatDateDisplay(this.props.value)}\n ref={this.datePickerNode}\n onFocus={this.handleOpen}\n onBlur={this.handleBlur}\n className={styles.input}\n />\n <CalendarIcon\n onClick={() => {\n this.focusInput();\n }}\n className={styles.icon}\n />\n </div>\n );\n }\n}\n","import React, { useState, useCallback, useEffect } from 'react';\n// eslint-disable-next-line -- TODO: describe this disable no-restricted-imports\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: describe this disable @typescript-eslint/prefer-for-of\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","import * as React from 'react';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport { DatepickerInput } from './DatepickerInput';\nimport { TimepickerInput } from './TimepickerInput';\nimport { TimezonepickerInput } from './TimezonePickerInput';\nimport {\n userInputFromDatetime,\n buildFieldValue,\n getDefaultAMPM,\n getDefaultUtcOffset,\n} from './utils/date';\nimport { TimeFormat, DateTimeFormat, TimeResult } from './types';\n\nimport { TextLink } from '@contentful/f36-components';\n\nexport interface DateEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: 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 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":["ZONE_RX","startOfToday","format","moment","set","hours","minutes","fieldValueToMoment","datetimeString","datetime","test","utcOffset","timeFromUserInput","input","timeInput","time","utc","ampm","datetimeFromUserInput","date","valid","parseZone","toObject","isValid","invalid","formatDateDisplay","buildFieldValue","data","usesTime","usesTimezone","getDefaultAMPM","getDefaultUtcOffset","userInputFromDatetime","value","uses12hClock","timeFormat","I18N","previousMonth","nextMonth","months","weekdaysShort","weekdays","DEFAULTS","i18n","yearRange","createPikaday","opts","Pikaday","Object","assign","CalendarIcon","props","React","width","height","viewBox","onClick","xmlns","className","fill","fillRule","d","styles","datePickerWrapper","css","position","maxHeight","datePicker","zIndex","display","cursor","paddingRight","icon","top","right","DatepickerInput","createRef","datePickerNode","current","focus","pikaday","show","e","onBlur","el","contains","relatedTarget","hide","componentDidMount","onChange","defaultDate","toDate","undefined","field","setDefaultDate","reposition","theme","cx","toString","onSelect","getMoment","componentWillUnmount","destroy","render","TextInput","testId","isReadOnly","isDisabled","disabled","ref","onFocus","handleOpen","handleBlur","focusInput","Component","noop","validInputFormats","parseRawInput","raw","i","length","getDefaultTime","formatToString","TimepickerInput","useState","selectedTime","setSelectedTime","useEffect","handleChange","useCallback","currentTarget","handleFocus","preventDefault","target","select","parsedTime","Flex","placeholder","defaultZoneOffset","zoneOffsets","TimezonepickerInput","Select","map","offset","Option","key","root","alignItems","separator","marginLeft","tokens","spacingM","useEffectWithoutFirstRender","callback","deps","isFirstRun","DateEditorContainer","initialValue","hasClear","setValue","TextLink","as","DateEditor","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-datepicker';\nimport { css } from 'emotion';\n// eslint-disable-next-line -- TODO: describe this disable no-restricted-imports\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 return (\n <Datepicker\n className={styles.root}\n selected={props.value?.toDate()}\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: describe this disable no-restricted-imports\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: describe this disable @typescript-eslint/prefer-for-of\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: describe this disable no-restricted-imports\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';\nimport { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\nimport { FieldAPI, FieldConnector, ParametersAPI } from '@contentful/field-editor-shared';\nimport { DatepickerInput } from './DatepickerInput';\nimport { TimepickerInput } from './TimepickerInput';\nimport { TimezonepickerInput } from './TimezonePickerInput';\nimport {\n userInputFromDatetime,\n buildFieldValue,\n getDefaultAMPM,\n getDefaultUtcOffset,\n} from './utils/date';\nimport { TimeFormat, DateTimeFormat, TimeResult } from './types';\n\nimport { TextLink } from '@contentful/f36-components';\n\nexport interface DateEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: 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 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","React","Datepicker","className","selected","value","onSelect","day","momentDay","moment","undefined","onChange","inputProps","isDisabled","disabled","placeholder","validInputFormats","parseRawInput","raw","time","i","length","date","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","toObject","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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"}