Skip to content

Commit 9c1ba73

Browse files
authored
feat: add hideHeader (#717)
1 parent 8db5ccb commit 9c1ba73

File tree

4 files changed

+77
-33
lines changed

4 files changed

+77
-33
lines changed

src/PickerPanel/PanelHeader.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,13 @@ function PanelHeader<DateType extends object>(props: HeaderProps) {
3232

3333
const headerPrefixCls = `${prefixCls}-header`;
3434

35-
const { hidePrev, hideNext } = React.useContext(PickerHackContext);
35+
const { hidePrev, hideNext, hideHeader } = React.useContext(PickerHackContext);
3636

37+
if (hideHeader) {
38+
return null;
39+
}
40+
41+
// ========================= Render =========================
3742
return (
3843
<div className={headerPrefixCls}>
3944
{onSuperOffset && (

src/PickerPanel/context.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export function useInfo<DateType extends object = any>(
9696
export interface PickerHackContextProps {
9797
hidePrev?: boolean;
9898
hideNext?: boolean;
99+
hideHeader?: boolean;
99100
onCellDblClick?: () => void;
100101
}
101102

src/PickerPanel/index.tsx

Lines changed: 47 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import PickerContext from '../PickerInput/context';
1919
import useCellRender from '../PickerInput/hooks/useCellRender';
2020
import { isSame } from '../utils/dateUtil';
2121
import { pickProps, toArray } from '../utils/miscUtil';
22+
import { PickerHackContext } from './context';
2223
import DatePanel from './DatePanel';
2324
import DateTimePanel from './DateTimePanel';
2425
import DecadePanel from './DecadePanel';
@@ -110,6 +111,9 @@ export interface BasePickerPanelProps<DateType extends object = any>
110111

111112
// Components
112113
components?: Components;
114+
115+
/** @private This is internal usage. Do not use in your production env */
116+
hideHeader?: boolean;
113117
}
114118

115119
export interface SinglePickerPanelProps<DateType extends object = any>
@@ -172,6 +176,8 @@ function PickerPanel<DateType extends object = any>(
172176

173177
// Components
174178
components = {},
179+
180+
hideHeader,
175181
} = props;
176182

177183
const mergedPrefixCls = React.useContext(PickerContext)?.prefixCls || prefixCls || 'rc-picker';
@@ -345,6 +351,13 @@ function PickerPanel<DateType extends object = any>(
345351
DefaultComponents[internalMode] ||
346352
DatePanel) as typeof DatePanel;
347353

354+
// ======================== Context =========================
355+
const parentHackContext = React.useContext(PickerHackContext);
356+
const pickerPanelContext = React.useMemo(
357+
() => ({ ...parentHackContext, hideHeader }),
358+
[parentHackContext, hideHeader],
359+
);
360+
348361
// ======================== Warnings ========================
349362
if (process.env.NODE_ENV !== 'production') {
350363
warning(
@@ -374,38 +387,40 @@ function PickerPanel<DateType extends object = any>(
374387
]);
375388

376389
return (
377-
<div
378-
ref={rootRef}
379-
tabIndex={tabIndex}
380-
className={classNames(panelCls, {
381-
[`${panelCls}-rtl`]: direction === 'rtl',
382-
})}
383-
>
384-
<PanelComponent
385-
{...panelProps}
386-
// Time
387-
showTime={mergedShowTime}
388-
// MISC
389-
prefixCls={mergedPrefixCls}
390-
locale={filledLocale}
391-
generateConfig={generateConfig}
392-
// Mode
393-
onModeChange={triggerModeChange}
394-
// Value
395-
pickerValue={mergedPickerValue}
396-
onPickerValueChange={(nextPickerValue) => {
397-
setPickerValue(nextPickerValue, true);
398-
}}
399-
value={mergedValue[0]}
400-
onSelect={onPanelValueSelect}
401-
values={mergedValue}
402-
// Render
403-
cellRender={onInternalCellRender}
404-
// Hover
405-
hoverRangeValue={hoverRangeDate}
406-
hoverValue={hoverValue}
407-
/>
408-
</div>
390+
<PickerHackContext.Provider value={pickerPanelContext}>
391+
<div
392+
ref={rootRef}
393+
tabIndex={tabIndex}
394+
className={classNames(panelCls, {
395+
[`${panelCls}-rtl`]: direction === 'rtl',
396+
})}
397+
>
398+
<PanelComponent
399+
{...panelProps}
400+
// Time
401+
showTime={mergedShowTime}
402+
// MISC
403+
prefixCls={mergedPrefixCls}
404+
locale={filledLocale}
405+
generateConfig={generateConfig}
406+
// Mode
407+
onModeChange={triggerModeChange}
408+
// Value
409+
pickerValue={mergedPickerValue}
410+
onPickerValueChange={(nextPickerValue) => {
411+
setPickerValue(nextPickerValue, true);
412+
}}
413+
value={mergedValue[0]}
414+
onSelect={onPanelValueSelect}
415+
values={mergedValue}
416+
// Render
417+
cellRender={onInternalCellRender}
418+
// Hover
419+
hoverRangeValue={hoverRangeDate}
420+
hoverValue={hoverValue}
421+
/>
422+
</div>
423+
</PickerHackContext.Provider>
409424
);
410425
}
411426

tests/internal.spec.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { render } from '@testing-library/react';
2+
import React from 'react';
3+
import { DayPickerPanel, getMoment } from './util/commonUtil';
4+
5+
// Note: Props tested in this file is safe to remove when refactor
6+
describe('Picker.Internal', () => {
7+
beforeEach(() => {
8+
jest.useFakeTimers().setSystemTime(getMoment('1990-09-03 00:00:00').valueOf());
9+
});
10+
11+
afterEach(() => {
12+
jest.clearAllTimers();
13+
jest.useRealTimers();
14+
});
15+
16+
it('hideHeader', async () => {
17+
const { container, rerender } = render(<DayPickerPanel />);
18+
expect(container.querySelector('.rc-picker-header')).toBeTruthy();
19+
20+
rerender(<DayPickerPanel hideHeader />);
21+
expect(container.querySelector('.rc-picker-header')).toBeFalsy();
22+
});
23+
});

0 commit comments

Comments
 (0)