From a593db1e20f0a2979d8bf5e4903703b25c5e5fc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8C=E8=B4=A7=E7=88=B1=E5=90=83=E7=99=BD=E8=90=9D?= =?UTF-8?q?=E5=8D=9C?= Date: Tue, 31 Dec 2024 10:19:30 +0800 Subject: [PATCH] fix(DatePicker): week select with year edge week not working as expect (#6808) * fix: iso week selection * test: add test case --- .../date-picker/date-picker-week-utils.ts | 9 +++---- .../date-picker/tests/date-picker.test.tsx | 25 ++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/components/date-picker/date-picker-week-utils.ts b/src/components/date-picker/date-picker-week-utils.ts index e6022018c7..8100b266aa 100644 --- a/src/components/date-picker/date-picker-week-utils.ts +++ b/src/components/date-picker/date-picker-week-utils.ts @@ -1,8 +1,8 @@ -import type { ReactNode } from 'react' import dayjs from 'dayjs' +import isLeapYear from 'dayjs/plugin/isLeapYear' import isoWeek from 'dayjs/plugin/isoWeek' import isoWeeksInYear from 'dayjs/plugin/isoWeeksInYear' -import isLeapYear from 'dayjs/plugin/isLeapYear' +import type { ReactNode } from 'react' import { PickerColumn } from '../picker' import type { DatePickerFilter } from './date-picker-utils' @@ -123,13 +123,12 @@ export function convertDateToStringArray( } export function convertStringArrayToDate< - T extends string | number | null | undefined + T extends string | number | null | undefined, >(value: T[]): Date { const yearString = value[0] ?? '1900' const weekString = value[1] ?? '1' const weekdayString = value[2] ?? '1' - const day = dayjs() - .year(parseInt(yearString as string)) + const day = dayjs(`${parseInt(yearString as string)}-01-01`) .isoWeek(parseInt(weekString as string)) .isoWeekday(parseInt(weekdayString as string)) .hour(0) diff --git a/src/components/date-picker/tests/date-picker.test.tsx b/src/components/date-picker/tests/date-picker.test.tsx index 8fc0527c56..398098845b 100644 --- a/src/components/date-picker/tests/date-picker.test.tsx +++ b/src/components/date-picker/tests/date-picker.test.tsx @@ -1,17 +1,18 @@ +import dayjs from 'dayjs' +import * as React from 'react' import { - render, - testA11y, + act, fireEvent, - waitFor, + render, screen, sleep, - act, + testA11y, + waitFor, waitForElementToBeRemoved, } from 'testing' -import * as React from 'react' import DatePicker from '../' -import dayjs from 'dayjs' import Button from '../../button' +import { convertStringArrayToDate } from '../date-picker-week-utils' const classPrefix = `adm-picker` @@ -205,4 +206,16 @@ describe('DatePicker', () => { expect(res.toDateString()).toEqual(now.toDateString()) expect(res.tillNow).toBeTruthy() }) + + test('convertStringArrayToDate of week should correct', () => { + // jest mock today is `2024-12-30` + jest.useFakeTimers({ + now: new Date('2024-12-30'), + }) + + const date = convertStringArrayToDate(['2024', '1', '1']) + expect(date.getFullYear()).toBe(2024) + expect(date.getMonth()).toBe(0) + expect(date.getDate()).toBe(1) + }) })