Skip to content

Commit bfa4b0e

Browse files
authored
feat: add start end (#175)
* feat: add start end * add test & fix lint
1 parent 49704a8 commit bfa4b0e

File tree

9 files changed

+52
-6
lines changed

9 files changed

+52
-6
lines changed

src/generate/dateFns.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import {
33
getYear,
44
getMonth,
55
getDate,
6+
endOfMonth,
67
getHours,
78
getMinutes,
89
getSeconds,
@@ -40,6 +41,8 @@ const localeParse = (format: string) => {
4041
const generateConfig: GenerateConfig<Date> = {
4142
// get
4243
getNow: () => new Date(),
44+
getFixedDate: string => new Date(string),
45+
getEndDate: date => endOfMonth(date),
4346
getWeekDay: date => getDay(date),
4447
getYear: date => getYear(date),
4548
getMonth: date => getMonth(date),

src/generate/dayjs.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ const parseNoMatchNotice = () => {
4646
const generateConfig: GenerateConfig<Dayjs> = {
4747
// get
4848
getNow: () => dayjs(),
49+
getFixedDate: string => dayjs(string, 'YYYY-MM-DD'),
50+
getEndDate: date => date.endOf('month'),
4951
getWeekDay: date => {
5052
const clone = date.locale('en');
5153
return clone.weekday() + clone.localeData().firstDayOfWeek();

src/generate/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ export interface GenerateConfig<DateType> {
88
getMonth: (value: DateType) => number;
99
getYear: (value: DateType) => number;
1010
getNow: () => DateType;
11+
getFixedDate: (fixed: string) => DateType;
12+
getEndDate: (value: DateType) => DateType;
1113

1214
// Set
1315
addYear: (value: DateType, diff: number) => DateType;

src/generate/moment.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import { GenerateConfig } from '.';
55
const generateConfig: GenerateConfig<Moment> = {
66
// get
77
getNow: () => moment(),
8+
getFixedDate: string => moment(string, 'YYYY-MM-DD'),
9+
getEndDate: date => {
10+
const clone = date.clone();
11+
return clone.endOf('month');
12+
},
813
getWeekDay: date => {
914
const clone = date.clone().locale('en_US');
1015
return clone.weekday() + clone.localeData().firstDayOfWeek();

src/panels/PanelBody.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import * as React from 'react';
22
import classNames from 'classnames';
33
import PanelContext from '../PanelContext';
4+
import { GenerateConfig } from '../generate';
5+
import { getLastDay } from '../utils/timeUtil';
46

57
export interface PanelBodyProps<DateType> {
68
prefixCls: string;
@@ -17,6 +19,7 @@ export interface PanelBodyProps<DateType> {
1719
getCellText: (date: DateType) => React.ReactNode;
1820
getCellNode?: (date: DateType) => React.ReactNode;
1921
titleCell?: (date: DateType) => string;
22+
generateConfig: GenerateConfig<DateType>;
2023

2124
// Used for week panel
2225
prefixColumn?: (date: DateType) => React.ReactNode;
@@ -36,6 +39,7 @@ export default function PanelBody<DateType>({
3639
getCellText,
3740
getCellNode,
3841
getCellDate,
42+
generateConfig,
3943
titleCell,
4044
headerCells,
4145
}: PanelBodyProps<DateType>) {
@@ -63,12 +67,16 @@ export default function PanelBody<DateType>({
6367
}
6468
}
6569

70+
const title = titleCell && titleCell(currentDate);
71+
6672
row.push(
6773
<td
6874
key={j}
69-
title={titleCell && titleCell(currentDate)}
75+
title={title}
7076
className={classNames(cellPrefixCls, {
7177
[`${cellPrefixCls}-disabled`]: disabled,
78+
[`${cellPrefixCls}-start`]: getCellText(currentDate) === 1,
79+
[`${cellPrefixCls}-end`]: title === getLastDay(generateConfig, currentDate),
7280
...getCellClassName(currentDate),
7381
})}
7482
onClick={() => {

src/utils/timeUtil.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,12 @@ export function getLowerBoundTime(
3232
const lowerBoundSecond = Math.floor(second / secondStep) * secondStep;
3333
return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond];
3434
}
35+
36+
export function getLastDay<DateType>(generateConfig: GenerateConfig<DateType>, date: DateType) {
37+
const year = generateConfig.getYear(date);
38+
const month = generateConfig.getMonth(date) + 1;
39+
const endDate = generateConfig.getEndDate(generateConfig.getFixedDate(`${year}-${month}-01`));
40+
const lastDay = generateConfig.getDate(endDate);
41+
const monthShow = month < 10 ? `0${month}` : `${month}`;
42+
return `${year}-${monthShow}-${lastDay}`;
43+
}

tests/__snapshots__/panel.spec.tsx.snap

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ exports[`Picker.Panel should render correctly in rtl 1`] = `
227227
</div>
228228
</td>
229229
<td
230-
class="rc-picker-cell"
230+
class="rc-picker-cell rc-picker-cell-end"
231231
title="1990-08-31"
232232
>
233233
<div
@@ -237,7 +237,7 @@ exports[`Picker.Panel should render correctly in rtl 1`] = `
237237
</div>
238238
</td>
239239
<td
240-
class="rc-picker-cell rc-picker-cell-in-view"
240+
class="rc-picker-cell rc-picker-cell-start rc-picker-cell-in-view"
241241
title="1990-09-01"
242242
>
243243
<div
@@ -537,7 +537,7 @@ exports[`Picker.Panel should render correctly in rtl 1`] = `
537537
</tr>
538538
<tr>
539539
<td
540-
class="rc-picker-cell rc-picker-cell-in-view"
540+
class="rc-picker-cell rc-picker-cell-end rc-picker-cell-in-view"
541541
title="1990-09-30"
542542
>
543543
<div
@@ -547,7 +547,7 @@ exports[`Picker.Panel should render correctly in rtl 1`] = `
547547
</div>
548548
</td>
549549
<td
550-
class="rc-picker-cell"
550+
class="rc-picker-cell rc-picker-cell-start"
551551
title="1990-10-01"
552552
>
553553
<div

tests/generate.spec.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,21 @@ describe('Picker.Generate', () => {
2626
describe(name, () => {
2727
it('get', () => {
2828
const now = generateConfig.getNow();
29+
const fixedDate = generateConfig.getFixedDate('1990-09-03');
30+
const endDate = generateConfig.getEndDate(fixedDate);
2931
expect(generateConfig.getWeekDay(now)).toEqual(1);
3032
expect(generateConfig.getSecond(now)).toEqual(3);
3133
expect(generateConfig.getMinute(now)).toEqual(2);
3234
expect(generateConfig.getHour(now)).toEqual(1);
3335
expect(generateConfig.getDate(now)).toEqual(3);
36+
expect(generateConfig.getDate(fixedDate)).toEqual(3);
37+
expect(generateConfig.getDate(endDate)).toEqual(30);
3438
expect(generateConfig.getMonth(now)).toEqual(8);
39+
expect(generateConfig.getMonth(fixedDate)).toEqual(8);
40+
expect(generateConfig.getMonth(endDate)).toEqual(8);
3541
expect(generateConfig.getYear(now)).toEqual(1990);
42+
expect(generateConfig.getYear(fixedDate)).toEqual(1990);
43+
expect(generateConfig.getYear(endDate)).toEqual(1990);
3644
});
3745

3846
it('set', () => {

tests/util.spec.tsx

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import momentGenerateConfig from '../src/generate/moment';
2-
import { getLowerBoundTime, setTime } from '../src/utils/timeUtil';
2+
import { getLowerBoundTime, setTime, getLastDay } from '../src/utils/timeUtil';
33
import { toArray } from '../src/utils/miscUtil';
44
import { isSameTime, isSameDecade } from '../src/utils/dateUtil';
55
import { getMoment } from './util/commonUtil';
@@ -64,4 +64,13 @@ describe('Picker.Util', () => {
6464
),
6565
).toBeTruthy();
6666
});
67+
68+
describe('getLastDay', () => {
69+
expect(
70+
getLastDay(
71+
momentGenerateConfig,
72+
getMoment('2020-10-01'),
73+
),
74+
).toEqual('2020-10-31');
75+
});
6776
});

0 commit comments

Comments
 (0)