Skip to content

Commit a556e02

Browse files
committed
feat: Move ranges into Panel again
1 parent adfa327 commit a556e02

File tree

6 files changed

+122
-106
lines changed

6 files changed

+122
-106
lines changed

assets/index.less

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@
1616
}
1717
}
1818

19-
&-ranges {
20-
display: flex;
21-
list-style: none;
22-
margin: 0;
23-
padding: 0;
24-
}
25-
2619
// ===================== Shared Panel =====================
2720
&-decade-panel,
2821
&-year-panel,
@@ -129,9 +122,15 @@
129122
}
130123
}
131124

132-
&-now {
133-
text-align: left;
125+
&-ranges {
126+
margin: 0;
127+
padding: 0;
134128
overflow: hidden;
129+
list-style: none;
130+
131+
> li {
132+
display: inline-block;
133+
}
135134
}
136135

137136
&-ok {
@@ -378,8 +377,4 @@
378377
vertical-align: top;
379378
transition: margin 0.3s;
380379
}
381-
382-
&-ranges {
383-
background: red;
384-
}
385380
}

examples/range.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,9 @@ export default () => {
7070
ranges={{
7171
ranges: [moment(), moment().add(10, 'day')],
7272
}}
73+
onOk={dates => {
74+
console.log('OK!!!', dates);
75+
}}
7376
/>
7477
</div>
7578

src/Picker.tsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,6 @@ export interface PickerSharedProps<DateType> extends React.AriaAttributes {
8181
// WAI-ARIA
8282
role?: string;
8383
name?: string;
84-
85-
/** @private Internal usage. Do not use in your production env */
86-
components?: {
87-
button: React.ComponentType;
88-
};
8984
}
9085

9186
type OmitPanelProps<Props> = Omit<

src/PickerPanel.tsx

Lines changed: 63 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export interface PickerPanelSharedProps<DateType> {
6969
onChange?: (value: DateType) => void;
7070
onPanelChange?: OnPanelChange<DateType>;
7171
onMouseDown?: React.MouseEventHandler<HTMLDivElement>;
72-
onOk?: () => void;
72+
onOk?: (date: DateType) => void;
7373

7474
/** @private This is internal usage. Do not use in your production env */
7575
hideHeader?: boolean;
@@ -78,7 +78,8 @@ export interface PickerPanelSharedProps<DateType> {
7878

7979
/** @private Internal usage. Do not use in your production env */
8080
components?: {
81-
button: React.ComponentType;
81+
button?: React.ComponentType | string;
82+
rangeItem?: React.ComponentType | string;
8283
};
8384
}
8485

@@ -142,9 +143,12 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
142143
onMouseDown,
143144
onPickerValueChange,
144145
onOk,
145-
components,
146+
components = {},
146147
} = props as MergedPickerPanelProps<DateType>;
147148

149+
const needConfirmButton: boolean =
150+
(picker === 'date' && !!showTime) || picker === 'time';
151+
148152
if (process.env.NODE_ENV !== 'production') {
149153
warning(
150154
!value || generateConfig.isValidate(value),
@@ -170,6 +174,7 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
170174
panelPosition,
171175
rangedValue,
172176
hoverRangedValue,
177+
rangeList = [],
173178
} = React.useContext(RangeContext);
174179
const panelRef = React.useRef<PanelRefProps>({});
175180

@@ -423,39 +428,75 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
423428
? null
424429
: getExtraFooter(prefixCls, mergedMode, renderExtraFooter);
425430

426-
let nowNode: React.ReactNode;
431+
let rangesNode: React.ReactNode;
427432
let todayNode: React.ReactNode;
428433

429-
if ((mergedMode === 'date' && showTime) || mergedMode === 'time') {
430-
const Button = components ? components.button : 'button';
434+
if (rangeList.length || needConfirmButton) {
435+
let presetNode: React.ReactNode;
436+
let okNode: React.ReactNode;
437+
438+
if (rangeList.length) {
439+
const Item = (components.rangeItem || 'span') as any;
440+
441+
presetNode = (
442+
<>
443+
{rangeList.map(({ label, onClick, onMouseEnter, onMouseLeave }) => (
444+
<li key={label} className={`${prefixCls}-range`}>
445+
<Item
446+
onClick={onClick}
447+
onMouseEnter={onMouseEnter}
448+
onMouseLeave={onMouseLeave}
449+
>
450+
{label}
451+
</Item>
452+
</li>
453+
))}
454+
</>
455+
);
456+
}
431457

432-
nowNode = (
433-
<div className={`${prefixCls}-now`}>
434-
<a
435-
className={`${prefixCls}-now-btn`}
436-
onClick={() => {
437-
triggerSelect(generateConfig.getNow(), 'submit', true);
438-
}}
439-
>
440-
{locale.now}
441-
</a>
458+
if (needConfirmButton) {
459+
const Button = (components.button || 'button') as any;
460+
461+
if (!inRange && !presetNode) {
462+
presetNode = (
463+
<li className={`${prefixCls}-now`}>
464+
<a
465+
className={`${prefixCls}-now-btn`}
466+
onClick={() => {
467+
triggerSelect(generateConfig.getNow(), 'submit', true);
468+
}}
469+
>
470+
{locale.now}
471+
</a>
472+
</li>
473+
);
474+
}
442475

443-
<div className={`${prefixCls}-ok`}>
476+
okNode = (
477+
<li className={`${prefixCls}-ok`}>
444478
<Button
445479
disabled={!value}
446480
onClick={() => {
447481
if (value) {
448482
triggerSelect(value, 'submit', true);
449483
if (onOk) {
450-
onOk();
484+
onOk(value);
451485
}
452486
}
453487
}}
454488
>
455489
{locale.ok}
456490
</Button>
457-
</div>
458-
</div>
491+
</li>
492+
);
493+
}
494+
495+
rangesNode = (
496+
<ul className={`${prefixCls}-ranges`}>
497+
{presetNode}
498+
{okNode}
499+
</ul>
459500
);
460501
} else if (showToday && mergedMode === 'date' && picker === 'date') {
461502
todayNode = (
@@ -495,10 +536,10 @@ function PickerPanel<DateType>(props: PickerPanelProps<DateType>) {
495536
ref={panelDivRef}
496537
>
497538
{panelNode}
498-
{extraFooter || nowNode || todayNode ? (
539+
{extraFooter || rangesNode || todayNode ? (
499540
<div className={`${prefixCls}-footer`}>
500541
{extraFooter}
501-
{nowNode}
542+
{rangesNode}
502543
{todayNode}
503544
</div>
504545
) : null}

src/RangeContext.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ interface RangeContextProps {
1010
hoverRangedValue?: RangeValue<any>;
1111
inRange?: boolean;
1212
panelPosition?: 'left' | 'right' | false;
13+
rangeList?: {
14+
label: string;
15+
onClick: () => void;
16+
onMouseEnter: () => void;
17+
onMouseLeave: () => void;
18+
}[];
1319
}
1420

1521
const RangeContext = React.createContext<RangeContextProps>({});

0 commit comments

Comments
 (0)