@rainbow-oh/yee-c 0.4.4 → 0.5.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.
- package/dist/cjs/Button/button.d.ts +1 -1
- package/dist/cjs/CSV/download.d.ts +1 -1
- package/dist/cjs/Carousel/carousel.d.ts +2 -2
- package/dist/cjs/Carousel/carousel.js +9 -2
- package/dist/cjs/Carousel/interface.d.ts +5 -0
- package/dist/cjs/Dialog/demo/basic.js +1 -1
- package/dist/cjs/Dialog/dialog.js +1 -1
- package/dist/cjs/Drawer/style/index.less +4 -0
- package/dist/cjs/Field/demo/validation.js +23 -3
- package/dist/cjs/Field/field.js +1 -1
- package/dist/cjs/FloatButton/float-button.d.ts +1 -1
- package/dist/cjs/Form/Field.js +1 -4
- package/dist/cjs/Form/Form.js +1 -1
- package/dist/cjs/Form/Group.js +36 -14
- package/dist/cjs/Form/List.js +23 -3
- package/dist/cjs/Form/demo/async-validate.d.ts +3 -0
- package/dist/cjs/Form/demo/async-validate.js +108 -0
- package/dist/cjs/Form/demo/basic.js +2 -2
- package/dist/cjs/Form/demo/virtual.js +1 -1
- package/dist/cjs/Form/form-store.d.ts +4 -4
- package/dist/cjs/Form/form-store.js +55 -25
- package/dist/cjs/Form/interface.d.ts +10 -7
- package/dist/cjs/Form/style/index.less +15 -0
- package/dist/cjs/Form/utils/validate.d.ts +23 -2
- package/dist/cjs/Form/utils/validate.js +59 -10
- package/dist/cjs/Input/style/index.less +0 -17
- package/dist/cjs/InputNumber/style/index.less +0 -29
- package/dist/cjs/PickerPanel/interface.d.ts +44 -2
- package/dist/cjs/PickerPanel/panels/DatePanel/DateBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DatePanel/DateHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DatePanel/DateHeader.js +1 -1
- package/dist/cjs/PickerPanel/panels/DatePanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DateTimePanel/index.d.ts +7 -1
- package/dist/cjs/PickerPanel/panels/DateTimePanel/index.js +18 -4
- package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeBody.js +1 -1
- package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeHeader.js +1 -1
- package/dist/cjs/PickerPanel/panels/DecadePanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/DecadePanel/index.js +1 -1
- package/dist/cjs/PickerPanel/panels/Header.d.ts +13 -1
- package/dist/cjs/PickerPanel/panels/MonthPanel/MonthBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.js +1 -1
- package/dist/cjs/PickerPanel/panels/MonthPanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/MonthPanel/index.js +1 -1
- package/dist/cjs/PickerPanel/panels/PanelBody.d.ts +21 -1
- package/dist/cjs/PickerPanel/panels/PanelBody.js +3 -3
- package/dist/cjs/PickerPanel/panels/QuarterPanel/QuarterBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/QuarterPanel/QuarterHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/QuarterPanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/RangePanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/RangePanel/index.js +2 -2
- package/dist/cjs/PickerPanel/panels/RangePanel/interface.d.ts +5 -5
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeBody.d.ts +17 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeCell.d.ts +7 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeCell.js +1 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeColumn.d.ts +14 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeColumn.js +1 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/TimeHeader.d.ts +4 -1
- package/dist/cjs/PickerPanel/panels/TimePanel/index.d.ts +9 -1
- package/dist/cjs/PickerPanel/panels/WeekPanel/WeekBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/WeekPanel/WeekHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/WeekPanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/YearPanel/YearBody.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/YearPanel/YearBody.js +2 -2
- package/dist/cjs/PickerPanel/panels/YearPanel/YearHeader.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/YearPanel/YearHeader.js +7 -1
- package/dist/cjs/PickerPanel/panels/YearPanel/index.d.ts +2 -1
- package/dist/cjs/PickerPanel/panels/YearPanel/index.js +1 -1
- package/dist/cjs/PickerPanel/utils/pickerUtils.d.ts +7 -7
- package/dist/cjs/PickerPanel/utils/pickerUtils.js +2 -2
- package/dist/cjs/Select/demo/basic.js +1 -1
- package/dist/cjs/Select/demo/virtual.d.ts +3 -0
- package/dist/cjs/Select/demo/virtual.js +55 -0
- package/dist/cjs/Select/hooks/useSelectKeyboard.d.ts +7 -1
- package/dist/cjs/Select/hooks/useSelectKeyboard.js +16 -6
- package/dist/cjs/Select/interface.d.ts +44 -0
- package/dist/cjs/Select/option.js +3 -2
- package/dist/cjs/Select/options.js +115 -15
- package/dist/cjs/Select/select.js +20 -4
- package/dist/cjs/Select/style/index.less +17 -13
- package/dist/cjs/Selector/style/index.less +2 -137
- package/dist/cjs/Table/style/index.less +19 -0
- package/dist/cjs/TextArea/style/index.less +0 -17
- package/dist/cjs/hooks/index.d.ts +2 -1
- package/dist/cjs/hooks/index.js +3 -1
- package/dist/cjs/hooks/useEvent.js +4 -1
- package/dist/cjs/hooks/useVirtualList.d.ts +71 -0
- package/dist/cjs/hooks/useVirtualList.js +117 -0
- package/dist/cjs/style/size.css +1 -0
- package/dist/cjs/style/themes.css +1 -1
- package/dist/cjs/style/variables.css +2 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/Button/button.d.ts +1 -1
- package/dist/esm/CSV/download.d.ts +1 -1
- package/dist/esm/Carousel/carousel.d.ts +2 -2
- package/dist/esm/Carousel/carousel.js +5 -1
- package/dist/esm/Carousel/interface.d.ts +5 -0
- package/dist/esm/Dialog/demo/basic.js +1 -1
- package/dist/esm/Dialog/dialog.js +1 -1
- package/dist/esm/Drawer/style/index.less +4 -0
- package/dist/esm/Field/demo/validation.js +30 -9
- package/dist/esm/Field/field.js +2 -1
- package/dist/esm/FloatButton/float-button.d.ts +1 -1
- package/dist/esm/Form/Field.js +3 -4
- package/dist/esm/Form/Form.js +1 -1
- package/dist/esm/Form/Group.js +142 -53
- package/dist/esm/Form/List.js +61 -42
- package/dist/esm/Form/demo/async-validate.d.ts +3 -0
- package/dist/esm/Form/demo/async-validate.js +95 -0
- package/dist/esm/Form/demo/basic.js +4 -2
- package/dist/esm/Form/demo/virtual.js +1 -1
- package/dist/esm/Form/form-store.d.ts +4 -4
- package/dist/esm/Form/form-store.js +187 -93
- package/dist/esm/Form/interface.d.ts +10 -7
- package/dist/esm/Form/style/index.less +15 -0
- package/dist/esm/Form/utils/validate.d.ts +23 -2
- package/dist/esm/Form/utils/validate.js +122 -17
- package/dist/esm/Input/style/index.less +0 -17
- package/dist/esm/InputNumber/style/index.less +0 -29
- package/dist/esm/PickerPanel/interface.d.ts +44 -2
- package/dist/esm/PickerPanel/panels/DatePanel/DateBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DatePanel/DateHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DatePanel/DateHeader.js +1 -1
- package/dist/esm/PickerPanel/panels/DatePanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DateTimePanel/index.d.ts +7 -1
- package/dist/esm/PickerPanel/panels/DateTimePanel/index.js +11 -7
- package/dist/esm/PickerPanel/panels/DecadePanel/DecadeBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DecadePanel/DecadeBody.js +2 -1
- package/dist/esm/PickerPanel/panels/DecadePanel/DecadeHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DecadePanel/DecadeHeader.js +2 -1
- package/dist/esm/PickerPanel/panels/DecadePanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/DecadePanel/index.js +1 -1
- package/dist/esm/PickerPanel/panels/Header.d.ts +13 -1
- package/dist/esm/PickerPanel/panels/MonthPanel/MonthBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/MonthPanel/MonthHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/MonthPanel/MonthHeader.js +2 -1
- package/dist/esm/PickerPanel/panels/MonthPanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/MonthPanel/index.js +1 -1
- package/dist/esm/PickerPanel/panels/PanelBody.d.ts +21 -1
- package/dist/esm/PickerPanel/panels/PanelBody.js +2 -4
- package/dist/esm/PickerPanel/panels/QuarterPanel/QuarterBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/QuarterPanel/QuarterHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/QuarterPanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/RangePanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/RangePanel/index.js +2 -2
- package/dist/esm/PickerPanel/panels/RangePanel/interface.d.ts +5 -5
- package/dist/esm/PickerPanel/panels/TimePanel/TimeBody.d.ts +17 -1
- package/dist/esm/PickerPanel/panels/TimePanel/TimeCell.d.ts +7 -1
- package/dist/esm/PickerPanel/panels/TimePanel/TimeCell.js +1 -1
- package/dist/esm/PickerPanel/panels/TimePanel/TimeColumn.d.ts +14 -1
- package/dist/esm/PickerPanel/panels/TimePanel/TimeColumn.js +1 -1
- package/dist/esm/PickerPanel/panels/TimePanel/TimeHeader.d.ts +4 -1
- package/dist/esm/PickerPanel/panels/TimePanel/index.d.ts +9 -1
- package/dist/esm/PickerPanel/panels/WeekPanel/WeekBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/WeekPanel/WeekHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/WeekPanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/YearPanel/YearBody.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/YearPanel/YearBody.js +3 -2
- package/dist/esm/PickerPanel/panels/YearPanel/YearHeader.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/YearPanel/YearHeader.js +2 -1
- package/dist/esm/PickerPanel/panels/YearPanel/index.d.ts +2 -1
- package/dist/esm/PickerPanel/panels/YearPanel/index.js +1 -1
- package/dist/esm/PickerPanel/picker-panel.js +3 -0
- package/dist/esm/PickerPanel/utils/pickerUtils.d.ts +7 -7
- package/dist/esm/PickerPanel/utils/pickerUtils.js +4 -10
- package/dist/esm/Select/demo/basic.js +1 -1
- package/dist/esm/Select/demo/virtual.d.ts +3 -0
- package/dist/esm/Select/demo/virtual.js +38 -0
- package/dist/esm/Select/hooks/useSelectKeyboard.d.ts +7 -1
- package/dist/esm/Select/hooks/useSelectKeyboard.js +25 -9
- package/dist/esm/Select/interface.d.ts +44 -0
- package/dist/esm/Select/option.js +4 -2
- package/dist/esm/Select/options.js +132 -13
- package/dist/esm/Select/select.js +19 -4
- package/dist/esm/Select/style/index.less +17 -13
- package/dist/esm/Selector/style/index.less +2 -137
- package/dist/esm/Table/style/index.less +19 -0
- package/dist/esm/TextArea/style/index.less +0 -17
- package/dist/esm/hooks/index.d.ts +2 -1
- package/dist/esm/hooks/index.js +2 -1
- package/dist/esm/hooks/useVirtualList.d.ts +71 -0
- package/dist/esm/hooks/useVirtualList.js +129 -0
- package/dist/esm/style/size.css +1 -0
- package/dist/esm/style/themes.css +1 -1
- package/dist/esm/style/variables.css +2 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/umd/yee-c.min.css +2 -2
- package/dist/umd/yee-c.min.js +1 -1
- package/package.json +1 -1
- package/src/Carousel/carousel.tsx +14 -3
- package/src/Carousel/interface.ts +6 -0
- package/src/Cascader/cascader.tsx +3 -1
- package/src/Cascader/column.tsx +1 -1
- package/src/Dialog/demo/basic.tsx +1 -1
- package/src/Dialog/dialog.tsx +1 -1
- package/src/Drawer/style/index.less +4 -0
- package/src/Dropdown/dropdown.tsx +1 -1
- package/src/Field/demo/validation.tsx +2 -2
- package/src/Field/field.tsx +2 -1
- package/src/Field/index.en-US.md +1 -1
- package/src/Field/index.zh-CN.md +1 -1
- package/src/FloatButton/float-button.tsx +5 -3
- package/src/Form/Field.tsx +3 -4
- package/src/Form/Form.tsx +1 -1
- package/src/Form/Group.tsx +15 -12
- package/src/Form/List.tsx +3 -3
- package/src/Form/demo/async-validate.tsx +71 -0
- package/src/Form/demo/basic.tsx +2 -2
- package/src/Form/demo/virtual.tsx +1 -1
- package/src/Form/form-store.ts +37 -21
- package/src/Form/index.en-US.md +6 -5
- package/src/Form/index.zh-CN.md +6 -5
- package/src/Form/interface.ts +13 -7
- package/src/Form/style/index.less +15 -0
- package/src/Form/utils/validate.ts +65 -13
- package/src/Input/style/index.less +0 -17
- package/src/InputNumber/style/index.less +0 -29
- package/src/PickerPanel/interface.ts +43 -2
- package/src/PickerPanel/panels/DatePanel/DateBody.tsx +2 -1
- package/src/PickerPanel/panels/DatePanel/DateHeader.tsx +3 -2
- package/src/PickerPanel/panels/DatePanel/index.tsx +2 -1
- package/src/PickerPanel/panels/DateTimePanel/index.tsx +12 -5
- package/src/PickerPanel/panels/DecadePanel/DecadeBody.tsx +3 -2
- package/src/PickerPanel/panels/DecadePanel/DecadeHeader.tsx +3 -2
- package/src/PickerPanel/panels/DecadePanel/index.tsx +3 -2
- package/src/PickerPanel/panels/Header.tsx +14 -1
- package/src/PickerPanel/panels/MonthPanel/MonthBody.tsx +2 -1
- package/src/PickerPanel/panels/MonthPanel/MonthHeader.tsx +3 -2
- package/src/PickerPanel/panels/MonthPanel/index.tsx +3 -2
- package/src/PickerPanel/panels/PanelBody.tsx +27 -5
- package/src/PickerPanel/panels/QuarterPanel/QuarterBody.tsx +2 -1
- package/src/PickerPanel/panels/QuarterPanel/QuarterHeader.tsx +2 -1
- package/src/PickerPanel/panels/QuarterPanel/index.tsx +2 -1
- package/src/PickerPanel/panels/RangePanel/index.tsx +11 -9
- package/src/PickerPanel/panels/RangePanel/interface.ts +5 -5
- package/src/PickerPanel/panels/TimePanel/TimeBody.tsx +21 -5
- package/src/PickerPanel/panels/TimePanel/TimeCell.tsx +9 -2
- package/src/PickerPanel/panels/TimePanel/TimeColumn.tsx +15 -2
- package/src/PickerPanel/panels/TimePanel/TimeHeader.tsx +5 -1
- package/src/PickerPanel/panels/TimePanel/index.tsx +10 -1
- package/src/PickerPanel/panels/WeekPanel/WeekBody.tsx +2 -1
- package/src/PickerPanel/panels/WeekPanel/WeekHeader.tsx +2 -1
- package/src/PickerPanel/panels/WeekPanel/index.tsx +2 -1
- package/src/PickerPanel/panels/YearPanel/YearBody.tsx +4 -3
- package/src/PickerPanel/panels/YearPanel/YearHeader.tsx +9 -3
- package/src/PickerPanel/panels/YearPanel/index.tsx +3 -2
- package/src/PickerPanel/picker-panel.tsx +5 -3
- package/src/PickerPanel/utils/pickerUtils.ts +17 -8
- package/src/Select/demo/basic.tsx +1 -1
- package/src/Select/demo/virtual.tsx +25 -0
- package/src/Select/hooks/useSelectKeyboard.ts +30 -6
- package/src/Select/index.en-US.md +4 -0
- package/src/Select/index.zh-CN.md +4 -0
- package/src/Select/interface.ts +48 -2
- package/src/Select/option.tsx +2 -1
- package/src/Select/options.tsx +139 -8
- package/src/Select/select.tsx +23 -1
- package/src/Select/style/index.less +17 -13
- package/src/Selector/style/index.less +2 -137
- package/src/Splitter/hooks/useMove.ts +2 -2
- package/src/Table/style/index.less +19 -0
- package/src/TextArea/style/index.less +0 -17
- package/src/hooks/index.ts +2 -0
- package/src/hooks/useEvent.ts +7 -4
- package/src/hooks/useMergedState.ts +6 -4
- package/src/hooks/useVirtualList.ts +169 -0
- package/src/style/size.css +1 -0
- package/src/version.ts +1 -1
|
@@ -14,7 +14,7 @@ function TimeCell(props) {
|
|
|
14
14
|
return /*#__PURE__*/React.createElement("li", {
|
|
15
15
|
className: cls,
|
|
16
16
|
onClick: function onClick() {
|
|
17
|
-
return onSelect(value);
|
|
17
|
+
return onSelect === null || onSelect === void 0 ? void 0 : onSelect(value);
|
|
18
18
|
}
|
|
19
19
|
}, /*#__PURE__*/React.createElement("div", {
|
|
20
20
|
className: "".concat(prefixCls, "-time-panel-cell-inner")
|
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
import { Dayjs } from 'dayjs';
|
|
1
2
|
import React from 'react';
|
|
2
|
-
|
|
3
|
+
import type { TimeUnit } from '../../interface';
|
|
4
|
+
interface TimeColumnProps {
|
|
5
|
+
prefixCls?: string;
|
|
6
|
+
type: TimeUnit;
|
|
7
|
+
value?: Dayjs;
|
|
8
|
+
cells: Dayjs[];
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
onSelect?: (date: Dayjs) => void;
|
|
11
|
+
viewDate?: Dayjs;
|
|
12
|
+
maxDate?: Dayjs;
|
|
13
|
+
minDate?: Dayjs;
|
|
14
|
+
}
|
|
15
|
+
declare function TimeColumn(props: TimeColumnProps): React.JSX.Element;
|
|
3
16
|
export default TimeColumn;
|
|
@@ -28,7 +28,7 @@ function TimeColumn(props) {
|
|
|
28
28
|
selectedCell = _React$useState2[0],
|
|
29
29
|
setSelectedCell = _React$useState2[1];
|
|
30
30
|
React.useLayoutEffect(function () {
|
|
31
|
-
if (value !==
|
|
31
|
+
if (value !== undefined && selectedRef.current) {
|
|
32
32
|
var _ref$current, _selectedRef$current;
|
|
33
33
|
(_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.scrollTo({
|
|
34
34
|
top: (_selectedRef$current = selectedRef.current) === null || _selectedRef$current === void 0 ? void 0 : _selectedRef$current.offsetTop,
|
|
@@ -1,3 +1,11 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
|
|
2
|
+
import type { PanelSharedProps } from '../../interface';
|
|
3
|
+
interface TimePanelProps extends PanelSharedProps {
|
|
4
|
+
format?: string;
|
|
5
|
+
hourStep?: number;
|
|
6
|
+
minuteStep?: number;
|
|
7
|
+
secondStep?: number;
|
|
8
|
+
showTitle?: boolean;
|
|
9
|
+
}
|
|
10
|
+
declare function TimePanel(props: TimePanelProps): React.JSX.Element;
|
|
3
11
|
export default TimePanel;
|
|
@@ -21,7 +21,8 @@ function YearBody(props) {
|
|
|
21
21
|
maxDate = props.maxDate,
|
|
22
22
|
minDate = props.minDate,
|
|
23
23
|
nowDate = props.nowDate,
|
|
24
|
-
offsetYear = props.offsetYear,
|
|
24
|
+
_props$offsetYear = props.offsetYear,
|
|
25
|
+
offsetYear = _props$offsetYear === void 0 ? 0 : _props$offsetYear,
|
|
25
26
|
_props$hoverRange = props.hoverRange,
|
|
26
27
|
hoverRange = _props$hoverRange === void 0 ? [] : _props$hoverRange,
|
|
27
28
|
_props$selectedRange = props.selectedRange,
|
|
@@ -45,7 +46,7 @@ function YearBody(props) {
|
|
|
45
46
|
});
|
|
46
47
|
var getCellTitle = useEvent(function (currentDate) {
|
|
47
48
|
var _year = pickerUtils.getYear(currentDate) + offsetYear;
|
|
48
|
-
return _year < 1000 ? '0' + _year : _year;
|
|
49
|
+
return _year < 1000 ? '0' + _year : String(_year);
|
|
49
50
|
});
|
|
50
51
|
var getCellClassName = useEvent(function (currentDate) {
|
|
51
52
|
var currentYear = pickerUtils.getYear(currentDate);
|
|
@@ -8,7 +8,8 @@ export default function YearHeader(props) {
|
|
|
8
8
|
viewDate = props.viewDate,
|
|
9
9
|
onViewDateChange = props.onViewDateChange,
|
|
10
10
|
onPanelChange = props.onPanelChange,
|
|
11
|
-
offsetYear = props.offsetYear
|
|
11
|
+
_props$offsetYear = props.offsetYear,
|
|
12
|
+
offsetYear = _props$offsetYear === void 0 ? 0 : _props$offsetYear;
|
|
12
13
|
var viewYear = pickerUtils.getYear(viewDate);
|
|
13
14
|
var startYear = viewYear - viewYear % 10 + offsetYear;
|
|
14
15
|
var endYear = startYear + 9;
|
|
@@ -7,7 +7,7 @@ export default function DecadePanel(props) {
|
|
|
7
7
|
offset = props.offset;
|
|
8
8
|
var offsetYear = 0;
|
|
9
9
|
if (offset !== null && offset !== void 0 && offset.year) {
|
|
10
|
-
offsetYear =
|
|
10
|
+
offsetYear = offset.year;
|
|
11
11
|
}
|
|
12
12
|
return /*#__PURE__*/React.createElement("div", {
|
|
13
13
|
className: "".concat(prefixCls, "-year-panel")
|
|
@@ -95,6 +95,9 @@ var PickerPanel = /*#__PURE__*/React.forwardRef(function (props, ref) {
|
|
|
95
95
|
setMergedPickerView(newViewDate);
|
|
96
96
|
onPanelChange === null || onPanelChange === void 0 || onPanelChange(newViewDate);
|
|
97
97
|
};
|
|
98
|
+
|
|
99
|
+
// `PanelBody` clears the hover by passing `''`; forward as-is to preserve
|
|
100
|
+
// the existing runtime behavior.
|
|
98
101
|
var handleMouseChange = function handleMouseChange(date) {
|
|
99
102
|
onCellMouse === null || onCellMouse === void 0 || onCellMouse(date);
|
|
100
103
|
};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import dayjs, { Dayjs } from 'dayjs';
|
|
1
|
+
import dayjs, { Dayjs, OpUnitType } from 'dayjs';
|
|
2
2
|
type PickerType = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'second' | 'minute' | 'hour';
|
|
3
3
|
declare const d: {
|
|
4
4
|
dayjs: typeof dayjs;
|
|
5
|
-
init: (date?:
|
|
5
|
+
init: (date?: dayjs.ConfigType, option?: dayjs.OptionType) => dayjs.Dayjs;
|
|
6
6
|
getNow: () => dayjs.Dayjs;
|
|
7
7
|
getYear: (date: Dayjs) => number;
|
|
8
8
|
getQuarter: (date: Dayjs) => number;
|
|
@@ -13,7 +13,7 @@ declare const d: {
|
|
|
13
13
|
getMinute: (date: Dayjs) => number;
|
|
14
14
|
getSecond: (date: Dayjs) => number;
|
|
15
15
|
format: (date: Dayjs, format: string) => string;
|
|
16
|
-
isSame: (date1: Dayjs, date2: Dayjs, type?: PickerType) => boolean;
|
|
16
|
+
isSame: (date1: Dayjs | undefined, date2: Dayjs | undefined, type?: PickerType) => boolean;
|
|
17
17
|
setYear: (date: Dayjs, year: number) => dayjs.Dayjs;
|
|
18
18
|
setMonth: (date: Dayjs, month: number) => dayjs.Dayjs;
|
|
19
19
|
setDate: (date: Dayjs, day: number) => dayjs.Dayjs;
|
|
@@ -23,10 +23,10 @@ declare const d: {
|
|
|
23
23
|
addYear: (date: Dayjs, offset: number) => dayjs.Dayjs;
|
|
24
24
|
addMonth: (date: Dayjs, offset: number) => dayjs.Dayjs;
|
|
25
25
|
addDate: (date: Dayjs, offset: number) => dayjs.Dayjs;
|
|
26
|
-
isAfter: (date1: Dayjs, date2: Dayjs, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
|
|
27
|
-
isBefore: (date1: Dayjs, date2: Dayjs, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
|
|
28
|
-
isValid: (date: Dayjs, format?: string, strict?: boolean) => boolean;
|
|
29
|
-
isBetween: (date: Dayjs, start: Dayjs, end: Dayjs,
|
|
26
|
+
isAfter: (date1: Dayjs, date2: Dayjs | undefined, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
|
|
27
|
+
isBefore: (date1: Dayjs, date2: Dayjs | undefined, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
|
|
28
|
+
isValid: (date: Dayjs | undefined, format?: string, strict?: boolean) => boolean;
|
|
29
|
+
isBetween: (date: Dayjs, start: Dayjs, end: Dayjs, unit?: OpUnitType, nulls?: '()' | '[]' | '[)' | '(]') => boolean;
|
|
30
30
|
getCellClassName: ({ date, startHoverDate, endHoverDate, startSelectedDate, endSelectedDate, unit, prefixCls, }: {
|
|
31
31
|
date: Dayjs;
|
|
32
32
|
startHoverDate: Dayjs | null | undefined;
|
|
@@ -21,11 +21,8 @@ dayjs.extend(buddhistEra); // Buddhist calendar
|
|
|
21
21
|
|
|
22
22
|
var d = {
|
|
23
23
|
dayjs: dayjs,
|
|
24
|
-
init: function init(date) {
|
|
25
|
-
|
|
26
|
-
rest[_key - 1] = arguments[_key];
|
|
27
|
-
}
|
|
28
|
-
return dayjs.apply(void 0, [date].concat(rest));
|
|
24
|
+
init: function init(date, option) {
|
|
25
|
+
return dayjs(date, option);
|
|
29
26
|
},
|
|
30
27
|
getNow: function getNow() {
|
|
31
28
|
return d.init(undefined);
|
|
@@ -97,11 +94,8 @@ var d = {
|
|
|
97
94
|
isValid: function isValid(date, format, strict) {
|
|
98
95
|
return dayjs(date, format, strict).isValid();
|
|
99
96
|
},
|
|
100
|
-
isBetween: function isBetween(date, start, end) {
|
|
101
|
-
|
|
102
|
-
args[_key2 - 3] = arguments[_key2];
|
|
103
|
-
}
|
|
104
|
-
return date && start && end ? date.isBetween.apply(date, [start, end].concat(args)) : false;
|
|
97
|
+
isBetween: function isBetween(date, start, end, unit, nulls) {
|
|
98
|
+
return date && start && end ? date.isBetween(start, end, unit, nulls) : false;
|
|
105
99
|
},
|
|
106
100
|
getCellClassName: function getCellClassName(_ref) {
|
|
107
101
|
var date = _ref.date,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
7
|
+
import { Select } from "../..";
|
|
8
|
+
import React, { useState } from 'react';
|
|
9
|
+
|
|
10
|
+
// Build a large option set (5000 items) to demonstrate virtual scrolling.
|
|
11
|
+
// Even with this many options, the DOM only holds the visible window.
|
|
12
|
+
var options = Array.from({
|
|
13
|
+
length: 5000
|
|
14
|
+
}, function (_, i) {
|
|
15
|
+
return {
|
|
16
|
+
label: "Option ".concat(i + 1),
|
|
17
|
+
value: i
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
export default (function () {
|
|
21
|
+
var _useState = useState(100),
|
|
22
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
23
|
+
value = _useState2[0],
|
|
24
|
+
setValue = _useState2[1];
|
|
25
|
+
return /*#__PURE__*/React.createElement(Select, {
|
|
26
|
+
virtual: true,
|
|
27
|
+
searchable: true,
|
|
28
|
+
value: value,
|
|
29
|
+
onChange: function onChange(val) {
|
|
30
|
+
return setValue(val);
|
|
31
|
+
},
|
|
32
|
+
options: options,
|
|
33
|
+
style: {
|
|
34
|
+
width: 200
|
|
35
|
+
},
|
|
36
|
+
placeholder: "Please select"
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -11,8 +11,14 @@ interface UseSelectKeyboardParams {
|
|
|
11
11
|
onClose?: () => void;
|
|
12
12
|
onOpenChange?: (open: boolean) => void;
|
|
13
13
|
containerRef?: React.RefObject<HTMLElement>;
|
|
14
|
+
/**
|
|
15
|
+
* Virtual-mode scroll hook. When provided, keyboard navigation drives the
|
|
16
|
+
* virtual viewport through this callback instead of calling scrollIntoView
|
|
17
|
+
* (the focused option may not be in the DOM while virtualized).
|
|
18
|
+
*/
|
|
19
|
+
scrollToIndex?: (index: number) => void;
|
|
14
20
|
}
|
|
15
|
-
export default function useSelectKeyboard({ options, open, selectedKeys, onSelect, onClose, onOpenChange, containerRef, }: UseSelectKeyboardParams): {
|
|
21
|
+
export default function useSelectKeyboard({ options, open, selectedKeys, onSelect, onClose, onOpenChange, containerRef, scrollToIndex, }: UseSelectKeyboardParams): {
|
|
16
22
|
focusedKey: string | number;
|
|
17
23
|
onKeyDown: (event: React.KeyboardEvent) => void;
|
|
18
24
|
};
|
|
@@ -13,7 +13,8 @@ export default function useSelectKeyboard(_ref) {
|
|
|
13
13
|
onSelect = _ref.onSelect,
|
|
14
14
|
onClose = _ref.onClose,
|
|
15
15
|
onOpenChange = _ref.onOpenChange,
|
|
16
|
-
containerRef = _ref.containerRef
|
|
16
|
+
containerRef = _ref.containerRef,
|
|
17
|
+
scrollToIndex = _ref.scrollToIndex;
|
|
17
18
|
var _useState = useState(''),
|
|
18
19
|
_useState2 = _slicedToArray(_useState, 2),
|
|
19
20
|
focusedKey = _useState2[0],
|
|
@@ -51,6 +52,12 @@ export default function useSelectKeyboard(_ref) {
|
|
|
51
52
|
|
|
52
53
|
// Scroll the focused option into view
|
|
53
54
|
var scrollOptionIntoView = function scrollOptionIntoView(index) {
|
|
55
|
+
// Virtual mode: drive the virtual viewport directly, since the option
|
|
56
|
+
// element may not be mounted when it lies outside the render window.
|
|
57
|
+
if (scrollToIndex) {
|
|
58
|
+
scrollToIndex(index);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
54
61
|
var container = containerRef === null || containerRef === void 0 ? void 0 : containerRef.current;
|
|
55
62
|
if (!container) return;
|
|
56
63
|
var optionElements = container.querySelectorAll('[role="option"]');
|
|
@@ -152,22 +159,31 @@ export default function useSelectKeyboard(_ref) {
|
|
|
152
159
|
useEffect(function () {
|
|
153
160
|
if (open) {
|
|
154
161
|
// Focus the first selected option, or the first enabled option
|
|
162
|
+
var focusedValue = '';
|
|
155
163
|
if ((selectedKeys === null || selectedKeys === void 0 ? void 0 : selectedKeys.length) > 0) {
|
|
156
164
|
var firstSelected = options === null || options === void 0 ? void 0 : options.find(function (opt) {
|
|
157
165
|
return opt.value === selectedKeys[0];
|
|
158
166
|
});
|
|
159
167
|
if (firstSelected && !firstSelected.disabled) {
|
|
160
|
-
|
|
161
|
-
return;
|
|
168
|
+
focusedValue = firstSelected.value;
|
|
162
169
|
}
|
|
163
170
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
171
|
+
if (!focusedValue) {
|
|
172
|
+
// Find the first enabled option
|
|
173
|
+
var firstEnabled = options === null || options === void 0 ? void 0 : options.find(function (opt) {
|
|
174
|
+
return !opt.disabled;
|
|
175
|
+
});
|
|
176
|
+
if (firstEnabled) {
|
|
177
|
+
focusedValue = firstEnabled.value;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (focusedValue) {
|
|
181
|
+
setFocusedKey(focusedValue);
|
|
170
182
|
}
|
|
183
|
+
// Scrolling the focused option into view in virtual mode is handled by
|
|
184
|
+
// <Options> itself (it owns the viewport + virtual list), which avoids
|
|
185
|
+
// the first-open timing issue where this effect runs before the virtual
|
|
186
|
+
// API ref is wired up.
|
|
171
187
|
} else {
|
|
172
188
|
// Clear focused key when closing
|
|
173
189
|
setFocusedKey('');
|
|
@@ -94,6 +94,26 @@ export interface SelectProps extends DataAttributeProps {
|
|
|
94
94
|
* Callback when searching
|
|
95
95
|
*/
|
|
96
96
|
onFilter?: (value: string, options: Array<Option>) => Array<Option>;
|
|
97
|
+
/**
|
|
98
|
+
* Enable virtual scrolling for the dropdown.
|
|
99
|
+
*
|
|
100
|
+
* When enabled, only the options inside the visible window are rendered
|
|
101
|
+
* (the DOM node count stays constant regardless of how many options there
|
|
102
|
+
* are). Recommended for large option sets (hundreds or thousands).
|
|
103
|
+
* @default false
|
|
104
|
+
*/
|
|
105
|
+
virtual?: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Height of each option in pixels. Required to be a fixed value when
|
|
108
|
+
* `virtual` is enabled (the list assumes every option has exactly this height).
|
|
109
|
+
* @default 32
|
|
110
|
+
*/
|
|
111
|
+
itemHeight?: number;
|
|
112
|
+
/**
|
|
113
|
+
* Max height of the dropdown popup in pixels.
|
|
114
|
+
* @default 200
|
|
115
|
+
*/
|
|
116
|
+
listHeight?: number;
|
|
97
117
|
}
|
|
98
118
|
/**
|
|
99
119
|
* Props for the internal Option component (renders a single dropdown option).
|
|
@@ -119,6 +139,11 @@ export interface OptionProps {
|
|
|
119
139
|
* Test id forwarded to the option element
|
|
120
140
|
*/
|
|
121
141
|
dataTestId?: string;
|
|
142
|
+
/**
|
|
143
|
+
* Inline style forwarded to the option element.
|
|
144
|
+
* Used by virtual scrolling to position each option absolutely.
|
|
145
|
+
*/
|
|
146
|
+
style?: React.CSSProperties;
|
|
122
147
|
}
|
|
123
148
|
/**
|
|
124
149
|
* Context value shared between Options and each Option.
|
|
@@ -167,6 +192,25 @@ export interface OptionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
|
|
|
167
192
|
* Whether multiple selection mode is active
|
|
168
193
|
*/
|
|
169
194
|
multiple: boolean;
|
|
195
|
+
/**
|
|
196
|
+
* Whether virtual scrolling is enabled
|
|
197
|
+
*/
|
|
198
|
+
virtual?: boolean;
|
|
199
|
+
/**
|
|
200
|
+
* Fixed option height in pixels (only meaningful when `virtual` is enabled)
|
|
201
|
+
*/
|
|
202
|
+
itemHeight?: number;
|
|
203
|
+
/**
|
|
204
|
+
* Max popup height in pixels (only meaningful when `virtual` is enabled)
|
|
205
|
+
*/
|
|
206
|
+
listHeight?: number;
|
|
207
|
+
/**
|
|
208
|
+
* Ref that receives the virtual list API (currently `scrollToIndex`),
|
|
209
|
+
* so the parent can wire keyboard navigation to the virtual viewport.
|
|
210
|
+
*/
|
|
211
|
+
virtualApiRef?: React.MutableRefObject<{
|
|
212
|
+
scrollToIndex: (index: number) => void;
|
|
213
|
+
} | null>;
|
|
170
214
|
/**
|
|
171
215
|
* Callback when an option is selected
|
|
172
216
|
*/
|
|
@@ -11,7 +11,8 @@ var Option = function Option(props) {
|
|
|
11
11
|
value = props.value,
|
|
12
12
|
disabled = props.disabled,
|
|
13
13
|
title = props.title,
|
|
14
|
-
dataTestId = props.dataTestId
|
|
14
|
+
dataTestId = props.dataTestId,
|
|
15
|
+
style = props.style;
|
|
15
16
|
var _useContext = useContext(OptionsCtx),
|
|
16
17
|
prefixCls = _useContext.prefixCls,
|
|
17
18
|
selectedKeys = _useContext.selectedKeys,
|
|
@@ -37,7 +38,8 @@ var Option = function Option(props) {
|
|
|
37
38
|
role: "option",
|
|
38
39
|
tabIndex: disabled ? undefined : 0,
|
|
39
40
|
title: htmlTitle,
|
|
40
|
-
"data-testid": dataTestId
|
|
41
|
+
"data-testid": dataTestId,
|
|
42
|
+
style: style
|
|
41
43
|
}, /*#__PURE__*/React.createElement("div", {
|
|
42
44
|
className: "".concat(prefixCls, "-option-content")
|
|
43
45
|
}, label), multiple && selected && /*#__PURE__*/React.createElement("span", {
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
var _excluded = ["prefixCls", "options", "popupClassName", "popupStyle", "selectedKeys", "focusedKey", "dataTestId", "multiple", "onSelect"];
|
|
1
|
+
var _excluded = ["prefixCls", "options", "popupClassName", "popupStyle", "selectedKeys", "focusedKey", "dataTestId", "multiple", "virtual", "itemHeight", "listHeight", "virtualApiRef", "onSelect"];
|
|
2
2
|
function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
3
3
|
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
|
|
4
4
|
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
|
|
5
5
|
import clsx from 'clsx';
|
|
6
|
-
import React, { createContext, forwardRef, useRef } from 'react';
|
|
6
|
+
import React, { createContext, forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
|
|
7
|
+
import useVirtualList from "../hooks/useVirtualList";
|
|
7
8
|
import { useLocale } from "../locale";
|
|
8
9
|
import Option from "./option";
|
|
9
10
|
export var OptionsCtx = /*#__PURE__*/createContext({});
|
|
@@ -19,26 +20,144 @@ var Options = /*#__PURE__*/forwardRef(function (props, ref) {
|
|
|
19
20
|
focusedKey = props.focusedKey,
|
|
20
21
|
dataTestId = props.dataTestId,
|
|
21
22
|
multiple = props.multiple,
|
|
23
|
+
virtual = props.virtual,
|
|
24
|
+
_props$itemHeight = props.itemHeight,
|
|
25
|
+
itemHeight = _props$itemHeight === void 0 ? 32 : _props$itemHeight,
|
|
26
|
+
_props$listHeight = props.listHeight,
|
|
27
|
+
listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight,
|
|
28
|
+
virtualApiRef = props.virtualApiRef,
|
|
22
29
|
onSelect = props.onSelect,
|
|
23
30
|
rest = _objectWithoutProperties(props, _excluded);
|
|
31
|
+
var rootRef = useRef(null);
|
|
32
|
+
// Forward the popup root element to the parent (Select uses it as the
|
|
33
|
+
// keyboard-nav containerRef) while keeping a stable RefObject for the
|
|
34
|
+
// effects below.
|
|
35
|
+
useImperativeHandle(ref, function () {
|
|
36
|
+
return rootRef.current;
|
|
37
|
+
}, []);
|
|
24
38
|
|
|
25
|
-
//
|
|
26
|
-
|
|
39
|
+
// Hook is always called (rules of hooks). When `virtual` is off the
|
|
40
|
+
// returned viewportRef is never attached, so the observer stays idle.
|
|
41
|
+
var _useVirtualList = useVirtualList({
|
|
42
|
+
itemCount: options.length,
|
|
43
|
+
itemHeight: itemHeight
|
|
44
|
+
}),
|
|
45
|
+
start = _useVirtualList.start,
|
|
46
|
+
end = _useVirtualList.end,
|
|
47
|
+
offsetY = _useVirtualList.offsetY,
|
|
48
|
+
totalHeight = _useVirtualList.totalHeight,
|
|
49
|
+
viewportRef = _useVirtualList.viewportRef,
|
|
50
|
+
onScroll = _useVirtualList.onScroll,
|
|
51
|
+
scrollToIndex = _useVirtualList.scrollToIndex;
|
|
52
|
+
|
|
53
|
+
// Expose the virtual scroll API to the parent so keyboard navigation
|
|
54
|
+
// can drive the virtual viewport (replaces scrollIntoView).
|
|
55
|
+
useEffect(function () {
|
|
56
|
+
if (!virtual || !virtualApiRef) return;
|
|
57
|
+
virtualApiRef.current = {
|
|
58
|
+
scrollToIndex: scrollToIndex
|
|
59
|
+
};
|
|
60
|
+
return function () {
|
|
61
|
+
if (virtualApiRef.current) {
|
|
62
|
+
virtualApiRef.current = null;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}, [virtual, virtualApiRef, scrollToIndex]);
|
|
66
|
+
|
|
67
|
+
// Reset the scroll position whenever the option set changes (e.g. after
|
|
68
|
+
// filtering via search), otherwise the viewport may sit at an offset
|
|
69
|
+
// where none of the new results are visible.
|
|
70
|
+
useEffect(function () {
|
|
71
|
+
if (virtual) {
|
|
72
|
+
scrollToIndex(0);
|
|
73
|
+
}
|
|
74
|
+
}, [options, virtual, scrollToIndex]);
|
|
75
|
+
|
|
76
|
+
// Bring the focused option into view on open and whenever it changes.
|
|
77
|
+
// - virtual mode: drive the virtual viewport via scrollToIndex.
|
|
78
|
+
// - default mode: scrollIntoView on the option's DOM node.
|
|
79
|
+
// Options owns this (rather than the keyboard hook) so it also covers the
|
|
80
|
+
// initial open, where the keyboard effect can fire before the popup is
|
|
81
|
+
// mounted / the virtual API ref is wired up.
|
|
82
|
+
useEffect(function () {
|
|
83
|
+
if (options.length === 0) return;
|
|
84
|
+
if (focusedKey === '') return;
|
|
85
|
+
var focusedIndex = options.findIndex(function (o) {
|
|
86
|
+
return o.value === focusedKey;
|
|
87
|
+
});
|
|
88
|
+
if (focusedIndex < 0) return;
|
|
89
|
+
if (virtual) {
|
|
90
|
+
scrollToIndex(focusedIndex);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
var container = rootRef.current;
|
|
94
|
+
if (!container) return;
|
|
95
|
+
var optionElements = container.querySelectorAll('[role="option"]');
|
|
96
|
+
var targetElement = optionElements[focusedIndex];
|
|
97
|
+
if (targetElement) {
|
|
98
|
+
targetElement.scrollIntoView({
|
|
99
|
+
block: 'nearest'
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}, [focusedKey, virtual, options, scrollToIndex, rootRef]);
|
|
103
|
+
var isEmpty = options.length === 0;
|
|
104
|
+
var ctxValue = {
|
|
105
|
+
prefixCls: prefixCls,
|
|
106
|
+
selectedKeys: selectedKeys,
|
|
107
|
+
focusedKey: focusedKey,
|
|
108
|
+
multiple: multiple,
|
|
109
|
+
onSelect: onSelect
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// ----- Virtual mode: only render the visible window -----
|
|
113
|
+
if (virtual && !isEmpty) {
|
|
114
|
+
var visibleOptions = options.slice(start, end);
|
|
115
|
+
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
116
|
+
className: clsx("".concat(prefixCls, "-popup"), "".concat(prefixCls, "-popup-virtual"), popupClassName),
|
|
117
|
+
style: popupStyle,
|
|
118
|
+
ref: rootRef,
|
|
119
|
+
tabIndex: -1
|
|
120
|
+
}), /*#__PURE__*/React.createElement(OptionsCtx.Provider, {
|
|
121
|
+
value: ctxValue
|
|
122
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
123
|
+
className: "".concat(prefixCls, "-popup-viewport"),
|
|
124
|
+
ref: viewportRef,
|
|
125
|
+
onScroll: onScroll,
|
|
126
|
+
style: {
|
|
127
|
+
maxHeight: listHeight,
|
|
128
|
+
overflowY: 'auto'
|
|
129
|
+
}
|
|
130
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
131
|
+
style: {
|
|
132
|
+
height: totalHeight,
|
|
133
|
+
position: 'relative'
|
|
134
|
+
}
|
|
135
|
+
}, visibleOptions.map(function (option, i) {
|
|
136
|
+
return /*#__PURE__*/React.createElement(Option, _extends({}, option, {
|
|
137
|
+
key: option.value,
|
|
138
|
+
dataTestId: "".concat(dataTestId, "-").concat(start + i),
|
|
139
|
+
style: {
|
|
140
|
+
position: 'absolute',
|
|
141
|
+
top: 0,
|
|
142
|
+
left: 0,
|
|
143
|
+
right: 0,
|
|
144
|
+
height: itemHeight,
|
|
145
|
+
transform: "translateY(".concat(offsetY + i * itemHeight, "px)")
|
|
146
|
+
}
|
|
147
|
+
}));
|
|
148
|
+
})))));
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ----- Default mode: render every option (unchanged behavior) -----
|
|
27
152
|
return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
|
|
28
153
|
className: clsx("".concat(prefixCls, "-popup"), popupClassName),
|
|
29
154
|
style: popupStyle,
|
|
30
|
-
ref:
|
|
155
|
+
ref: rootRef,
|
|
31
156
|
tabIndex: -1
|
|
32
|
-
}),
|
|
157
|
+
}), isEmpty ? /*#__PURE__*/React.createElement("div", {
|
|
33
158
|
className: "".concat(prefixCls, "-empty")
|
|
34
159
|
}, select.noData) : /*#__PURE__*/React.createElement(OptionsCtx.Provider, {
|
|
35
|
-
value:
|
|
36
|
-
prefixCls: prefixCls,
|
|
37
|
-
selectedKeys: selectedKeys,
|
|
38
|
-
focusedKey: focusedKey,
|
|
39
|
-
multiple: multiple,
|
|
40
|
-
onSelect: onSelect
|
|
41
|
-
}
|
|
160
|
+
value: ctxValue
|
|
42
161
|
}, options.map(function (option, index) {
|
|
43
162
|
return /*#__PURE__*/React.createElement(Option, _extends({}, option, {
|
|
44
163
|
key: option.value,
|