@contentful/field-editor-date 1.3.5 → 1.5.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/dist/cjs/DateEditor.js +186 -0
- package/dist/cjs/DatepickerInput.js +92 -0
- package/dist/cjs/DatepickerInput.spec.js +110 -0
- package/dist/cjs/TimepickerInput.js +132 -0
- package/dist/cjs/TimezonePickerInput.js +32 -0
- package/dist/cjs/index.js +20 -0
- package/dist/cjs/types.js +4 -0
- package/dist/cjs/utils/data.spec.js +56 -0
- package/dist/cjs/utils/date.js +116 -0
- package/dist/cjs/utils/zoneOffsets.js +61 -0
- package/dist/esm/DateEditor.js +132 -0
- package/dist/esm/DatepickerInput.js +38 -0
- package/dist/esm/DatepickerInput.spec.js +62 -0
- package/dist/esm/TimepickerInput.js +78 -0
- package/dist/esm/TimezonePickerInput.js +17 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils/data.spec.js +47 -0
- package/dist/esm/utils/date.js +87 -0
- package/dist/esm/utils/zoneOffsets.js +43 -0
- package/dist/{DateEditor.d.ts → types/DateEditor.d.ts} +29 -29
- package/dist/{DatepickerInput.d.ts → types/DatepickerInput.d.ts} +8 -8
- package/dist/types/DatepickerInput.spec.d.ts +1 -0
- package/dist/{TimepickerInput.d.ts → types/TimepickerInput.d.ts} +12 -12
- package/dist/{TimezonePickerInput.d.ts → types/TimezonePickerInput.d.ts} +7 -7
- package/dist/{index.d.ts → types/index.d.ts} +2 -2
- package/dist/types/types.d.ts +9 -0
- package/dist/types/utils/data.spec.d.ts +1 -0
- package/dist/{utils → types/utils}/date.d.ts +27 -27
- package/dist/{utils → types/utils}/zoneOffsets.d.ts +2 -2
- package/package.json +28 -14
- package/CHANGELOG.md +0 -288
- package/dist/field-editor-date.cjs.development.js +0 -463
- package/dist/field-editor-date.cjs.development.js.map +0 -1
- package/dist/field-editor-date.cjs.production.min.js +0 -2
- package/dist/field-editor-date.cjs.production.min.js.map +0 -1
- package/dist/field-editor-date.esm.js +0 -455
- package/dist/field-editor-date.esm.js.map +0 -1
- package/dist/index.js +0 -8
- package/dist/types.d.ts +0 -9
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "DateEditor", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return DateEditor;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
|
+
const _f36components = require("@contentful/f36-components");
|
|
13
|
+
const _f36tokens = _interop_require_default(require("@contentful/f36-tokens"));
|
|
14
|
+
const _fieldeditorshared = require("@contentful/field-editor-shared");
|
|
15
|
+
const _emotion = require("emotion");
|
|
16
|
+
const _DatepickerInput = require("./DatepickerInput");
|
|
17
|
+
const _TimepickerInput = require("./TimepickerInput");
|
|
18
|
+
const _TimezonePickerInput = require("./TimezonePickerInput");
|
|
19
|
+
const _date = require("./utils/date");
|
|
20
|
+
function _interop_require_default(obj) {
|
|
21
|
+
return obj && obj.__esModule ? obj : {
|
|
22
|
+
default: obj
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
26
|
+
if (typeof WeakMap !== "function") return null;
|
|
27
|
+
var cacheBabelInterop = new WeakMap();
|
|
28
|
+
var cacheNodeInterop = new WeakMap();
|
|
29
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
30
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
31
|
+
})(nodeInterop);
|
|
32
|
+
}
|
|
33
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
34
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
35
|
+
return obj;
|
|
36
|
+
}
|
|
37
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
38
|
+
return {
|
|
39
|
+
default: obj
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
43
|
+
if (cache && cache.has(obj)) {
|
|
44
|
+
return cache.get(obj);
|
|
45
|
+
}
|
|
46
|
+
var newObj = {};
|
|
47
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
48
|
+
for(var key in obj){
|
|
49
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
50
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
51
|
+
if (desc && (desc.get || desc.set)) {
|
|
52
|
+
Object.defineProperty(newObj, key, desc);
|
|
53
|
+
} else {
|
|
54
|
+
newObj[key] = obj[key];
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
newObj.default = obj;
|
|
59
|
+
if (cache) {
|
|
60
|
+
cache.set(obj, newObj);
|
|
61
|
+
}
|
|
62
|
+
return newObj;
|
|
63
|
+
}
|
|
64
|
+
const styles = {
|
|
65
|
+
root: (0, _emotion.css)({
|
|
66
|
+
display: 'flex',
|
|
67
|
+
alignItems: 'center'
|
|
68
|
+
}),
|
|
69
|
+
separator: (0, _emotion.css)({
|
|
70
|
+
marginLeft: _f36tokens.default.spacingM
|
|
71
|
+
})
|
|
72
|
+
};
|
|
73
|
+
function useEffectWithoutFirstRender(callback, deps) {
|
|
74
|
+
const isFirstRun = _react.useRef(true);
|
|
75
|
+
_react.useEffect(()=>{
|
|
76
|
+
if (isFirstRun.current) {
|
|
77
|
+
isFirstRun.current = false;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
callback();
|
|
81
|
+
}, deps);
|
|
82
|
+
}
|
|
83
|
+
function DateEditorContainer({ initialValue , usesTime , usesTimezone , uses12hClock , disabled , hasClear , onChange }) {
|
|
84
|
+
const [value, setValue] = _react.useState(()=>initialValue);
|
|
85
|
+
useEffectWithoutFirstRender(()=>{
|
|
86
|
+
onChange(value);
|
|
87
|
+
}, [
|
|
88
|
+
value
|
|
89
|
+
]);
|
|
90
|
+
return _react.createElement("div", {
|
|
91
|
+
"data-test-id": "date-editor",
|
|
92
|
+
className: styles.root
|
|
93
|
+
}, _react.createElement(_DatepickerInput.DatepickerInput, {
|
|
94
|
+
disabled: disabled,
|
|
95
|
+
value: value.date,
|
|
96
|
+
onChange: (date)=>{
|
|
97
|
+
setValue((value)=>({
|
|
98
|
+
...value,
|
|
99
|
+
date
|
|
100
|
+
}));
|
|
101
|
+
}
|
|
102
|
+
}), usesTime && _react.createElement(_react.Fragment, null, _react.createElement("div", {
|
|
103
|
+
className: styles.separator
|
|
104
|
+
}), _react.createElement(_TimepickerInput.TimepickerInput, {
|
|
105
|
+
disabled: disabled,
|
|
106
|
+
time: value.time,
|
|
107
|
+
ampm: value.ampm,
|
|
108
|
+
onChange: ({ time , ampm })=>{
|
|
109
|
+
setValue((value)=>({
|
|
110
|
+
...value,
|
|
111
|
+
time,
|
|
112
|
+
ampm
|
|
113
|
+
}));
|
|
114
|
+
},
|
|
115
|
+
uses12hClock: uses12hClock
|
|
116
|
+
})), usesTimezone && _react.createElement(_react.Fragment, null, _react.createElement("div", {
|
|
117
|
+
className: styles.separator
|
|
118
|
+
}), _react.createElement(_TimezonePickerInput.TimezonepickerInput, {
|
|
119
|
+
disabled: disabled,
|
|
120
|
+
value: value.utcOffset,
|
|
121
|
+
onChange: (utcOffset)=>{
|
|
122
|
+
setValue((value)=>({
|
|
123
|
+
...value,
|
|
124
|
+
utcOffset
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
})), hasClear && _react.createElement(_react.Fragment, null, _react.createElement("div", {
|
|
128
|
+
className: styles.separator
|
|
129
|
+
}), _react.createElement(_f36components.TextLink, {
|
|
130
|
+
as: "button",
|
|
131
|
+
isDisabled: disabled,
|
|
132
|
+
testId: "date-clear",
|
|
133
|
+
onClick: ()=>{
|
|
134
|
+
setValue({
|
|
135
|
+
date: undefined,
|
|
136
|
+
time: undefined,
|
|
137
|
+
ampm: (0, _date.getDefaultAMPM)(),
|
|
138
|
+
utcOffset: (0, _date.getDefaultUtcOffset)()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}, "Clear")));
|
|
142
|
+
}
|
|
143
|
+
function DateEditor(props) {
|
|
144
|
+
const { field , parameters } = props;
|
|
145
|
+
const formatParam = parameters?.instance?.format ?? 'timeZ';
|
|
146
|
+
const ampmParam = parameters?.instance?.ampm ?? '24';
|
|
147
|
+
const usesTime = formatParam !== 'dateonly';
|
|
148
|
+
const usesTimezone = formatParam === 'timeZ';
|
|
149
|
+
const uses12hClock = ampmParam === '12';
|
|
150
|
+
return _react.createElement(_fieldeditorshared.FieldConnector, {
|
|
151
|
+
field: field,
|
|
152
|
+
isInitiallyDisabled: props.isInitiallyDisabled,
|
|
153
|
+
isDisabled: props.isDisabled,
|
|
154
|
+
throttle: 0
|
|
155
|
+
}, ({ value , disabled , setValue , externalReset })=>{
|
|
156
|
+
const datetimeValue = (0, _date.userInputFromDatetime)({
|
|
157
|
+
value,
|
|
158
|
+
uses12hClock
|
|
159
|
+
});
|
|
160
|
+
return _react.createElement(DateEditorContainer, {
|
|
161
|
+
initialValue: datetimeValue,
|
|
162
|
+
uses12hClock: uses12hClock,
|
|
163
|
+
usesTimezone: usesTimezone,
|
|
164
|
+
usesTime: usesTime,
|
|
165
|
+
disabled: disabled,
|
|
166
|
+
hasClear: Boolean(value),
|
|
167
|
+
onChange: (data)=>{
|
|
168
|
+
const fieldValue = (0, _date.buildFieldValue)({
|
|
169
|
+
data,
|
|
170
|
+
usesTime,
|
|
171
|
+
usesTimezone
|
|
172
|
+
});
|
|
173
|
+
if (fieldValue.invalid) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (Boolean(value) || !value && Boolean(fieldValue.valid)) {
|
|
177
|
+
setValue(fieldValue.valid);
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
key: `date-container-${externalReset}`
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
DateEditor.defaultProps = {
|
|
185
|
+
isInitiallyDisabled: true
|
|
186
|
+
};
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "DatepickerInput", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return DatepickerInput;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
|
+
const _f36components = require("@contentful/f36-components");
|
|
13
|
+
const _emotion = require("emotion");
|
|
14
|
+
const _moment = _interop_require_default(require("moment"));
|
|
15
|
+
function _interop_require_default(obj) {
|
|
16
|
+
return obj && obj.__esModule ? obj : {
|
|
17
|
+
default: obj
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
21
|
+
if (typeof WeakMap !== "function") return null;
|
|
22
|
+
var cacheBabelInterop = new WeakMap();
|
|
23
|
+
var cacheNodeInterop = new WeakMap();
|
|
24
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
25
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
26
|
+
})(nodeInterop);
|
|
27
|
+
}
|
|
28
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
29
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
33
|
+
return {
|
|
34
|
+
default: obj
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
38
|
+
if (cache && cache.has(obj)) {
|
|
39
|
+
return cache.get(obj);
|
|
40
|
+
}
|
|
41
|
+
var newObj = {};
|
|
42
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
43
|
+
for(var key in obj){
|
|
44
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
46
|
+
if (desc && (desc.get || desc.set)) {
|
|
47
|
+
Object.defineProperty(newObj, key, desc);
|
|
48
|
+
} else {
|
|
49
|
+
newObj[key] = obj[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
newObj.default = obj;
|
|
54
|
+
if (cache) {
|
|
55
|
+
cache.set(obj, newObj);
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
}
|
|
59
|
+
const YEAR_RANGE = 100;
|
|
60
|
+
const styles = {
|
|
61
|
+
root: (0, _emotion.css)({
|
|
62
|
+
maxWidth: '270px'
|
|
63
|
+
})
|
|
64
|
+
};
|
|
65
|
+
const DatepickerInput = (props)=>{
|
|
66
|
+
const [fromDate, toDate] = (0, _react.useMemo)(()=>{
|
|
67
|
+
const fromDate = new Date();
|
|
68
|
+
fromDate.setFullYear(fromDate.getFullYear() - YEAR_RANGE);
|
|
69
|
+
const toDate = new Date();
|
|
70
|
+
toDate.setFullYear(toDate.getFullYear() + YEAR_RANGE);
|
|
71
|
+
return [
|
|
72
|
+
fromDate,
|
|
73
|
+
toDate
|
|
74
|
+
];
|
|
75
|
+
}, []);
|
|
76
|
+
const dateObj = props.value?.toObject();
|
|
77
|
+
const selectedDate = dateObj ? new Date(dateObj.years, dateObj.months, dateObj.date) : undefined;
|
|
78
|
+
return _react.default.createElement(_f36components.Datepicker, {
|
|
79
|
+
className: styles.root,
|
|
80
|
+
selected: selectedDate,
|
|
81
|
+
onSelect: (day)=>{
|
|
82
|
+
const momentDay = day ? (0, _moment.default)(day) : undefined;
|
|
83
|
+
props.onChange(momentDay);
|
|
84
|
+
},
|
|
85
|
+
inputProps: {
|
|
86
|
+
isDisabled: props.disabled,
|
|
87
|
+
placeholder: ''
|
|
88
|
+
},
|
|
89
|
+
fromDate: fromDate,
|
|
90
|
+
toDate: toDate
|
|
91
|
+
});
|
|
92
|
+
};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
6
|
+
require("@testing-library/jest-dom/extend-expect");
|
|
7
|
+
const _react1 = require("@testing-library/react");
|
|
8
|
+
const _timezoneddate = _interop_require_default(require("timezoned-date"));
|
|
9
|
+
const _DatepickerInput = require("./DatepickerInput");
|
|
10
|
+
const _date = require("./utils/date");
|
|
11
|
+
function _interop_require_default(obj) {
|
|
12
|
+
return obj && obj.__esModule ? obj : {
|
|
13
|
+
default: obj
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
17
|
+
if (typeof WeakMap !== "function") return null;
|
|
18
|
+
var cacheBabelInterop = new WeakMap();
|
|
19
|
+
var cacheNodeInterop = new WeakMap();
|
|
20
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
21
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
22
|
+
})(nodeInterop);
|
|
23
|
+
}
|
|
24
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
25
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
26
|
+
return obj;
|
|
27
|
+
}
|
|
28
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
29
|
+
return {
|
|
30
|
+
default: obj
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
34
|
+
if (cache && cache.has(obj)) {
|
|
35
|
+
return cache.get(obj);
|
|
36
|
+
}
|
|
37
|
+
var newObj = {};
|
|
38
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
39
|
+
for(var key in obj){
|
|
40
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
41
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
42
|
+
if (desc && (desc.get || desc.set)) {
|
|
43
|
+
Object.defineProperty(newObj, key, desc);
|
|
44
|
+
} else {
|
|
45
|
+
newObj[key] = obj[key];
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
newObj.default = obj;
|
|
50
|
+
if (cache) {
|
|
51
|
+
cache.set(obj, newObj);
|
|
52
|
+
}
|
|
53
|
+
return newObj;
|
|
54
|
+
}
|
|
55
|
+
(0, _react1.configure)({
|
|
56
|
+
testIdAttribute: 'data-test-id'
|
|
57
|
+
});
|
|
58
|
+
let originalDate;
|
|
59
|
+
beforeEach(()=>{
|
|
60
|
+
originalDate = global.Date;
|
|
61
|
+
});
|
|
62
|
+
afterEach(()=>{
|
|
63
|
+
global.Date = originalDate;
|
|
64
|
+
});
|
|
65
|
+
const renderDatepicker = (dateString)=>{
|
|
66
|
+
const { date } = (0, _date.userInputFromDatetime)({
|
|
67
|
+
value: dateString,
|
|
68
|
+
uses12hClock: false
|
|
69
|
+
});
|
|
70
|
+
return (0, _react1.render)(_react.createElement(_DatepickerInput.DatepickerInput, {
|
|
71
|
+
value: date,
|
|
72
|
+
onChange: jest.fn()
|
|
73
|
+
}));
|
|
74
|
+
};
|
|
75
|
+
describe('Date: DatepickerInput', function() {
|
|
76
|
+
describe('renders correct date, when the system UTC offset is +02:00 and the one in the props.value is', ()=>{
|
|
77
|
+
it('+04:00', async ()=>{
|
|
78
|
+
global.Date = _timezoneddate.default.makeConstructor(120);
|
|
79
|
+
renderDatepicker('2022-09-22T00:00+04:00');
|
|
80
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
81
|
+
});
|
|
82
|
+
it('+10:00', async ()=>{
|
|
83
|
+
global.Date = _timezoneddate.default.makeConstructor(120);
|
|
84
|
+
renderDatepicker('2022-09-22T00:00+10:00');
|
|
85
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
86
|
+
});
|
|
87
|
+
it('-08:00', async ()=>{
|
|
88
|
+
global.Date = _timezoneddate.default.makeConstructor(120);
|
|
89
|
+
renderDatepicker('2022-09-22T00:00-08:00');
|
|
90
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('renders correct date, when the system UTC offset is -06:00 and the one in the props.value is', ()=>{
|
|
94
|
+
it('+02:00', async ()=>{
|
|
95
|
+
global.Date = _timezoneddate.default.makeConstructor(-360);
|
|
96
|
+
renderDatepicker('2022-09-22T00:00+02:00');
|
|
97
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
98
|
+
});
|
|
99
|
+
it('+10:00', async ()=>{
|
|
100
|
+
global.Date = _timezoneddate.default.makeConstructor(-360);
|
|
101
|
+
renderDatepicker('2022-09-22T00:00+10:00');
|
|
102
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
103
|
+
});
|
|
104
|
+
it('-08:00', async ()=>{
|
|
105
|
+
global.Date = _timezoneddate.default.makeConstructor(-360);
|
|
106
|
+
renderDatepicker('2022-09-22T00:00-08:00');
|
|
107
|
+
expect(_react1.screen.getByTestId('cf-ui-datepicker-input')).toHaveValue('22 Sep 2022');
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TimepickerInput", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return TimepickerInput;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _react = _interop_require_wildcard(require("react"));
|
|
12
|
+
const _f36components = require("@contentful/f36-components");
|
|
13
|
+
const _emotion = require("emotion");
|
|
14
|
+
const _moment = _interop_require_default(require("moment"));
|
|
15
|
+
function _interop_require_default(obj) {
|
|
16
|
+
return obj && obj.__esModule ? obj : {
|
|
17
|
+
default: obj
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
21
|
+
if (typeof WeakMap !== "function") return null;
|
|
22
|
+
var cacheBabelInterop = new WeakMap();
|
|
23
|
+
var cacheNodeInterop = new WeakMap();
|
|
24
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
25
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
26
|
+
})(nodeInterop);
|
|
27
|
+
}
|
|
28
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
29
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
30
|
+
return obj;
|
|
31
|
+
}
|
|
32
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
33
|
+
return {
|
|
34
|
+
default: obj
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
38
|
+
if (cache && cache.has(obj)) {
|
|
39
|
+
return cache.get(obj);
|
|
40
|
+
}
|
|
41
|
+
var newObj = {};
|
|
42
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
43
|
+
for(var key in obj){
|
|
44
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
45
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
46
|
+
if (desc && (desc.get || desc.set)) {
|
|
47
|
+
Object.defineProperty(newObj, key, desc);
|
|
48
|
+
} else {
|
|
49
|
+
newObj[key] = obj[key];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
newObj.default = obj;
|
|
54
|
+
if (cache) {
|
|
55
|
+
cache.set(obj, newObj);
|
|
56
|
+
}
|
|
57
|
+
return newObj;
|
|
58
|
+
}
|
|
59
|
+
const validInputFormats = [
|
|
60
|
+
'hh:mm a',
|
|
61
|
+
'hh:mm A',
|
|
62
|
+
'h:mm a',
|
|
63
|
+
'h:mm A',
|
|
64
|
+
'hh:mm',
|
|
65
|
+
'k:mm',
|
|
66
|
+
'kk:mm',
|
|
67
|
+
'h a',
|
|
68
|
+
'h A',
|
|
69
|
+
'h',
|
|
70
|
+
'hh',
|
|
71
|
+
'HH'
|
|
72
|
+
];
|
|
73
|
+
function parseRawInput(raw) {
|
|
74
|
+
let time = null;
|
|
75
|
+
for(let i = 0; i < validInputFormats.length; i++){
|
|
76
|
+
const date = (0, _moment.default)(raw, validInputFormats[i]);
|
|
77
|
+
if (date.isValid()) {
|
|
78
|
+
time = date;
|
|
79
|
+
break;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return time;
|
|
83
|
+
}
|
|
84
|
+
const getDefaultTime = ()=>{
|
|
85
|
+
return (0, _moment.default)(`12:00 AM`, 'hh:mm A');
|
|
86
|
+
};
|
|
87
|
+
const formatToString = (uses12hClock, value)=>{
|
|
88
|
+
return uses12hClock ? value.format('hh:mm A') : value.format('HH:mm');
|
|
89
|
+
};
|
|
90
|
+
const TimepickerInput = ({ disabled , uses12hClock , time ='12:00' , ampm ='AM' , onChange })=>{
|
|
91
|
+
const [selectedTime, setSelectedTime] = (0, _react.useState)(()=>{
|
|
92
|
+
return formatToString(uses12hClock, getDefaultTime());
|
|
93
|
+
});
|
|
94
|
+
(0, _react.useEffect)(()=>{
|
|
95
|
+
setSelectedTime(formatToString(uses12hClock, (0, _moment.default)(`${time} ${ampm}`, 'hh:mm A')));
|
|
96
|
+
}, [
|
|
97
|
+
time,
|
|
98
|
+
ampm,
|
|
99
|
+
uses12hClock
|
|
100
|
+
]);
|
|
101
|
+
const handleChange = (0, _react.useCallback)((e)=>{
|
|
102
|
+
setSelectedTime(e.currentTarget.value);
|
|
103
|
+
}, []);
|
|
104
|
+
const handleFocus = (0, _react.useCallback)((e)=>{
|
|
105
|
+
e.preventDefault();
|
|
106
|
+
e.target.select();
|
|
107
|
+
}, []);
|
|
108
|
+
const handleBlur = ()=>{
|
|
109
|
+
const parsedTime = parseRawInput(selectedTime);
|
|
110
|
+
const value = parsedTime ?? getDefaultTime();
|
|
111
|
+
setSelectedTime(formatToString(uses12hClock, value));
|
|
112
|
+
onChange({
|
|
113
|
+
time: value.format('hh:mm'),
|
|
114
|
+
ampm: value.format('A')
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
return _react.default.createElement(_f36components.Flex, {
|
|
118
|
+
className: (0, _emotion.css)({
|
|
119
|
+
width: '145px'
|
|
120
|
+
})
|
|
121
|
+
}, _react.default.createElement(_f36components.TextInput, {
|
|
122
|
+
"aria-label": "Select time",
|
|
123
|
+
placeholder: uses12hClock ? '12:00 AM' : '00:00',
|
|
124
|
+
"date-time-type": uses12hClock ? '12' : '24',
|
|
125
|
+
testId: "time-input",
|
|
126
|
+
value: selectedTime,
|
|
127
|
+
isDisabled: disabled,
|
|
128
|
+
onFocus: handleFocus,
|
|
129
|
+
onBlur: handleBlur,
|
|
130
|
+
onChange: handleChange
|
|
131
|
+
}));
|
|
132
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "TimezonepickerInput", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return TimezonepickerInput;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _react = _interop_require_default(require("react"));
|
|
12
|
+
const _f36components = require("@contentful/f36-components");
|
|
13
|
+
const _zoneOffsets = require("./utils/zoneOffsets");
|
|
14
|
+
function _interop_require_default(obj) {
|
|
15
|
+
return obj && obj.__esModule ? obj : {
|
|
16
|
+
default: obj
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const TimezonepickerInput = ({ disabled , onChange , value =_zoneOffsets.defaultZoneOffset })=>{
|
|
20
|
+
return _react.default.createElement(_f36components.Select, {
|
|
21
|
+
"aria-label": "Select timezone",
|
|
22
|
+
testId: "timezone-input",
|
|
23
|
+
value: value,
|
|
24
|
+
isDisabled: disabled,
|
|
25
|
+
onChange: (e)=>{
|
|
26
|
+
onChange(e.currentTarget.value);
|
|
27
|
+
}
|
|
28
|
+
}, _zoneOffsets.zoneOffsets.map((offset)=>_react.default.createElement(_f36components.Select.Option, {
|
|
29
|
+
key: offset,
|
|
30
|
+
value: offset
|
|
31
|
+
}, "UTC", offset)));
|
|
32
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
DateEditor: function() {
|
|
13
|
+
return _DateEditor.DateEditor;
|
|
14
|
+
},
|
|
15
|
+
zoneOffsets: function() {
|
|
16
|
+
return _zoneOffsets.zoneOffsets;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const _DateEditor = require("./DateEditor");
|
|
20
|
+
const _zoneOffsets = require("./utils/zoneOffsets");
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
const _moment = _interop_require_default(require("moment"));
|
|
6
|
+
const _date = require("./date");
|
|
7
|
+
function _interop_require_default(obj) {
|
|
8
|
+
return obj && obj.__esModule ? obj : {
|
|
9
|
+
default: obj
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
describe('date utils', ()=>{
|
|
13
|
+
describe('buildFieldValue', ()=>{
|
|
14
|
+
it('should work properly', ()=>{
|
|
15
|
+
expect((0, _date.buildFieldValue)({
|
|
16
|
+
data: {
|
|
17
|
+
date: (0, _moment.default)('2018-02-02'),
|
|
18
|
+
time: '05:00',
|
|
19
|
+
ampm: 'PM',
|
|
20
|
+
utcOffset: '+03:00'
|
|
21
|
+
},
|
|
22
|
+
usesTimezone: true,
|
|
23
|
+
usesTime: true
|
|
24
|
+
})).toEqual({
|
|
25
|
+
invalid: false,
|
|
26
|
+
valid: '2018-02-02T17:00+03:00'
|
|
27
|
+
});
|
|
28
|
+
expect((0, _date.buildFieldValue)({
|
|
29
|
+
data: {
|
|
30
|
+
date: (0, _moment.default)('2015-01-14'),
|
|
31
|
+
time: '05:00',
|
|
32
|
+
ampm: 'AM',
|
|
33
|
+
utcOffset: '-05:00'
|
|
34
|
+
},
|
|
35
|
+
usesTimezone: true,
|
|
36
|
+
usesTime: true
|
|
37
|
+
})).toEqual({
|
|
38
|
+
invalid: false,
|
|
39
|
+
valid: '2015-01-14T05:00-05:00'
|
|
40
|
+
});
|
|
41
|
+
expect((0, _date.buildFieldValue)({
|
|
42
|
+
data: {
|
|
43
|
+
date: (0, _moment.default)('2015-01-14'),
|
|
44
|
+
time: '17:00',
|
|
45
|
+
ampm: 'PM',
|
|
46
|
+
utcOffset: '-05:00'
|
|
47
|
+
},
|
|
48
|
+
usesTimezone: true,
|
|
49
|
+
usesTime: true
|
|
50
|
+
})).toEqual({
|
|
51
|
+
invalid: false,
|
|
52
|
+
valid: '2015-01-14T17:00-05:00'
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
});
|