rsuite 5.59.1 → 5.59.3-alpha.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 +12 -0
- package/DateRangePicker/styles/index.css +27 -0
- package/DateRangePicker/styles/index.less +27 -0
- package/cjs/@types/common.d.ts +1 -1
- package/cjs/Calendar/CalendarContainer.js +4 -4
- package/cjs/DatePicker/DatePicker.d.ts +3 -38
- package/cjs/DatePicker/DatePicker.js +86 -137
- package/cjs/DatePicker/PredefinedRanges.d.ts +1 -1
- package/cjs/DatePicker/PredefinedRanges.js +3 -3
- package/cjs/DatePicker/Toolbar.d.ts +1 -1
- package/cjs/DatePicker/Toolbar.js +13 -12
- package/cjs/DatePicker/hooks/useFocus.d.ts +13 -0
- package/cjs/DatePicker/hooks/useFocus.js +96 -0
- package/cjs/DatePicker/hooks/useMonthView.d.ts +10 -0
- package/cjs/DatePicker/hooks/useMonthView.js +28 -0
- package/cjs/DatePicker/index.d.ts +2 -1
- package/cjs/DatePicker/types.d.ts +37 -0
- package/cjs/DatePicker/utils.d.ts +9 -0
- package/cjs/DatePicker/utils.js +20 -2
- package/cjs/DateRangePicker/DateRangePicker.d.ts +15 -3
- package/cjs/DateRangePicker/DateRangePicker.js +58 -68
- package/cjs/DateRangePicker/DateRangePickerContext.d.ts +4 -1
- package/cjs/DateRangePicker/DateRangePickerContext.js +4 -4
- package/cjs/DateRangePicker/Header.d.ts +11 -0
- package/cjs/DateRangePicker/Header.js +65 -0
- package/cjs/DateRangePicker/disabledDateUtils.d.ts +1 -1
- package/cjs/DateRangePicker/disabledDateUtils.js +1 -1
- package/cjs/DateRangePicker/index.js +5 -0
- package/cjs/Form/Form.d.ts +56 -39
- package/cjs/Form/Form.js +64 -186
- package/cjs/Form/FormContext.d.ts +12 -9
- package/cjs/Form/FormContext.js +11 -5
- package/cjs/Form/hooks/useFormRef.d.ts +55 -0
- package/cjs/Form/hooks/useFormRef.js +45 -0
- package/cjs/Form/hooks/useFormValidate.d.ts +19 -0
- package/cjs/Form/hooks/useFormValidate.js +157 -0
- package/cjs/Form/hooks/useFormValue.d.ts +2 -1
- package/cjs/Form/hooks/useFormValue.js +12 -1
- package/cjs/Form/hooks/useSchemaModel.js +5 -0
- package/cjs/Form/index.d.ts +2 -1
- package/cjs/FormControl/FormControl.d.ts +1 -1
- package/cjs/FormControl/FormControl.js +50 -68
- package/cjs/FormControl/hooks/useField.d.ts +18 -0
- package/cjs/FormControl/hooks/useField.js +54 -0
- package/cjs/FormControl/hooks/useRegisterModel.d.ts +3 -0
- package/cjs/FormControl/hooks/useRegisterModel.js +22 -0
- package/cjs/FormControl/utils.d.ts +1 -0
- package/cjs/FormControl/utils.js +8 -0
- package/cjs/FormControlLabel/FormControlLabel.js +12 -9
- package/cjs/FormErrorMessage/FormErrorMessage.js +2 -5
- package/cjs/FormGroup/FormGroup.d.ts +18 -4
- package/cjs/FormGroup/FormGroup.js +28 -2
- package/cjs/FormGroup/index.d.ts +1 -0
- package/cjs/FormGroup/index.js +4 -3
- package/cjs/FormHelpText/FormHelpText.d.ts +2 -1
- package/cjs/FormHelpText/FormHelpText.js +16 -9
- package/cjs/Input/Input.js +4 -5
- package/cjs/utils/dateUtils.d.ts +72 -10
- package/cjs/utils/dateUtils.js +88 -29
- package/dist/rsuite-no-reset-rtl.css +27 -0
- package/dist/rsuite-no-reset-rtl.min.css +1 -1
- package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
- package/dist/rsuite-no-reset.css +27 -0
- package/dist/rsuite-no-reset.min.css +1 -1
- package/dist/rsuite-no-reset.min.css.map +1 -1
- package/dist/rsuite-rtl.css +27 -0
- package/dist/rsuite-rtl.min.css +1 -1
- package/dist/rsuite-rtl.min.css.map +1 -1
- package/dist/rsuite.css +27 -0
- package/dist/rsuite.js +144 -44
- package/dist/rsuite.js.map +1 -1
- package/dist/rsuite.min.css +1 -1
- package/dist/rsuite.min.css.map +1 -1
- package/dist/rsuite.min.js +1 -1
- package/dist/rsuite.min.js.LICENSE.txt +35 -0
- package/dist/rsuite.min.js.map +1 -1
- package/esm/@types/common.d.ts +1 -1
- package/esm/Calendar/CalendarContainer.js +5 -5
- package/esm/DatePicker/DatePicker.d.ts +3 -38
- package/esm/DatePicker/DatePicker.js +88 -139
- package/esm/DatePicker/PredefinedRanges.d.ts +1 -1
- package/esm/DatePicker/PredefinedRanges.js +3 -3
- package/esm/DatePicker/Toolbar.d.ts +1 -1
- package/esm/DatePicker/Toolbar.js +13 -12
- package/esm/DatePicker/hooks/useFocus.d.ts +13 -0
- package/esm/DatePicker/hooks/useFocus.js +90 -0
- package/esm/DatePicker/hooks/useMonthView.d.ts +10 -0
- package/esm/DatePicker/hooks/useMonthView.js +22 -0
- package/esm/DatePicker/index.d.ts +2 -1
- package/esm/DatePicker/types.d.ts +37 -0
- package/esm/DatePicker/utils.d.ts +9 -0
- package/esm/DatePicker/utils.js +18 -2
- package/esm/DateRangePicker/DateRangePicker.d.ts +15 -3
- package/esm/DateRangePicker/DateRangePicker.js +61 -71
- package/esm/DateRangePicker/DateRangePickerContext.d.ts +4 -1
- package/esm/DateRangePicker/DateRangePickerContext.js +2 -2
- package/esm/DateRangePicker/Header.d.ts +11 -0
- package/esm/DateRangePicker/Header.js +59 -0
- package/esm/DateRangePicker/disabledDateUtils.d.ts +1 -1
- package/esm/DateRangePicker/disabledDateUtils.js +1 -1
- package/esm/DateRangePicker/index.js +4 -0
- package/esm/Form/Form.d.ts +56 -39
- package/esm/Form/Form.js +62 -183
- package/esm/Form/FormContext.d.ts +12 -9
- package/esm/Form/FormContext.js +6 -2
- package/esm/Form/hooks/useFormRef.d.ts +55 -0
- package/esm/Form/hooks/useFormRef.js +40 -0
- package/esm/Form/hooks/useFormValidate.d.ts +19 -0
- package/esm/Form/hooks/useFormValidate.js +152 -0
- package/esm/Form/hooks/useFormValue.d.ts +2 -1
- package/esm/Form/hooks/useFormValue.js +12 -1
- package/esm/Form/hooks/useSchemaModel.js +5 -0
- package/esm/Form/index.d.ts +2 -1
- package/esm/FormControl/FormControl.d.ts +1 -1
- package/esm/FormControl/FormControl.js +48 -66
- package/esm/FormControl/hooks/useField.d.ts +18 -0
- package/esm/FormControl/hooks/useField.js +48 -0
- package/esm/FormControl/hooks/useRegisterModel.d.ts +3 -0
- package/esm/FormControl/hooks/useRegisterModel.js +17 -0
- package/esm/FormControl/utils.d.ts +1 -0
- package/esm/FormControl/utils.js +4 -0
- package/esm/FormControlLabel/FormControlLabel.js +12 -8
- package/esm/FormErrorMessage/FormErrorMessage.js +2 -5
- package/esm/FormGroup/FormGroup.d.ts +18 -4
- package/esm/FormGroup/FormGroup.js +27 -1
- package/esm/FormGroup/index.d.ts +1 -0
- package/esm/FormGroup/index.js +1 -0
- package/esm/FormHelpText/FormHelpText.d.ts +2 -1
- package/esm/FormHelpText/FormHelpText.js +17 -9
- package/esm/Input/Input.js +4 -5
- package/esm/utils/dateUtils.d.ts +72 -10
- package/esm/utils/dateUtils.js +86 -28
- package/package.json +2 -2
- package/cjs/Form/hooks/useFormError.d.ts +0 -6
- package/cjs/Form/hooks/useFormError.js +0 -31
- package/cjs/FormControl/useRegisterModel.d.ts +0 -4
- package/cjs/FormControl/useRegisterModel.js +0 -18
- package/esm/Form/hooks/useFormError.d.ts +0 -6
- package/esm/Form/hooks/useFormError.js +0 -26
- package/esm/FormControl/useRegisterModel.d.ts +0 -4
- package/esm/FormControl/useRegisterModel.js +0 -13
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
+
import { useRef, useCallback } from 'react';
|
|
4
|
+
import omit from 'lodash/omit';
|
|
5
|
+
import set from 'lodash/set';
|
|
6
|
+
import { useControlled } from '../../utils';
|
|
7
|
+
import { nameToPath } from '../../FormControl/utils';
|
|
8
|
+
import useEventCallback from '../../utils/useEventCallback';
|
|
9
|
+
import useFormRef from './useFormRef';
|
|
10
|
+
export default function useFormValidate(formError, props) {
|
|
11
|
+
var ref = props.ref,
|
|
12
|
+
formValue = props.formValue,
|
|
13
|
+
getCombinedModel = props.getCombinedModel,
|
|
14
|
+
onCheck = props.onCheck,
|
|
15
|
+
onError = props.onError,
|
|
16
|
+
nestedField = props.nestedField;
|
|
17
|
+
var _useControlled = useControlled(formError, {}),
|
|
18
|
+
realFormError = _useControlled[0],
|
|
19
|
+
setFormError = _useControlled[1];
|
|
20
|
+
var realFormErrorRef = useRef(realFormError);
|
|
21
|
+
realFormErrorRef.current = realFormError;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Validate the form data and return a boolean.
|
|
25
|
+
* The error message after verification is returned in the callback.
|
|
26
|
+
* @param callback
|
|
27
|
+
*/
|
|
28
|
+
var check = useEventCallback(function (callback) {
|
|
29
|
+
var formError = {};
|
|
30
|
+
var errorCount = 0;
|
|
31
|
+
var model = getCombinedModel();
|
|
32
|
+
Object.keys(model.getSchemaSpec()).forEach(function (key) {
|
|
33
|
+
var checkResult = model.checkForField(key, formValue || {});
|
|
34
|
+
if (checkResult.hasError === true) {
|
|
35
|
+
errorCount += 1;
|
|
36
|
+
formError[key] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
setFormError(formError);
|
|
40
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
|
|
41
|
+
callback === null || callback === void 0 ? void 0 : callback(formError);
|
|
42
|
+
if (errorCount > 0) {
|
|
43
|
+
onError === null || onError === void 0 ? void 0 : onError(formError);
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Check the data field
|
|
51
|
+
* @param fieldName
|
|
52
|
+
* @param callback
|
|
53
|
+
*/
|
|
54
|
+
var checkForField = useEventCallback(function (fieldName, callback) {
|
|
55
|
+
var _extends2;
|
|
56
|
+
var model = getCombinedModel();
|
|
57
|
+
var checkResult = model.checkForField(fieldName, formValue || {});
|
|
58
|
+
var nextFormError = _extends({}, formError, (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
|
|
59
|
+
setFormError(nextFormError);
|
|
60
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
|
|
61
|
+
callback === null || callback === void 0 ? void 0 : callback(checkResult);
|
|
62
|
+
if (checkResult.hasError) {
|
|
63
|
+
onError === null || onError === void 0 ? void 0 : onError(nextFormError);
|
|
64
|
+
}
|
|
65
|
+
return !checkResult.hasError;
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Check form data asynchronously and return a Promise
|
|
70
|
+
*/
|
|
71
|
+
var checkAsync = useEventCallback(function () {
|
|
72
|
+
var promises = [];
|
|
73
|
+
var keys = [];
|
|
74
|
+
var model = getCombinedModel();
|
|
75
|
+
Object.keys(model.getSchemaSpec()).forEach(function (key) {
|
|
76
|
+
keys.push(key);
|
|
77
|
+
promises.push(model.checkForFieldAsync(key, formValue || {}));
|
|
78
|
+
});
|
|
79
|
+
return Promise.all(promises).then(function (values) {
|
|
80
|
+
var formError = {};
|
|
81
|
+
var errorCount = 0;
|
|
82
|
+
for (var i = 0; i < values.length; i++) {
|
|
83
|
+
if (values[i].hasError) {
|
|
84
|
+
errorCount += 1;
|
|
85
|
+
formError[keys[i]] = values[i].errorMessage;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
|
|
89
|
+
setFormError(formError);
|
|
90
|
+
if (errorCount > 0) {
|
|
91
|
+
onError === null || onError === void 0 ? void 0 : onError(formError);
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
hasError: errorCount > 0,
|
|
95
|
+
formError: formError
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Asynchronously check form fields and return Promise
|
|
102
|
+
* @param fieldName
|
|
103
|
+
*/
|
|
104
|
+
var checkForFieldAsync = useEventCallback(function (fieldName) {
|
|
105
|
+
var model = getCombinedModel();
|
|
106
|
+
return model.checkForFieldAsync(fieldName, formValue || {}).then(function (checkResult) {
|
|
107
|
+
var _extends3;
|
|
108
|
+
var nextFormError = _extends({}, formError, (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
|
|
109
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
|
|
110
|
+
setFormError(nextFormError);
|
|
111
|
+
if (checkResult.hasError) {
|
|
112
|
+
onError === null || onError === void 0 ? void 0 : onError(nextFormError);
|
|
113
|
+
}
|
|
114
|
+
return checkResult;
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
var onRemoveError = useCallback(function (name) {
|
|
118
|
+
/**
|
|
119
|
+
* when this function is called when the children component is unmount,
|
|
120
|
+
* it's an old render frame so use Ref to get future error
|
|
121
|
+
*/
|
|
122
|
+
var formError = omit(realFormErrorRef.current, [nestedField ? nameToPath(name) : name]);
|
|
123
|
+
realFormErrorRef.current = formError;
|
|
124
|
+
setFormError(formError);
|
|
125
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
|
|
126
|
+
return formError;
|
|
127
|
+
}, [nestedField, onCheck, setFormError]);
|
|
128
|
+
var setFieldError = useCallback(function (fieldName, checkResult) {
|
|
129
|
+
var _extends4;
|
|
130
|
+
var nextFormError = nestedField ? set(_extends({}, formError), nameToPath(fieldName), checkResult) : _extends({}, formError, (_extends4 = {}, _extends4[fieldName] = checkResult, _extends4));
|
|
131
|
+
setFormError(nextFormError);
|
|
132
|
+
onError === null || onError === void 0 ? void 0 : onError(nextFormError);
|
|
133
|
+
onCheck === null || onCheck === void 0 ? void 0 : onCheck(nextFormError);
|
|
134
|
+
return nextFormError;
|
|
135
|
+
}, [formError, nestedField, onCheck, onError, setFormError]);
|
|
136
|
+
var formRef = useFormRef(ref, {
|
|
137
|
+
check: check,
|
|
138
|
+
checkForField: checkForField,
|
|
139
|
+
checkAsync: checkAsync,
|
|
140
|
+
checkForFieldAsync: checkForFieldAsync,
|
|
141
|
+
formError: formError,
|
|
142
|
+
setFormError: setFormError,
|
|
143
|
+
nestedField: nestedField
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
formRef: formRef,
|
|
147
|
+
formError: realFormError,
|
|
148
|
+
check: check,
|
|
149
|
+
setFieldError: setFieldError,
|
|
150
|
+
onRemoveError: onRemoveError
|
|
151
|
+
};
|
|
152
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="lodash" />
|
|
2
|
-
export default function useFormValue(controlledValue: any,
|
|
2
|
+
export default function useFormValue(controlledValue: any, props: any): {
|
|
3
3
|
formValue: any;
|
|
4
4
|
setFormValue: (value: any) => void;
|
|
5
|
+
setFieldValue: (fieldName: string, fieldValue: any) => any;
|
|
5
6
|
onRemoveValue: (name: string) => import("lodash").Omit<any, string>;
|
|
6
7
|
};
|
|
@@ -1,13 +1,23 @@
|
|
|
1
1
|
'use client';
|
|
2
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
3
|
import { useRef, useCallback } from 'react';
|
|
3
4
|
import omit from 'lodash/omit';
|
|
5
|
+
import set from 'lodash/set';
|
|
4
6
|
import { useControlled } from '../../utils';
|
|
5
|
-
export default function useFormValue(controlledValue,
|
|
7
|
+
export default function useFormValue(controlledValue, props) {
|
|
8
|
+
var formDefaultValue = props.formDefaultValue,
|
|
9
|
+
nestedField = props.nestedField;
|
|
6
10
|
var _useControlled = useControlled(controlledValue, formDefaultValue),
|
|
7
11
|
formValue = _useControlled[0],
|
|
8
12
|
setFormValue = _useControlled[1];
|
|
9
13
|
var realFormValueRef = useRef(formValue);
|
|
10
14
|
realFormValueRef.current = formValue;
|
|
15
|
+
var setFieldValue = useCallback(function (fieldName, fieldValue) {
|
|
16
|
+
var _extends2;
|
|
17
|
+
var nextFormError = nestedField ? set(_extends({}, formValue), fieldName, fieldValue) : _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
|
|
18
|
+
setFormValue(nextFormError);
|
|
19
|
+
return nextFormError;
|
|
20
|
+
}, [formValue, nestedField, setFormValue]);
|
|
11
21
|
var onRemoveValue = useCallback(function (name) {
|
|
12
22
|
/**
|
|
13
23
|
* when this function is called when the children component is unmount,
|
|
@@ -21,6 +31,7 @@ export default function useFormValue(controlledValue, formDefaultValue) {
|
|
|
21
31
|
return {
|
|
22
32
|
formValue: formValue,
|
|
23
33
|
setFormValue: setFormValue,
|
|
34
|
+
setFieldValue: setFieldValue,
|
|
24
35
|
onRemoveValue: onRemoveValue
|
|
25
36
|
};
|
|
26
37
|
}
|
|
@@ -19,6 +19,11 @@ function useSchemaModel(formModel) {
|
|
|
19
19
|
var realSubRules = subRulesRef.current.filter(function (v) {
|
|
20
20
|
return Boolean(v.fieldRule.current);
|
|
21
21
|
});
|
|
22
|
+
|
|
23
|
+
// If there is no sub rule, return the original form model
|
|
24
|
+
if (realSubRules.length === 0) {
|
|
25
|
+
return formModel;
|
|
26
|
+
}
|
|
22
27
|
return SchemaModel.combine(formModel, SchemaModel(realSubRules.map(function (_ref) {
|
|
23
28
|
var _ref2;
|
|
24
29
|
var name = _ref.name,
|
package/esm/Form/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Form from './Form';
|
|
2
|
-
export type {
|
|
2
|
+
export type { FormProps } from './Form';
|
|
3
|
+
export type { FormInstance } from './hooks/useFormRef';
|
|
3
4
|
export type { FormGroupProps } from '../FormGroup';
|
|
4
5
|
export type { FormErrorMessageProps } from '../FormErrorMessage';
|
|
5
6
|
export type { FormControlLabelProps } from '../FormControlLabel';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import type { CheckType } from 'schema-typed';
|
|
2
3
|
import Input from '../Input';
|
|
3
4
|
import { TypeAttributes, FormControlBaseProps, WithAsProps } from '../@types/common';
|
|
4
|
-
import type { CheckType } from 'schema-typed';
|
|
5
5
|
/**
|
|
6
6
|
* Props that FormControl passes to its accepter
|
|
7
7
|
*/
|
|
@@ -5,17 +5,15 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
|
|
|
5
5
|
var _templateObject;
|
|
6
6
|
import React, { useContext } from 'react';
|
|
7
7
|
import PropTypes from 'prop-types';
|
|
8
|
-
import isUndefined from 'lodash/isUndefined';
|
|
9
|
-
import get from 'lodash/get';
|
|
10
|
-
import set from 'lodash/set';
|
|
11
8
|
import Input from '../Input';
|
|
12
9
|
import FormErrorMessage from '../FormErrorMessage';
|
|
13
10
|
import { useClassNames } from '../utils';
|
|
14
11
|
import FormContext, { FormValueContext } from '../Form/FormContext';
|
|
15
|
-
import {
|
|
12
|
+
import { useFormGroup } from '../FormGroup';
|
|
16
13
|
import { useWillUnmount, useEventCallback } from '../utils';
|
|
17
14
|
import { oneOf } from '../internals/propTypes';
|
|
18
|
-
import useRegisterModel from './useRegisterModel';
|
|
15
|
+
import useRegisterModel from './hooks/useRegisterModel';
|
|
16
|
+
import useField from './hooks/useField';
|
|
19
17
|
import Toggle from '../Toggle';
|
|
20
18
|
|
|
21
19
|
/**
|
|
@@ -37,8 +35,6 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
37
35
|
nestedField = _useContext.nestedField,
|
|
38
36
|
removeFieldValue = _useContext.removeFieldValue,
|
|
39
37
|
removeFieldError = _useContext.removeFieldError,
|
|
40
|
-
pushFieldRule = _useContext.pushFieldRule,
|
|
41
|
-
removeFieldRule = _useContext.removeFieldRule,
|
|
42
38
|
onFieldChange = _useContext.onFieldChange,
|
|
43
39
|
onFieldError = _useContext.onFieldError,
|
|
44
40
|
onFieldSuccess = _useContext.onFieldSuccess,
|
|
@@ -69,13 +65,17 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
69
65
|
_props$shouldResetWit = props.shouldResetWithUnmount,
|
|
70
66
|
shouldResetWithUnmount = _props$shouldResetWit === void 0 ? false : _props$shouldResetWit,
|
|
71
67
|
rule = props.rule,
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
68
|
+
id = props.id,
|
|
69
|
+
rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule", "id"]);
|
|
70
|
+
var _useFormGroup = useFormGroup(id),
|
|
71
|
+
controlId = _useFormGroup.controlId,
|
|
72
|
+
helpTextId = _useFormGroup.helpTextId,
|
|
73
|
+
labelId = _useFormGroup.labelId,
|
|
74
|
+
errorMessageId = _useFormGroup.errorMessageId;
|
|
75
75
|
if (!onFieldChange) {
|
|
76
76
|
throw new Error("\n <FormControl> must be inside a component decorated with <Form>.\n And need to update React to 16.6.0 +.\n ");
|
|
77
77
|
}
|
|
78
|
-
useRegisterModel(name,
|
|
78
|
+
useRegisterModel(name, rule);
|
|
79
79
|
useWillUnmount(function () {
|
|
80
80
|
if (shouldResetWithUnmount) {
|
|
81
81
|
removeFieldValue === null || removeFieldValue === void 0 ? void 0 : removeFieldValue(name);
|
|
@@ -84,80 +84,62 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
84
84
|
});
|
|
85
85
|
var trigger = checkTrigger || contextCheckTrigger;
|
|
86
86
|
var formValue = useContext(FormValueContext);
|
|
87
|
-
var
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
};
|
|
100
|
-
var getFieldError = function getFieldError(fieldName) {
|
|
101
|
-
if (nestedField) {
|
|
102
|
-
var _name = fieldName.includes('.') ? fieldName.replace('.', '.object.') + '.errorMessage' : fieldName;
|
|
103
|
-
return get(formError, _name);
|
|
104
|
-
}
|
|
105
|
-
return formError === null || formError === void 0 ? void 0 : formError[fieldName];
|
|
106
|
-
};
|
|
107
|
-
var fieldValue = getFieldValue(name);
|
|
87
|
+
var _useField = useField({
|
|
88
|
+
name: name,
|
|
89
|
+
errorMessage: errorMessage,
|
|
90
|
+
formValue: formValue,
|
|
91
|
+
formError: formError,
|
|
92
|
+
value: value,
|
|
93
|
+
nestedField: nestedField,
|
|
94
|
+
errorFromContext: errorFromContext
|
|
95
|
+
}),
|
|
96
|
+
fieldValue = _useField.fieldValue,
|
|
97
|
+
fieldError = _useField.fieldError,
|
|
98
|
+
setFieldValue = _useField.setFieldValue;
|
|
108
99
|
var _useClassNames = useClassNames(classPrefix),
|
|
109
100
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
110
101
|
prefix = _useClassNames.prefix;
|
|
111
102
|
var classes = withClassPrefix('wrapper');
|
|
112
103
|
var handleFieldChange = useEventCallback(function (value, event) {
|
|
113
|
-
|
|
104
|
+
if (trigger === 'change') {
|
|
105
|
+
handleFieldCheck(value);
|
|
106
|
+
}
|
|
114
107
|
onFieldChange === null || onFieldChange === void 0 ? void 0 : onFieldChange(name, value, event);
|
|
115
108
|
onChange === null || onChange === void 0 ? void 0 : onChange(value, event);
|
|
116
109
|
});
|
|
117
110
|
var handleFieldBlur = useEventCallback(function (event) {
|
|
118
|
-
|
|
111
|
+
if (trigger === 'blur') {
|
|
112
|
+
handleFieldCheck(fieldValue);
|
|
113
|
+
}
|
|
119
114
|
onBlur === null || onBlur === void 0 ? void 0 : onBlur(event);
|
|
120
115
|
});
|
|
121
|
-
var handleFieldCheck = useEventCallback(function (value
|
|
122
|
-
var checkFieldName = nestedField ? name.split('.')[0] : name;
|
|
116
|
+
var handleFieldCheck = useEventCallback(function (value) {
|
|
123
117
|
var callbackEvents = function callbackEvents(checkResult) {
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
118
|
+
if (checkResult.hasError) {
|
|
119
|
+
var _errorMessage = checkResult.errorMessage;
|
|
120
|
+
var _fieldError = nestedField ? checkResult : _errorMessage || checkResult;
|
|
121
|
+
onFieldError === null || onFieldError === void 0 ? void 0 : onFieldError(name, _fieldError);
|
|
122
|
+
} else {
|
|
123
|
+
onFieldSuccess === null || onFieldSuccess === void 0 ? void 0 : onFieldSuccess(name);
|
|
131
124
|
}
|
|
132
125
|
return checkResult;
|
|
133
126
|
};
|
|
134
127
|
var nextFormValue = setFieldValue(name, value);
|
|
135
128
|
var model = getCombinedModel();
|
|
129
|
+
var checkOptions = {
|
|
130
|
+
nestedObject: nestedField
|
|
131
|
+
};
|
|
136
132
|
if (checkAsync) {
|
|
137
|
-
return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(
|
|
133
|
+
return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue, checkOptions).then(function (checkResult) {
|
|
138
134
|
return callbackEvents(checkResult);
|
|
139
135
|
});
|
|
140
136
|
}
|
|
141
|
-
return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(
|
|
137
|
+
return Promise.resolve(callbackEvents(model === null || model === void 0 ? void 0 : model.checkForField(name, nextFormValue, checkOptions)));
|
|
142
138
|
});
|
|
143
|
-
var
|
|
144
|
-
if (!isUndefined(errorMessage)) {
|
|
145
|
-
messageNode = errorMessage;
|
|
146
|
-
} else if (errorFromContext) {
|
|
147
|
-
var fieldError = getFieldError(name);
|
|
148
|
-
if (typeof fieldError === 'string' || !(fieldError !== null && fieldError !== void 0 && fieldError.array) && !(fieldError !== null && fieldError !== void 0 && fieldError.object) && fieldError !== null && fieldError !== void 0 && fieldError.hasError) {
|
|
149
|
-
messageNode = fieldError;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
var ariaDescribedby = controlId ? controlId + "-help-text" : null;
|
|
153
|
-
var fieldHasError = Boolean(messageNode);
|
|
154
|
-
var ariaErrormessage = fieldHasError && controlId ? controlId + "-error-message" : undefined;
|
|
155
|
-
var valueKey = 'value';
|
|
139
|
+
var fieldHasError = Boolean(fieldError);
|
|
156
140
|
|
|
157
141
|
// Toggle component is a special case that uses `checked` and `defaultChecked` instead of `value` and `defaultValue` props.
|
|
158
|
-
|
|
159
|
-
valueKey = 'checked';
|
|
160
|
-
}
|
|
142
|
+
var valueKey = AccepterComponent === Toggle ? 'checked' : 'value';
|
|
161
143
|
var accepterProps = (_accepterProps = {}, _accepterProps[valueKey] = fieldValue === undefined ? defaultValue : fieldValue, _accepterProps);
|
|
162
144
|
return /*#__PURE__*/React.createElement(Component, {
|
|
163
145
|
className: classes,
|
|
@@ -165,10 +147,10 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
165
147
|
"data-testid": "form-control-wrapper"
|
|
166
148
|
}, /*#__PURE__*/React.createElement(AccepterComponent, _extends({
|
|
167
149
|
id: controlId,
|
|
168
|
-
"aria-labelledby":
|
|
169
|
-
"aria-describedby":
|
|
150
|
+
"aria-labelledby": labelId,
|
|
151
|
+
"aria-describedby": helpTextId,
|
|
170
152
|
"aria-invalid": fieldHasError || undefined,
|
|
171
|
-
"aria-errormessage":
|
|
153
|
+
"aria-errormessage": fieldHasError ? errorMessageId : undefined
|
|
172
154
|
}, accepterProps, rest, {
|
|
173
155
|
readOnly: readOnly,
|
|
174
156
|
plaintext: plaintext,
|
|
@@ -177,13 +159,13 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
177
159
|
onChange: handleFieldChange,
|
|
178
160
|
onBlur: handleFieldBlur
|
|
179
161
|
})), /*#__PURE__*/React.createElement(FormErrorMessage, {
|
|
180
|
-
id:
|
|
162
|
+
id: errorMessageId,
|
|
181
163
|
role: "alert",
|
|
182
164
|
"aria-relevant": "all",
|
|
183
165
|
show: fieldHasError,
|
|
184
166
|
className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["message-wrapper"]))),
|
|
185
167
|
placement: errorPlacement
|
|
186
|
-
},
|
|
168
|
+
}, fieldError));
|
|
187
169
|
});
|
|
188
170
|
FormControl.displayName = 'FormControl';
|
|
189
171
|
FormControl.propTypes = {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
interface FieldProps {
|
|
3
|
+
name: string;
|
|
4
|
+
formValue?: Record<string, any>;
|
|
5
|
+
formError?: Record<string, any>;
|
|
6
|
+
value: any;
|
|
7
|
+
nestedField: boolean;
|
|
8
|
+
errorMessage: React.ReactNode;
|
|
9
|
+
errorFromContext?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare function useField(props: FieldProps): {
|
|
12
|
+
fieldValue: any;
|
|
13
|
+
fieldError: any;
|
|
14
|
+
setFieldValue: (fieldName: string, fieldValue: any) => {
|
|
15
|
+
[x: string]: any;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export default useField;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
|
+
import { useCallback, useMemo } from 'react';
|
|
4
|
+
import get from 'lodash/get';
|
|
5
|
+
import set from 'lodash/set';
|
|
6
|
+
import { nameToPath } from '../utils';
|
|
7
|
+
function useField(props) {
|
|
8
|
+
var name = props.name,
|
|
9
|
+
formValue = props.formValue,
|
|
10
|
+
formError = props.formError,
|
|
11
|
+
value = props.value,
|
|
12
|
+
nestedField = props.nestedField,
|
|
13
|
+
errorMessage = props.errorMessage,
|
|
14
|
+
errorFromContext = props.errorFromContext;
|
|
15
|
+
var fieldValue = useMemo(function () {
|
|
16
|
+
if (typeof value !== 'undefined') {
|
|
17
|
+
return value;
|
|
18
|
+
}
|
|
19
|
+
return nestedField ? get(formValue, name) : formValue === null || formValue === void 0 ? void 0 : formValue[name];
|
|
20
|
+
}, [formValue, name, nestedField, value]);
|
|
21
|
+
var fieldError = useMemo(function () {
|
|
22
|
+
if (typeof errorMessage !== 'undefined' || !errorFromContext) {
|
|
23
|
+
return errorMessage;
|
|
24
|
+
}
|
|
25
|
+
if (nestedField) {
|
|
26
|
+
var _get;
|
|
27
|
+
return (_get = get(formError, nameToPath(name))) === null || _get === void 0 ? void 0 : _get.errorMessage;
|
|
28
|
+
}
|
|
29
|
+
var fieldError = formError === null || formError === void 0 ? void 0 : formError[name];
|
|
30
|
+
if (typeof fieldError === 'string') {
|
|
31
|
+
return fieldError;
|
|
32
|
+
}
|
|
33
|
+
return fieldError === null || fieldError === void 0 ? void 0 : fieldError.errorMessage;
|
|
34
|
+
}, [errorFromContext, errorMessage, formError, name, nestedField]);
|
|
35
|
+
var setFieldValue = useCallback(function (fieldName, fieldValue) {
|
|
36
|
+
var _extends2;
|
|
37
|
+
if (nestedField) {
|
|
38
|
+
return set(_extends({}, formValue), fieldName, fieldValue);
|
|
39
|
+
}
|
|
40
|
+
return _extends({}, formValue, (_extends2 = {}, _extends2[fieldName] = fieldValue, _extends2));
|
|
41
|
+
}, [formValue, nestedField]);
|
|
42
|
+
return {
|
|
43
|
+
fieldValue: fieldValue,
|
|
44
|
+
fieldError: fieldError,
|
|
45
|
+
setFieldValue: setFieldValue
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export default useField;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useRef, useEffect } from 'react';
|
|
3
|
+
import { useFormContext } from '../../Form/FormContext';
|
|
4
|
+
function useRegisterModel(name, rule) {
|
|
5
|
+
var _ref = useFormContext() || {},
|
|
6
|
+
pushFieldRule = _ref.pushFieldRule,
|
|
7
|
+
removeFieldRule = _ref.removeFieldRule;
|
|
8
|
+
var refRule = useRef(rule);
|
|
9
|
+
refRule.current = rule;
|
|
10
|
+
useEffect(function () {
|
|
11
|
+
pushFieldRule === null || pushFieldRule === void 0 ? void 0 : pushFieldRule(name, refRule);
|
|
12
|
+
return function () {
|
|
13
|
+
removeFieldRule === null || removeFieldRule === void 0 ? void 0 : removeFieldRule(name);
|
|
14
|
+
};
|
|
15
|
+
}, [name, pushFieldRule, removeFieldRule]);
|
|
16
|
+
}
|
|
17
|
+
export default useRegisterModel;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function nameToPath(name: string): string;
|
|
@@ -1,31 +1,35 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
3
3
|
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
|
|
4
|
-
import React
|
|
4
|
+
import React from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { useClassNames } from '../utils';
|
|
7
|
-
import {
|
|
7
|
+
import { useFormGroup } from '../FormGroup';
|
|
8
8
|
/**
|
|
9
9
|
* The `<Form.ControlLabel>` component renders a label with required indicator, for form controls.
|
|
10
10
|
* @see https://rsuitejs.com/components/form/
|
|
11
11
|
*/
|
|
12
12
|
var FormControlLabel = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
13
|
+
var _useFormGroup = useFormGroup(),
|
|
14
|
+
labelId = _useFormGroup.labelId,
|
|
15
|
+
controlId = _useFormGroup.controlId;
|
|
13
16
|
var _props$as = props.as,
|
|
14
17
|
Component = _props$as === void 0 ? 'label' : _props$as,
|
|
15
18
|
_props$classPrefix = props.classPrefix,
|
|
16
19
|
classPrefix = _props$classPrefix === void 0 ? 'form-control-label' : _props$classPrefix,
|
|
17
|
-
htmlFor = props.htmlFor,
|
|
20
|
+
_props$htmlFor = props.htmlFor,
|
|
21
|
+
htmlFor = _props$htmlFor === void 0 ? controlId : _props$htmlFor,
|
|
18
22
|
className = props.className,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
_props$id = props.id,
|
|
24
|
+
id = _props$id === void 0 ? labelId : _props$id,
|
|
25
|
+
rest = _objectWithoutPropertiesLoose(props, ["as", "classPrefix", "htmlFor", "className", "id"]);
|
|
22
26
|
var _useClassNames = useClassNames(classPrefix),
|
|
23
27
|
withClassPrefix = _useClassNames.withClassPrefix,
|
|
24
28
|
merge = _useClassNames.merge;
|
|
25
29
|
var classes = merge(className, withClassPrefix());
|
|
26
30
|
return /*#__PURE__*/React.createElement(Component, _extends({
|
|
27
|
-
id:
|
|
28
|
-
htmlFor: htmlFor
|
|
31
|
+
id: id,
|
|
32
|
+
htmlFor: htmlFor
|
|
29
33
|
}, rest, {
|
|
30
34
|
ref: ref,
|
|
31
35
|
className: classes
|
|
@@ -29,10 +29,7 @@ var FormErrorMessage = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
29
29
|
merge = _useClassNames.merge;
|
|
30
30
|
var classes = withClassPrefix('show');
|
|
31
31
|
var wrapperClasses = merge(className, prefix('wrapper', (_prefix = {}, _prefix["placement-" + kebabCase(placementPolyfill(placement))] = placement, _prefix)));
|
|
32
|
-
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
return /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
|
|
32
|
+
return show ? /*#__PURE__*/React.createElement(Component, _extends({}, rest, {
|
|
36
33
|
ref: ref,
|
|
37
34
|
className: wrapperClasses
|
|
38
35
|
}), /*#__PURE__*/React.createElement("span", {
|
|
@@ -41,7 +38,7 @@ var FormErrorMessage = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
41
38
|
className: prefix(_templateObject || (_templateObject = _taggedTemplateLiteralLoose(["arrow"])))
|
|
42
39
|
}), /*#__PURE__*/React.createElement("span", {
|
|
43
40
|
className: prefix(_templateObject2 || (_templateObject2 = _taggedTemplateLiteralLoose(["inner"])))
|
|
44
|
-
}, children)));
|
|
41
|
+
}, children))) : null;
|
|
45
42
|
});
|
|
46
43
|
FormErrorMessage.displayName = 'FormErrorMessage';
|
|
47
44
|
FormErrorMessage.propTypes = {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
1
|
import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
|
|
3
2
|
export interface FormGroupProps extends WithAsProps {
|
|
4
3
|
/**
|
|
@@ -7,9 +6,24 @@ export interface FormGroupProps extends WithAsProps {
|
|
|
7
6
|
*/
|
|
8
7
|
controlId?: string;
|
|
9
8
|
}
|
|
10
|
-
export declare const
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
export declare const useFormGroup: (controlId?: string) => {
|
|
10
|
+
/**
|
|
11
|
+
* The `id` of the `<Form.Control>` component.
|
|
12
|
+
*/
|
|
13
|
+
controlId: string;
|
|
14
|
+
/**
|
|
15
|
+
* The `id` of the `<Form.HelpText>` component.
|
|
16
|
+
*/
|
|
17
|
+
helpTextId: string;
|
|
18
|
+
/**
|
|
19
|
+
* The `id` of the `<Form.ControlLabel>` component.
|
|
20
|
+
*/
|
|
21
|
+
labelId: string;
|
|
22
|
+
/**
|
|
23
|
+
* The `id` of the `<Form.ErrorMessage>` component.
|
|
24
|
+
*/
|
|
25
|
+
errorMessageId: string;
|
|
26
|
+
};
|
|
13
27
|
/**
|
|
14
28
|
* The `<Form.Group>` component is the easiest way to add some structure to forms.
|
|
15
29
|
* @see https://rsuitejs.com/components/form/
|
|
@@ -4,7 +4,33 @@ import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWith
|
|
|
4
4
|
import React, { useMemo } from 'react';
|
|
5
5
|
import PropTypes from 'prop-types';
|
|
6
6
|
import { useClassNames, useUniqueId } from '../utils';
|
|
7
|
-
|
|
7
|
+
var FormGroupContext = /*#__PURE__*/React.createContext({});
|
|
8
|
+
export var useFormGroup = function useFormGroup(controlId) {
|
|
9
|
+
var context = React.useContext(FormGroupContext);
|
|
10
|
+
var fallbackId = useUniqueId('rs-');
|
|
11
|
+
var id = controlId || context.controlId || fallbackId;
|
|
12
|
+
var helpTextId = id + "-help-text";
|
|
13
|
+
var labelId = id + "-label";
|
|
14
|
+
var errorMessageId = id + "-error-message";
|
|
15
|
+
return {
|
|
16
|
+
/**
|
|
17
|
+
* The `id` of the `<Form.Control>` component.
|
|
18
|
+
*/
|
|
19
|
+
controlId: id,
|
|
20
|
+
/**
|
|
21
|
+
* The `id` of the `<Form.HelpText>` component.
|
|
22
|
+
*/
|
|
23
|
+
helpTextId: helpTextId,
|
|
24
|
+
/**
|
|
25
|
+
* The `id` of the `<Form.ControlLabel>` component.
|
|
26
|
+
*/
|
|
27
|
+
labelId: labelId,
|
|
28
|
+
/**
|
|
29
|
+
* The `id` of the `<Form.ErrorMessage>` component.
|
|
30
|
+
*/
|
|
31
|
+
errorMessageId: errorMessageId
|
|
32
|
+
};
|
|
33
|
+
};
|
|
8
34
|
|
|
9
35
|
/**
|
|
10
36
|
* The `<Form.Group>` component is the easiest way to add some structure to forms.
|