@rc-component/select 1.3.0 → 1.3.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.
@@ -5,11 +5,11 @@ import * as React from 'react';
5
5
  import { useAllowClear } from "../hooks/useAllowClear";
6
6
  import { BaseSelectContext } from "../hooks/useBaseProps";
7
7
  import useLock from "../hooks/useLock";
8
- import useSelectTriggerControl from "../hooks/useSelectTriggerControl";
8
+ import useSelectTriggerControl, { isInside } from "../hooks/useSelectTriggerControl";
9
9
  import SelectTrigger from "../SelectTrigger";
10
10
  import { getSeparatedContent, isValidCount } from "../utils/valueUtil";
11
11
  import Polite from "./Polite";
12
- import useOpen from "../hooks/useOpen";
12
+ import useOpen, { macroTask } from "../hooks/useOpen";
13
13
  import { useEvent } from '@rc-component/util';
14
14
  import SelectInput from "../SelectInput";
15
15
  import useComponents from "../hooks/useComponents";
@@ -288,6 +288,12 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
288
288
  keyLockRef.current = false;
289
289
  };
290
290
 
291
+ // ========================== Focus / Blur ==========================
292
+ const getSelectElements = () => [getDOM(containerRef.current), triggerRef.current?.getPopupElement()];
293
+
294
+ // Close when click on non-select element
295
+ useSelectTriggerControl(getSelectElements, mergedOpen, triggerOpen, !!mergedComponents.root);
296
+
291
297
  // ========================== Focus / Blur ==========================
292
298
  /** Record real focus status */
293
299
  // const focusRef = React.useRef<boolean>(false);
@@ -302,6 +308,13 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
302
308
  onFocus?.(event);
303
309
  }
304
310
  };
311
+ const onRootBlur = () => {
312
+ macroTask(() => {
313
+ if (!isInside(getSelectElements(), document.activeElement)) {
314
+ triggerOpen(false);
315
+ }
316
+ });
317
+ };
305
318
  const onInternalBlur = event => {
306
319
  setFocused(false);
307
320
  if (mergedSearchValue) {
@@ -317,6 +330,7 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
317
330
  });
318
331
  }
319
332
  }
333
+ onRootBlur();
320
334
  if (!disabled) {
321
335
  onBlur?.(event);
322
336
  }
@@ -352,9 +366,6 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
352
366
  };
353
367
  }
354
368
 
355
- // Close when click on non-select element
356
- useSelectTriggerControl(() => [getDOM(containerRef.current), triggerRef.current?.getPopupElement()], mergedOpen, triggerOpen, !!mergedComponents.root);
357
-
358
369
  // ============================ Context =============================
359
370
  const baseSelectContext = React.useMemo(() => ({
360
371
  ...props,
@@ -488,7 +499,8 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
488
499
  empty: emptyOptions,
489
500
  onPopupVisibleChange: onTriggerVisibleChange,
490
501
  onPopupMouseEnter: onPopupMouseEnter,
491
- onPopupMouseDown: onInternalMouseDown
502
+ onPopupMouseDown: onInternalMouseDown,
503
+ onPopupBlur: onRootBlur
492
504
  }, renderNode);
493
505
  return /*#__PURE__*/React.createElement(BaseSelectContext.Provider, {
494
506
  value: baseSelectContext
@@ -10,7 +10,6 @@ import { isValidateOpenKey } from "../utils/keyUtil";
10
10
  import { clsx } from 'clsx';
11
11
  import { getDOM } from "@rc-component/util/es/Dom/findDOMNode";
12
12
  import { composeRef } from "@rc-component/util/es/ref";
13
- import { macroTask } from "../hooks/useOpen";
14
13
  const DEFAULT_OMIT_PROPS = ['value', 'onChange', 'removeIcon', 'placeholder', 'maxTagCount', 'maxTagTextLength', 'maxTagPlaceholder', 'choiceTransitionName', 'onInputKeyDown', 'onPopupScroll', 'tabIndex', 'activeValue', 'onSelectorRemove', 'focused'];
15
14
  export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
16
15
  const {
@@ -38,7 +37,6 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
38
37
  autoFocus,
39
38
  // Events
40
39
  onMouseDown,
41
- onBlur,
42
40
  onClearMouseDown,
43
41
  onInputKeyDown,
44
42
  onSelectorRemove,
@@ -134,15 +132,6 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
134
132
  }
135
133
  onMouseDown?.(event);
136
134
  });
137
- const onInternalBlur = event => {
138
- macroTask(() => {
139
- const inputNode = getDOM(inputRef.current);
140
- if (!inputNode || inputNode !== document.activeElement && !inputNode.contains(document.activeElement)) {
141
- toggleOpen(false);
142
- }
143
- });
144
- onBlur?.(event);
145
- };
146
135
 
147
136
  // =================== Components ===================
148
137
  const {
@@ -177,8 +166,7 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
177
166
  style: style
178
167
  // Mouse Events
179
168
  ,
180
- onMouseDown: onInternalMouseDown,
181
- onBlur: onInternalBlur
169
+ onMouseDown: onInternalMouseDown
182
170
  }), /*#__PURE__*/React.createElement(Affix, {
183
171
  className: clsx(`${prefixCls}-prefix`, classNames?.prefix),
184
172
  style: styles?.prefix
@@ -25,6 +25,7 @@ export interface SelectTriggerProps {
25
25
  onPopupVisibleChange?: (visible: boolean) => void;
26
26
  onPopupMouseEnter: () => void;
27
27
  onPopupMouseDown: React.MouseEventHandler<HTMLDivElement>;
28
+ onPopupBlur?: React.FocusEventHandler<HTMLDivElement>;
28
29
  }
29
30
  declare const RefSelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<RefTriggerProps>>;
30
31
  export default RefSelectTrigger;
@@ -66,6 +66,7 @@ const SelectTrigger = (props, ref) => {
66
66
  onPopupVisibleChange,
67
67
  onPopupMouseEnter,
68
68
  onPopupMouseDown,
69
+ onPopupBlur,
69
70
  ...restProps
70
71
  } = props;
71
72
 
@@ -117,7 +118,8 @@ const SelectTrigger = (props, ref) => {
117
118
  },
118
119
  popup: /*#__PURE__*/React.createElement("div", {
119
120
  onMouseEnter: onPopupMouseEnter,
120
- onMouseDown: onPopupMouseDown
121
+ onMouseDown: onPopupMouseDown,
122
+ onBlur: onPopupBlur
121
123
  }, popupNode),
122
124
  ref: triggerPopupRef,
123
125
  stretch: stretch,
@@ -66,7 +66,7 @@ export default function useOpen(propOpen, onOpen, postOpen) {
66
66
  taskLockRef.current = ignoreNext;
67
67
  macroTask(() => {
68
68
  taskLockRef.current = false;
69
- }, 2);
69
+ }, 3);
70
70
  }
71
71
  }
72
72
  return;
@@ -1 +1,2 @@
1
+ export declare function isInside(elements: (HTMLElement | SVGElement | undefined)[], target: HTMLElement): boolean;
1
2
  export default function useSelectTriggerControl(elements: () => (HTMLElement | SVGElement | undefined)[], open: boolean, triggerOpen: (open: boolean) => void, customizedTrigger: boolean): void;
@@ -1,5 +1,8 @@
1
1
  import * as React from 'react';
2
2
  import { useEvent } from '@rc-component/util';
3
+ export function isInside(elements, target) {
4
+ return elements.filter(element => element).some(element => element.contains(target) || element === target);
5
+ }
3
6
  export default function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger) {
4
7
  const onGlobalMouseDown = useEvent(event => {
5
8
  // If trigger is customized, Trigger will take control of popupVisible
@@ -12,7 +15,7 @@ export default function useSelectTriggerControl(elements, open, triggerOpen, cus
12
15
  }
13
16
  if (open &&
14
17
  // Marked by SelectInput mouseDown event
15
- !event._ignore_global_close && elements().filter(element => element).every(element => !element.contains(target) && element !== target)) {
18
+ !event._ignore_global_close && !isInside(elements(), target)) {
16
19
  // Should trigger close
17
20
  triggerOpen(false);
18
21
  }
@@ -10,11 +10,11 @@ var React = _interopRequireWildcard(require("react"));
10
10
  var _useAllowClear = require("../hooks/useAllowClear");
11
11
  var _useBaseProps = require("../hooks/useBaseProps");
12
12
  var _useLock = _interopRequireDefault(require("../hooks/useLock"));
13
- var _useSelectTriggerControl = _interopRequireDefault(require("../hooks/useSelectTriggerControl"));
13
+ var _useSelectTriggerControl = _interopRequireWildcard(require("../hooks/useSelectTriggerControl"));
14
14
  var _SelectTrigger = _interopRequireDefault(require("../SelectTrigger"));
15
15
  var _valueUtil = require("../utils/valueUtil");
16
16
  var _Polite = _interopRequireDefault(require("./Polite"));
17
- var _useOpen = _interopRequireDefault(require("../hooks/useOpen"));
17
+ var _useOpen = _interopRequireWildcard(require("../hooks/useOpen"));
18
18
  var _util = require("@rc-component/util");
19
19
  var _SelectInput = _interopRequireDefault(require("../SelectInput"));
20
20
  var _useComponents = _interopRequireDefault(require("../hooks/useComponents"));
@@ -297,6 +297,12 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
297
297
  keyLockRef.current = false;
298
298
  };
299
299
 
300
+ // ========================== Focus / Blur ==========================
301
+ const getSelectElements = () => [(0, _findDOMNode.getDOM)(containerRef.current), triggerRef.current?.getPopupElement()];
302
+
303
+ // Close when click on non-select element
304
+ (0, _useSelectTriggerControl.default)(getSelectElements, mergedOpen, triggerOpen, !!mergedComponents.root);
305
+
300
306
  // ========================== Focus / Blur ==========================
301
307
  /** Record real focus status */
302
308
  // const focusRef = React.useRef<boolean>(false);
@@ -311,6 +317,13 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
311
317
  onFocus?.(event);
312
318
  }
313
319
  };
320
+ const onRootBlur = () => {
321
+ (0, _useOpen.macroTask)(() => {
322
+ if (!(0, _useSelectTriggerControl.isInside)(getSelectElements(), document.activeElement)) {
323
+ triggerOpen(false);
324
+ }
325
+ });
326
+ };
314
327
  const onInternalBlur = event => {
315
328
  setFocused(false);
316
329
  if (mergedSearchValue) {
@@ -326,6 +339,7 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
326
339
  });
327
340
  }
328
341
  }
342
+ onRootBlur();
329
343
  if (!disabled) {
330
344
  onBlur?.(event);
331
345
  }
@@ -361,9 +375,6 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
361
375
  };
362
376
  }
363
377
 
364
- // Close when click on non-select element
365
- (0, _useSelectTriggerControl.default)(() => [(0, _findDOMNode.getDOM)(containerRef.current), triggerRef.current?.getPopupElement()], mergedOpen, triggerOpen, !!mergedComponents.root);
366
-
367
378
  // ============================ Context =============================
368
379
  const baseSelectContext = React.useMemo(() => ({
369
380
  ...props,
@@ -497,7 +508,8 @@ const BaseSelect = /*#__PURE__*/React.forwardRef((props, ref) => {
497
508
  empty: emptyOptions,
498
509
  onPopupVisibleChange: onTriggerVisibleChange,
499
510
  onPopupMouseEnter: onPopupMouseEnter,
500
- onPopupMouseDown: onInternalMouseDown
511
+ onPopupMouseDown: onInternalMouseDown,
512
+ onPopupBlur: onRootBlur
501
513
  }, renderNode);
502
514
  return /*#__PURE__*/React.createElement(_useBaseProps.BaseSelectContext.Provider, {
503
515
  value: baseSelectContext
@@ -15,7 +15,6 @@ var _keyUtil = require("../utils/keyUtil");
15
15
  var _clsx = require("clsx");
16
16
  var _findDOMNode = require("@rc-component/util/lib/Dom/findDOMNode");
17
17
  var _ref = require("@rc-component/util/lib/ref");
18
- var _useOpen = require("../hooks/useOpen");
19
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -47,7 +46,6 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
47
46
  autoFocus,
48
47
  // Events
49
48
  onMouseDown,
50
- onBlur,
51
49
  onClearMouseDown,
52
50
  onInputKeyDown,
53
51
  onSelectorRemove,
@@ -143,15 +141,6 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
143
141
  }
144
142
  onMouseDown?.(event);
145
143
  });
146
- const onInternalBlur = event => {
147
- (0, _useOpen.macroTask)(() => {
148
- const inputNode = (0, _findDOMNode.getDOM)(inputRef.current);
149
- if (!inputNode || inputNode !== document.activeElement && !inputNode.contains(document.activeElement)) {
150
- toggleOpen(false);
151
- }
152
- });
153
- onBlur?.(event);
154
- };
155
144
 
156
145
  // =================== Components ===================
157
146
  const {
@@ -186,8 +175,7 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
186
175
  style: style
187
176
  // Mouse Events
188
177
  ,
189
- onMouseDown: onInternalMouseDown,
190
- onBlur: onInternalBlur
178
+ onMouseDown: onInternalMouseDown
191
179
  }), /*#__PURE__*/React.createElement(_Affix.default, {
192
180
  className: (0, _clsx.clsx)(`${prefixCls}-prefix`, classNames?.prefix),
193
181
  style: styles?.prefix
@@ -25,6 +25,7 @@ export interface SelectTriggerProps {
25
25
  onPopupVisibleChange?: (visible: boolean) => void;
26
26
  onPopupMouseEnter: () => void;
27
27
  onPopupMouseDown: React.MouseEventHandler<HTMLDivElement>;
28
+ onPopupBlur?: React.FocusEventHandler<HTMLDivElement>;
28
29
  }
29
30
  declare const RefSelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<RefTriggerProps>>;
30
31
  export default RefSelectTrigger;
@@ -75,6 +75,7 @@ const SelectTrigger = (props, ref) => {
75
75
  onPopupVisibleChange,
76
76
  onPopupMouseEnter,
77
77
  onPopupMouseDown,
78
+ onPopupBlur,
78
79
  ...restProps
79
80
  } = props;
80
81
 
@@ -126,7 +127,8 @@ const SelectTrigger = (props, ref) => {
126
127
  },
127
128
  popup: /*#__PURE__*/React.createElement("div", {
128
129
  onMouseEnter: onPopupMouseEnter,
129
- onMouseDown: onPopupMouseDown
130
+ onMouseDown: onPopupMouseDown,
131
+ onBlur: onPopupBlur
130
132
  }, popupNode),
131
133
  ref: triggerPopupRef,
132
134
  stretch: stretch,
@@ -73,7 +73,7 @@ function useOpen(propOpen, onOpen, postOpen) {
73
73
  taskLockRef.current = ignoreNext;
74
74
  macroTask(() => {
75
75
  taskLockRef.current = false;
76
- }, 2);
76
+ }, 3);
77
77
  }
78
78
  }
79
79
  return;
@@ -1 +1,2 @@
1
+ export declare function isInside(elements: (HTMLElement | SVGElement | undefined)[], target: HTMLElement): boolean;
1
2
  export default function useSelectTriggerControl(elements: () => (HTMLElement | SVGElement | undefined)[], open: boolean, triggerOpen: (open: boolean) => void, customizedTrigger: boolean): void;
@@ -4,10 +4,14 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = useSelectTriggerControl;
7
+ exports.isInside = isInside;
7
8
  var React = _interopRequireWildcard(require("react"));
8
9
  var _util = require("@rc-component/util");
9
10
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
11
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ function isInside(elements, target) {
13
+ return elements.filter(element => element).some(element => element.contains(target) || element === target);
14
+ }
11
15
  function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger) {
12
16
  const onGlobalMouseDown = (0, _util.useEvent)(event => {
13
17
  // If trigger is customized, Trigger will take control of popupVisible
@@ -20,7 +24,7 @@ function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger)
20
24
  }
21
25
  if (open &&
22
26
  // Marked by SelectInput mouseDown event
23
- !event._ignore_global_close && elements().filter(element => element).every(element => !element.contains(target) && element !== target)) {
27
+ !event._ignore_global_close && !isInside(elements(), target)) {
24
28
  // Should trigger close
25
29
  triggerOpen(false);
26
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/select",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "React Select",
5
5
  "engines": {
6
6
  "node": ">=8.x"