Skip to content

Commit e2e4765

Browse files
authored
refactor: Use defualtOpenValue (#742)
* chore: defaultPickerValue working * test: test driven * chore: align logic * chore: fix defaultOpen logic * fix: merge logic * test: update test case * chore: fix lint
1 parent 2019880 commit e2e4765

File tree

9 files changed

+96
-45
lines changed

9 files changed

+96
-45
lines changed

docs/examples/debug.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,12 @@ export default () => {
155155
// disabledMinutes: () => [0, 1, 2, 3, 4, 5],
156156
// disabledSeconds: () => [0, 1, 2, 3, 4, 5],
157157
// })}
158-
open
158+
defaultOpenValue={dayjs()}
159+
// open
159160
picker="time"
161+
// showTime={{
162+
// defaultValue: dayjs(),
163+
// }}
160164
ref={singleRef}
161165
suffixIcon="🧶"
162166
// showTime={{
@@ -185,11 +189,13 @@ export default () => {
185189
}}
186190
/>
187191
<br />
188-
{/* <RangePicker
192+
<RangePicker
189193
{...sharedLocale}
190-
value={rangeValue}
191-
open
192-
picker="week"
194+
// value={rangeValue}
195+
// open
196+
showTime={{
197+
defaultOpenValue: [dayjs()],
198+
}}
193199
panelRender={(ori) => <>2333{ori}</>}
194200
onChange={(val, text) => {
195201
console.log('🔥 Change:', val, text);
@@ -210,7 +216,7 @@ export default () => {
210216
info,
211217
);
212218
}}
213-
/> */}
219+
/>
214220
<br />
215221

216222
<button

src/PickerInput/Popup/Footer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface FooterProps<DateType extends object = any> {
1818
showNow: boolean;
1919
generateConfig: GenerateConfig<DateType>;
2020
disabledDate: DisabledDate<DateType>;
21-
showTime?: Omit<RangeTimeProps<DateType>, 'defaultValue'>;
21+
showTime?: Omit<RangeTimeProps<DateType>, 'defaultValue' | 'defaultOpenValue'>;
2222

2323
// Invalid
2424
/** From Footer component used only. Check if can OK button click */

src/PickerInput/Popup/index.tsx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export interface PopupProps<DateType extends object = any, PresetValue = DateTyp
2525
// Direction
2626
direction?: 'ltr' | 'rtl';
2727

28+
// Fill
29+
/** TimePicker or showTime only */
30+
defaultOpenValue: DateType;
31+
2832
// Change
2933
needConfirm: boolean;
3034
isInvalid: (date: DateType | DateType[]) => boolean;
@@ -59,7 +63,7 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
5963
value,
6064
onSelect,
6165
isInvalid,
62-
pickerValue,
66+
defaultOpenValue,
6367
onOk,
6468
onSubmit,
6569
} = props;
@@ -101,15 +105,16 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
101105

102106
const valueList = React.useMemo(() => filterEmpty(toArray(value)), [value]);
103107

104-
const isTimePicker = picker === 'time';
105-
const isEmptyValue = !valueList.length;
108+
const isTimePickerEmptyValue = picker === 'time' && !valueList.length;
106109

107110
const footerSubmitValue = React.useMemo(() => {
108-
if (isTimePicker && isEmptyValue) {
109-
return filterEmpty([pickerValue]);
111+
if (isTimePickerEmptyValue) {
112+
return filterEmpty([defaultOpenValue]);
110113
}
111114
return valueList;
112-
}, [isTimePicker, valueList, isEmptyValue, pickerValue]);
115+
}, [isTimePickerEmptyValue, valueList, defaultOpenValue]);
116+
117+
const popupPanelValue = isTimePickerEmptyValue ? defaultOpenValue : valueList;
113118

114119
const disableSubmit = React.useMemo(() => {
115120
// Empty is invalid
@@ -122,8 +127,8 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
122127

123128
const onFooterSubmit = () => {
124129
// For TimePicker, we will additional trigger the value update
125-
if (isTimePicker && isEmptyValue) {
126-
onSelect(pickerValue);
130+
if (isTimePickerEmptyValue) {
131+
onSelect(defaultOpenValue);
127132
}
128133

129134
onOk();
@@ -140,7 +145,7 @@ export default function Popup<DateType extends object = any>(props: PopupProps<D
140145
onHover={onPresetHover}
141146
/>
142147
<div>
143-
<PopupPanel {...props} />
148+
<PopupPanel {...props} value={popupPanelValue} />
144149
<Footer
145150
{...props}
146151
showNow={multiple ? false : showNow}

src/PickerInput/RangePicker.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import type {
2020
import type { PickerPanelProps } from '../PickerPanel';
2121
import PickerTrigger from '../PickerTrigger';
2222
import { pickTriggerProps } from '../PickerTrigger/util';
23-
import { fillIndex } from '../utils/miscUtil';
23+
import { fillIndex, toArray } from '../utils/miscUtil';
2424
import PickerContext from './context';
2525
import useCellRender from './hooks/useCellRender';
2626
import useFieldsInvalidate from './hooks/useFieldsInvalidate';
@@ -128,7 +128,7 @@ export interface BaseRangePickerProps<DateType extends object>
128128

129129
export interface RangePickerProps<DateType extends object>
130130
extends BaseRangePickerProps<DateType>,
131-
Omit<RangeTimeProps<DateType>, 'format' | 'defaultValue'> {}
131+
Omit<RangeTimeProps<DateType>, 'format' | 'defaultValue' | 'defaultOpenValue'> {}
132132

133133
function getActiveRange(activeIndex: number) {
134134
return activeIndex === 1 ? 'end' : 'start';
@@ -357,7 +357,7 @@ function RangePicker<DateType extends object = any>(
357357
multiplePanel,
358358
defaultPickerValue,
359359
pickerValue,
360-
mergedShowTime?.defaultValue,
360+
mergedShowTime?.defaultOpenValue,
361361
onPickerValueChange,
362362
minDate,
363363
maxDate,
@@ -572,6 +572,7 @@ function RangePicker<DateType extends object = any>(
572572
onSelect={onPanelSelect}
573573
// PickerValue
574574
pickerValue={currentPickerValue}
575+
defaultOpenValue={toArray(showTime?.defaultOpenValue)[activeIndex]}
575576
onPickerValueChange={setCurrentPickerValue}
576577
// Hover
577578
hoverValue={hoverValues}

src/PickerInput/SinglePicker.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ function Picker<DateType extends object = any>(
323323
false, // multiplePanel,
324324
defaultPickerValue,
325325
pickerValue,
326-
toArray(showTime?.defaultValue),
326+
toArray(showTime?.defaultOpenValue),
327327
onInternalPickerValueChange,
328328
minDate,
329329
maxDate,
@@ -503,6 +503,7 @@ function Picker<DateType extends object = any>(
503503
onSelect={onPanelSelect}
504504
// PickerValue
505505
pickerValue={currentPickerValue}
506+
defaultOpenValue={showTime?.defaultOpenValue}
506507
onPickerValueChange={setCurrentPickerValue}
507508
// Hover
508509
hoverValue={hoverValues}

src/PickerInput/hooks/useFilledProps.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -116,14 +116,12 @@ export default function useFilledProps<
116116
defaultValue,
117117
pickerValue,
118118
defaultPickerValue,
119-
defaultOpenValue,
120119
} = props;
121120

122121
const values = useList(value);
123122
const defaultValues = useList(defaultValue);
124-
const defaultOpenValues = useList(defaultOpenValue, true);
125123
const pickerValues = useList(pickerValue);
126-
const defaultPickerValues = useList(defaultPickerValue) || defaultOpenValues;
124+
const defaultPickerValues = useList(defaultPickerValue);
127125

128126
// ======================== Picker ========================
129127
/** Almost same as `picker`, but add `datetime` for `date` with `showTime` */
@@ -156,11 +154,6 @@ export default function useFilledProps<
156154
`'disabledHours', 'disabledMinutes', 'disabledSeconds' will be removed in the next major version, please use 'disabledTime' instead.`,
157155
);
158156
}
159-
160-
warning(
161-
!defaultOpenValue,
162-
`'defaultOpenValue' is deprecated which merged into 'defaultPickerValue' instead.`,
163-
);
164157
}
165158

166159
// ======================== Props =========================

src/hooks/useTimeConfig.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const showTimeKeys = [
2626
'disabledMilliseconds',
2727
'disabledTime',
2828
'changeOnScroll',
29+
'defaultOpenValue',
2930
] as const;
3031

3132
/**
@@ -83,6 +84,7 @@ export function getTimeProps<DateType extends object>(
8384

8485
const showTimeConfig = showTime && typeof showTime === 'object' ? showTime : {};
8586
const timeConfig = {
87+
defaultOpenValue: showTimeConfig.defaultOpenValue || showTimeConfig.defaultValue,
8688
...pickedProps,
8789
...showTimeConfig,
8890
};

src/interface.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -162,9 +162,12 @@ export interface SharedTimeProps<DateType extends object = any> {
162162
/** Only work in picker is `time` */
163163
hideDisabledOptions?: boolean;
164164

165-
/** Set default value template when empty selection */
165+
/** @deprecated Use `defaultOpenValue` instead */
166166
defaultValue?: DateType;
167167

168+
/** Set default value template when empty selection */
169+
defaultOpenValue?: DateType;
170+
168171
/** @deprecated Please use `disabledTime` instead. */
169172
disabledHours?: DisabledTimes['disabledHours'];
170173
/** @deprecated Please use `disabledTime` instead. */
@@ -181,9 +184,11 @@ export interface SharedTimeProps<DateType extends object = any> {
181184

182185
export type RangeTimeProps<DateType extends object = any> = Omit<
183186
SharedTimeProps<DateType>,
184-
'defaultValue'
187+
'defaultValue' | 'defaultOpenValue'
185188
> & {
186-
defaultValue?: [DateType, DateType];
189+
/** @deprecated Use `defaultOpenValue` instead. */
190+
defaultValue?: DateType[];
191+
defaultOpenValue?: DateType[];
187192
};
188193

189194
// ======================= Components =======================
@@ -369,7 +374,6 @@ export interface SharedPickerProps<DateType extends object = any>
369374
maxDate?: DateType;
370375

371376
// Open
372-
/** @deprecated Please use `defaultPickerValue` instead */
373377
defaultOpenValue?: DateType;
374378
defaultOpen?: boolean;
375379
open?: boolean;

tests/picker.spec.tsx

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -812,10 +812,6 @@ describe('Picker.Basic', () => {
812812
/>,
813813
);
814814

815-
expect(errSpy).toHaveBeenCalledWith(
816-
"Warning: 'defaultOpenValue' is deprecated which merged into 'defaultPickerValue' instead.",
817-
);
818-
819815
openPicker(container);
820816
fireEvent.click(document.querySelector('.rc-picker-ok button'));
821817

@@ -1377,17 +1373,60 @@ describe('Picker.Basic', () => {
13771373
).toEqual('01');
13781374
});
13791375

1380-
it('time picker should align to 0', () => {
1381-
jest.useFakeTimers().setSystemTime(getDay('1990-09-03 01:03:05').valueOf());
1376+
describe('time with defaultPickerValue', () => {
1377+
beforeEach(() => {
1378+
jest.useFakeTimers().setSystemTime(getDay('1990-09-03 01:03:05').valueOf());
1379+
});
13821380

1383-
const onCalendarChange = jest.fn();
1384-
render(<DayPicker picker="time" open showNow onCalendarChange={onCalendarChange} />);
1381+
it('time picker should align to 0', () => {
1382+
const onCalendarChange = jest.fn();
1383+
render(<DayPicker picker="time" open showNow onCalendarChange={onCalendarChange} />);
1384+
1385+
const submitBtn = document.querySelector('.rc-picker-ok button');
1386+
expect(submitBtn).toHaveAttribute('disabled');
1387+
1388+
selectCell('00');
1389+
expect(submitBtn).not.toHaveAttribute('disabled');
1390+
expect(onCalendarChange).toHaveBeenCalledWith(
1391+
expect.anything(),
1392+
'00:00:00',
1393+
expect.anything(),
1394+
);
1395+
onCalendarChange.mockReset();
1396+
1397+
fireEvent.click(document.querySelector('.rc-picker-now-btn'));
1398+
expect(submitBtn).not.toHaveAttribute('disabled');
1399+
expect(onCalendarChange).toHaveBeenCalledWith(
1400+
expect.anything(),
1401+
'01:03:05',
1402+
expect.anything(),
1403+
);
1404+
});
13851405

1386-
selectCell('00');
1387-
expect(onCalendarChange).toHaveBeenCalledWith(expect.anything(), '00:00:00', expect.anything());
1388-
onCalendarChange.mockReset();
1406+
function testPropsName(propName: string) {
1407+
it(`${propName} with showTime`, () => {
1408+
const onCalendarChange = jest.fn();
1409+
render(
1410+
<DayPicker
1411+
showTime={{
1412+
[propName]: dayjs(),
1413+
}}
1414+
open
1415+
onCalendarChange={onCalendarChange}
1416+
defaultPickerValue={dayjs()}
1417+
/>,
1418+
);
1419+
1420+
selectCell(15);
1421+
expect(onCalendarChange).toHaveBeenCalledWith(
1422+
expect.anything(),
1423+
'1990-09-15 01:03:05',
1424+
expect.anything(),
1425+
);
1426+
});
1427+
}
13891428

1390-
fireEvent.click(document.querySelector('.rc-picker-now-btn'));
1391-
expect(onCalendarChange).toHaveBeenCalledWith(expect.anything(), '01:03:05', expect.anything());
1429+
testPropsName('defaultValue');
1430+
testPropsName('defaultOpenValue');
13921431
});
13931432
});

0 commit comments

Comments
 (0)