@rc-component/select 1.0.4 → 1.0.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.
- package/es/OptionList.js +12 -11
- package/es/Select.d.ts +2 -3
- package/es/Select.js +12 -1
- package/lib/OptionList.js +12 -11
- package/lib/Select.d.ts +2 -3
- package/lib/Select.js +12 -1
- package/package.json +1 -1
package/es/OptionList.js
CHANGED
|
@@ -127,19 +127,20 @@ const OptionList = (_, ref) => {
|
|
|
127
127
|
* `setActive` function will call root accessibility state update which makes re-render.
|
|
128
128
|
* So we need to delay to let Input component trigger onChange first.
|
|
129
129
|
*/
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
130
|
+
let timeoutId;
|
|
131
|
+
if (!multiple && open && rawValues.size === 1) {
|
|
132
|
+
const value = Array.from(rawValues)[0];
|
|
133
|
+
// Scroll to the option closest to the searchValue if searching.
|
|
134
|
+
const index = memoFlattenOptions.findIndex(({
|
|
135
|
+
data
|
|
136
|
+
}) => searchValue ? String(data.value).startsWith(searchValue) : data.value === value);
|
|
137
|
+
if (index !== -1) {
|
|
138
|
+
setActive(index);
|
|
139
|
+
timeoutId = setTimeout(() => {
|
|
139
140
|
scrollIntoView(index);
|
|
140
|
-
}
|
|
141
|
+
});
|
|
141
142
|
}
|
|
142
|
-
}
|
|
143
|
+
}
|
|
143
144
|
|
|
144
145
|
// Force trigger scrollbar visible when open
|
|
145
146
|
if (open) {
|
package/es/Select.d.ts
CHANGED
|
@@ -77,6 +77,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
|
|
|
77
77
|
autoClearSearchValue?: boolean;
|
|
78
78
|
onSelect?: SelectHandler<ArrayElementType<ValueType>, OptionType>;
|
|
79
79
|
onDeselect?: SelectHandler<ArrayElementType<ValueType>, OptionType>;
|
|
80
|
+
onActive?: (value: ValueType) => void;
|
|
80
81
|
/**
|
|
81
82
|
* In Select, `false` means do nothing.
|
|
82
83
|
* In TreeSelect, `false` will highlight match item.
|
|
@@ -109,9 +110,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
|
|
|
109
110
|
classNames?: Partial<Record<SemanticName, string>>;
|
|
110
111
|
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
|
|
111
112
|
}
|
|
112
|
-
declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: SelectProps<ValueType, OptionType> & {
|
|
113
|
-
children?: React.ReactNode;
|
|
114
|
-
} & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
|
|
113
|
+
declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
|
|
115
114
|
Option: typeof Option;
|
|
116
115
|
OptGroup: typeof OptGroup;
|
|
117
116
|
};
|
package/es/Select.js
CHANGED
|
@@ -64,6 +64,7 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
64
64
|
// Select
|
|
65
65
|
onSelect,
|
|
66
66
|
onDeselect,
|
|
67
|
+
onActive,
|
|
67
68
|
popupMatchSelectWidth = true,
|
|
68
69
|
// Options
|
|
69
70
|
filterOption,
|
|
@@ -305,6 +306,7 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
305
306
|
const [activeValue, setActiveValue] = React.useState(null);
|
|
306
307
|
const [accessibilityIndex, setAccessibilityIndex] = React.useState(0);
|
|
307
308
|
const mergedDefaultActiveFirstOption = defaultActiveFirstOption !== undefined ? defaultActiveFirstOption : mode !== 'combobox';
|
|
309
|
+
const activeEventRef = React.useRef();
|
|
308
310
|
const onActiveValue = React.useCallback((active, index, {
|
|
309
311
|
source = 'keyboard'
|
|
310
312
|
} = {}) => {
|
|
@@ -312,7 +314,16 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
312
314
|
if (backfill && mode === 'combobox' && active !== null && source === 'keyboard') {
|
|
313
315
|
setActiveValue(String(active));
|
|
314
316
|
}
|
|
315
|
-
|
|
317
|
+
|
|
318
|
+
// Active will call multiple times.
|
|
319
|
+
// We only need trigger the last one.
|
|
320
|
+
const promise = Promise.resolve().then(() => {
|
|
321
|
+
if (activeEventRef.current === promise) {
|
|
322
|
+
onActive?.(active);
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
activeEventRef.current = promise;
|
|
326
|
+
}, [backfill, mode, onActive]);
|
|
316
327
|
|
|
317
328
|
// ========================= OptionList =========================
|
|
318
329
|
const triggerSelect = (val, selected, type) => {
|
package/lib/OptionList.js
CHANGED
|
@@ -135,19 +135,20 @@ const OptionList = (_, ref) => {
|
|
|
135
135
|
* `setActive` function will call root accessibility state update which makes re-render.
|
|
136
136
|
* So we need to delay to let Input component trigger onChange first.
|
|
137
137
|
*/
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
138
|
+
let timeoutId;
|
|
139
|
+
if (!multiple && open && rawValues.size === 1) {
|
|
140
|
+
const value = Array.from(rawValues)[0];
|
|
141
|
+
// Scroll to the option closest to the searchValue if searching.
|
|
142
|
+
const index = memoFlattenOptions.findIndex(({
|
|
143
|
+
data
|
|
144
|
+
}) => searchValue ? String(data.value).startsWith(searchValue) : data.value === value);
|
|
145
|
+
if (index !== -1) {
|
|
146
|
+
setActive(index);
|
|
147
|
+
timeoutId = setTimeout(() => {
|
|
147
148
|
scrollIntoView(index);
|
|
148
|
-
}
|
|
149
|
+
});
|
|
149
150
|
}
|
|
150
|
-
}
|
|
151
|
+
}
|
|
151
152
|
|
|
152
153
|
// Force trigger scrollbar visible when open
|
|
153
154
|
if (open) {
|
package/lib/Select.d.ts
CHANGED
|
@@ -77,6 +77,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
|
|
|
77
77
|
autoClearSearchValue?: boolean;
|
|
78
78
|
onSelect?: SelectHandler<ArrayElementType<ValueType>, OptionType>;
|
|
79
79
|
onDeselect?: SelectHandler<ArrayElementType<ValueType>, OptionType>;
|
|
80
|
+
onActive?: (value: ValueType) => void;
|
|
80
81
|
/**
|
|
81
82
|
* In Select, `false` means do nothing.
|
|
82
83
|
* In TreeSelect, `false` will highlight match item.
|
|
@@ -109,9 +110,7 @@ export interface SelectProps<ValueType = any, OptionType extends BaseOptionType
|
|
|
109
110
|
classNames?: Partial<Record<SemanticName, string>>;
|
|
110
111
|
styles?: Partial<Record<SemanticName, React.CSSProperties>>;
|
|
111
112
|
}
|
|
112
|
-
declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: SelectProps<ValueType, OptionType> & {
|
|
113
|
-
children?: React.ReactNode;
|
|
114
|
-
} & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
|
|
113
|
+
declare const TypedSelect: (<ValueType = any, OptionType extends BaseOptionType | DefaultOptionType = DefaultOptionType>(props: React.PropsWithChildren<SelectProps<ValueType, OptionType>> & React.RefAttributes<BaseSelectRef>) => React.ReactElement) & {
|
|
115
114
|
Option: typeof Option;
|
|
116
115
|
OptGroup: typeof OptGroup;
|
|
117
116
|
};
|
package/lib/Select.js
CHANGED
|
@@ -71,6 +71,7 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
71
71
|
// Select
|
|
72
72
|
onSelect,
|
|
73
73
|
onDeselect,
|
|
74
|
+
onActive,
|
|
74
75
|
popupMatchSelectWidth = true,
|
|
75
76
|
// Options
|
|
76
77
|
filterOption,
|
|
@@ -312,6 +313,7 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
312
313
|
const [activeValue, setActiveValue] = React.useState(null);
|
|
313
314
|
const [accessibilityIndex, setAccessibilityIndex] = React.useState(0);
|
|
314
315
|
const mergedDefaultActiveFirstOption = defaultActiveFirstOption !== undefined ? defaultActiveFirstOption : mode !== 'combobox';
|
|
316
|
+
const activeEventRef = React.useRef();
|
|
315
317
|
const onActiveValue = React.useCallback((active, index, {
|
|
316
318
|
source = 'keyboard'
|
|
317
319
|
} = {}) => {
|
|
@@ -319,7 +321,16 @@ const Select = /*#__PURE__*/React.forwardRef((props, ref) => {
|
|
|
319
321
|
if (backfill && mode === 'combobox' && active !== null && source === 'keyboard') {
|
|
320
322
|
setActiveValue(String(active));
|
|
321
323
|
}
|
|
322
|
-
|
|
324
|
+
|
|
325
|
+
// Active will call multiple times.
|
|
326
|
+
// We only need trigger the last one.
|
|
327
|
+
const promise = Promise.resolve().then(() => {
|
|
328
|
+
if (activeEventRef.current === promise) {
|
|
329
|
+
onActive?.(active);
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
activeEventRef.current = promise;
|
|
333
|
+
}, [backfill, mode, onActive]);
|
|
323
334
|
|
|
324
335
|
// ========================= OptionList =========================
|
|
325
336
|
const triggerSelect = (val, selected, type) => {
|