Skip to content

Commit f358f6b

Browse files
authored
fix: week range disabled rule (#177)
* fix: week range disabled rule * add test * update test * update test * semantic refactor
1 parent 5b98b5c commit f358f6b

File tree

6 files changed

+29
-6
lines changed

6 files changed

+29
-6
lines changed

src/generate/dateFns.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
isAfter,
2020
isValid,
2121
getWeek,
22+
startOfWeek,
2223
format as formatDate,
2324
parse as parseDate,
2425
} from 'date-fns';
@@ -71,6 +72,9 @@ const generateConfig: GenerateConfig<Date> = {
7172
const clone = Locale[dealLocal(locale)];
7273
return clone.options.weekStartsOn;
7374
},
75+
getWeekFirstDate: (locale, date) => {
76+
return startOfWeek(date, { locale: Locale[dealLocal(locale)] });
77+
},
7478
getWeek: (locale, date) => {
7579
return getWeek(date, { locale: Locale[dealLocal(locale)] });
7680
},

src/generate/dayjs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ const generateConfig: GenerateConfig<Dayjs> = {
8080
.locale(parseLocale(locale))
8181
.localeData()
8282
.firstDayOfWeek(),
83+
getWeekFirstDate: (locale, date) => date.locale(parseLocale(locale)).weekday(0),
8384
getWeek: (locale, date) => date.locale(parseLocale(locale)).week(),
8485
getShortWeekDays: locale =>
8586
dayjs()

src/generate/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface GenerateConfig<DateType> {
2828

2929
locale: {
3030
getWeekFirstDay: (locale: string) => number;
31+
getWeekFirstDate: (locale: string, value: DateType) => DateType;
3132
getWeek: (locale: string, value: DateType) => number;
3233

3334
format: (locale: string, date: DateType, format: string) => string;

src/generate/moment.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ const generateConfig: GenerateConfig<Moment> = {
6868
const date = moment().locale(locale);
6969
return date.localeData().firstDayOfWeek();
7070
},
71+
getWeekFirstDate: (locale, date) => {
72+
const clone = date.clone();
73+
const result = clone.locale(locale);
74+
return result.weekday(0);
75+
},
7176
getWeek: (locale, date) => {
7277
const clone = date.clone();
7378
const result = clone.locale(locale);

src/hooks/useRangeDisabled.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,8 @@ export default function useRangeDisabled<DateType>(
2626
const startDate = getValue(selectedValue, 0);
2727
const endDate = getValue(selectedValue, 1);
2828

29-
function weekNumber(date: DateType) {
30-
const year = generateConfig.getYear(date);
31-
const week = generateConfig.locale.getWeek(locale.locale, date);
32-
return year * 100 + week;
29+
function weekFirstDate(date: DateType) {
30+
return generateConfig.locale.getWeekFirstDate(locale.locale, date);
3331
}
3432

3533
function monthNumber(date: DateType) {
@@ -63,7 +61,7 @@ export default function useRangeDisabled<DateType>(
6361
case 'month':
6462
return monthNumber(date) > monthNumber(endDate);
6563
case 'week':
66-
return weekNumber(date) > weekNumber(endDate);
64+
return weekFirstDate(date) > weekFirstDate(endDate);
6765
default:
6866
return (
6967
!isSameDate(generateConfig, date, endDate) && generateConfig.isAfter(date, endDate)
@@ -97,7 +95,7 @@ export default function useRangeDisabled<DateType>(
9795
case 'month':
9896
return monthNumber(date) < monthNumber(startDate);
9997
case 'week':
100-
return weekNumber(date) < weekNumber(startDate);
98+
return weekFirstDate(date) < weekFirstDate(startDate);
10199
default:
102100
return (
103101
!isSameDate(generateConfig, date, startDate) &&

tests/generate.spec.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,20 @@ describe('Picker.Generate', () => {
132132
});
133133
});
134134

135+
it('getWeekFirstDayValue', () => {
136+
const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD';
137+
const usDate = generateConfig.locale.getWeekFirstDate(
138+
'en_US',
139+
generateConfig.locale.parse('en_US', '2020-12-30', [formatStr]),
140+
);
141+
const cnDate = generateConfig.locale.getWeekFirstDate(
142+
'zh_CN',
143+
generateConfig.locale.parse('zh_CN', '2020-12-30', [formatStr]),
144+
);
145+
expect(generateConfig.locale.format('en_US', usDate, formatStr)).toEqual('2020-12-27');
146+
expect(generateConfig.locale.format('zh_CN', cnDate, formatStr)).toEqual('2020-12-28');
147+
});
148+
135149
it('Parse format Wo', () => {
136150
if (name !== 'date-fns') {
137151
expect(

0 commit comments

Comments
 (0)