@rc-component/select 1.2.3 → 1.2.5

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
package/es/Select.d.ts CHANGED
@@ -125,7 +125,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
125
125
  classNames?: Partial<Record<SemanticName, string>>;
126
126
  styles?: Partial<Record<SemanticName, React.CSSProperties>>;
127
127
  }
128
- declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
128
+ declare const TypedSelect: (<ValueType = any, OptionType extends DefaultOptionType | BaseOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
129
129
  Option: typeof Option;
130
130
  OptGroup: typeof OptGroup;
131
131
  };
@@ -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,
@@ -107,6 +105,11 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
107
105
  // ====================== Open ======================
108
106
  const onInternalMouseDown = useEvent(event => {
109
107
  if (!disabled) {
108
+ // https://github.com/ant-design/ant-design/issues/56002
109
+ // Tell `useSelectTriggerControl` to ignore this event
110
+ // When icon is dynamic render, the parentNode will miss
111
+ // so we need to mark the event directly
112
+ event.nativeEvent._ignore_global_close = true;
110
113
  const inputDOM = getDOM(inputRef.current);
111
114
  if (inputDOM && event.target !== inputDOM && !inputDOM.contains(event.target)) {
112
115
  event.preventDefault();
@@ -129,15 +132,6 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
129
132
  }
130
133
  onMouseDown?.(event);
131
134
  });
132
- const onInternalBlur = event => {
133
- macroTask(() => {
134
- const inputNode = getDOM(inputRef.current);
135
- if (!inputNode || inputNode !== document.activeElement && !inputNode.contains(document.activeElement)) {
136
- toggleOpen(false);
137
- }
138
- });
139
- onBlur?.(event);
140
- };
141
135
 
142
136
  // =================== Components ===================
143
137
  const {
@@ -172,8 +166,7 @@ export default /*#__PURE__*/React.forwardRef(function SelectInput(props, ref) {
172
166
  style: style
173
167
  // Mouse Events
174
168
  ,
175
- onMouseDown: onInternalMouseDown,
176
- onBlur: onInternalBlur
169
+ onMouseDown: onInternalMouseDown
177
170
  }), /*#__PURE__*/React.createElement(Affix, {
178
171
  className: clsx(`${prefixCls}-prefix`, classNames?.prefix),
179
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
@@ -10,7 +13,9 @@ export default function useSelectTriggerControl(elements, open, triggerOpen, cus
10
13
  if (target.shadowRoot && event.composed) {
11
14
  target = event.composedPath()[0] || target;
12
15
  }
13
- if (open && elements().filter(element => element).every(element => !element.contains(target) && element !== target)) {
16
+ if (open &&
17
+ // Marked by SelectInput mouseDown event
18
+ !event._ignore_global_close && !isInside(elements(), target)) {
14
19
  // Should trigger close
15
20
  triggerOpen(false);
16
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
package/lib/Select.d.ts CHANGED
@@ -125,7 +125,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
125
125
  classNames?: Partial<Record<SemanticName, string>>;
126
126
  styles?: Partial<Record<SemanticName, React.CSSProperties>>;
127
127
  }
128
- declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
128
+ declare const TypedSelect: (<ValueType = any, OptionType extends DefaultOptionType | BaseOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
129
129
  Option: typeof Option;
130
130
  OptGroup: typeof OptGroup;
131
131
  };
@@ -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,
@@ -116,6 +114,11 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
116
114
  // ====================== Open ======================
117
115
  const onInternalMouseDown = (0, _util.useEvent)(event => {
118
116
  if (!disabled) {
117
+ // https://github.com/ant-design/ant-design/issues/56002
118
+ // Tell `useSelectTriggerControl` to ignore this event
119
+ // When icon is dynamic render, the parentNode will miss
120
+ // so we need to mark the event directly
121
+ event.nativeEvent._ignore_global_close = true;
119
122
  const inputDOM = (0, _findDOMNode.getDOM)(inputRef.current);
120
123
  if (inputDOM && event.target !== inputDOM && !inputDOM.contains(event.target)) {
121
124
  event.preventDefault();
@@ -138,15 +141,6 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
138
141
  }
139
142
  onMouseDown?.(event);
140
143
  });
141
- const onInternalBlur = event => {
142
- (0, _useOpen.macroTask)(() => {
143
- const inputNode = (0, _findDOMNode.getDOM)(inputRef.current);
144
- if (!inputNode || inputNode !== document.activeElement && !inputNode.contains(document.activeElement)) {
145
- toggleOpen(false);
146
- }
147
- });
148
- onBlur?.(event);
149
- };
150
144
 
151
145
  // =================== Components ===================
152
146
  const {
@@ -181,8 +175,7 @@ var _default = exports.default = /*#__PURE__*/React.forwardRef(function SelectIn
181
175
  style: style
182
176
  // Mouse Events
183
177
  ,
184
- onMouseDown: onInternalMouseDown,
185
- onBlur: onInternalBlur
178
+ onMouseDown: onInternalMouseDown
186
179
  }), /*#__PURE__*/React.createElement(_Affix.default, {
187
180
  className: (0, _clsx.clsx)(`${prefixCls}-prefix`, classNames?.prefix),
188
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
@@ -18,7 +22,9 @@ function useSelectTriggerControl(elements, open, triggerOpen, customizedTrigger)
18
22
  if (target.shadowRoot && event.composed) {
19
23
  target = event.composedPath()[0] || target;
20
24
  }
21
- if (open && elements().filter(element => element).every(element => !element.contains(target) && element !== target)) {
25
+ if (open &&
26
+ // Marked by SelectInput mouseDown event
27
+ !event._ignore_global_close && !isInside(elements(), target)) {
22
28
  // Should trigger close
23
29
  triggerOpen(false);
24
30
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rc-component/select",
3
- "version": "1.2.3",
3
+ "version": "1.2.5",
4
4
  "description": "React Select",
5
5
  "engines": {
6
6
  "node": ">=8.x"