fix(CalendarDay): fix margin-bottom calculation wrong for calendar days (#13271)

This commit is contained in:
Phi
2025-01-04 21:59:29 +08:00
committed by GitHub
parent d44953c0aa
commit be93d4990f
5 changed files with 42 additions and 31 deletions

View File

@@ -5,7 +5,7 @@ import {
type CSSProperties,
} from 'vue';
import { makeNumberProp, createNamespace, makeRequiredProp } from '../utils';
import { bem } from './utils';
import { bem, isLastRowInMonth } from './utils';
import type { CalendarDayItem } from './types';
const [name] = createNamespace('calendar-day');
@@ -54,7 +54,7 @@ export default defineComponent({
}
}
if (offset + (item.date?.getDate() || 1) > 28) {
if (item.date && isLastRowInMonth(item.date, offset)) {
style.marginBottom = 0;
}

View File

@@ -202,49 +202,42 @@ exports[`formatter prop 1`] = `
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
24
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
25
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
26
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
27
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
28
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
29
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
30
@@ -510,49 +503,42 @@ exports[`popup wrapper 2`] = `
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
24
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
25
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
26
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
27
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
28
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
29
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
30
@@ -811,49 +797,42 @@ exports[`should render title、footer、subtitle slot correctly 1`] = `
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
24
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
25
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
26
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
27
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
28
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
29
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
30

View File

@@ -195,49 +195,42 @@ exports[`lazy-render prop 1`] = `
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
24
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
25
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
26
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
27
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
28
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
29
</div>
<div
role="gridcell"
style="margin-bottom: 0px;"
class="van-calendar__day van-calendar__day--disabled"
>
30

View File

@@ -1,4 +1,10 @@
import { compareDay, compareMonth, getNextDay, calcDateNum } from '../utils';
import {
compareDay,
compareMonth,
getNextDay,
calcDateNum,
isLastRowInMonth,
} from '../utils';
const date1 = new Date(2010, 0, 1);
const date2 = new Date(2010, 0, 2);
@@ -29,3 +35,22 @@ test('calcDateNum', () => {
expect(calcDateNum([date1, date2])).toEqual(2);
expect(calcDateNum([date1, date3])).toEqual(32);
});
test('isLastRowInMonth', () => {
// test first day of month
expect(isLastRowInMonth(new Date(2024, 0, 1), 0)).toEqual(false);
// test middle of month
expect(isLastRowInMonth(new Date(2024, 0, 22), 0)).toEqual(false);
expect(isLastRowInMonth(new Date(2024, 0, 28), 0)).toEqual(false);
// test last week of month
expect(isLastRowInMonth(new Date(2024, 0, 29), 0)).toEqual(true);
expect(isLastRowInMonth(new Date(2024, 0, 31), 0)).toEqual(true);
// test different offset
expect(isLastRowInMonth(new Date(2024, 0, 18), 4)).toEqual(false);
expect(isLastRowInMonth(new Date(2024, 0, 24), 4)).toEqual(false);
expect(isLastRowInMonth(new Date(2024, 0, 25), 4)).toEqual(true);
expect(isLastRowInMonth(new Date(2024, 0, 31), 4)).toEqual(true);
});

View File

@@ -82,3 +82,17 @@ export function calcDateNum(date: [Date, Date]) {
const day2 = date[1].getTime();
return (day2 - day1) / (1000 * 60 * 60 * 24) + 1;
}
/**
* Checks if the given date is in the last row of its month in a calendar view
* @param date The date to check
* @param offset The offset of the first day of the month
* @returns boolean indicating whether the date is in the last row
*/
export function isLastRowInMonth(date: Date, offset: number = 0) {
const lastDay = new Date(date.getFullYear(), date.getMonth() + 1, 0);
const currentPos = offset + date.getDate() - 1;
const lastDayPos = offset + lastDay.getDate() - 1;
return Math.floor(currentPos / 7) === Math.floor(lastDayPos / 7);
}