Skip to content

Commit 22755e1

Browse files
authored
fix(date-picker): refactor date utility functions and week picker to correctly show selected week (#2970)
* fix(date-picker): refactor date utility functions and week picker to correctly show selected week * docs(date-picker): update WeekPicker usage with `dayStartOfWeek` in demo * test(date-picker): update WeekPicker snapshot
1 parent 749804c commit 22755e1

File tree

4 files changed

+48
-21
lines changed

4 files changed

+48
-21
lines changed

packages/web-vue/components/_utils/date.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,21 +51,34 @@ export const methods = {
5151
startOf(time: Dayjs, unit: OpUnitType) {
5252
return time.startOf(unit);
5353
},
54+
/**
55+
* Similar to `startOf`, returns start date of a week; used in week pickers
56+
* @param time Selected date
57+
* @param weekStart Start day of a week
58+
* @returns Start date of the week containing the selected date
59+
*/
60+
startOfWeek(time: Dayjs, weekStart: number) {
61+
const currentDay = time.day();
62+
let startOfWeek = time.subtract(currentDay - weekStart, 'day');
63+
if (startOfWeek.isAfter(time)) {
64+
startOfWeek = startOfWeek.subtract(7, 'day');
65+
}
66+
return startOfWeek;
67+
},
5468
endOf(time: Dayjs, unit: OpUnitType) {
5569
return time.endOf(unit);
5670
},
5771
set(time: Dayjs, unit: UnitType, value: number) {
5872
return time.set(unit, value);
5973
},
60-
isSameWeek(
61-
date1: Dayjs,
62-
date2: Dayjs,
63-
weekStart: number,
64-
localeName: string
65-
) {
66-
return date1
67-
.locale({ ...dayjs.Ls[localeName.toLocaleLowerCase()], weekStart })
68-
.isSame(date2, 'week');
74+
isSameWeek(date1: Dayjs, date2: Dayjs, weekStart: number) {
75+
// calculate week number of the given date considering the given start of week
76+
const getWeek = (date: Dayjs) => {
77+
const day = date.day();
78+
const diff = day - weekStart + (day < weekStart ? 7 : 0);
79+
return date.subtract(diff, 'day').week();
80+
};
81+
return getWeek(date1) === getWeek(date2);
6982
},
7083
};
7184

packages/web-vue/components/date-picker/__demo__/week.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,22 @@ title:
66
77
## zh-CN
88
9-
周输入器的基础使用
9+
周选择器提供了一种选择星期的简单方法。也可以指定一周的起始日
1010
1111
---
1212
1313
## en-US
1414
15-
The basic usage of WeekPicker.
15+
WeekPicker provides a simple way to select weeks. It also allows you to specify the starting day of the week.
1616
1717
---
1818
1919
```vue
2020
<template>
21-
<a-week-picker style="width: 200px;" />
21+
<a-week-picker style="width: 200px; margin: 0 24px 24px 0;" />
22+
<a-week-picker
23+
style="width: 200px; margin: 0 24px 24px 0;"
24+
day-start-of-week="1"
25+
/>
2226
</template>
2327
```

packages/web-vue/components/date-picker/__test__/__snapshots__/demo.test.ts.snap

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1316,7 +1316,16 @@ exports[`<date-picker> demo: render [trigger-element] correctly 1`] = `
13161316
`;
13171317
13181318
exports[`<date-picker> demo: render [week] correctly 1`] = `
1319-
"<div class=\\"arco-picker arco-picker-size-medium\\" style=\\"width: 200px;\\" visible=\\"false\\">
1319+
"<div class=\\"arco-picker arco-picker-size-medium\\" style=\\"width: 200px; margin: 0px 24px 24px 0px;\\" visible=\\"false\\">
1320+
<!--v-if-->
1321+
<div class=\\"arco-picker-input\\"><input placeholder=\\"请选择周\\" class=\\"arco-picker-start-time\\"></div>
1322+
<div class=\\"arco-picker-suffix\\">
1323+
<!--v-if--><span class=\\"arco-picker-suffix-icon\\"><svg viewBox=\\"0 0 48 48\\" fill=\\"none\\" xmlns=\\"http://www.w3.org/2000/svg\\" stroke=\\"currentColor\\" class=\\"arco-icon arco-icon-calendar\\" stroke-width=\\"4\\" stroke-linecap=\\"butt\\" stroke-linejoin=\\"miter\\"><path d=\\"M7 22h34M14 5v8m20-8v8M8 41h32a1 1 0 0 0 1-1V10a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v30a1 1 0 0 0 1 1Z\\"></path></svg></span>
1324+
<!--v-if-->
1325+
</div>
1326+
</div>
1327+
<!---->
1328+
<div class=\\"arco-picker arco-picker-size-medium\\" style=\\"width: 200px; margin: 0px 24px 24px 0px;\\" visible=\\"false\\">
13201329
<!--v-if-->
13211330
<div class=\\"arco-picker-input\\"><input placeholder=\\"请选择周\\" class=\\"arco-picker-start-time\\"></div>
13221331
<div class=\\"arco-picker-suffix\\">

packages/web-vue/components/date-picker/panels/week/index.vue

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,22 @@ export default defineComponent({
3333
setup(props, { emit }) {
3434
const { locale } = useI18n();
3535
const isSameTime: IsSameTime = (current, target) => {
36-
return methods.isSameWeek(
37-
current,
38-
target,
39-
props.dayStartOfWeek,
40-
locale.value
41-
);
36+
return methods.isSameWeek(current, target, props.dayStartOfWeek);
4237
};
4338
return {
4439
isSameTime,
4540
onSelect: (value: Dayjs) => {
46-
const startDateOfWeek = methods.startOf(value, 'week');
41+
const startDateOfWeek = methods.startOfWeek(
42+
value,
43+
props.dayStartOfWeek
44+
);
4745
emit('select', startDateOfWeek);
4846
},
4947
onCellMouseEnter: (value: Dayjs) => {
50-
const startDateOfWeek = methods.startOf(value, 'week');
48+
const startDateOfWeek = methods.startOfWeek(
49+
value,
50+
props.dayStartOfWeek
51+
);
5152
emit('cell-mouse-enter', startDateOfWeek);
5253
},
5354
};

0 commit comments

Comments
 (0)