diff --git a/src/generate/dateFns.ts b/src/generate/dateFns.ts index e1e6e3c02..435e757cf 100644 --- a/src/generate/dateFns.ts +++ b/src/generate/dateFns.ts @@ -3,6 +3,7 @@ import { getYear, getMonth, getDate, + endOfMonth, getHours, getMinutes, getSeconds, @@ -40,6 +41,8 @@ const localeParse = (format: string) => { const generateConfig: GenerateConfig = { // get getNow: () => new Date(), + getFixedDate: string => new Date(string), + getEndDate: date => endOfMonth(date), getWeekDay: date => getDay(date), getYear: date => getYear(date), getMonth: date => getMonth(date), diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index 4225c94dc..3ca163534 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -46,6 +46,8 @@ const parseNoMatchNotice = () => { const generateConfig: GenerateConfig = { // get getNow: () => dayjs(), + getFixedDate: string => dayjs(string, 'YYYY-MM-DD'), + getEndDate: date => date.endOf('month'), getWeekDay: date => { const clone = date.locale('en'); return clone.weekday() + clone.localeData().firstDayOfWeek(); diff --git a/src/generate/index.ts b/src/generate/index.ts index 47daec4fb..1776732fd 100644 --- a/src/generate/index.ts +++ b/src/generate/index.ts @@ -8,6 +8,8 @@ export interface GenerateConfig { getMonth: (value: DateType) => number; getYear: (value: DateType) => number; getNow: () => DateType; + getFixedDate: (fixed: string) => DateType; + getEndDate: (value: DateType) => DateType; // Set addYear: (value: DateType, diff: number) => DateType; diff --git a/src/generate/moment.ts b/src/generate/moment.ts index 3b2c40cbf..e8bc3f3c0 100644 --- a/src/generate/moment.ts +++ b/src/generate/moment.ts @@ -5,6 +5,11 @@ import { GenerateConfig } from '.'; const generateConfig: GenerateConfig = { // get getNow: () => moment(), + getFixedDate: string => moment(string, 'YYYY-MM-DD'), + getEndDate: date => { + const clone = date.clone(); + return clone.endOf('month'); + }, getWeekDay: date => { const clone = date.clone().locale('en_US'); return clone.weekday() + clone.localeData().firstDayOfWeek(); diff --git a/src/panels/PanelBody.tsx b/src/panels/PanelBody.tsx index bb7dd659f..de718677b 100644 --- a/src/panels/PanelBody.tsx +++ b/src/panels/PanelBody.tsx @@ -1,6 +1,8 @@ import * as React from 'react'; import classNames from 'classnames'; import PanelContext from '../PanelContext'; +import { GenerateConfig } from '../generate'; +import { getLastDay } from '../utils/timeUtil'; export interface PanelBodyProps { prefixCls: string; @@ -17,6 +19,7 @@ export interface PanelBodyProps { getCellText: (date: DateType) => React.ReactNode; getCellNode?: (date: DateType) => React.ReactNode; titleCell?: (date: DateType) => string; + generateConfig: GenerateConfig; // Used for week panel prefixColumn?: (date: DateType) => React.ReactNode; @@ -36,6 +39,7 @@ export default function PanelBody({ getCellText, getCellNode, getCellDate, + generateConfig, titleCell, headerCells, }: PanelBodyProps) { @@ -63,12 +67,16 @@ export default function PanelBody({ } } + const title = titleCell && titleCell(currentDate); + row.push( { diff --git a/src/utils/timeUtil.ts b/src/utils/timeUtil.ts index 4325e6634..8cdbfa224 100644 --- a/src/utils/timeUtil.ts +++ b/src/utils/timeUtil.ts @@ -32,3 +32,12 @@ export function getLowerBoundTime( const lowerBoundSecond = Math.floor(second / secondStep) * secondStep; return [lowerBoundHour, lowerBoundMinute, lowerBoundSecond]; } + +export function getLastDay(generateConfig: GenerateConfig, date: DateType) { + const year = generateConfig.getYear(date); + const month = generateConfig.getMonth(date) + 1; + const endDate = generateConfig.getEndDate(generateConfig.getFixedDate(`${year}-${month}-01`)); + const lastDay = generateConfig.getDate(endDate); + const monthShow = month < 10 ? `0${month}` : `${month}`; + return `${year}-${monthShow}-${lastDay}`; +} diff --git a/tests/__snapshots__/panel.spec.tsx.snap b/tests/__snapshots__/panel.spec.tsx.snap index d2bc19470..769478ed3 100644 --- a/tests/__snapshots__/panel.spec.tsx.snap +++ b/tests/__snapshots__/panel.spec.tsx.snap @@ -227,7 +227,7 @@ exports[`Picker.Panel should render correctly in rtl 1`] = `
{ describe(name, () => { it('get', () => { const now = generateConfig.getNow(); + const fixedDate = generateConfig.getFixedDate('1990-09-03'); + const endDate = generateConfig.getEndDate(fixedDate); expect(generateConfig.getWeekDay(now)).toEqual(1); expect(generateConfig.getSecond(now)).toEqual(3); expect(generateConfig.getMinute(now)).toEqual(2); expect(generateConfig.getHour(now)).toEqual(1); expect(generateConfig.getDate(now)).toEqual(3); + expect(generateConfig.getDate(fixedDate)).toEqual(3); + expect(generateConfig.getDate(endDate)).toEqual(30); expect(generateConfig.getMonth(now)).toEqual(8); + expect(generateConfig.getMonth(fixedDate)).toEqual(8); + expect(generateConfig.getMonth(endDate)).toEqual(8); expect(generateConfig.getYear(now)).toEqual(1990); + expect(generateConfig.getYear(fixedDate)).toEqual(1990); + expect(generateConfig.getYear(endDate)).toEqual(1990); }); it('set', () => { diff --git a/tests/util.spec.tsx b/tests/util.spec.tsx index ad812bff8..0348574ee 100644 --- a/tests/util.spec.tsx +++ b/tests/util.spec.tsx @@ -1,5 +1,5 @@ import momentGenerateConfig from '../src/generate/moment'; -import { getLowerBoundTime, setTime } from '../src/utils/timeUtil'; +import { getLowerBoundTime, setTime, getLastDay } from '../src/utils/timeUtil'; import { toArray } from '../src/utils/miscUtil'; import { isSameTime, isSameDecade } from '../src/utils/dateUtil'; import { getMoment } from './util/commonUtil'; @@ -64,4 +64,13 @@ describe('Picker.Util', () => { ), ).toBeTruthy(); }); + + describe('getLastDay', () => { + expect( + getLastDay( + momentGenerateConfig, + getMoment('2020-10-01'), + ), + ).toEqual('2020-10-31'); + }); });