@digigov/form 0.4.10 → 0.5.1
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 +24 -1
- package/Field/index.js +7 -0
- package/es/Field/index.js +6 -0
- package/es/index.js +3 -2
- package/es/inputs/DateInput/index.js +149 -0
- package/es/validators.js +79 -0
- package/esm/Field/index.js +6 -0
- package/esm/index.js +4 -3
- package/esm/inputs/DateInput/index.js +149 -0
- package/esm/validators.js +79 -0
- package/index.js +3 -2
- package/inputs/DateInput/index.js +173 -0
- package/libs/form/src/index.d.ts +2 -1
- package/libs/form/src/inputs/DateInput/index.d.ts +14 -0
- package/libs/ui/src/core/Button/index.d.ts +1 -0
- package/libs/ui/src/core/Divider/index.d.ts +5 -0
- package/libs/ui/src/core/Link/index.d.ts +3 -8
- package/libs/ui/src/core/NotificationBanner/index.d.ts +9 -8
- package/libs/ui/src/core/ServiceBadge/index.d.ts +1 -0
- package/libs/ui/src/core/Table/index.d.ts +7 -0
- package/libs/ui/src/core/index.d.ts +3 -0
- package/libs/ui/src/locales/el.d.ts +10 -0
- package/libs-ui/react-core/src/ArrowIcon/index.d.ts +15 -0
- package/libs-ui/react-core/src/ButtonGroup/index.d.ts +9 -0
- package/libs-ui/react-core/src/CaretIcon/index.d.ts +15 -0
- package/libs-ui/react-core/src/DateInput/index.d.ts +12 -0
- package/libs-ui/react-core/src/DateInputItem/index.d.ts +25 -0
- package/libs-ui/react-core/src/Link/index.d.ts +14 -0
- package/libs-ui/react-core/src/NotificationBannerLink/index.d.ts +15 -0
- package/libs-ui/react-core/src/PhaseBannerText/index.d.ts +11 -0
- package/libs-ui/react-core/src/Table/index.d.ts +34 -0
- package/libs-ui/react-core/src/TableBody/index.d.ts +9 -0
- package/libs-ui/react-core/src/TableCaption/index.d.ts +15 -0
- package/libs-ui/react-core/src/TableDataCell/index.d.ts +15 -0
- package/libs-ui/react-core/src/TableHead/index.d.ts +9 -0
- package/libs-ui/react-core/src/TableHeaderCell/index.d.ts +21 -0
- package/libs-ui/react-core/src/TableRow/index.d.ts +9 -0
- package/package.json +4 -3
- package/validators.js +82 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,29 @@
|
|
|
1
1
|
# Change Log - @digigov/form
|
|
2
2
|
|
|
3
|
-
This log was last generated on Thu,
|
|
3
|
+
This log was last generated on Thu, 24 Feb 2022 14:51:06 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 0.5.1
|
|
6
|
+
Thu, 24 Feb 2022 14:51:06 GMT
|
|
7
|
+
|
|
8
|
+
### Patches
|
|
9
|
+
|
|
10
|
+
- pass validator registry through formbuilder props
|
|
11
|
+
|
|
12
|
+
## 0.5.0
|
|
13
|
+
Wed, 16 Feb 2022 12:49:28 GMT
|
|
14
|
+
|
|
15
|
+
### Minor changes
|
|
16
|
+
|
|
17
|
+
- Add new `date` field type that renders a three-block date input
|
|
18
|
+
|
|
19
|
+
### Patches
|
|
20
|
+
|
|
21
|
+
- Pin dayjs dependency
|
|
22
|
+
|
|
23
|
+
## 0.4.11
|
|
24
|
+
Mon, 14 Feb 2022 09:56:29 GMT
|
|
25
|
+
|
|
26
|
+
_Version update only_
|
|
4
27
|
|
|
5
28
|
## 0.4.10
|
|
6
29
|
Thu, 10 Feb 2022 13:45:56 GMT
|
package/Field/index.js
CHANGED
|
@@ -43,6 +43,8 @@ var _Select = _interopRequireDefault(require("@digigov/form/inputs/Select"));
|
|
|
43
43
|
|
|
44
44
|
var _FileInput = _interopRequireDefault(require("@digigov/form/inputs/FileInput"));
|
|
45
45
|
|
|
46
|
+
var _DateInput = _interopRequireDefault(require("@digigov/form/inputs/DateInput"));
|
|
47
|
+
|
|
46
48
|
var _Label2 = _interopRequireDefault(require("@digigov/form/inputs/Label"));
|
|
47
49
|
|
|
48
50
|
var _i18n = require("@digigov/ui/app/i18n");
|
|
@@ -63,6 +65,11 @@ var FIELD_COMPONENTS = {
|
|
|
63
65
|
file: {
|
|
64
66
|
component: _FileInput["default"]
|
|
65
67
|
},
|
|
68
|
+
date: {
|
|
69
|
+
wrapper: 'fieldset',
|
|
70
|
+
controlled: true,
|
|
71
|
+
component: _DateInput["default"]
|
|
72
|
+
},
|
|
66
73
|
'choice:multiple': {
|
|
67
74
|
wrapper: 'fieldset',
|
|
68
75
|
controlled: true,
|
package/es/Field/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import Checkboxes from '@digigov/form/inputs/Checkboxes';
|
|
|
16
16
|
import Radio from '@digigov/form/inputs/Radio';
|
|
17
17
|
import Select from '@digigov/form/inputs/Select';
|
|
18
18
|
import FileInput from '@digigov/form/inputs/FileInput';
|
|
19
|
+
import DateInput from '@digigov/form/inputs/DateInput';
|
|
19
20
|
import Label from '@digigov/form/inputs/Label';
|
|
20
21
|
import { useTranslation } from '@digigov/ui/app/i18n';
|
|
21
22
|
var FIELD_COMPONENTS = {
|
|
@@ -28,6 +29,11 @@ var FIELD_COMPONENTS = {
|
|
|
28
29
|
file: {
|
|
29
30
|
component: FileInput
|
|
30
31
|
},
|
|
32
|
+
date: {
|
|
33
|
+
wrapper: 'fieldset',
|
|
34
|
+
controlled: true,
|
|
35
|
+
component: DateInput
|
|
36
|
+
},
|
|
31
37
|
'choice:multiple': {
|
|
32
38
|
wrapper: 'fieldset',
|
|
33
39
|
controlled: true,
|
package/es/index.js
CHANGED
|
@@ -82,12 +82,13 @@ export function FormBuilder(_ref2) {
|
|
|
82
82
|
_ref2$criteriaMode = _ref2.criteriaMode,
|
|
83
83
|
criteriaMode = _ref2$criteriaMode === void 0 ? 'firstError' : _ref2$criteriaMode,
|
|
84
84
|
_ref2$auto = _ref2.auto,
|
|
85
|
-
auto = _ref2$auto === void 0 ? false : _ref2$auto
|
|
85
|
+
auto = _ref2$auto === void 0 ? false : _ref2$auto,
|
|
86
|
+
validatorRegistry = _ref2.validatorRegistry;
|
|
86
87
|
var fieldsState = useRef(fields);
|
|
87
88
|
var setFieldsState = useCallback(function (newFields) {
|
|
88
89
|
fieldsState.current = newFields;
|
|
89
90
|
}, []);
|
|
90
|
-
var schema = useValidationSchema(fieldsState);
|
|
91
|
+
var schema = useValidationSchema(fieldsState, validatorRegistry);
|
|
91
92
|
var registerField = useCallback(function (field) {
|
|
92
93
|
setFieldsState([].concat(_toConsumableArray(fieldsState.current), [field]));
|
|
93
94
|
}, []);
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
var _excluded = ["label"],
|
|
4
|
+
_excluded2 = ["name", "type"];
|
|
5
|
+
import React, { useMemo, useState } from 'react';
|
|
6
|
+
import dayjs from 'dayjs';
|
|
7
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
8
|
+
import { useTranslation } from '@digigov/ui/app/i18n';
|
|
9
|
+
import CoreDateInput from '@digigov/react-core/DateInput';
|
|
10
|
+
import CoreDateInputItem from '@digigov/react-core/DateInputItem';
|
|
11
|
+
dayjs.extend(customParseFormat);
|
|
12
|
+
|
|
13
|
+
function useDate(value, onChange) {
|
|
14
|
+
var _useMemo = useMemo(function () {
|
|
15
|
+
if (!value || value.length === '') {
|
|
16
|
+
return ['', '', ''];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var _value$split = value.split('/'),
|
|
20
|
+
_value$split2 = _slicedToArray(_value$split, 3),
|
|
21
|
+
day = _value$split2[0],
|
|
22
|
+
month = _value$split2[1],
|
|
23
|
+
year = _value$split2[2];
|
|
24
|
+
|
|
25
|
+
return [year, month, day];
|
|
26
|
+
}, [value]),
|
|
27
|
+
_useMemo2 = _slicedToArray(_useMemo, 3),
|
|
28
|
+
year = _useMemo2[0],
|
|
29
|
+
month = _useMemo2[1],
|
|
30
|
+
day = _useMemo2[2];
|
|
31
|
+
|
|
32
|
+
function set(year, month, day) {
|
|
33
|
+
var value = "".concat(day || '', "/").concat(month || '', "/").concat(year || '');
|
|
34
|
+
|
|
35
|
+
if (!year && !month && !day) {
|
|
36
|
+
onChange(null);
|
|
37
|
+
} else {
|
|
38
|
+
onChange(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function setYear(evt) {
|
|
43
|
+
var val = evt.target.value;
|
|
44
|
+
set(val, month, day);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function setMonth(evt, cast) {
|
|
48
|
+
var val = evt.target.value;
|
|
49
|
+
|
|
50
|
+
if (cast && val && val.length === 1) {
|
|
51
|
+
val = '0' + val;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set(year, val, day);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function setDay(evt, cast) {
|
|
58
|
+
var val = evt.target.value;
|
|
59
|
+
|
|
60
|
+
if (cast && val && val.length === 1) {
|
|
61
|
+
val = '0' + val;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
set(year, month, val);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
day: day,
|
|
69
|
+
month: month,
|
|
70
|
+
year: year,
|
|
71
|
+
setYear: setYear,
|
|
72
|
+
setMonth: setMonth,
|
|
73
|
+
setDay: setDay
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var VALID_FORMATS = ['DD/MM/YYYY'];
|
|
78
|
+
|
|
79
|
+
var makeDate = function makeDate(val) {
|
|
80
|
+
var date = dayjs(val, VALID_FORMATS, true);
|
|
81
|
+
|
|
82
|
+
if (date.isValid()) {
|
|
83
|
+
return date.format('DD/MM/YYYY');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return '';
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
var DatePart = function DatePart(_ref) {
|
|
90
|
+
var label = _ref.label,
|
|
91
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
92
|
+
|
|
93
|
+
return /*#__PURE__*/React.createElement(CoreDateInputItem, props, label);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
var DateInput = function DateInput(_ref2) {
|
|
97
|
+
var name = _ref2.name,
|
|
98
|
+
type = _ref2.type,
|
|
99
|
+
props = _objectWithoutProperties(_ref2, _excluded2);
|
|
100
|
+
|
|
101
|
+
var _useTranslation = useTranslation(),
|
|
102
|
+
t = _useTranslation.t;
|
|
103
|
+
|
|
104
|
+
var _useState = useState(props.value),
|
|
105
|
+
_useState2 = _slicedToArray(_useState, 1),
|
|
106
|
+
initial = _useState2[0];
|
|
107
|
+
|
|
108
|
+
var value = useMemo(function () {
|
|
109
|
+
if (initial === props.value) {
|
|
110
|
+
return makeDate(props.value);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return props.value;
|
|
114
|
+
}, [props.value, initial]);
|
|
115
|
+
var date = useDate(value || makeDate(props.defaultValue), props.onChange);
|
|
116
|
+
return /*#__PURE__*/React.createElement(CoreDateInput, null, /*#__PURE__*/React.createElement(DatePart, {
|
|
117
|
+
label: t('form.label.day'),
|
|
118
|
+
onChange: date.setDay,
|
|
119
|
+
onBlur: function onBlur(e) {
|
|
120
|
+
return date.setDay(e, true);
|
|
121
|
+
},
|
|
122
|
+
value: date.day,
|
|
123
|
+
width: 2,
|
|
124
|
+
name: "".concat(name, "-day"),
|
|
125
|
+
maxlength: "2",
|
|
126
|
+
disabled: props.disabled
|
|
127
|
+
}), /*#__PURE__*/React.createElement(DatePart, {
|
|
128
|
+
label: t('form.label.month'),
|
|
129
|
+
onChange: date.setMonth,
|
|
130
|
+
onBlur: function onBlur(e) {
|
|
131
|
+
return date.setMonth(e, true);
|
|
132
|
+
},
|
|
133
|
+
value: date.month,
|
|
134
|
+
width: 2,
|
|
135
|
+
name: "".concat(props.name, "-month"),
|
|
136
|
+
maxlength: "2",
|
|
137
|
+
disabled: props.disabled
|
|
138
|
+
}), /*#__PURE__*/React.createElement(DatePart, {
|
|
139
|
+
label: t('form.label.year'),
|
|
140
|
+
onChange: date.setYear,
|
|
141
|
+
value: date.year,
|
|
142
|
+
width: 4,
|
|
143
|
+
name: "".concat(props.name, "-year"),
|
|
144
|
+
maxlength: "4",
|
|
145
|
+
disabled: props.disabled
|
|
146
|
+
}));
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export default DateInput;
|
package/es/validators.js
CHANGED
|
@@ -10,6 +10,9 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
10
10
|
import * as yup from 'yup';
|
|
11
11
|
import * as gPhoneNumber from 'google-libphonenumber';
|
|
12
12
|
import { useMemo } from 'react';
|
|
13
|
+
import dayjs from 'dayjs';
|
|
14
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
15
|
+
dayjs.extend(customParseFormat);
|
|
13
16
|
var DEFAULT_FILE_MAX_SIZE = 10000000;
|
|
14
17
|
export function validateAFM(afm) {
|
|
15
18
|
if (afm.length !== 9) {
|
|
@@ -280,6 +283,13 @@ var IBAN_VALIDATOR = function IBAN_VALIDATOR(field) {
|
|
|
280
283
|
};
|
|
281
284
|
};
|
|
282
285
|
|
|
286
|
+
var VALID_DATE_FORMATS = ['DD/MM/YYYY'];
|
|
287
|
+
var DATE_CACHE = {};
|
|
288
|
+
|
|
289
|
+
var getDate = function getDate(v) {
|
|
290
|
+
return DATE_CACHE[v] ? DATE_CACHE[v] : dayjs(v, VALID_DATE_FORMATS, true);
|
|
291
|
+
};
|
|
292
|
+
|
|
283
293
|
function getYupField(field, yupTypeMap) {
|
|
284
294
|
var yupField = yupTypeMap[field.type] || yupTypeMap.string;
|
|
285
295
|
return yupField(field);
|
|
@@ -416,6 +426,75 @@ var getYUPTypeMap = function getYUPTypeMap() {
|
|
|
416
426
|
},
|
|
417
427
|
'choice:single': function choiceSingle() {
|
|
418
428
|
return yup.string().nullable();
|
|
429
|
+
},
|
|
430
|
+
date: function date(field) {
|
|
431
|
+
var simpleDate = yup.string().nullable(true).test('date', 'form.error.date.invalid', function (value) {
|
|
432
|
+
if (!value) return true;
|
|
433
|
+
value = getDate(value);
|
|
434
|
+
return value.isValid();
|
|
435
|
+
});
|
|
436
|
+
var params = field.extra || {};
|
|
437
|
+
|
|
438
|
+
if (params.max) {
|
|
439
|
+
var maxDate;
|
|
440
|
+
|
|
441
|
+
if (params.max === 'now') {
|
|
442
|
+
var today = new Date();
|
|
443
|
+
maxDate = new Date(today);
|
|
444
|
+
} else {
|
|
445
|
+
maxDate = getDate(params.max).toDate();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
var maxNextDate = new Date(maxDate);
|
|
449
|
+
maxNextDate.setDate(maxDate.getDate() + 1);
|
|
450
|
+
simpleDate = simpleDate.test({
|
|
451
|
+
name: 'earlier-than',
|
|
452
|
+
message: {
|
|
453
|
+
key: 'form.error.date.earlier_than',
|
|
454
|
+
context: {
|
|
455
|
+
maxDate: maxNextDate.toLocaleDateString()
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
test: function test(value) {
|
|
459
|
+
if (!value) return true;
|
|
460
|
+
value = getDate(value);
|
|
461
|
+
var isValid = +value.toDate() < +maxDate;
|
|
462
|
+
return isValid;
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (params.min) {
|
|
468
|
+
var minDate;
|
|
469
|
+
|
|
470
|
+
if (params.min === 'now') {
|
|
471
|
+
var _today = new Date();
|
|
472
|
+
|
|
473
|
+
minDate = new Date(_today);
|
|
474
|
+
} else {
|
|
475
|
+
minDate = getDate(params.min).toDate();
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
var minPreviousDate = new Date(minDate);
|
|
479
|
+
minPreviousDate.setDate(minDate.getDate() - 1);
|
|
480
|
+
simpleDate = simpleDate.test({
|
|
481
|
+
name: 'later-than',
|
|
482
|
+
message: {
|
|
483
|
+
key: 'form.error.date.later_than',
|
|
484
|
+
context: {
|
|
485
|
+
minDate: minPreviousDate.toLocaleDateString()
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
test: function test(value) {
|
|
489
|
+
if (!value) return true;
|
|
490
|
+
value = getDate(value);
|
|
491
|
+
var isValid = +value.toDate() > +minDate;
|
|
492
|
+
return isValid;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return simpleDate;
|
|
419
498
|
}
|
|
420
499
|
};
|
|
421
500
|
return yupTypeMap;
|
package/esm/Field/index.js
CHANGED
|
@@ -16,6 +16,7 @@ import Checkboxes from '@digigov/form/inputs/Checkboxes';
|
|
|
16
16
|
import Radio from '@digigov/form/inputs/Radio';
|
|
17
17
|
import Select from '@digigov/form/inputs/Select';
|
|
18
18
|
import FileInput from '@digigov/form/inputs/FileInput';
|
|
19
|
+
import DateInput from '@digigov/form/inputs/DateInput';
|
|
19
20
|
import Label from '@digigov/form/inputs/Label';
|
|
20
21
|
import { useTranslation } from '@digigov/ui/app/i18n';
|
|
21
22
|
var FIELD_COMPONENTS = {
|
|
@@ -28,6 +29,11 @@ var FIELD_COMPONENTS = {
|
|
|
28
29
|
file: {
|
|
29
30
|
component: FileInput
|
|
30
31
|
},
|
|
32
|
+
date: {
|
|
33
|
+
wrapper: 'fieldset',
|
|
34
|
+
controlled: true,
|
|
35
|
+
component: DateInput
|
|
36
|
+
},
|
|
31
37
|
'choice:multiple': {
|
|
32
38
|
wrapper: 'fieldset',
|
|
33
39
|
controlled: true,
|
package/esm/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** @license Digigov v0.
|
|
1
|
+
/** @license Digigov v0.5.1
|
|
2
2
|
*
|
|
3
3
|
* This source code is licensed under the MIT license found in the
|
|
4
4
|
* LICENSE file in the root directory of this source tree.
|
|
@@ -87,12 +87,13 @@ export function FormBuilder(_ref2) {
|
|
|
87
87
|
_ref2$criteriaMode = _ref2.criteriaMode,
|
|
88
88
|
criteriaMode = _ref2$criteriaMode === void 0 ? 'firstError' : _ref2$criteriaMode,
|
|
89
89
|
_ref2$auto = _ref2.auto,
|
|
90
|
-
auto = _ref2$auto === void 0 ? false : _ref2$auto
|
|
90
|
+
auto = _ref2$auto === void 0 ? false : _ref2$auto,
|
|
91
|
+
validatorRegistry = _ref2.validatorRegistry;
|
|
91
92
|
var fieldsState = useRef(fields);
|
|
92
93
|
var setFieldsState = useCallback(function (newFields) {
|
|
93
94
|
fieldsState.current = newFields;
|
|
94
95
|
}, []);
|
|
95
|
-
var schema = useValidationSchema(fieldsState);
|
|
96
|
+
var schema = useValidationSchema(fieldsState, validatorRegistry);
|
|
96
97
|
var registerField = useCallback(function (field) {
|
|
97
98
|
setFieldsState([].concat(_toConsumableArray(fieldsState.current), [field]));
|
|
98
99
|
}, []);
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
2
|
+
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
|
|
3
|
+
var _excluded = ["label"],
|
|
4
|
+
_excluded2 = ["name", "type"];
|
|
5
|
+
import React, { useMemo, useState } from 'react';
|
|
6
|
+
import dayjs from 'dayjs';
|
|
7
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
8
|
+
import { useTranslation } from '@digigov/ui/app/i18n';
|
|
9
|
+
import CoreDateInput from '@digigov/react-core/DateInput';
|
|
10
|
+
import CoreDateInputItem from '@digigov/react-core/DateInputItem';
|
|
11
|
+
dayjs.extend(customParseFormat);
|
|
12
|
+
|
|
13
|
+
function useDate(value, onChange) {
|
|
14
|
+
var _useMemo = useMemo(function () {
|
|
15
|
+
if (!value || value.length === '') {
|
|
16
|
+
return ['', '', ''];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
var _value$split = value.split('/'),
|
|
20
|
+
_value$split2 = _slicedToArray(_value$split, 3),
|
|
21
|
+
day = _value$split2[0],
|
|
22
|
+
month = _value$split2[1],
|
|
23
|
+
year = _value$split2[2];
|
|
24
|
+
|
|
25
|
+
return [year, month, day];
|
|
26
|
+
}, [value]),
|
|
27
|
+
_useMemo2 = _slicedToArray(_useMemo, 3),
|
|
28
|
+
year = _useMemo2[0],
|
|
29
|
+
month = _useMemo2[1],
|
|
30
|
+
day = _useMemo2[2];
|
|
31
|
+
|
|
32
|
+
function set(year, month, day) {
|
|
33
|
+
var value = "".concat(day || '', "/").concat(month || '', "/").concat(year || '');
|
|
34
|
+
|
|
35
|
+
if (!year && !month && !day) {
|
|
36
|
+
onChange(null);
|
|
37
|
+
} else {
|
|
38
|
+
onChange(value);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function setYear(evt) {
|
|
43
|
+
var val = evt.target.value;
|
|
44
|
+
set(val, month, day);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function setMonth(evt, cast) {
|
|
48
|
+
var val = evt.target.value;
|
|
49
|
+
|
|
50
|
+
if (cast && val && val.length === 1) {
|
|
51
|
+
val = '0' + val;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
set(year, val, day);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function setDay(evt, cast) {
|
|
58
|
+
var val = evt.target.value;
|
|
59
|
+
|
|
60
|
+
if (cast && val && val.length === 1) {
|
|
61
|
+
val = '0' + val;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
set(year, month, val);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
day: day,
|
|
69
|
+
month: month,
|
|
70
|
+
year: year,
|
|
71
|
+
setYear: setYear,
|
|
72
|
+
setMonth: setMonth,
|
|
73
|
+
setDay: setDay
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var VALID_FORMATS = ['DD/MM/YYYY'];
|
|
78
|
+
|
|
79
|
+
var makeDate = function makeDate(val) {
|
|
80
|
+
var date = dayjs(val, VALID_FORMATS, true);
|
|
81
|
+
|
|
82
|
+
if (date.isValid()) {
|
|
83
|
+
return date.format('DD/MM/YYYY');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return '';
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
var DatePart = function DatePart(_ref) {
|
|
90
|
+
var label = _ref.label,
|
|
91
|
+
props = _objectWithoutProperties(_ref, _excluded);
|
|
92
|
+
|
|
93
|
+
return /*#__PURE__*/React.createElement(CoreDateInputItem, props, label);
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
var DateInput = function DateInput(_ref2) {
|
|
97
|
+
var name = _ref2.name,
|
|
98
|
+
type = _ref2.type,
|
|
99
|
+
props = _objectWithoutProperties(_ref2, _excluded2);
|
|
100
|
+
|
|
101
|
+
var _useTranslation = useTranslation(),
|
|
102
|
+
t = _useTranslation.t;
|
|
103
|
+
|
|
104
|
+
var _useState = useState(props.value),
|
|
105
|
+
_useState2 = _slicedToArray(_useState, 1),
|
|
106
|
+
initial = _useState2[0];
|
|
107
|
+
|
|
108
|
+
var value = useMemo(function () {
|
|
109
|
+
if (initial === props.value) {
|
|
110
|
+
return makeDate(props.value);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return props.value;
|
|
114
|
+
}, [props.value, initial]);
|
|
115
|
+
var date = useDate(value || makeDate(props.defaultValue), props.onChange);
|
|
116
|
+
return /*#__PURE__*/React.createElement(CoreDateInput, null, /*#__PURE__*/React.createElement(DatePart, {
|
|
117
|
+
label: t('form.label.day'),
|
|
118
|
+
onChange: date.setDay,
|
|
119
|
+
onBlur: function onBlur(e) {
|
|
120
|
+
return date.setDay(e, true);
|
|
121
|
+
},
|
|
122
|
+
value: date.day,
|
|
123
|
+
width: 2,
|
|
124
|
+
name: "".concat(name, "-day"),
|
|
125
|
+
maxlength: "2",
|
|
126
|
+
disabled: props.disabled
|
|
127
|
+
}), /*#__PURE__*/React.createElement(DatePart, {
|
|
128
|
+
label: t('form.label.month'),
|
|
129
|
+
onChange: date.setMonth,
|
|
130
|
+
onBlur: function onBlur(e) {
|
|
131
|
+
return date.setMonth(e, true);
|
|
132
|
+
},
|
|
133
|
+
value: date.month,
|
|
134
|
+
width: 2,
|
|
135
|
+
name: "".concat(props.name, "-month"),
|
|
136
|
+
maxlength: "2",
|
|
137
|
+
disabled: props.disabled
|
|
138
|
+
}), /*#__PURE__*/React.createElement(DatePart, {
|
|
139
|
+
label: t('form.label.year'),
|
|
140
|
+
onChange: date.setYear,
|
|
141
|
+
value: date.year,
|
|
142
|
+
width: 4,
|
|
143
|
+
name: "".concat(props.name, "-year"),
|
|
144
|
+
maxlength: "4",
|
|
145
|
+
disabled: props.disabled
|
|
146
|
+
}));
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
export default DateInput;
|
package/esm/validators.js
CHANGED
|
@@ -10,6 +10,9 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
10
10
|
import * as yup from 'yup';
|
|
11
11
|
import * as gPhoneNumber from 'google-libphonenumber';
|
|
12
12
|
import { useMemo } from 'react';
|
|
13
|
+
import dayjs from 'dayjs';
|
|
14
|
+
import customParseFormat from 'dayjs/plugin/customParseFormat';
|
|
15
|
+
dayjs.extend(customParseFormat);
|
|
13
16
|
var DEFAULT_FILE_MAX_SIZE = 10000000;
|
|
14
17
|
export function validateAFM(afm) {
|
|
15
18
|
if (afm.length !== 9) {
|
|
@@ -280,6 +283,13 @@ var IBAN_VALIDATOR = function IBAN_VALIDATOR(field) {
|
|
|
280
283
|
};
|
|
281
284
|
};
|
|
282
285
|
|
|
286
|
+
var VALID_DATE_FORMATS = ['DD/MM/YYYY'];
|
|
287
|
+
var DATE_CACHE = {};
|
|
288
|
+
|
|
289
|
+
var getDate = function getDate(v) {
|
|
290
|
+
return DATE_CACHE[v] ? DATE_CACHE[v] : dayjs(v, VALID_DATE_FORMATS, true);
|
|
291
|
+
};
|
|
292
|
+
|
|
283
293
|
function getYupField(field, yupTypeMap) {
|
|
284
294
|
var yupField = yupTypeMap[field.type] || yupTypeMap.string;
|
|
285
295
|
return yupField(field);
|
|
@@ -416,6 +426,75 @@ var getYUPTypeMap = function getYUPTypeMap() {
|
|
|
416
426
|
},
|
|
417
427
|
'choice:single': function choiceSingle() {
|
|
418
428
|
return yup.string().nullable();
|
|
429
|
+
},
|
|
430
|
+
date: function date(field) {
|
|
431
|
+
var simpleDate = yup.string().nullable(true).test('date', 'form.error.date.invalid', function (value) {
|
|
432
|
+
if (!value) return true;
|
|
433
|
+
value = getDate(value);
|
|
434
|
+
return value.isValid();
|
|
435
|
+
});
|
|
436
|
+
var params = field.extra || {};
|
|
437
|
+
|
|
438
|
+
if (params.max) {
|
|
439
|
+
var maxDate;
|
|
440
|
+
|
|
441
|
+
if (params.max === 'now') {
|
|
442
|
+
var today = new Date();
|
|
443
|
+
maxDate = new Date(today);
|
|
444
|
+
} else {
|
|
445
|
+
maxDate = getDate(params.max).toDate();
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
var maxNextDate = new Date(maxDate);
|
|
449
|
+
maxNextDate.setDate(maxDate.getDate() + 1);
|
|
450
|
+
simpleDate = simpleDate.test({
|
|
451
|
+
name: 'earlier-than',
|
|
452
|
+
message: {
|
|
453
|
+
key: 'form.error.date.earlier_than',
|
|
454
|
+
context: {
|
|
455
|
+
maxDate: maxNextDate.toLocaleDateString()
|
|
456
|
+
}
|
|
457
|
+
},
|
|
458
|
+
test: function test(value) {
|
|
459
|
+
if (!value) return true;
|
|
460
|
+
value = getDate(value);
|
|
461
|
+
var isValid = +value.toDate() < +maxDate;
|
|
462
|
+
return isValid;
|
|
463
|
+
}
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
if (params.min) {
|
|
468
|
+
var minDate;
|
|
469
|
+
|
|
470
|
+
if (params.min === 'now') {
|
|
471
|
+
var _today = new Date();
|
|
472
|
+
|
|
473
|
+
minDate = new Date(_today);
|
|
474
|
+
} else {
|
|
475
|
+
minDate = getDate(params.min).toDate();
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
var minPreviousDate = new Date(minDate);
|
|
479
|
+
minPreviousDate.setDate(minDate.getDate() - 1);
|
|
480
|
+
simpleDate = simpleDate.test({
|
|
481
|
+
name: 'later-than',
|
|
482
|
+
message: {
|
|
483
|
+
key: 'form.error.date.later_than',
|
|
484
|
+
context: {
|
|
485
|
+
minDate: minPreviousDate.toLocaleDateString()
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
test: function test(value) {
|
|
489
|
+
if (!value) return true;
|
|
490
|
+
value = getDate(value);
|
|
491
|
+
var isValid = +value.toDate() > +minDate;
|
|
492
|
+
return isValid;
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
return simpleDate;
|
|
419
498
|
}
|
|
420
499
|
};
|
|
421
500
|
return yupTypeMap;
|
package/index.js
CHANGED
|
@@ -140,12 +140,13 @@ function FormBuilder(_ref2) {
|
|
|
140
140
|
_ref2$criteriaMode = _ref2.criteriaMode,
|
|
141
141
|
criteriaMode = _ref2$criteriaMode === void 0 ? 'firstError' : _ref2$criteriaMode,
|
|
142
142
|
_ref2$auto = _ref2.auto,
|
|
143
|
-
auto = _ref2$auto === void 0 ? false : _ref2$auto
|
|
143
|
+
auto = _ref2$auto === void 0 ? false : _ref2$auto,
|
|
144
|
+
validatorRegistry = _ref2.validatorRegistry;
|
|
144
145
|
var fieldsState = (0, _react.useRef)(fields);
|
|
145
146
|
var setFieldsState = (0, _react.useCallback)(function (newFields) {
|
|
146
147
|
fieldsState.current = newFields;
|
|
147
148
|
}, []);
|
|
148
|
-
var schema = (0, _validators.useValidationSchema)(fieldsState);
|
|
149
|
+
var schema = (0, _validators.useValidationSchema)(fieldsState, validatorRegistry);
|
|
149
150
|
var registerField = (0, _react.useCallback)(function (field) {
|
|
150
151
|
setFieldsState([].concat((0, _toConsumableArray2["default"])(fieldsState.current), [field]));
|
|
151
152
|
}, []);
|