rsuite 5.59.0 → 5.59.2

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.
Files changed (181) hide show
  1. package/AvatarGroup/styles/index.css +2 -0
  2. package/AvatarGroup/styles/index.less +2 -0
  3. package/CHANGELOG.md +26 -0
  4. package/CheckPicker/styles/index.css +2 -0
  5. package/CheckTree/styles/index.css +2 -0
  6. package/CheckTreePicker/styles/index.css +2 -0
  7. package/Checkbox/styles/index.css +2 -0
  8. package/Checkbox/styles/index.less +2 -0
  9. package/DateRangePicker/styles/index.css +27 -0
  10. package/DateRangePicker/styles/index.less +27 -0
  11. package/MultiCascadeTree/styles/index.css +2 -0
  12. package/MultiCascader/styles/index.css +2 -0
  13. package/Placeholder/styles/index.css +42 -6
  14. package/Placeholder/styles/index.less +18 -9
  15. package/Placeholder/styles/mixin.less +7 -0
  16. package/Sidenav/styles/index.css +3 -0
  17. package/Sidenav/styles/index.less +4 -0
  18. package/TagInput/styles/index.css +2 -0
  19. package/TagPicker/styles/index.css +2 -0
  20. package/cjs/@types/common.d.ts +1 -1
  21. package/cjs/Avatar/Avatar.js +16 -8
  22. package/cjs/Avatar/useImage.js +0 -1
  23. package/cjs/AvatarGroup/AvatarGroup.d.ts +1 -0
  24. package/cjs/AvatarGroup/AvatarGroup.js +12 -12
  25. package/cjs/Calendar/CalendarContainer.js +4 -4
  26. package/cjs/Checkbox/Checkbox.js +1 -1
  27. package/cjs/DatePicker/DatePicker.d.ts +3 -38
  28. package/cjs/DatePicker/DatePicker.js +86 -137
  29. package/cjs/DatePicker/PredefinedRanges.d.ts +1 -1
  30. package/cjs/DatePicker/PredefinedRanges.js +3 -3
  31. package/cjs/DatePicker/Toolbar.d.ts +1 -1
  32. package/cjs/DatePicker/Toolbar.js +13 -12
  33. package/cjs/DatePicker/hooks/useFocus.d.ts +13 -0
  34. package/cjs/DatePicker/hooks/useFocus.js +96 -0
  35. package/cjs/DatePicker/hooks/useMonthView.d.ts +10 -0
  36. package/cjs/DatePicker/hooks/useMonthView.js +28 -0
  37. package/cjs/DatePicker/index.d.ts +2 -1
  38. package/cjs/DatePicker/types.d.ts +37 -0
  39. package/cjs/DatePicker/utils.d.ts +9 -0
  40. package/cjs/DatePicker/utils.js +20 -2
  41. package/cjs/DateRangePicker/DateRangePicker.d.ts +15 -3
  42. package/cjs/DateRangePicker/DateRangePicker.js +58 -68
  43. package/cjs/DateRangePicker/DateRangePickerContext.d.ts +4 -1
  44. package/cjs/DateRangePicker/DateRangePickerContext.js +4 -4
  45. package/cjs/DateRangePicker/Header.d.ts +11 -0
  46. package/cjs/DateRangePicker/Header.js +65 -0
  47. package/cjs/DateRangePicker/disabledDateUtils.d.ts +1 -1
  48. package/cjs/DateRangePicker/disabledDateUtils.js +1 -1
  49. package/cjs/DateRangePicker/index.js +5 -0
  50. package/cjs/Form/Form.d.ts +56 -39
  51. package/cjs/Form/Form.js +70 -208
  52. package/cjs/Form/FormContext.d.ts +13 -10
  53. package/cjs/Form/FormContext.js +11 -5
  54. package/cjs/Form/{useFormClassNames.d.ts → hooks/useFormClassNames.d.ts} +2 -2
  55. package/cjs/Form/{useFormClassNames.js → hooks/useFormClassNames.js} +2 -2
  56. package/cjs/Form/hooks/useFormRef.d.ts +55 -0
  57. package/cjs/Form/hooks/useFormRef.js +45 -0
  58. package/cjs/Form/hooks/useFormValidate.d.ts +19 -0
  59. package/cjs/Form/hooks/useFormValidate.js +157 -0
  60. package/cjs/Form/hooks/useFormValue.d.ts +7 -0
  61. package/cjs/Form/hooks/useFormValue.js +42 -0
  62. package/cjs/Form/{useSchemaModel.js → hooks/useSchemaModel.js} +5 -0
  63. package/cjs/Form/index.d.ts +3 -2
  64. package/cjs/Form/index.js +3 -9
  65. package/cjs/FormControl/FormControl.d.ts +1 -1
  66. package/cjs/FormControl/FormControl.js +51 -69
  67. package/cjs/FormControl/hooks/useField.d.ts +18 -0
  68. package/cjs/FormControl/hooks/useField.js +54 -0
  69. package/cjs/FormControl/hooks/useRegisterModel.d.ts +3 -0
  70. package/cjs/FormControl/hooks/useRegisterModel.js +22 -0
  71. package/cjs/FormControl/utils.d.ts +1 -0
  72. package/cjs/FormControl/utils.js +8 -0
  73. package/cjs/FormControlLabel/FormControlLabel.js +12 -9
  74. package/cjs/FormErrorMessage/FormErrorMessage.js +2 -5
  75. package/cjs/FormGroup/FormGroup.d.ts +18 -4
  76. package/cjs/FormGroup/FormGroup.js +28 -2
  77. package/cjs/FormGroup/index.d.ts +1 -0
  78. package/cjs/FormGroup/index.js +4 -3
  79. package/cjs/FormHelpText/FormHelpText.d.ts +2 -1
  80. package/cjs/FormHelpText/FormHelpText.js +16 -9
  81. package/cjs/Input/Input.js +4 -5
  82. package/cjs/Placeholder/PlaceholderGraph.d.ts +13 -1
  83. package/cjs/Placeholder/PlaceholderGrid.d.ts +27 -1
  84. package/cjs/Placeholder/PlaceholderGrid.js +10 -13
  85. package/cjs/Placeholder/PlaceholderParagraph.d.ts +24 -1
  86. package/cjs/Placeholder/PlaceholderParagraph.js +13 -9
  87. package/cjs/utils/dateUtils.d.ts +72 -10
  88. package/cjs/utils/dateUtils.js +88 -29
  89. package/dist/rsuite-no-reset-rtl.css +76 -6
  90. package/dist/rsuite-no-reset-rtl.min.css +1 -1
  91. package/dist/rsuite-no-reset-rtl.min.css.map +1 -1
  92. package/dist/rsuite-no-reset.css +76 -6
  93. package/dist/rsuite-no-reset.min.css +1 -1
  94. package/dist/rsuite-no-reset.min.css.map +1 -1
  95. package/dist/rsuite-rtl.css +76 -6
  96. package/dist/rsuite-rtl.min.css +1 -1
  97. package/dist/rsuite-rtl.min.css.map +1 -1
  98. package/dist/rsuite.css +76 -6
  99. package/dist/rsuite.js +221 -57
  100. package/dist/rsuite.js.map +1 -1
  101. package/dist/rsuite.min.css +1 -1
  102. package/dist/rsuite.min.css.map +1 -1
  103. package/dist/rsuite.min.js +1 -1
  104. package/dist/rsuite.min.js.LICENSE.txt +35 -0
  105. package/dist/rsuite.min.js.map +1 -1
  106. package/esm/@types/common.d.ts +1 -1
  107. package/esm/Avatar/Avatar.js +12 -4
  108. package/esm/Avatar/useImage.js +0 -1
  109. package/esm/AvatarGroup/AvatarGroup.d.ts +1 -0
  110. package/esm/AvatarGroup/AvatarGroup.js +12 -12
  111. package/esm/Calendar/CalendarContainer.js +5 -5
  112. package/esm/Checkbox/Checkbox.js +1 -1
  113. package/esm/DatePicker/DatePicker.d.ts +3 -38
  114. package/esm/DatePicker/DatePicker.js +88 -139
  115. package/esm/DatePicker/PredefinedRanges.d.ts +1 -1
  116. package/esm/DatePicker/PredefinedRanges.js +3 -3
  117. package/esm/DatePicker/Toolbar.d.ts +1 -1
  118. package/esm/DatePicker/Toolbar.js +13 -12
  119. package/esm/DatePicker/hooks/useFocus.d.ts +13 -0
  120. package/esm/DatePicker/hooks/useFocus.js +90 -0
  121. package/esm/DatePicker/hooks/useMonthView.d.ts +10 -0
  122. package/esm/DatePicker/hooks/useMonthView.js +22 -0
  123. package/esm/DatePicker/index.d.ts +2 -1
  124. package/esm/DatePicker/types.d.ts +37 -0
  125. package/esm/DatePicker/utils.d.ts +9 -0
  126. package/esm/DatePicker/utils.js +18 -2
  127. package/esm/DateRangePicker/DateRangePicker.d.ts +15 -3
  128. package/esm/DateRangePicker/DateRangePicker.js +61 -71
  129. package/esm/DateRangePicker/DateRangePickerContext.d.ts +4 -1
  130. package/esm/DateRangePicker/DateRangePickerContext.js +2 -2
  131. package/esm/DateRangePicker/Header.d.ts +11 -0
  132. package/esm/DateRangePicker/Header.js +59 -0
  133. package/esm/DateRangePicker/disabledDateUtils.d.ts +1 -1
  134. package/esm/DateRangePicker/disabledDateUtils.js +1 -1
  135. package/esm/DateRangePicker/index.js +4 -0
  136. package/esm/Form/Form.d.ts +56 -39
  137. package/esm/Form/Form.js +68 -205
  138. package/esm/Form/FormContext.d.ts +13 -10
  139. package/esm/Form/FormContext.js +6 -2
  140. package/esm/Form/{useFormClassNames.d.ts → hooks/useFormClassNames.d.ts} +2 -2
  141. package/esm/Form/{useFormClassNames.js → hooks/useFormClassNames.js} +2 -2
  142. package/esm/Form/hooks/useFormRef.d.ts +55 -0
  143. package/esm/Form/hooks/useFormRef.js +40 -0
  144. package/esm/Form/hooks/useFormValidate.d.ts +19 -0
  145. package/esm/Form/hooks/useFormValidate.js +152 -0
  146. package/esm/Form/hooks/useFormValue.d.ts +7 -0
  147. package/esm/Form/hooks/useFormValue.js +37 -0
  148. package/esm/Form/{useSchemaModel.js → hooks/useSchemaModel.js} +5 -0
  149. package/esm/Form/index.d.ts +3 -2
  150. package/esm/Form/index.js +1 -1
  151. package/esm/FormControl/FormControl.d.ts +1 -1
  152. package/esm/FormControl/FormControl.js +49 -67
  153. package/esm/FormControl/hooks/useField.d.ts +18 -0
  154. package/esm/FormControl/hooks/useField.js +48 -0
  155. package/esm/FormControl/hooks/useRegisterModel.d.ts +3 -0
  156. package/esm/FormControl/hooks/useRegisterModel.js +17 -0
  157. package/esm/FormControl/utils.d.ts +1 -0
  158. package/esm/FormControl/utils.js +4 -0
  159. package/esm/FormControlLabel/FormControlLabel.js +12 -8
  160. package/esm/FormErrorMessage/FormErrorMessage.js +2 -5
  161. package/esm/FormGroup/FormGroup.d.ts +18 -4
  162. package/esm/FormGroup/FormGroup.js +27 -1
  163. package/esm/FormGroup/index.d.ts +1 -0
  164. package/esm/FormGroup/index.js +1 -0
  165. package/esm/FormHelpText/FormHelpText.d.ts +2 -1
  166. package/esm/FormHelpText/FormHelpText.js +17 -9
  167. package/esm/Input/Input.js +4 -5
  168. package/esm/Placeholder/PlaceholderGraph.d.ts +13 -1
  169. package/esm/Placeholder/PlaceholderGrid.d.ts +27 -1
  170. package/esm/Placeholder/PlaceholderGrid.js +10 -13
  171. package/esm/Placeholder/PlaceholderParagraph.d.ts +24 -1
  172. package/esm/Placeholder/PlaceholderParagraph.js +12 -8
  173. package/esm/utils/dateUtils.d.ts +72 -10
  174. package/esm/utils/dateUtils.js +86 -28
  175. package/package.json +2 -2
  176. package/cjs/FormControl/useRegisterModel.d.ts +0 -4
  177. package/cjs/FormControl/useRegisterModel.js +0 -18
  178. package/esm/FormControl/useRegisterModel.d.ts +0 -4
  179. package/esm/FormControl/useRegisterModel.js +0 -13
  180. /package/cjs/Form/{useSchemaModel.d.ts → hooks/useSchemaModel.d.ts} +0 -0
  181. /package/esm/Form/{useSchemaModel.d.ts → hooks/useSchemaModel.d.ts} +0 -0
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ interface HeaderProps {
3
+ formatStr: string;
4
+ character: string;
5
+ value: Date[] | null;
6
+ activeKey?: 'start' | 'end';
7
+ onSelect?: (eventKey: 'start' | 'end') => void;
8
+ clickable?: boolean;
9
+ }
10
+ declare function Header(props: HeaderProps): JSX.Element;
11
+ export default Header;
@@ -0,0 +1,59 @@
1
+ 'use client';
2
+ import React from 'react';
3
+ import { useClassNames } from '../utils';
4
+ import { compareAsc } from '../utils/dateUtils';
5
+ import { FormattedDate } from '../CustomProvider';
6
+ import Button from '../Button';
7
+ function Header(props) {
8
+ var _prefix;
9
+ var _useClassNames = useClassNames('picker'),
10
+ prefix = _useClassNames.prefix;
11
+ var formatStr = props.formatStr,
12
+ character = props.character,
13
+ value = props.value,
14
+ _props$activeKey = props.activeKey,
15
+ activeKey = _props$activeKey === void 0 ? 'start' : _props$activeKey,
16
+ clickable = props.clickable,
17
+ onSelect = props.onSelect;
18
+ var _ref = value !== null && value !== void 0 ? value : [null, null],
19
+ startDate = _ref[0],
20
+ endDate = _ref[1];
21
+ var v = startDate && endDate ? [startDate, endDate].sort(compareAsc) : [startDate, endDate];
22
+ var start = v[0] ? /*#__PURE__*/React.createElement(FormattedDate, {
23
+ date: v[0],
24
+ formatStr: formatStr
25
+ }) : formatStr;
26
+ var end = v[1] ? /*#__PURE__*/React.createElement(FormattedDate, {
27
+ date: v[1],
28
+ formatStr: formatStr
29
+ }) : formatStr;
30
+ return /*#__PURE__*/React.createElement("div", {
31
+ className: prefix('daterange-header', (_prefix = {}, _prefix["tab-active-" + activeKey] = clickable, _prefix)),
32
+ "data-testid": "daterange-header"
33
+ }, clickable ? /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Button, {
34
+ size: "xs",
35
+ appearance: "subtle",
36
+ className: prefix('header-date'),
37
+ onClick: function onClick() {
38
+ return onSelect === null || onSelect === void 0 ? void 0 : onSelect('start');
39
+ },
40
+ "aria-label": "Select start date"
41
+ }, start), /*#__PURE__*/React.createElement("span", {
42
+ className: prefix('header-character')
43
+ }, character), /*#__PURE__*/React.createElement(Button, {
44
+ size: "xs",
45
+ appearance: "subtle",
46
+ className: prefix('header-date'),
47
+ onClick: function onClick() {
48
+ return onSelect === null || onSelect === void 0 ? void 0 : onSelect('end');
49
+ },
50
+ "aria-label": "Select end date"
51
+ }, end)) : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("span", {
52
+ className: prefix('header-date')
53
+ }, start), /*#__PURE__*/React.createElement("span", {
54
+ className: prefix('header-character')
55
+ }, character), /*#__PURE__*/React.createElement("span", {
56
+ className: prefix('header-date')
57
+ }, end)));
58
+ }
59
+ export default Header;
@@ -4,7 +4,7 @@ import { DisabledDateFunction } from './types';
4
4
  */
5
5
  export declare function allowedMaxDays(days: number): DisabledDateFunction;
6
6
  /**
7
- Only allowed days are specified, other dates are disabled.
7
+ * Only allowed days are specified, other dates are disabled.
8
8
  */
9
9
  export declare function allowedDays(days: number): DisabledDateFunction;
10
10
  /**
@@ -35,7 +35,7 @@ export function allowedMaxDays(days) {
35
35
  }
36
36
 
37
37
  /**
38
- Only allowed days are specified, other dates are disabled.
38
+ * Only allowed days are specified, other dates are disabled.
39
39
  */
40
40
  export function allowedDays(days) {
41
41
  return function (date, selectValue, selectedDone, target) {
@@ -1,3 +1,7 @@
1
1
  'use client';
2
2
  import DateRangePicker from './DateRangePicker';
3
+ import * as utils from './disabledDateUtils';
4
+ Object.keys(utils).forEach(function (key) {
5
+ DateRangePicker[key] = utils[key];
6
+ });
3
7
  export default DateRangePicker;
@@ -1,36 +1,64 @@
1
1
  import React from 'react';
2
2
  import { Schema } from 'schema-typed';
3
- import type { CheckResult } from 'schema-typed';
4
3
  import FormControl from '../FormControl';
5
4
  import FormControlLabel from '../FormControlLabel';
6
5
  import FormErrorMessage from '../FormErrorMessage';
7
6
  import FormGroup from '../FormGroup';
8
7
  import FormHelpText from '../FormHelpText';
9
8
  import { WithAsProps, TypeAttributes, RsRefForwardingComponent } from '../@types/common';
9
+ import { FormInstance } from './hooks/useFormRef';
10
10
  export interface FormProps<T = Record<string, any>, errorMsgType = any, E = {
11
11
  [P in keyof T]?: errorMsgType;
12
12
  }> extends WithAsProps, Omit<React.FormHTMLAttributes<HTMLFormElement>, 'onChange' | 'onSubmit' | 'onError'> {
13
- /** Set the left and right columns of the layout of the elements within the form */
13
+ /**
14
+ * Set the left and right columns of the layout of the elements within the form。
15
+ *
16
+ * @default 'vertical'
17
+ */
14
18
  layout?: 'horizontal' | 'vertical' | 'inline';
15
- /** The fluid property allows the Input 100% of the form to fill the container, valid only in vertical layouts. */
19
+ /**
20
+ * The fluid property allows the Input 100% of the form to fill the container, valid only in vertical layouts.
21
+ */
16
22
  fluid?: boolean;
17
- /** Current value of the input. Creates a controlled component */
18
- formValue?: T;
19
- /** Initial value */
20
- formDefaultValue?: T;
21
- /** Error message of form */
22
- formError?: E;
23
- /** Trigger the type of form validation */
23
+ /**
24
+ * Current value of the input. Creates a controlled component
25
+ */
26
+ formValue?: T | null;
27
+ /**
28
+ * Initial value
29
+ */
30
+ formDefaultValue?: T | null;
31
+ /**
32
+ * Error message of form
33
+ */
34
+ formError?: E | null;
35
+ /**
36
+ * Trigger the type of form validation.
37
+ *
38
+ * @default 'change'
39
+ */
24
40
  checkTrigger?: TypeAttributes.CheckTrigger;
25
- /** SchemaModel object */
41
+ /**
42
+ * SchemaModel object
43
+ *
44
+ * @see https://github.com/rsuite/schema-typed
45
+ */
26
46
  model?: Schema;
27
- /** Make the form readonly */
47
+ /**
48
+ * Make the form readonly
49
+ */
28
50
  readOnly?: boolean;
29
- /** Render the form as plain text */
51
+ /**
52
+ * Render the form as plain text
53
+ */
30
54
  plaintext?: boolean;
31
- /** Disable the form. */
55
+ /**
56
+ * Disable the form
57
+ */
32
58
  disabled?: boolean;
33
- /** The error message comes from context */
59
+ /**
60
+ * The error message comes from context
61
+ */
34
62
  errorFromContext?: boolean;
35
63
  /**
36
64
  * The form data is nested.
@@ -46,33 +74,22 @@ export interface FormProps<T = Record<string, any>, errorMsgType = any, E = {
46
74
  * ```
47
75
  */
48
76
  nestedField?: boolean;
49
- /** Callback fired when data changing */
77
+ /**
78
+ * Callback fired when data changing
79
+ */
50
80
  onChange?: (formValue: T, event?: React.SyntheticEvent) => void;
51
- /** Callback fired when error checking */
81
+ /**
82
+ * Callback fired when error checking
83
+ */
52
84
  onError?: (formError: E) => void;
53
- /** Callback fired when data cheking */
85
+ /**
86
+ * Callback fired when data cheking
87
+ */
54
88
  onCheck?: (formError: E) => void;
55
- /** Callback fired when form submit */
56
- onSubmit?: (checkStatus: boolean, event: React.FormEvent<HTMLFormElement>) => void;
57
- }
58
- export interface FormInstance<T = Record<string, any>, errorMsg = string, E = {
59
- [P in keyof T]?: errorMsg;
60
- }> {
61
- root: HTMLFormElement | null;
62
- /** Verify form data */
63
- check: (callback?: (formError: E) => void) => boolean;
64
- /** Asynchronously check form data */
65
- checkAsync: () => Promise<any>;
66
- /** Check the data field */
67
- checkForField: (fieldName: keyof T, callback?: (checkResult: CheckResult<errorMsg>) => void) => boolean;
68
- /** Asynchronous verification as a data field */
69
- checkForFieldAsync: (fieldName: keyof T) => Promise<CheckResult>;
70
- /** Clear all error messages */
71
- cleanErrors: (callback?: () => void) => void;
72
- /** Clear the error message of the specified field */
73
- cleanErrorForField: (fieldName: keyof E, callback?: () => void) => void;
74
- /** All error messages are reset, and an initial value can be set */
75
- resetErrors: (formError: E, callback?: () => void) => void;
89
+ /**
90
+ * Callback fired when form submit
91
+ */
92
+ onSubmit?: (checkPassed: boolean, event: React.FormEvent<HTMLFormElement>) => void;
76
93
  }
77
94
  export interface FormComponent extends RsRefForwardingComponent<'form', FormProps & {
78
95
  ref?: React.Ref<FormInstance>;
package/esm/Form/Form.js CHANGED
@@ -1,21 +1,23 @@
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, { useMemo, useImperativeHandle, useRef } from 'react';
4
+ import React from 'react';
5
5
  import PropTypes from 'prop-types';
6
- import omit from 'lodash/omit';
7
- import set from 'lodash/set';
8
6
  import { SchemaModel } from 'schema-typed';
9
- import FormContext, { FormValueContext } from './FormContext';
7
+ import { FormValueProvider, FormProvider } from './FormContext';
10
8
  import FormControl from '../FormControl';
11
9
  import FormControlLabel from '../FormControlLabel';
12
10
  import FormErrorMessage from '../FormErrorMessage';
13
11
  import FormGroup from '../FormGroup';
14
12
  import FormHelpText from '../FormHelpText';
15
- import { useFormClassNames } from './useFormClassNames';
16
- import useSchemaModel from './useSchemaModel';
17
- import { useControlled, useEventCallback } from '../utils';
13
+ import { useEventCallback } from '../utils';
18
14
  import { oneOf } from '../internals/propTypes';
15
+ import useSchemaModel from './hooks/useSchemaModel';
16
+ import useFormValidate from './hooks/useFormValidate';
17
+ import useFormValue from './hooks/useFormValue';
18
+ import useFormClassNames from './hooks/useFormClassNames';
19
+ var defaultSchema = SchemaModel({});
20
+
19
21
  /**
20
22
  * The `Form` component is a form interface for collecting and validating user input.
21
23
  * @see https://rsuitejs.com/components/form
@@ -29,15 +31,15 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
29
31
  errorFromContext = _props$errorFromConte === void 0 ? true : _props$errorFromConte,
30
32
  _props$formDefaultVal = props.formDefaultValue,
31
33
  formDefaultValue = _props$formDefaultVal === void 0 ? {} : _props$formDefaultVal,
32
- formValue = props.formValue,
33
- formError = props.formError,
34
+ controlledFormValue = props.formValue,
35
+ controlledFormError = props.formError,
34
36
  fluid = props.fluid,
35
37
  _props$nestedField = props.nestedField,
36
38
  nestedField = _props$nestedField === void 0 ? false : _props$nestedField,
37
39
  _props$layout = props.layout,
38
40
  layout = _props$layout === void 0 ? 'vertical' : _props$layout,
39
41
  _props$model = props.model,
40
- formModel = _props$model === void 0 ? SchemaModel({}) : _props$model,
42
+ formModel = _props$model === void 0 ? defaultSchema : _props$model,
41
43
  readOnly = props.readOnly,
42
44
  plaintext = props.plaintext,
43
45
  className = props.className,
@@ -52,6 +54,27 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
52
54
  getCombinedModel = _useSchemaModel.getCombinedModel,
53
55
  pushFieldRule = _useSchemaModel.pushFieldRule,
54
56
  removeFieldRule = _useSchemaModel.removeFieldRule;
57
+ var _useFormValue = useFormValue(controlledFormValue, {
58
+ formDefaultValue: formDefaultValue,
59
+ nestedField: nestedField
60
+ }),
61
+ formValue = _useFormValue.formValue,
62
+ onRemoveValue = _useFormValue.onRemoveValue,
63
+ setFieldValue = _useFormValue.setFieldValue;
64
+ var formValidateProps = {
65
+ ref: ref,
66
+ formValue: formValue,
67
+ getCombinedModel: getCombinedModel,
68
+ onCheck: onCheck,
69
+ onError: onError,
70
+ nestedField: nestedField
71
+ };
72
+ var _useFormValidate = useFormValidate(controlledFormError, formValidateProps),
73
+ formError = _useFormValidate.formError,
74
+ setFieldError = _useFormValidate.setFieldError,
75
+ onRemoveError = _useFormValidate.onRemoveError,
76
+ check = _useFormValidate.check,
77
+ formRef = _useFormValidate.formRef;
55
78
  var classes = useFormClassNames({
56
79
  classPrefix: classPrefix,
57
80
  className: className,
@@ -61,218 +84,58 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
61
84
  plaintext: plaintext,
62
85
  disabled: disabled
63
86
  });
64
- var _useControlled = useControlled(formValue, formDefaultValue),
65
- realFormValue = _useControlled[0],
66
- setFormValue = _useControlled[1];
67
- var _useControlled2 = useControlled(formError, {}),
68
- realFormError = _useControlled2[0],
69
- setFormError = _useControlled2[1];
70
- var realFormValueRef = useRef(realFormValue);
71
- realFormValueRef.current = realFormValue;
72
- var realFormErrorRef = useRef(realFormError);
73
- realFormErrorRef.current = realFormError;
74
-
75
- /**
76
- * Validate the form data and return a boolean.
77
- * The error message after verification is returned in the callback.
78
- * @param callback
79
- */
80
- var check = useEventCallback(function (callback) {
81
- var formValue = realFormValue || {};
82
- var formError = {};
83
- var errorCount = 0;
84
- var model = getCombinedModel();
85
- Object.keys(model.spec).forEach(function (key) {
86
- var checkResult = model.checkForField(key, formValue);
87
- if (checkResult.hasError === true) {
88
- errorCount += 1;
89
- formError[key] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult;
90
- }
91
- });
92
- setFormError(formError);
93
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
94
- callback === null || callback === void 0 ? void 0 : callback(formError);
95
- if (errorCount > 0) {
96
- onError === null || onError === void 0 ? void 0 : onError(formError);
97
- return false;
98
- }
99
- return true;
100
- });
101
-
102
- /**
103
- * Check the data field
104
- * @param fieldName
105
- * @param callback
106
- */
107
- var checkForField = useEventCallback(function (fieldName, callback) {
108
- var _extends2;
109
- var formValue = realFormValue || {};
110
- var model = getCombinedModel();
111
- var checkResult = model.checkForField(fieldName, formValue);
112
- var formError = _extends({}, realFormError, (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
113
- setFormError(formError);
114
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
115
- callback === null || callback === void 0 ? void 0 : callback(checkResult);
116
- if (checkResult.hasError) {
117
- onError === null || onError === void 0 ? void 0 : onError(formError);
118
- }
119
- return !checkResult.hasError;
120
- });
121
-
122
- /**
123
- * Check form data asynchronously and return a Promise
124
- */
125
- var checkAsync = useEventCallback(function () {
126
- var formValue = realFormValue || {};
127
- var promises = [];
128
- var keys = [];
129
- var model = getCombinedModel();
130
- Object.keys(model.spec).forEach(function (key) {
131
- keys.push(key);
132
- promises.push(model.checkForFieldAsync(key, formValue));
133
- });
134
- return Promise.all(promises).then(function (values) {
135
- var formError = {};
136
- var errorCount = 0;
137
- for (var i = 0; i < values.length; i++) {
138
- if (values[i].hasError) {
139
- errorCount += 1;
140
- formError[keys[i]] = values[i].errorMessage;
141
- }
142
- }
143
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
144
- setFormError(formError);
145
- if (errorCount > 0) {
146
- onError === null || onError === void 0 ? void 0 : onError(formError);
147
- }
148
- return {
149
- hasError: errorCount > 0,
150
- formError: formError
151
- };
152
- });
153
- });
154
-
155
- /**
156
- * Asynchronously check form fields and return Promise
157
- * @param fieldName
158
- */
159
- var checkForFieldAsync = useEventCallback(function (fieldName) {
160
- var formValue = realFormValue || {};
161
- var model = getCombinedModel();
162
- return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
163
- var _extends3;
164
- var formError = _extends({}, realFormError, (_extends3 = {}, _extends3[fieldName] = checkResult.errorMessage, _extends3));
165
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
166
- setFormError(formError);
167
- if (checkResult.hasError) {
168
- onError === null || onError === void 0 ? void 0 : onError(formError);
169
- }
170
- return checkResult;
171
- });
172
- });
173
- var cleanErrors = useEventCallback(function () {
174
- setFormError({});
175
- });
176
- var cleanErrorForField = useEventCallback(function (fieldName) {
177
- setFormError(omit(realFormError, [fieldName]));
178
- });
179
- var resetErrors = useEventCallback(function (formError) {
180
- if (formError === void 0) {
181
- formError = {};
182
- }
183
- setFormError(formError);
184
- });
185
- useImperativeHandle(ref, function () {
186
- return {
187
- root: rootRef.current,
188
- check: check,
189
- checkForField: checkForField,
190
- checkAsync: checkAsync,
191
- checkForFieldAsync: checkForFieldAsync,
192
- cleanErrors: cleanErrors,
193
- cleanErrorForField: cleanErrorForField,
194
- resetErrors: resetErrors
195
- };
196
- });
197
- var removeFieldError = useEventCallback(function (name) {
198
- /**
199
- * when this function is called when the children component is unmount, it's an old render frame
200
- * so use Ref to get future error
201
- */
202
- var formError = omit(realFormErrorRef.current, [name]);
203
- realFormErrorRef.current = formError;
204
- setFormError(formError);
205
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
206
- });
207
87
  var removeFieldValue = useEventCallback(function (name) {
208
- /**
209
- * when this function is called when the children component is unmount, it's an old render frame
210
- * so use Ref to get future value
211
- */
212
- var formValue = omit(realFormValueRef.current, [name]);
213
- realFormValueRef.current = formValue;
214
- setFormValue(formValue);
88
+ var formValue = onRemoveValue(name);
215
89
  onChange === null || onChange === void 0 ? void 0 : onChange(formValue);
216
90
  });
91
+ var removeFieldError = useEventCallback(function (name) {
92
+ onRemoveError(name);
93
+ });
217
94
  var handleSubmit = useEventCallback(function (event) {
95
+ var _event$preventDefault, _event$stopPropagatio;
96
+ event === null || event === void 0 ? void 0 : (_event$preventDefault = event.preventDefault) === null || _event$preventDefault === void 0 ? void 0 : _event$preventDefault.call(event);
97
+ event === null || event === void 0 ? void 0 : (_event$stopPropagatio = event.stopPropagation) === null || _event$stopPropagatio === void 0 ? void 0 : _event$stopPropagatio.call(event);
218
98
  if (disabled || readOnly || plaintext) {
219
99
  return;
220
100
  }
221
- event.preventDefault();
222
- event.stopPropagation();
223
- var checkStatus = check();
224
- onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(checkStatus, event);
101
+ var checkResult = check();
102
+ onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(checkResult, event);
225
103
  });
226
- var handleFieldError = useEventCallback(function (name, errorMessage) {
227
- var _extends4;
228
- var formError = _extends({}, realFormError, (_extends4 = {}, _extends4[name] = errorMessage, _extends4));
229
- setFormError(formError);
230
- onError === null || onError === void 0 ? void 0 : onError(formError);
231
- onCheck === null || onCheck === void 0 ? void 0 : onCheck(formError);
104
+ var onFieldError = useEventCallback(function (name, checkResult) {
105
+ setFieldError(name, checkResult);
232
106
  });
233
- var handleFieldSuccess = useEventCallback(function (name) {
107
+ var onFieldSuccess = useEventCallback(function (name) {
234
108
  removeFieldError(name);
235
109
  });
236
- var setFieldValue = function setFieldValue(formValue, fieldName, fieldValue) {
237
- var _extends5;
238
- if (nestedField) {
239
- return set(_extends({}, formValue), fieldName, fieldValue);
240
- }
241
- return _extends({}, formValue, (_extends5 = {}, _extends5[fieldName] = fieldValue, _extends5));
242
- };
243
- var handleFieldChange = useEventCallback(function (name, value, event) {
244
- var nextFormValue = setFieldValue(realFormValue, name, value);
245
- setFormValue(nextFormValue);
110
+ var onFieldChange = useEventCallback(function (name, value, event) {
111
+ var nextFormValue = setFieldValue(name, value);
246
112
  onChange === null || onChange === void 0 ? void 0 : onChange(nextFormValue, event);
247
113
  });
248
- var rootRef = useRef(null);
249
- var formContextValue = useMemo(function () {
250
- return {
251
- getCombinedModel: getCombinedModel,
252
- checkTrigger: checkTrigger,
253
- errorFromContext: errorFromContext,
254
- readOnly: readOnly,
255
- plaintext: plaintext,
256
- disabled: disabled,
257
- formError: realFormError,
258
- nestedField: nestedField,
259
- removeFieldValue: removeFieldValue,
260
- removeFieldError: removeFieldError,
261
- pushFieldRule: pushFieldRule,
262
- removeFieldRule: removeFieldRule,
263
- onFieldChange: handleFieldChange,
264
- onFieldError: handleFieldError,
265
- onFieldSuccess: handleFieldSuccess
266
- };
267
- }, [getCombinedModel, checkTrigger, errorFromContext, readOnly, plaintext, disabled, realFormError, nestedField, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
114
+ var formContextValue = {
115
+ errorFromContext: errorFromContext,
116
+ checkTrigger: checkTrigger,
117
+ plaintext: plaintext,
118
+ readOnly: readOnly,
119
+ disabled: disabled,
120
+ formError: formError,
121
+ nestedField: nestedField,
122
+ pushFieldRule: pushFieldRule,
123
+ getCombinedModel: getCombinedModel,
124
+ removeFieldValue: removeFieldValue,
125
+ removeFieldError: removeFieldError,
126
+ removeFieldRule: removeFieldRule,
127
+ onFieldSuccess: onFieldSuccess,
128
+ onFieldChange: onFieldChange,
129
+ onFieldError: onFieldError
130
+ };
268
131
  return /*#__PURE__*/React.createElement("form", _extends({}, rest, {
269
- ref: rootRef,
132
+ ref: formRef,
270
133
  onSubmit: handleSubmit,
271
134
  className: classes
272
- }), /*#__PURE__*/React.createElement(FormContext.Provider, {
135
+ }), /*#__PURE__*/React.createElement(FormProvider, {
273
136
  value: formContextValue
274
- }, /*#__PURE__*/React.createElement(FormValueContext.Provider, {
275
- value: realFormValue
137
+ }, /*#__PURE__*/React.createElement(FormValueProvider, {
138
+ value: formValue
276
139
  }, children)));
277
140
  });
278
141
  Form.Control = FormControl;
@@ -1,19 +1,20 @@
1
1
  import React from 'react';
2
2
  import { TypeAttributes } from '../@types/common';
3
- import type { Schema } from 'schema-typed';
4
- import type { FieldRuleType } from './useSchemaModel';
5
- interface TrulyFormContextValue<T = Record<string, any>, errorMsgType = any, E = {
3
+ import type { Schema, CheckResult } from 'schema-typed';
4
+ import type { FieldRuleType } from './hooks/useSchemaModel';
5
+ declare type RecordAny = Record<string, any>;
6
+ interface TrulyFormContextValue<T = RecordAny, errorMsgType = any, E = {
6
7
  [P in keyof T]?: errorMsgType;
7
8
  }> {
8
- getCombinedModel: () => Schema;
9
9
  formError: E;
10
10
  nestedField: boolean;
11
+ getCombinedModel: () => Schema;
11
12
  removeFieldValue: (name: string) => void;
12
13
  removeFieldError: (name: string) => void;
13
- pushFieldRule: (name: string, fieldRule: FieldRuleType) => void;
14
14
  removeFieldRule: (name: string) => void;
15
+ pushFieldRule: (name: string, fieldRule: FieldRuleType) => void;
16
+ onFieldError: (name: string, fieldError: string | CheckResult) => void;
15
17
  onFieldChange: (name: string, value: any, event: React.SyntheticEvent) => void;
16
- onFieldError: (name: string, errorMessage: string) => void;
17
18
  onFieldSuccess: (name: string) => void;
18
19
  }
19
20
  declare type ExternalPropsContextValue = {
@@ -24,8 +25,10 @@ declare type ExternalPropsContextValue = {
24
25
  disabled?: boolean;
25
26
  };
26
27
  declare type InitialContextType = Partial<Record<keyof TrulyFormContextValue, undefined>>;
27
- export declare type FormContextValue<T = Record<string, any>, errorMsgType = any> = (TrulyFormContextValue<T, errorMsgType> | InitialContextType) & ExternalPropsContextValue;
28
- export declare const FormContext: React.Context<FormContextValue<Record<string, any>, any>>;
29
- export declare const FormValueContext: React.Context<Record<string, any> | undefined>;
30
- export declare const FormPlaintextContext: React.Context<boolean>;
28
+ export declare type FormContextValue<T = RecordAny, errorMsgType = any> = (TrulyFormContextValue<T, errorMsgType> | InitialContextType) & ExternalPropsContextValue;
29
+ export declare const FormContext: React.Context<FormContextValue<RecordAny, any>>;
30
+ export declare const FormValueContext: React.Context<RecordAny | undefined>;
31
+ export declare const FormProvider: React.Provider<FormContextValue<RecordAny, any>>;
32
+ export declare const FormValueProvider: React.Provider<RecordAny | undefined>;
33
+ export declare function useFormContext<T = RecordAny, E = any>(): FormContextValue<T, E>;
31
34
  export default FormContext;
@@ -1,6 +1,10 @@
1
1
  'use client';
2
- import React from 'react';
2
+ import React, { useContext } from 'react';
3
3
  export var FormContext = /*#__PURE__*/React.createContext({});
4
4
  export var FormValueContext = /*#__PURE__*/React.createContext({});
5
- export var FormPlaintextContext = /*#__PURE__*/React.createContext(false);
5
+ export var FormProvider = FormContext.Provider;
6
+ export var FormValueProvider = FormValueContext.Provider;
7
+ export function useFormContext() {
8
+ return useContext(FormContext);
9
+ }
6
10
  export default FormContext;
@@ -1,5 +1,5 @@
1
- import type { FormProps } from './Form';
1
+ import type { FormProps } from '../Form';
2
2
  /**
3
3
  * Take <Form> props and return className for <Form> styles
4
4
  */
5
- export declare function useFormClassNames({ classPrefix, className, fluid, layout, readOnly, plaintext, disabled }: Pick<FormProps, 'classPrefix' | 'className' | 'fluid' | 'layout' | 'readOnly' | 'plaintext' | 'disabled'>): string;
5
+ export default function useFormClassNames({ classPrefix, className, fluid, layout, readOnly, plaintext, disabled }: Pick<FormProps, 'classPrefix' | 'className' | 'fluid' | 'layout' | 'readOnly' | 'plaintext' | 'disabled'>): string;
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- import { useClassNames } from '../utils';
2
+ import { useClassNames } from '../../utils';
3
3
  /**
4
4
  * Take <Form> props and return className for <Form> styles
5
5
  */
6
- export function useFormClassNames(_ref) {
6
+ export default function useFormClassNames(_ref) {
7
7
  var _ref$classPrefix = _ref.classPrefix,
8
8
  classPrefix = _ref$classPrefix === void 0 ? 'form' : _ref$classPrefix,
9
9
  className = _ref.className,