From 85cdaf7d407e3ead709a8294fddd4d64223cb48d Mon Sep 17 00:00:00 2001 From: xrkffgg Date: Thu, 19 Nov 2020 14:49:36 +0800 Subject: [PATCH 1/2] feat: add start end --- src/generate/dateFns.ts | 3 +++ src/generate/dayjs.ts | 2 ++ src/generate/index.ts | 2 ++ src/generate/moment.ts | 5 +++++ src/panels/PanelBody.tsx | 10 +++++++++- src/utils/timeUtil.ts | 10 ++++++++++ tests/__snapshots__/panel.spec.tsx.snap | 8 ++++---- 7 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/generate/dateFns.ts b/src/generate/dateFns.ts index e1e6e3c02..2fa23f4c4 100644 --- a/src/generate/dateFns.ts +++ b/src/generate/dateFns.ts @@ -3,6 +3,7 @@ import { getYear, getMonth, getDate, + endOfDay, 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 => endOfDay(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..4cfc807b4 100644 --- a/src/utils/timeUtil.ts +++ b/src/utils/timeUtil.ts @@ -32,3 +32,13 @@ 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; + let monthShow: string; + const endDate = generateConfig.getEndDate(generateConfig.getFixedDate(`${year}-${month}-01`)); + const lastDay = generateConfig.getDate(endDate); + 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`] = `
Date: Thu, 19 Nov 2020 15:41:56 +0800 Subject: [PATCH 2/2] add test & fix lint --- src/generate/dateFns.ts | 4 ++-- src/utils/timeUtil.ts | 3 +-- tests/generate.spec.tsx | 8 ++++++++ tests/util.spec.tsx | 11 ++++++++++- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/generate/dateFns.ts b/src/generate/dateFns.ts index 2fa23f4c4..435e757cf 100644 --- a/src/generate/dateFns.ts +++ b/src/generate/dateFns.ts @@ -3,7 +3,7 @@ import { getYear, getMonth, getDate, - endOfDay, + endOfMonth, getHours, getMinutes, getSeconds, @@ -42,7 +42,7 @@ const generateConfig: GenerateConfig = { // get getNow: () => new Date(), getFixedDate: string => new Date(string), - getEndDate: date => endOfDay(date), + getEndDate: date => endOfMonth(date), getWeekDay: date => getDay(date), getYear: date => getYear(date), getMonth: date => getMonth(date), diff --git a/src/utils/timeUtil.ts b/src/utils/timeUtil.ts index 4cfc807b4..8cdbfa224 100644 --- a/src/utils/timeUtil.ts +++ b/src/utils/timeUtil.ts @@ -36,9 +36,8 @@ export function getLowerBoundTime( export function getLastDay(generateConfig: GenerateConfig, date: DateType) { const year = generateConfig.getYear(date); const month = generateConfig.getMonth(date) + 1; - let monthShow: string; const endDate = generateConfig.getEndDate(generateConfig.getFixedDate(`${year}-${month}-01`)); const lastDay = generateConfig.getDate(endDate); - monthShow = month < 10 ? `0${month}` : `${month}`; + const monthShow = month < 10 ? `0${month}` : `${month}`; return `${year}-${monthShow}-${lastDay}`; } diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index 7fb909b6b..3281eed63 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -26,13 +26,21 @@ describe('Picker.Generate', () => { 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'); + }); });