mirror of
https://gitee.com/vant-contrib/vant.git
synced 2025-04-06 03:57:59 +08:00
feat: calendar support firstDayOfWeek (#6468)
This commit is contained in:
parent
63aa6baa86
commit
5febb845d0
@ -200,6 +200,14 @@ When selecting a date range, you can use the `max-range` prop to specify the max
|
|||||||
<van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />
|
<van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Custom First Day Of Week
|
||||||
|
|
||||||
|
Use `first-day-of-week` to custom the start day of week
|
||||||
|
|
||||||
|
```html
|
||||||
|
<van-calendar first-day-of-week="1" />
|
||||||
|
```
|
||||||
|
|
||||||
### Tiled display
|
### Tiled display
|
||||||
|
|
||||||
Set `poppable` to `false`, the calendar will be displayed directly on the page instead of appearing as a popup
|
Set `poppable` to `false`, the calendar will be displayed directly on the page instead of appearing as a popup
|
||||||
@ -235,6 +243,7 @@ Set `poppable` to `false`, the calendar will be displayed directly on the page i
|
|||||||
| show-confirm | Whether to show confirm button | _boolean_ | `true` |
|
| show-confirm | Whether to show confirm button | _boolean_ | `true` |
|
||||||
| confirm-text | Confirm button text | _string_ | `Confirm` |
|
| confirm-text | Confirm button text | _string_ | `Confirm` |
|
||||||
| confirm-disabled-text | Confirm button text when disabled | _string_ | `Confirm` |
|
| confirm-disabled-text | Confirm button text when disabled | _string_ | `Confirm` |
|
||||||
|
| first-day-of-week | Set the start day of week | _0-6_ | `0` |
|
||||||
|
|
||||||
### Poppable Props
|
### Poppable Props
|
||||||
|
|
||||||
|
@ -202,6 +202,14 @@ export default {
|
|||||||
<van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />
|
<van-calendar type="range" :max-range="3" :style="{ height: '500px' }" />
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 自定义周起始日
|
||||||
|
|
||||||
|
通过`first-day-of-week`属性设置一周从哪天开始
|
||||||
|
|
||||||
|
```html
|
||||||
|
<van-calendar first-day-of-week="1" />
|
||||||
|
```
|
||||||
|
|
||||||
### 平铺展示
|
### 平铺展示
|
||||||
|
|
||||||
将`poppable`设置为`false`,日历会直接展示在页面内,而不是以弹层的形式出现
|
将`poppable`设置为`false`,日历会直接展示在页面内,而不是以弹层的形式出现
|
||||||
@ -237,6 +245,7 @@ export default {
|
|||||||
| show-confirm | 是否展示确认按钮 | _boolean_ | `true` |
|
| show-confirm | 是否展示确认按钮 | _boolean_ | `true` |
|
||||||
| confirm-text | 确认按钮的文字 | _string_ | `确定` |
|
| confirm-text | 确认按钮的文字 | _string_ | `确定` |
|
||||||
| confirm-disabled-text | 确认按钮处于禁用状态时的文字 | _string_ | `确定` |
|
| confirm-disabled-text | 确认按钮处于禁用状态时的文字 | _string_ | `确定` |
|
||||||
|
| first-day-of-week | 设置周起始日 | _0-6_ | `0` |
|
||||||
|
|
||||||
### Poppable Props
|
### Poppable Props
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ export default createComponent({
|
|||||||
subtitle: String,
|
subtitle: String,
|
||||||
showTitle: Boolean,
|
showTitle: Boolean,
|
||||||
showSubtitle: Boolean,
|
showSubtitle: Boolean,
|
||||||
|
firstDayOfWeek: Number,
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
@ -28,9 +29,16 @@ export default createComponent({
|
|||||||
genWeekDays() {
|
genWeekDays() {
|
||||||
const weekdays = t('weekdays');
|
const weekdays = t('weekdays');
|
||||||
|
|
||||||
|
const { firstDayOfWeek } = this;
|
||||||
|
|
||||||
|
const renderWeekDays = [
|
||||||
|
...weekdays.slice(firstDayOfWeek, 7),
|
||||||
|
...weekdays.slice(0, firstDayOfWeek),
|
||||||
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div class={bem('weekdays')}>
|
<div class={bem('weekdays')}>
|
||||||
{weekdays.map((item) => (
|
{renderWeekDays.map((item) => (
|
||||||
<span class={bem('weekday')}>{item}</span>
|
<span class={bem('weekday')}>{item}</span>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
@ -27,6 +27,7 @@ export default createComponent({
|
|||||||
allowSameDay: Boolean,
|
allowSameDay: Boolean,
|
||||||
showSubtitle: Boolean,
|
showSubtitle: Boolean,
|
||||||
showMonthTitle: Boolean,
|
showMonthTitle: Boolean,
|
||||||
|
firstDayOfWeek: Number,
|
||||||
},
|
},
|
||||||
|
|
||||||
data() {
|
data() {
|
||||||
@ -41,7 +42,15 @@ export default createComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
offset() {
|
offset() {
|
||||||
return this.date.getDay();
|
const { firstDayOfWeek } = this;
|
||||||
|
|
||||||
|
const realDay = this.date.getDay();
|
||||||
|
|
||||||
|
if (!firstDayOfWeek) {
|
||||||
|
return realDay;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (realDay + 7 - this.firstDayOfWeek) % 7;
|
||||||
},
|
},
|
||||||
|
|
||||||
totalDay() {
|
totalDay() {
|
||||||
|
@ -81,6 +81,12 @@
|
|||||||
:value="formatRange(date.maxRange)"
|
:value="formatRange(date.maxRange)"
|
||||||
@click="show('range', 'maxRange')"
|
@click="show('range', 'maxRange')"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<van-cell
|
||||||
|
is-link
|
||||||
|
:title="t('firstDayOfWeek')"
|
||||||
|
@click="show('single', 'firstDayOfWeek')"
|
||||||
|
/>
|
||||||
</demo-block>
|
</demo-block>
|
||||||
|
|
||||||
<demo-block card :title="t('tiledDisplay')">
|
<demo-block card :title="t('tiledDisplay')">
|
||||||
@ -108,6 +114,7 @@
|
|||||||
:show-confirm="showConfirm"
|
:show-confirm="showConfirm"
|
||||||
:confirm-text="confirmText"
|
:confirm-text="confirmText"
|
||||||
:confirm-disabled-text="confirmDisabledText"
|
:confirm-disabled-text="confirmDisabledText"
|
||||||
|
:first-day-of-week="firstDayOfWeek"
|
||||||
@confirm="onConfirm"
|
@confirm="onConfirm"
|
||||||
/>
|
/>
|
||||||
</demo-section>
|
</demo-section>
|
||||||
@ -139,6 +146,7 @@ export default {
|
|||||||
customPosition: '自定义弹出位置',
|
customPosition: '自定义弹出位置',
|
||||||
customCalendar: '自定义日历',
|
customCalendar: '自定义日历',
|
||||||
confirmDisabledText: '请选择结束时间',
|
confirmDisabledText: '请选择结束时间',
|
||||||
|
firstDayOfWeek: '自定义周起始日',
|
||||||
tiledDisplay: '平铺展示',
|
tiledDisplay: '平铺展示',
|
||||||
},
|
},
|
||||||
'en-US': {
|
'en-US': {
|
||||||
@ -161,6 +169,7 @@ export default {
|
|||||||
customDayText: 'Custom Day Text',
|
customDayText: 'Custom Day Text',
|
||||||
customPosition: 'Custom Position',
|
customPosition: 'Custom Position',
|
||||||
customCalendar: 'Custom Calendar',
|
customCalendar: 'Custom Calendar',
|
||||||
|
firstDayOfWeek: 'Custom First Day Of Week',
|
||||||
confirmDisabledText: 'Select End Time',
|
confirmDisabledText: 'Select End Time',
|
||||||
tiledDisplay: 'Tiled display',
|
tiledDisplay: 'Tiled display',
|
||||||
},
|
},
|
||||||
@ -195,6 +204,7 @@ export default {
|
|||||||
tiledMaxDate: new Date(2012, 2, 20),
|
tiledMaxDate: new Date(2012, 2, 20),
|
||||||
confirmText: undefined,
|
confirmText: undefined,
|
||||||
confirmDisabledText: undefined,
|
confirmDisabledText: undefined,
|
||||||
|
firstDayOfWeek: 0,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -210,6 +220,7 @@ export default {
|
|||||||
this.showConfirm = true;
|
this.showConfirm = true;
|
||||||
this.confirmText = undefined;
|
this.confirmText = undefined;
|
||||||
this.confirmDisabledText = undefined;
|
this.confirmDisabledText = undefined;
|
||||||
|
this.firstDayOfWeek = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
show(type, id) {
|
show(type, id) {
|
||||||
@ -246,6 +257,9 @@ export default {
|
|||||||
case 'maxRange':
|
case 'maxRange':
|
||||||
this.maxRange = 3;
|
this.maxRange = 3;
|
||||||
break;
|
break;
|
||||||
|
case 'firstDayOfWeek':
|
||||||
|
this.firstDayOfWeek = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -35,6 +35,13 @@ export default createComponent({
|
|||||||
allowSameDay: Boolean,
|
allowSameDay: Boolean,
|
||||||
closeOnPopstate: Boolean,
|
closeOnPopstate: Boolean,
|
||||||
confirmDisabledText: String,
|
confirmDisabledText: String,
|
||||||
|
firstDayOfWeek: {
|
||||||
|
type: [Number, String],
|
||||||
|
default: 0,
|
||||||
|
validator: (val) => {
|
||||||
|
return val >= 0 && val <= 6;
|
||||||
|
},
|
||||||
|
},
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
default: 'single',
|
default: 'single',
|
||||||
@ -137,6 +144,10 @@ export default createComponent({
|
|||||||
|
|
||||||
return !currentDate;
|
return !currentDate;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
dayOffset() {
|
||||||
|
return this.firstDayOfWeek ? this.firstDayOfWeek % 7 : 0;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
@ -379,6 +390,7 @@ export default createComponent({
|
|||||||
showSubtitle={this.showSubtitle}
|
showSubtitle={this.showSubtitle}
|
||||||
allowSameDay={this.allowSameDay}
|
allowSameDay={this.allowSameDay}
|
||||||
showMonthTitle={showMonthTitle}
|
showMonthTitle={showMonthTitle}
|
||||||
|
firstDayOfWeek={this.dayOffset}
|
||||||
onClick={this.onClickDay}
|
onClick={this.onClickDay}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
@ -432,6 +444,7 @@ export default createComponent({
|
|||||||
scopedSlots={{
|
scopedSlots={{
|
||||||
title: () => this.slots('title'),
|
title: () => this.slots('title'),
|
||||||
}}
|
}}
|
||||||
|
firstDayOfWeek={this.dayOffset}
|
||||||
/>
|
/>
|
||||||
<div ref="body" class={bem('body')} onScroll={this.onScroll}>
|
<div ref="body" class={bem('body')} onScroll={this.onScroll}>
|
||||||
{this.months.map(this.genMonth)}
|
{this.months.map(this.genMonth)}
|
||||||
|
@ -51,6 +51,10 @@ exports[`renders demo correctly 1`] = `
|
|||||||
<div class="van-cell__title"><span>日期区间最大范围</span></div><i class="van-icon van-icon-arrow van-cell__right-icon">
|
<div class="van-cell__title"><span>日期区间最大范围</span></div><i class="van-icon van-icon-arrow van-cell__right-icon">
|
||||||
<!----></i>
|
<!----></i>
|
||||||
</div>
|
</div>
|
||||||
|
<div role="button" tabindex="0" class="van-cell van-cell--clickable">
|
||||||
|
<div class="van-cell__title"><span>自定义周起始日</span></div><i class="van-icon van-icon-arrow van-cell__right-icon">
|
||||||
|
<!----></i>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="van-calendar" style="height: 500px;">
|
<div class="van-calendar" style="height: 500px;">
|
||||||
|
@ -191,3 +191,24 @@ test('month-show event', async () => {
|
|||||||
|
|
||||||
expect(wrapper.emitted('month-show')).toBeTruthy();
|
expect(wrapper.emitted('month-show')).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test.only('first day of week', async () => {
|
||||||
|
const wrapper = mount(Calendar, {
|
||||||
|
propsData: {
|
||||||
|
poppable: false,
|
||||||
|
defaultDate: new Date(2020, 7, 1),
|
||||||
|
maxDate: new Date(2020, 7, 30),
|
||||||
|
firstDayOfWeek: 2,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
await later();
|
||||||
|
|
||||||
|
expect(wrapper.find('.van-calendar__weekdays').text()[0]).toEqual('二');
|
||||||
|
|
||||||
|
const day = wrapper.find(
|
||||||
|
'.van-calendar__month:first-of-type .van-calendar__day'
|
||||||
|
);
|
||||||
|
expect(day.text()).toEqual('1');
|
||||||
|
expect(day.attributes('style')).toContain(`margin-left: ${100 / 7}%`);
|
||||||
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user