rsuite 5.10.0 → 5.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/ButtonToolbar/styles/index.less +1 -1
  2. package/CHANGELOG.md +28 -0
  3. package/Nav/styles/index.less +7 -1
  4. package/Navbar/styles/index.less +6 -1
  5. package/README.md +4 -0
  6. package/Sidenav/styles/index.less +7 -5
  7. package/cjs/Cascader/DropdownMenu.js +8 -3
  8. package/cjs/DateRangePicker/DateRangePicker.d.ts +2 -0
  9. package/cjs/DateRangePicker/DateRangePicker.js +4 -2
  10. package/cjs/Disclosure/Disclosure.d.ts +1 -1
  11. package/cjs/Disclosure/DisclosureContext.d.ts +1 -1
  12. package/cjs/Dropdown/Dropdown.js +26 -110
  13. package/cjs/Dropdown/DropdownItem.js +14 -58
  14. package/cjs/Dropdown/DropdownMenu.js +32 -76
  15. package/cjs/Dropdown/DropdownToggle.js +4 -17
  16. package/cjs/Form/Form.js +21 -7
  17. package/cjs/Form/FormContext.d.ts +18 -13
  18. package/cjs/Form/useSchemaModel.d.ts +9 -0
  19. package/cjs/Form/useSchemaModel.js +46 -0
  20. package/cjs/FormControl/FormControl.d.ts +3 -0
  21. package/cjs/FormControl/FormControl.js +9 -2
  22. package/cjs/FormControl/useRegisterModel.d.ts +4 -0
  23. package/cjs/FormControl/useRegisterModel.js +20 -0
  24. package/cjs/Menu/Menu.d.ts +1 -0
  25. package/cjs/Menu/Menu.js +1 -0
  26. package/cjs/Menu/MenuItem.d.ts +1 -0
  27. package/cjs/Menu/MenuItem.js +1 -0
  28. package/cjs/Menu/Menubar.d.ts +3 -0
  29. package/cjs/Menu/Menubar.js +14 -3
  30. package/cjs/Nav/Nav.d.ts +7 -2
  31. package/cjs/Nav/Nav.js +105 -5
  32. package/cjs/Nav/NavContext.d.ts +2 -8
  33. package/cjs/Nav/NavContext.js +1 -7
  34. package/cjs/Nav/NavDropdown.d.ts +71 -0
  35. package/cjs/Nav/NavDropdown.js +193 -0
  36. package/cjs/Nav/NavDropdownItem.d.ts +39 -0
  37. package/cjs/Nav/NavDropdownItem.js +141 -0
  38. package/cjs/Nav/NavDropdownMenu.d.ts +26 -0
  39. package/cjs/Nav/NavDropdownMenu.js +156 -0
  40. package/cjs/Nav/NavDropdownToggle.d.ts +21 -0
  41. package/cjs/Nav/NavDropdownToggle.js +74 -0
  42. package/cjs/Nav/NavItem.d.ts +2 -0
  43. package/cjs/Nav/NavItem.js +13 -26
  44. package/cjs/Nav/NavMenu.d.ts +38 -0
  45. package/cjs/Nav/NavMenu.js +122 -0
  46. package/cjs/Navbar/NavbarDropdown.d.ts +57 -0
  47. package/cjs/Navbar/NavbarDropdown.js +147 -0
  48. package/cjs/Navbar/NavbarDropdownItem.d.ts +41 -0
  49. package/cjs/Navbar/NavbarDropdownItem.js +149 -0
  50. package/cjs/Navbar/NavbarDropdownMenu.d.ts +37 -0
  51. package/cjs/Navbar/NavbarDropdownMenu.js +155 -0
  52. package/cjs/Navbar/NavbarDropdownToggle.d.ts +19 -0
  53. package/cjs/Navbar/NavbarDropdownToggle.js +72 -0
  54. package/cjs/Navbar/NavbarItem.d.ts +5 -2
  55. package/cjs/Navbar/NavbarItem.js +10 -4
  56. package/cjs/Picker/utils.js +22 -15
  57. package/cjs/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  58. package/cjs/Sidenav/ExpandedSidenavDropdown.js +166 -0
  59. package/cjs/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  60. package/cjs/Sidenav/ExpandedSidenavDropdownItem.js +141 -0
  61. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  62. package/cjs/Sidenav/ExpandedSidenavDropdownMenu.js +145 -0
  63. package/cjs/Sidenav/Sidenav.d.ts +8 -2
  64. package/cjs/Sidenav/Sidenav.js +1 -2
  65. package/cjs/Sidenav/SidenavDropdown.d.ts +30 -8
  66. package/cjs/Sidenav/SidenavDropdown.js +144 -73
  67. package/cjs/Sidenav/SidenavDropdownItem.d.ts +22 -5
  68. package/cjs/Sidenav/SidenavDropdownItem.js +88 -72
  69. package/cjs/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  70. package/cjs/Sidenav/SidenavDropdownMenu.js +122 -90
  71. package/cjs/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  72. package/cjs/Sidenav/SidenavDropdownToggle.js +72 -0
  73. package/cjs/Sidenav/SidenavItem.d.ts +3 -0
  74. package/cjs/Sidenav/SidenavItem.js +22 -14
  75. package/cjs/utils/deprecateComponent.js +4 -6
  76. package/cjs/utils/deprecatePropType.d.ts +1 -5
  77. package/cjs/utils/deprecatePropType.js +7 -14
  78. package/cjs/utils/dom.d.ts +1 -1
  79. package/cjs/utils/useInternalId.d.ts +1 -1
  80. package/cjs/utils/useInternalId.js +2 -2
  81. package/cjs/utils/warnOnce.d.ts +9 -0
  82. package/cjs/utils/warnOnce.js +22 -0
  83. package/dist/rsuite-rtl.css +19 -10
  84. package/dist/rsuite-rtl.min.css +1 -1
  85. package/dist/rsuite-rtl.min.css.map +1 -1
  86. package/dist/rsuite.css +19 -10
  87. package/dist/rsuite.js +300 -25
  88. package/dist/rsuite.js.map +1 -1
  89. package/dist/rsuite.min.css +1 -1
  90. package/dist/rsuite.min.css.map +1 -1
  91. package/dist/rsuite.min.js +1 -1
  92. package/dist/rsuite.min.js.map +1 -1
  93. package/esm/Cascader/DropdownMenu.js +8 -3
  94. package/esm/DateRangePicker/DateRangePicker.d.ts +2 -0
  95. package/esm/DateRangePicker/DateRangePicker.js +4 -2
  96. package/esm/Disclosure/Disclosure.d.ts +1 -1
  97. package/esm/Disclosure/DisclosureContext.d.ts +1 -1
  98. package/esm/Dropdown/Dropdown.js +25 -105
  99. package/esm/Dropdown/DropdownItem.js +13 -55
  100. package/esm/Dropdown/DropdownMenu.js +31 -76
  101. package/esm/Dropdown/DropdownToggle.js +4 -14
  102. package/esm/Form/Form.js +19 -7
  103. package/esm/Form/FormContext.d.ts +18 -13
  104. package/esm/Form/useSchemaModel.d.ts +9 -0
  105. package/esm/Form/useSchemaModel.js +39 -0
  106. package/esm/FormControl/FormControl.d.ts +3 -0
  107. package/esm/FormControl/FormControl.js +9 -6
  108. package/esm/FormControl/useRegisterModel.d.ts +4 -0
  109. package/esm/FormControl/useRegisterModel.js +14 -0
  110. package/esm/Menu/Menu.d.ts +1 -0
  111. package/esm/Menu/Menu.js +1 -0
  112. package/esm/Menu/MenuItem.d.ts +1 -0
  113. package/esm/Menu/MenuItem.js +1 -0
  114. package/esm/Menu/Menubar.d.ts +3 -0
  115. package/esm/Menu/Menubar.js +13 -3
  116. package/esm/Nav/Nav.d.ts +7 -2
  117. package/esm/Nav/Nav.js +96 -5
  118. package/esm/Nav/NavContext.d.ts +2 -8
  119. package/esm/Nav/NavContext.js +1 -6
  120. package/esm/Nav/NavDropdown.d.ts +71 -0
  121. package/esm/Nav/NavDropdown.js +170 -0
  122. package/esm/Nav/NavDropdownItem.d.ts +39 -0
  123. package/esm/Nav/NavDropdownItem.js +123 -0
  124. package/esm/Nav/NavDropdownMenu.d.ts +26 -0
  125. package/esm/Nav/NavDropdownMenu.js +138 -0
  126. package/esm/Nav/NavDropdownToggle.d.ts +21 -0
  127. package/esm/Nav/NavDropdownToggle.js +57 -0
  128. package/esm/Nav/NavItem.d.ts +2 -0
  129. package/esm/Nav/NavItem.js +13 -21
  130. package/esm/Nav/NavMenu.d.ts +38 -0
  131. package/esm/Nav/NavMenu.js +98 -0
  132. package/esm/Navbar/NavbarDropdown.d.ts +57 -0
  133. package/esm/Navbar/NavbarDropdown.js +124 -0
  134. package/esm/Navbar/NavbarDropdownItem.d.ts +41 -0
  135. package/esm/Navbar/NavbarDropdownItem.js +128 -0
  136. package/esm/Navbar/NavbarDropdownMenu.d.ts +37 -0
  137. package/esm/Navbar/NavbarDropdownMenu.js +135 -0
  138. package/esm/Navbar/NavbarDropdownToggle.d.ts +19 -0
  139. package/esm/Navbar/NavbarDropdownToggle.js +55 -0
  140. package/esm/Navbar/NavbarItem.d.ts +5 -2
  141. package/esm/Navbar/NavbarItem.js +11 -4
  142. package/esm/Picker/utils.js +22 -14
  143. package/esm/Sidenav/ExpandedSidenavDropdown.d.ts +43 -0
  144. package/esm/Sidenav/ExpandedSidenavDropdown.js +140 -0
  145. package/esm/Sidenav/ExpandedSidenavDropdownItem.d.ts +31 -0
  146. package/esm/Sidenav/ExpandedSidenavDropdownItem.js +120 -0
  147. package/esm/Sidenav/ExpandedSidenavDropdownMenu.d.ts +26 -0
  148. package/esm/Sidenav/ExpandedSidenavDropdownMenu.js +121 -0
  149. package/esm/Sidenav/Sidenav.d.ts +8 -2
  150. package/esm/Sidenav/Sidenav.js +1 -2
  151. package/esm/Sidenav/SidenavDropdown.d.ts +30 -8
  152. package/esm/Sidenav/SidenavDropdown.js +145 -75
  153. package/esm/Sidenav/SidenavDropdownItem.d.ts +22 -5
  154. package/esm/Sidenav/SidenavDropdownItem.js +87 -71
  155. package/esm/Sidenav/SidenavDropdownMenu.d.ts +26 -16
  156. package/esm/Sidenav/SidenavDropdownMenu.js +122 -86
  157. package/esm/Sidenav/SidenavDropdownToggle.d.ts +19 -0
  158. package/esm/Sidenav/SidenavDropdownToggle.js +55 -0
  159. package/esm/Sidenav/SidenavItem.d.ts +3 -0
  160. package/esm/Sidenav/SidenavItem.js +23 -15
  161. package/esm/utils/deprecateComponent.js +3 -4
  162. package/esm/utils/deprecatePropType.d.ts +1 -5
  163. package/esm/utils/deprecatePropType.js +3 -13
  164. package/esm/utils/dom.d.ts +1 -1
  165. package/esm/utils/useInternalId.d.ts +1 -1
  166. package/esm/utils/useInternalId.js +2 -2
  167. package/esm/utils/warnOnce.d.ts +9 -0
  168. package/esm/utils/warnOnce.js +18 -0
  169. package/package.json +1 -1
  170. package/styles/variables.less +1 -0
package/esm/Form/Form.js CHANGED
@@ -12,6 +12,7 @@ import FormErrorMessage from '../FormErrorMessage';
12
12
  import FormGroup from '../FormGroup';
13
13
  import FormHelpText from '../FormHelpText';
14
14
  import { useFormClassNames } from './useFormClassNames';
15
+ import useSchemaModel from './useSchemaModel';
15
16
  var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
16
17
  var _props$checkTrigger = props.checkTrigger,
17
18
  checkTrigger = _props$checkTrigger === void 0 ? 'change' : _props$checkTrigger,
@@ -27,7 +28,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
27
28
  _props$layout = props.layout,
28
29
  layout = _props$layout === void 0 ? 'vertical' : _props$layout,
29
30
  _props$model = props.model,
30
- model = _props$model === void 0 ? SchemaModel({}) : _props$model,
31
+ formModel = _props$model === void 0 ? SchemaModel({}) : _props$model,
31
32
  readOnly = props.readOnly,
32
33
  plaintext = props.plaintext,
33
34
  className = props.className,
@@ -39,6 +40,11 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
39
40
  onChange = props.onChange,
40
41
  rest = _objectWithoutPropertiesLoose(props, ["checkTrigger", "classPrefix", "errorFromContext", "formDefaultValue", "formValue", "formError", "fluid", "layout", "model", "readOnly", "plaintext", "className", "children", "disabled", "onSubmit", "onCheck", "onError", "onChange"]);
41
42
 
43
+ var _useSchemaModel = useSchemaModel(formModel),
44
+ getCombinedModel = _useSchemaModel.getCombinedModel,
45
+ pushFieldRule = _useSchemaModel.pushFieldRule,
46
+ removeFieldRule = _useSchemaModel.removeFieldRule;
47
+
42
48
  var classes = useFormClassNames({
43
49
  classPrefix: classPrefix,
44
50
  className: className,
@@ -73,6 +79,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
73
79
  var formValue = getFormValue() || {};
74
80
  var formError = {};
75
81
  var errorCount = 0;
82
+ var model = getCombinedModel();
76
83
  Object.keys(model.spec).forEach(function (key) {
77
84
  var checkResult = model.checkForField(key, formValue);
78
85
 
@@ -91,7 +98,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
91
98
  }
92
99
 
93
100
  return true;
94
- }, [onCheck, onError, model, getFormValue]);
101
+ }, [getFormValue, getCombinedModel, onCheck, onError]);
95
102
  /**
96
103
  * Check the data field
97
104
  * @param fieldName
@@ -102,6 +109,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
102
109
  var _extends2;
103
110
 
104
111
  var formValue = getFormValue() || {};
112
+ var model = getCombinedModel();
105
113
  var checkResult = model.checkForField(fieldName, formValue);
106
114
 
107
115
  var formError = _extends({}, getFormError(), (_extends2 = {}, _extends2[fieldName] = (checkResult === null || checkResult === void 0 ? void 0 : checkResult.errorMessage) || checkResult, _extends2));
@@ -115,7 +123,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
115
123
  }
116
124
 
117
125
  return !checkResult.hasError;
118
- }, [model, getFormValue, getFormError, onCheck, onError]);
126
+ }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
119
127
  /**
120
128
  * Check form data asynchronously and return a Promise
121
129
  */
@@ -124,6 +132,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
124
132
  var formValue = getFormValue() || {};
125
133
  var promises = [];
126
134
  var keys = [];
135
+ var model = getCombinedModel();
127
136
  Object.keys(model.spec).forEach(function (key) {
128
137
  keys.push(key);
129
138
  promises.push(model.checkForFieldAsync(key, formValue));
@@ -151,7 +160,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
151
160
  formError: formError
152
161
  };
153
162
  });
154
- }, [model, getFormValue, onCheck, onError]);
163
+ }, [getFormValue, getCombinedModel, onCheck, onError]);
155
164
  /**
156
165
  * Asynchronously check form fields and return Promise
157
166
  * @param fieldName
@@ -159,6 +168,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
159
168
 
160
169
  var checkForFieldAsync = useCallback(function (fieldName) {
161
170
  var formValue = getFormValue() || {};
171
+ var model = getCombinedModel();
162
172
  return model.checkForFieldAsync(fieldName, formValue).then(function (checkResult) {
163
173
  var _extends3;
164
174
 
@@ -173,7 +183,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
173
183
 
174
184
  return checkResult;
175
185
  });
176
- }, [model, getFormValue, getFormError, onCheck, onError]);
186
+ }, [getFormValue, getCombinedModel, getFormError, onCheck, onError]);
177
187
  var cleanErrors = useCallback(function () {
178
188
  setFormError({});
179
189
  }, []);
@@ -244,7 +254,7 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
244
254
  var rootRef = useRef(null);
245
255
  var formContextValue = useMemo(function () {
246
256
  return {
247
- model: model,
257
+ getCombinedModel: getCombinedModel,
248
258
  checkTrigger: checkTrigger,
249
259
  formDefaultValue: formDefaultValue,
250
260
  errorFromContext: errorFromContext,
@@ -254,11 +264,13 @@ var Form = /*#__PURE__*/React.forwardRef(function (props, ref) {
254
264
  formError: getFormError(),
255
265
  removeFieldValue: removeFieldValue,
256
266
  removeFieldError: removeFieldError,
267
+ pushFieldRule: pushFieldRule,
268
+ removeFieldRule: removeFieldRule,
257
269
  onFieldChange: handleFieldChange,
258
270
  onFieldError: handleFieldError,
259
271
  onFieldSuccess: handleFieldSuccess
260
272
  };
261
- }, [model, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, getFormError, removeFieldValue, removeFieldError, handleFieldChange, handleFieldError, handleFieldSuccess]);
273
+ }, [getCombinedModel, checkTrigger, formDefaultValue, errorFromContext, readOnly, plaintext, disabled, getFormError, removeFieldValue, removeFieldError, pushFieldRule, removeFieldRule, handleFieldChange, handleFieldError, handleFieldSuccess]);
262
274
  return /*#__PURE__*/React.createElement("form", _extends({}, rest, {
263
275
  ref: rootRef,
264
276
  onSubmit: handleSubmit,
@@ -1,26 +1,31 @@
1
1
  import React from 'react';
2
- import { Schema } from 'schema-typed';
3
2
  import { TypeAttributes } from '../@types/common';
4
- export interface FormContextValue<T = Record<string, any>, errorMsgType = any, E = {
3
+ import type { Schema } from 'schema-typed';
4
+ import type { FieldRuleType } from './useSchemaModel';
5
+ interface TrulyFormContextValue<T = Record<string, any>, errorMsgType = any, E = {
5
6
  [P in keyof T]?: errorMsgType;
6
7
  }> {
7
- model?: Schema;
8
+ getCombinedModel: () => Schema;
9
+ formError: E;
10
+ removeFieldValue: (name: string) => void;
11
+ removeFieldError: (name: string) => void;
12
+ pushFieldRule: (name: string, fieldRule: FieldRuleType) => void;
13
+ removeFieldRule: (name: string) => void;
14
+ onFieldChange: (name: string, value: any, event: React.SyntheticEvent) => void;
15
+ onFieldError: (name: string, errorMessage: string) => void;
16
+ onFieldSuccess: (name: string) => void;
17
+ }
18
+ declare type ExternalPropsContextValue<T> = {
8
19
  checkTrigger?: TypeAttributes.CheckTrigger;
9
20
  formDefaultValue?: T;
10
21
  errorFromContext?: boolean;
11
22
  readOnly?: boolean;
12
23
  plaintext?: boolean;
13
24
  disabled?: boolean;
14
- formError?: E;
15
- removeFieldValue?: (name: string) => void;
16
- removeFieldError?: (name: string) => void;
17
- onFieldChange?: (name: string, value: any, event: React.SyntheticEvent) => void;
18
- onFieldError?: (name: string, errorMessage: string) => void;
19
- onFieldSuccess?: (name: string) => void;
20
- }
21
- export declare const FormContext: React.Context<FormContextValue<Record<string, any>, any, {
22
- [x: string]: any;
23
- }>>;
25
+ };
26
+ declare type InitialContextType = Partial<Record<keyof TrulyFormContextValue, undefined>>;
27
+ export declare type FormContextValue<T = Record<string, any>, errorMsgType = any> = (TrulyFormContextValue<T, errorMsgType> | InitialContextType) & ExternalPropsContextValue<T>;
28
+ export declare const FormContext: React.Context<FormContextValue<Record<string, any>, any>>;
24
29
  export declare const FormValueContext: React.Context<Record<string, any> | undefined>;
25
30
  export declare const FormPlaintextContext: React.Context<boolean>;
26
31
  export default FormContext;
@@ -0,0 +1,9 @@
1
+ import type { MutableRefObject } from 'react';
2
+ import type { CheckType, Schema } from 'schema-typed';
3
+ export declare type FieldRuleType = MutableRefObject<CheckType<unknown, any> | undefined>;
4
+ declare function useSchemaModel(formModel: Schema): {
5
+ getCombinedModel: () => Schema<any, string>;
6
+ pushFieldRule: (name: string, fieldRule: FieldRuleType) => void;
7
+ removeFieldRule: (name: string) => void;
8
+ };
9
+ export default useSchemaModel;
@@ -0,0 +1,39 @@
1
+ import { SchemaModel } from 'schema-typed';
2
+ import { useRef, useCallback } from 'react';
3
+
4
+ function useSchemaModel(formModel) {
5
+ var subRulesRef = useRef([]);
6
+ var pushFieldRule = useCallback(function (name, fieldRule) {
7
+ subRulesRef.current.push({
8
+ name: name,
9
+ fieldRule: fieldRule
10
+ });
11
+ }, []);
12
+ var removeFieldRule = useCallback(function (name) {
13
+ var index = subRulesRef.current.findIndex(function (v) {
14
+ return v.name === name;
15
+ });
16
+ subRulesRef.current.splice(index, 1);
17
+ }, []);
18
+ var getCombinedModel = useCallback(function () {
19
+ var realSubRules = subRulesRef.current.filter(function (v) {
20
+ return Boolean(v.fieldRule.current);
21
+ });
22
+ return SchemaModel.combine(formModel, SchemaModel(realSubRules.map(function (_ref) {
23
+ var _ref2;
24
+
25
+ var name = _ref.name,
26
+ fieldRule = _ref.fieldRule;
27
+ return _ref2 = {}, _ref2[name] = fieldRule.current, _ref2;
28
+ }).reduce(function (a, b) {
29
+ return Object.assign(a, b);
30
+ }, {})));
31
+ }, [formModel]);
32
+ return {
33
+ getCombinedModel: getCombinedModel,
34
+ pushFieldRule: pushFieldRule,
35
+ removeFieldRule: removeFieldRule
36
+ };
37
+ }
38
+
39
+ export default useSchemaModel;
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import Input from '../Input';
3
3
  import { TypeAttributes, FormControlBaseProps, WithAsProps } from '../@types/common';
4
+ import type { CheckType } from 'schema-typed';
4
5
  /**
5
6
  * Props that FormControl passes to its accepter
6
7
  */
@@ -30,6 +31,8 @@ export interface FormControlProps<P = any, ValueType = any> extends WithAsProps,
30
31
  checkAsync?: boolean;
31
32
  /** Remove field value and error message when component is unmounted */
32
33
  shouldResetWithUnmount?: boolean;
34
+ /** Validation rule */
35
+ rule?: CheckType<unknown, any>;
33
36
  }
34
37
  interface FormControlComponent extends React.FC<FormControlProps> {
35
38
  <Accepter extends React.ElementType = typeof Input>(props: FormControlProps & {
@@ -13,10 +13,7 @@ import { useClassNames } from '../utils';
13
13
  import FormContext, { FormValueContext } from '../Form/FormContext';
14
14
  import { FormGroupContext } from '../FormGroup/FormGroup';
15
15
  import { useWillUnmount } from '../utils';
16
- /**
17
- * Props that FormControl passes to its accepter
18
- */
19
-
16
+ import useRegisterModel from './useRegisterModel';
20
17
  var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
21
18
  var _useContext = useContext(FormContext),
22
19
  readOnlyContext = _useContext.readOnly,
@@ -28,10 +25,12 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
28
25
  formError = _useContext.formError,
29
26
  removeFieldValue = _useContext.removeFieldValue,
30
27
  removeFieldError = _useContext.removeFieldError,
28
+ pushFieldRule = _useContext.pushFieldRule,
29
+ removeFieldRule = _useContext.removeFieldRule,
31
30
  onFieldChange = _useContext.onFieldChange,
32
31
  onFieldError = _useContext.onFieldError,
33
32
  onFieldSuccess = _useContext.onFieldSuccess,
34
- model = _useContext.model,
33
+ getCombinedModel = _useContext.getCombinedModel,
35
34
  contextCheckTrigger = _useContext.checkTrigger;
36
35
 
37
36
  var _props$as = props.as,
@@ -59,7 +58,8 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
59
58
  defaultValue = props.defaultValue,
60
59
  _props$shouldResetWit = props.shouldResetWithUnmount,
61
60
  shouldResetWithUnmount = _props$shouldResetWit === void 0 ? false : _props$shouldResetWit,
62
- rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "className", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount"]);
61
+ rule = props.rule,
62
+ rest = _objectWithoutPropertiesLoose(props, ["as", "accepter", "classPrefix", "className", "checkAsync", "checkTrigger", "errorPlacement", "errorMessage", "name", "value", "readOnly", "plaintext", "disabled", "onChange", "onBlur", "defaultValue", "shouldResetWithUnmount", "rule"]);
63
63
 
64
64
  var _useContext2 = useContext(FormGroupContext),
65
65
  controlId = _useContext2.controlId;
@@ -68,6 +68,7 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
68
68
  throw new Error("\n <FormControl> must be inside a component decorated with <Form>.\n And need to update React to 16.6.0 +.\n ");
69
69
  }
70
70
 
71
+ useRegisterModel(name, pushFieldRule, removeFieldRule, rule);
71
72
  useWillUnmount(function () {
72
73
  if (shouldResetWithUnmount) {
73
74
  removeFieldValue === null || removeFieldValue === void 0 ? void 0 : removeFieldValue(name);
@@ -114,6 +115,8 @@ var FormControl = /*#__PURE__*/React.forwardRef(function (props, ref) {
114
115
 
115
116
  var nextFormValue = _extends({}, formValue, (_extends2 = {}, _extends2[name] = value, _extends2));
116
117
 
118
+ var model = getCombinedModel();
119
+
117
120
  if (checkAsync) {
118
121
  return model === null || model === void 0 ? void 0 : model.checkForFieldAsync(name, nextFormValue).then(function (checkResult) {
119
122
  return callbackEvents(checkResult);
@@ -0,0 +1,4 @@
1
+ import type { FieldRuleType } from '../Form/useSchemaModel';
2
+ import type { CheckType } from 'schema-typed';
3
+ declare function useRegisterModel(name: string, pushFieldRule: (n: string, r: FieldRuleType) => void, removeFieldRule: (n: string) => void, rule?: CheckType<unknown, any>): void;
4
+ export default useRegisterModel;
@@ -0,0 +1,14 @@
1
+ import { useRef, useEffect } from 'react';
2
+
3
+ function useRegisterModel(name, pushFieldRule, removeFieldRule, rule) {
4
+ var refRule = useRef(rule);
5
+ refRule.current = rule;
6
+ useEffect(function () {
7
+ pushFieldRule(name, refRule);
8
+ return function () {
9
+ removeFieldRule(name);
10
+ };
11
+ }, [name, pushFieldRule, removeFieldRule]);
12
+ }
13
+
14
+ export default useRegisterModel;
@@ -33,6 +33,7 @@ export interface MenuHandle {
33
33
  }
34
34
  /**
35
35
  * Headless ARIA `menu`
36
+ * @private
36
37
  */
37
38
  declare function Menu({ disabled, children, openMenuOn, defaultOpen, open: openProp, menuButtonText, renderMenuButton, renderMenuPopup, onToggleMenu }: MenuProps & React.HTMLAttributes<HTMLUListElement>): React.ReactElement<React.HTMLAttributes<HTMLDivElement>, string | React.JSXElementConstructor<any>>;
38
39
  declare namespace Menu {
package/esm/Menu/Menu.js CHANGED
@@ -13,6 +13,7 @@ import { isFocusableElement } from '../utils/dom';
13
13
  var defaultOpenMenuOn = ['click'];
14
14
  /**
15
15
  * Headless ARIA `menu`
16
+ * @private
16
17
  */
17
18
 
18
19
  function Menu(_ref) {
@@ -16,6 +16,7 @@ export interface MenuitemRenderProps {
16
16
  }
17
17
  /**
18
18
  * Headless ARIA `menuitem`
19
+ * @private
19
20
  */
20
21
  declare function MenuItem(props: MenuItemProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
21
22
  declare namespace MenuItem {
@@ -6,6 +6,7 @@ import MenuContext, { MenuActionTypes, MoveFocusTo } from './MenuContext';
6
6
 
7
7
  /**
8
8
  * Headless ARIA `menuitem`
9
+ * @private
9
10
  */
10
11
  function MenuItem(props) {
11
12
  var children = props.children,
@@ -7,4 +7,7 @@ export interface MenubarProps {
7
7
  /** Callback triggered when an item is being activated */
8
8
  onActivateItem?: (event: React.SyntheticEvent) => void;
9
9
  }
10
+ /**
11
+ * @private
12
+ */
10
13
  export default function Menubar({ vertical, children, onActivateItem }: MenubarProps): JSX.Element;
@@ -5,7 +5,14 @@ import MenuContext, { MenuActionTypes, MoveFocusTo } from './MenuContext';
5
5
  import { KEY_VALUES, useCustom } from '../utils';
6
6
  import { isFocusEntering, isFocusLeaving } from '../utils/events';
7
7
  import useMenu from './useMenu';
8
+ import { isFocusableElement } from '../utils/dom';
9
+
10
+ /**
11
+ * @private
12
+ */
8
13
  export default function Menubar(_ref) {
14
+ var _items$activeItemInde3;
15
+
9
16
  var _ref$vertical = _ref.vertical,
10
17
  vertical = _ref$vertical === void 0 ? false : _ref$vertical,
11
18
  children = _ref.children,
@@ -20,7 +27,8 @@ export default function Menubar(_ref) {
20
27
  var menubarElementRef = useRef(null);
21
28
  var onFocus = useCallback(function (event) {
22
29
  // Focus moves inside Menubar
23
- if (isFocusEntering(event)) {
30
+ if (isFocusEntering(event) && // Skip if focus is moving to a focusable element within this menu
31
+ !(event.target !== event.currentTarget && isFocusableElement(event.target))) {
24
32
  if (activeItemIndex === null) {
25
33
  dispatch({
26
34
  type: MenuActionTypes.MoveFocus,
@@ -43,7 +51,9 @@ export default function Menubar(_ref) {
43
51
  rtl = _useCustom.rtl;
44
52
 
45
53
  var onKeyDown = useCallback(function (event) {
46
- var activeItemElement = isNil(activeItemIndex) ? null : items[activeItemIndex].element;
54
+ var _items$activeItemInde, _items$activeItemInde2;
55
+
56
+ var activeItemElement = isNil(activeItemIndex) ? null : (_items$activeItemInde = (_items$activeItemInde2 = items[activeItemIndex]) === null || _items$activeItemInde2 === void 0 ? void 0 : _items$activeItemInde2.element) !== null && _items$activeItemInde !== void 0 ? _items$activeItemInde : null;
47
57
 
48
58
  switch (true) {
49
59
  case !vertical && !rtl && event.key === KEY_VALUES.RIGHT:
@@ -123,7 +133,7 @@ export default function Menubar(_ref) {
123
133
  onBlur: onBlur,
124
134
  onKeyDown: onKeyDown,
125
135
  onClick: onClick,
126
- 'aria-activedescendant': isNil(activeItemIndex) ? undefined : items[activeItemIndex].element.id,
136
+ 'aria-activedescendant': isNil(activeItemIndex) ? undefined : (_items$activeItemInde3 = items[activeItemIndex]) === null || _items$activeItemInde3 === void 0 ? void 0 : _items$activeItemInde3.element.id,
127
137
  'aria-orientation': vertical ? 'vertical' : undefined // implicitly set 'horizontal'
128
138
 
129
139
  }, menubarElementRef));
package/esm/Nav/Nav.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import NavItem from './NavItem';
3
- import Dropdown from '../Dropdown';
4
3
  import { WithAsProps, RsRefForwardingComponent } from '../@types/common';
4
+ import NavDropdown from './NavDropdown';
5
+ import NavMenu from './NavMenu';
5
6
  export interface NavProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect'> {
6
7
  /** sets appearance */
7
8
  appearance?: 'default' | 'subtle' | 'tabs';
@@ -19,8 +20,12 @@ export interface NavProps<T = any> extends WithAsProps, Omit<React.HTMLAttribute
19
20
  onSelect?: (eventKey: T | undefined, event: React.SyntheticEvent) => void;
20
21
  }
21
22
  interface NavComponent extends RsRefForwardingComponent<'div', NavProps> {
22
- Dropdown: typeof Dropdown;
23
+ /**
24
+ * @deprecated Use <Nav.Menu> instead.
25
+ */
26
+ Dropdown: typeof NavDropdown;
23
27
  Item: typeof NavItem;
28
+ Menu: typeof NavMenu;
24
29
  }
25
30
  declare const Nav: NavComponent;
26
31
  export default Nav;
package/esm/Nav/Nav.js CHANGED
@@ -1,15 +1,24 @@
1
1
  import _extends from "@babel/runtime/helpers/esm/extends";
2
2
  import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
3
- import React, { useContext, useMemo } from 'react';
3
+ import React, { useContext, useEffect, useMemo } from 'react';
4
4
  import PropTypes from 'prop-types';
5
5
  import NavItem from './NavItem';
6
- import Dropdown from '../Dropdown';
7
6
  import { useClassNames } from '../utils';
8
7
  import { NavbarContext } from '../Navbar/Navbar';
9
8
  import { SidenavContext } from '../Sidenav/Sidenav';
10
9
  import NavContext from './NavContext';
11
10
  import useEnsuredRef from '../utils/useEnsuredRef';
12
11
  import Menubar from '../Menu/Menubar';
12
+ import NavDropdown from './NavDropdown';
13
+ import NavMenu, { NavMenuActionType, NavMenuContext } from './NavMenu';
14
+ import deprecateComponent from '../utils/deprecateComponent';
15
+ import NavDropdownItem from './NavDropdownItem';
16
+ import NavDropdownMenu from './NavDropdownMenu';
17
+ import NavbarDropdownItem from '../Navbar/NavbarDropdownItem';
18
+ import SidenavDropdownItem from '../Sidenav/SidenavDropdownItem';
19
+ import NavbarItem from '../Navbar/NavbarItem';
20
+ import SidenavItem from '../Sidenav/SidenavItem';
21
+ import useInternalId from '../utils/useInternalId';
13
22
  var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
14
23
  var _props$as = props.as,
15
24
  Component = _props$as === void 0 ? 'div' : _props$as,
@@ -57,7 +66,6 @@ var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
57
66
  var activeKey = activeKeyProp !== null && activeKeyProp !== void 0 ? activeKeyProp : activeKeyFromSidenav;
58
67
  var contextValue = useMemo(function () {
59
68
  return {
60
- withinNav: true,
61
69
  activeKey: activeKey,
62
70
  onSelect: onSelectProp !== null && onSelectProp !== void 0 ? onSelectProp : onSelectFromSidenav
63
71
  };
@@ -97,8 +105,91 @@ var Nav = /*#__PURE__*/React.forwardRef(function (props, ref) {
97
105
  className: prefix('bar')
98
106
  })));
99
107
  });
100
- Nav.Dropdown = Dropdown;
101
- Nav.Item = NavItem;
108
+ var DeprecatedNavDropdown = deprecateComponent(NavDropdown, '<Nav.Dropdown> is deprecated, use <Nav.Menu> instead.');
109
+ DeprecatedNavDropdown.Menu = deprecateComponent(NavDropdownMenu, '<Nav.Dropdown.Menu> is deprecated, use <Nav.Menu> instead');
110
+ DeprecatedNavDropdown.Item = deprecateComponent(NavDropdownItem, '<Nav.Dropdown.Item> is deprecated, use <Nav.Item> instead');
111
+ Nav.Dropdown = DeprecatedNavDropdown;
112
+ /**
113
+ * The <Nav.Item> API
114
+ * When used as direct child of <Nav>, render the NavItem
115
+ * When used within a <Nav.Menu>, render the NavDropdownItem
116
+ */
117
+
118
+ Nav.Item = /*#__PURE__*/React.forwardRef(function (props, ref) {
119
+ var nav = useContext(NavContext);
120
+
121
+ if (!nav) {
122
+ throw new Error('<Nav.Item> must be rendered within a <Nav> component.');
123
+ }
124
+
125
+ var parentNavMenu = useContext(NavMenuContext);
126
+ var navbar = useContext(NavbarContext);
127
+ var sidenav = useContext(SidenavContext);
128
+
129
+ var _ref2 = parentNavMenu !== null && parentNavMenu !== void 0 ? parentNavMenu : [],
130
+ dispatch = _ref2[1];
131
+
132
+ var _id = useInternalId('Nav.Item');
133
+
134
+ useEffect(function () {
135
+ if (dispatch) {
136
+ var _props$active;
137
+
138
+ dispatch({
139
+ type: NavMenuActionType.RegisterItem,
140
+ payload: {
141
+ _id: _id,
142
+ eventKey: props.eventKey,
143
+ active: (_props$active = props.active) !== null && _props$active !== void 0 ? _props$active : false
144
+ }
145
+ });
146
+ return function () {
147
+ dispatch({
148
+ type: NavMenuActionType.UnregisterItem,
149
+ payload: {
150
+ _id: _id
151
+ }
152
+ });
153
+ };
154
+ }
155
+ }, [dispatch, _id, props.eventKey, props.active]);
156
+
157
+ if (parentNavMenu) {
158
+ if (navbar) {
159
+ return /*#__PURE__*/React.createElement(NavbarDropdownItem, _extends({
160
+ ref: ref
161
+ }, props));
162
+ }
163
+
164
+ if (sidenav) {
165
+ return /*#__PURE__*/React.createElement(SidenavDropdownItem, _extends({
166
+ ref: ref
167
+ }, props));
168
+ }
169
+
170
+ return /*#__PURE__*/React.createElement(NavDropdownItem, _extends({
171
+ ref: ref
172
+ }, props));
173
+ }
174
+
175
+ if (navbar) {
176
+ return /*#__PURE__*/React.createElement(NavbarItem, _extends({
177
+ ref: ref
178
+ }, props));
179
+ }
180
+
181
+ if (sidenav) {
182
+ return /*#__PURE__*/React.createElement(SidenavItem, _extends({
183
+ ref: ref
184
+ }, props));
185
+ }
186
+
187
+ return /*#__PURE__*/React.createElement(NavItem, _extends({
188
+ ref: ref
189
+ }, props));
190
+ });
191
+ Nav.Item.displayName = 'Nav.Item';
192
+ Nav.Menu = NavMenu;
102
193
  Nav.displayName = 'Nav';
103
194
  Nav.propTypes = {
104
195
  classPrefix: PropTypes.string,
@@ -1,13 +1,7 @@
1
1
  import React from 'react';
2
2
  export interface NavContextProps {
3
- /**
4
- * Whether component is rendered within a <Nav>
5
- *
6
- * FIXME: Bad design. Should use NavContextProps | null to determin whether within a <Nav>
7
- */
8
- withinNav: boolean;
9
- activeKey: string | null;
3
+ activeKey: string | undefined;
10
4
  onSelect?: (eventKey: string | undefined, event: React.SyntheticEvent) => void;
11
5
  }
12
- declare const NavContext: React.Context<NavContextProps>;
6
+ declare const NavContext: React.Context<NavContextProps | null>;
13
7
  export default NavContext;
@@ -1,8 +1,3 @@
1
1
  import React from 'react';
2
- import noop from 'lodash/noop';
3
- var NavContext = /*#__PURE__*/React.createContext({
4
- withinNav: false,
5
- activeKey: null,
6
- onSelect: noop
7
- });
2
+ var NavContext = /*#__PURE__*/React.createContext(null);
8
3
  export default NavContext;
@@ -0,0 +1,71 @@
1
+ import React from 'react';
2
+ import { TypeAttributes, WithAsProps, RsRefForwardingComponent } from '../@types/common';
3
+ import Button from '../Button';
4
+ import NavDropdownItem from './NavDropdownItem';
5
+ import NavDropdownMenu from './NavDropdownMenu';
6
+ import { NavDropdownToggleProps } from './NavDropdownToggle';
7
+ export declare type NavDropdownTrigger = 'click' | 'hover' | 'contextMenu';
8
+ export interface NavDropdownProps<T = any> extends WithAsProps, Omit<React.HTMLAttributes<HTMLElement>, 'onSelect' | 'title'> {
9
+ /** Define the title as a submenu */
10
+ title?: React.ReactNode;
11
+ /** Set the icon */
12
+ icon?: NavDropdownToggleProps['icon'];
13
+ /** Triggering events */
14
+ trigger?: NavDropdownTrigger | readonly NavDropdownTrigger[];
15
+ /** The placement of Menu */
16
+ placement?: TypeAttributes.Placement8;
17
+ /** Whether or not component is disabled */
18
+ disabled?: boolean;
19
+ /** The style of the menu */
20
+ menuStyle?: React.CSSProperties;
21
+ /** A css class to apply to the Toggle DOM node */
22
+ toggleClassName?: string;
23
+ /** The value of the current option */
24
+ eventKey?: T;
25
+ /** You can use a custom element type for this toggle component */
26
+ toggleAs?: React.ElementType;
27
+ /** No caret variation */
28
+ noCaret?: NavDropdownToggleProps['noCaret'];
29
+ /**
30
+ * Open the menu and control it
31
+ * @deprecated
32
+ */
33
+ open?: boolean;
34
+ /**
35
+ * @deprecated
36
+ */
37
+ renderTitle?: (children: React.ReactNode) => React.ReactNode;
38
+ /** Custom Toggle */
39
+ renderToggle?: (props: WithAsProps, ref: React.Ref<any>) => any;
40
+ /** The callback function that the menu closes */
41
+ onClose?: () => void;
42
+ /** Menu Pop-up callback function */
43
+ onOpen?: () => void;
44
+ /** Callback function for menu state switching */
45
+ onToggle?: (open: boolean, eventKey?: T | undefined, event?: React.SyntheticEvent) => void;
46
+ }
47
+ export interface NavDropdownComponent extends RsRefForwardingComponent<'div', NavDropdownProps> {
48
+ <ToggleAs extends React.ElementType = typeof Button>(props: NavDropdownProps & {
49
+ ref?: React.Ref<any>;
50
+ toggleAs?: ToggleAs;
51
+ } & React.ComponentProps<ToggleAs>, context: any): JSX.Element | null;
52
+ /**
53
+ * @deprecated Use <Nav.Item> instead.
54
+ */
55
+ Item: typeof NavDropdownItem;
56
+ /**
57
+ * @deprecated Use <Nav.Menu> instead.
58
+ */
59
+ Menu: typeof NavDropdownMenu;
60
+ }
61
+ /**
62
+ * @private this component is not supposed to be used directly
63
+ * Instead it's rendered by a <Nav.Menu> call
64
+ *
65
+ * <Nav>
66
+ * <Nav.Menu> -> This will render <NavDropdown> component
67
+ * </Nav.Menu>
68
+ * </Nav>
69
+ */
70
+ declare const NavDropdown: NavDropdownComponent;
71
+ export default NavDropdown;