Skip to content

Commit 9136372

Browse files
author
张鹏博
committed
fix: 修复周和季度选择器问题
1 parent 541da59 commit 9136372

8 files changed

Lines changed: 179 additions & 12 deletions

File tree

src/components/c-picker/demos/more-picker.md

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import {
2222

2323
const {
2424
YearPicker,
25-
QuarterPicker,
2625
MonthPicker,
27-
WeekPicker
26+
WeekPicker,
27+
QuarterPicker
2828
} = DatePicker;
2929

3030
export default class DatePickerDemo extends React.Component {
@@ -33,7 +33,8 @@ export default class DatePickerDemo extends React.Component {
3333
year: 2021,
3434
month: '2021/07',
3535
monthDay: '06/07',
36-
week: '2021/06/07 所在周',
36+
week: '2021年 第24周',
37+
quarter: '2021年 Q3',
3738
}
3839

3940
onYearChange = year => {
@@ -51,13 +52,18 @@ export default class DatePickerDemo extends React.Component {
5152
this.setState({ week });
5253
}
5354

55+
onQuarterChange = quarter => {
56+
console.log('quarter:', quarter);
57+
this.setState({ quarter });
58+
}
59+
5460
onMonthDayChange = monthDay => {
5561
console.log('monthDay:', monthDay);
5662
this.setState({ monthDay });
5763
}
5864

5965
render() {
60-
const { year, month, week, monthDay, disabled } = this.state;
66+
const { year, month, week, quarter, monthDay, disabled } = this.state;
6167
const { init } = this.field;
6268
return (
6369
<Form field={this.field} layout="horizontal" labelAlign="left" labelCol={{ span: 8 }}>
@@ -96,12 +102,21 @@ export default class DatePickerDemo extends React.Component {
96102
onChange={this.onWeekChange}
97103
disabled={disabled}
98104
allowClear
99-
format="yyyy/MM/DD 所在周"
100105
minYear={2020}
101106
maxYear={2025}
102107
presets={[{ label: '上周', value: () => moment().clone().subtract(1, 'weeks').startOf('week') }]}
103108
/>
104109
</Form.Item>
110+
<Form.Item label="季度选择器">
111+
<QuarterPicker
112+
value={quarter}
113+
onChange={this.onQuarterChange}
114+
disabled={disabled}
115+
allowClear
116+
minYear={2020}
117+
maxYear={2025}
118+
/>
119+
</Form.Item>
105120
<Form.Item label="实现【月-日】选择">
106121
<DatePicker
107122
value={monthDay}

src/components/c-picker/formats.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
export const dateFormat = 'yyyy/MM/DD';
22
export const timeFormat = 'HH:mm:ss';
33
export const dateTimeFormat = 'yyyy/MM/DD HH:mm:ss';
4-
export const weekFormat = 'yyyy年 第W周';
4+
export const weekFormat = 'YYYY年 第w周';
55
export const monthFormat = 'yyyy/MM';
6+
export const quarterFormat = 'yyyy年 [Q]Q';
67
export const yearFormat = 'yyyy年';

src/components/c-picker/generator/range.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default function generateRangePicker(generateConfig) {
1818
moment.locale('zh-cn', {
1919
week: {
2020
dow: 1,
21-
day: 7,
21+
doy: 4,
2222
},
2323
});
2424
}

src/components/c-picker/generator/single.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export default function generateSinglePicker(generateConfig) {
1818
moment.locale('zh-cn', {
1919
week: {
2020
dow: 1,
21-
day: 7,
21+
doy: 4,
2222
},
2323
});
2424
}

src/components/c-picker/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import TimePicker from './pickers/time';
33
import YearPicker from './pickers/year';
44
import MonthPicker from './pickers/month';
55
import WeekPicker from './pickers/week';
6+
import QuarterPicker from './pickers/quarter';
67
import DateRangePicker from './pickers/date-range';
78
import TimeRangePicker from './pickers/time-range';
89
import './index.less';
@@ -13,6 +14,7 @@ CPicker.TimePicker = TimePicker;
1314
CPicker.YearPicker = YearPicker;
1415
CPicker.MonthPicker = MonthPicker;
1516
CPicker.WeekPicker = WeekPicker;
17+
CPicker.QuarterPicker = QuarterPicker;
1618
CPicker.RangePicker = DateRangePicker;
1719
CPicker.TimeRangePicker = TimeRangePicker;
1820

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import React, { useCallback, useEffect, useMemo, useState } from 'react';
2+
import moment from 'moment';
3+
import momentGenerateConfig from 'rc-picker/lib/generate/moment';
4+
import generatePicker from '../generator';
5+
import { quarterFormat } from '../formats';
6+
7+
const { QuarterPicker: Picker } = generatePicker(momentGenerateConfig);
8+
9+
const QuarterPicker = ({
10+
size,
11+
className,
12+
dropdownClassName, // New
13+
disabled,
14+
defaultValue: _defaultValue,
15+
value: _value,
16+
open,
17+
onOpenChange, // New
18+
placeholder,
19+
width,
20+
minYear,
21+
maxYear,
22+
format: _format,
23+
onChange,
24+
getPopupContainer: _getPopupContainer, // New
25+
isAppendToBody,
26+
canEdit = true,
27+
style,
28+
showToday,
29+
disabledDate: _disabledDate,
30+
renderExtraFooter,
31+
autoFocus,
32+
allowClear,
33+
onFocus,
34+
onBlur,
35+
onMouseDown,
36+
onMouseUp,
37+
onMouseEnter,
38+
onMouseLeave,
39+
onClick,
40+
onContextMenu,
41+
onKeyDown,
42+
onSelect,
43+
onPanelChange,
44+
presets,
45+
}) => {
46+
const [value, setValue] = useState();
47+
const format = _format || quarterFormat;
48+
49+
useEffect(() => {
50+
setValue(_value && moment(_value, format));
51+
}, [_value, format]);
52+
53+
const handleChange = useCallback(
54+
(m) => {
55+
if (onChange) {
56+
onChange(m && m.clone().format(format));
57+
} else {
58+
setValue(m);
59+
}
60+
},
61+
[onChange, format],
62+
);
63+
64+
const handleSelect = useCallback(
65+
(m) => {
66+
if (onSelect) {
67+
onSelect(m && m.clone().format(format));
68+
}
69+
},
70+
[onSelect, format],
71+
);
72+
73+
const handlePanelChange = useCallback(
74+
(val, mode) => {
75+
if (onPanelChange) {
76+
onPanelChange(val && val.clone().format(format), mode);
77+
}
78+
},
79+
[onPanelChange, format],
80+
);
81+
82+
const getPopupContainer = useMemo(() => {
83+
if (_getPopupContainer) {
84+
return _getPopupContainer;
85+
}
86+
if (!isAppendToBody) {
87+
return () => document.body;
88+
}
89+
return undefined;
90+
}, [_getPopupContainer, isAppendToBody]);
91+
92+
const getDisabledDate = useCallback(
93+
(d) => {
94+
const current = d.clone();
95+
return (minYear && current.year() < minYear) || (maxYear && current.year() > maxYear);
96+
},
97+
[format, minYear, maxYear],
98+
);
99+
100+
const handleGetDisabledDate = useCallback(
101+
(m) => {
102+
if (_disabledDate) {
103+
return _disabledDate(m && m.clone().format(format));
104+
}
105+
return getDisabledDate(m);
106+
},
107+
[_disabledDate, getDisabledDate, format],
108+
);
109+
110+
return (
111+
<Picker
112+
size={size}
113+
style={{ width, ...style }}
114+
defaultValue={_defaultValue && moment().year(Number(_defaultValue))}
115+
onChange={handleChange}
116+
onSelect={handleSelect}
117+
onPanelChange={handlePanelChange}
118+
inputReadOnly={!canEdit}
119+
getPopupContainer={getPopupContainer}
120+
disabledDate={handleGetDisabledDate}
121+
{...{
122+
className,
123+
dropdownClassName,
124+
format,
125+
value,
126+
disabled,
127+
open,
128+
placeholder,
129+
showToday,
130+
renderExtraFooter,
131+
autoFocus,
132+
allowClear,
133+
onFocus,
134+
onBlur,
135+
onOpenChange,
136+
onMouseDown,
137+
onMouseUp,
138+
onMouseEnter,
139+
onMouseLeave,
140+
onClick,
141+
onContextMenu,
142+
onKeyDown,
143+
presets,
144+
}}
145+
/>
146+
);
147+
};
148+
149+
export default QuarterPicker;

src/components/c-picker/pickers/week.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ const WeekPicker = ({
5353
const handleChange = useCallback(
5454
(m) => {
5555
if (onChange) {
56-
onChange(m && m.clone().format(format));
56+
onChange(m && m.clone().startOf('week').format(format));
5757
} else {
5858
setValue(m);
5959
}
@@ -94,7 +94,7 @@ const WeekPicker = ({
9494
const current = d.clone();
9595
return (minYear && current.year() < minYear) || (maxYear && current.year() > maxYear);
9696
},
97-
[format, minYear, maxYear],
97+
[minYear, maxYear],
9898
);
9999

100100
const handleGetDisabledDate = useCallback(

src/locale/zh_CN.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ const locale = {
2525
dayFormat: 'D日',
2626
monthFormat: 'M月',
2727
dateFormat: 'YYYY/MM/DD',
28-
weekFormat: 'YYYY年 第wo周',
28+
weekFormat: 'YYYY年 第w周',
2929
dateTimeFormat: 'YYYY/MM/DD HH:mm:ss',
3030
previousYear: '上一年',
3131
nextYear: '下一年',
@@ -48,7 +48,7 @@ const locale = {
4848
// quarterRangePlaceholder: ['开始季度', '结束季度'],
4949
},
5050
dateFormat: 'YYYY/MM/DD',
51-
weekFormat: 'YYYY年 第wo周',
51+
weekFormat: 'YYYY年 第w周',
5252
monthFormat: 'YYYY/MM',
5353
yearFormat: 'YYYY年',
5454
dateTimeFormat: 'YYYY/MM/DD HH:mm:ss',

0 commit comments

Comments
 (0)