Skip to content

Commit e2303b8

Browse files
ziyoungisland205
authored andcommitted
Calendar: add first-day-of-week attribute (#16047)
1 parent 4069f37 commit e2303b8

File tree

8 files changed

+65
-22
lines changed

8 files changed

+65
-22
lines changed

examples/docs/en-US/calendar.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ Display date.
5353
:::
5454

5555
### Attributes
56-
| Attribute | Description | Type | Accepted Values | Default |
57-
|-----------------|-------------- |---------- |---------------------- |--------- |
58-
| value / v-model | binding value | Date/string/number |||
59-
| range | time range, including start time and end time. Start time must be Monday, end time must be Sunday, the time span cannot exceed two months | Array |||
56+
| Attribute | Description | Type | Accepted Values | Default |
57+
|-----------------|------------------- |---------- |---------------------- |--------- |
58+
| value / v-model | binding value | Date/string/number |||
59+
| range | time range, including start time and end time. Start time must be Monday, end time must be Sunday, the time span cannot exceed two months | Array |||
60+
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
6061

6162
### dateCell scoped slot 参数
6263
| Attribute | Description | Type | Accepted Values | Default |

examples/docs/es/calendar.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ Muestra fechas.
5454
:::
5555

5656
### Atributos
57-
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |
58-
|-----------------|-------------- |---------- |---------------------- |--------- |
59-
| value / v-model | valor vinculante | Date/string/number |||
57+
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |
58+
|-----------------|------------------- |---------- |---------------------- |------------ |
59+
| value / v-model | valor vinculante | Date/string/number || |
6060
| range | rango de tiempo, incluyendo el tiempo de inicio y el tiempo final. El tiempo de inicio debe ser el lunes, el tiempo final debe ser el domingo, el período no puede exceder los dos meses. | Array |||
61+
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
6162

6263
### dateCell scoped slot
6364
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |

examples/docs/fr-FR/calendar.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ Affiche un calendrier.
5454

5555
### Attributs
5656

57-
| Attribut | Description | Type | Valeurs acceptées | Défaut |
58-
|-----------------|-------------- |---------- |---------------------- |--------- |
59-
| value / v-model | Valeur liée. | Date/string/number |||
60-
| range | Intervalle de dates, début et fin inclus. Le début doit être un lundi et la fin un dimanche, l'intervalle ne pouvant excéder deux mois. | Array |||
57+
| Attribut | Description | Type | Valeurs acceptées | Défaut |
58+
|------------------ |-------------- |---------- |---------------------- |--------- |
59+
| value / v-model | Valeur liée. | Date/string/number |||
60+
| range | Intervalle de dates, début et fin inclus. Le début doit être un lundi et la fin un dimanche, l'intervalle ne pouvant excéder deux mois. | Array |||
61+
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
6162

6263
### Slot dateCell
6364

examples/docs/zh-CN/calendar.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
|-----------------|-------------- |---------- |------------ |-------- |
5858
| value / v-model | 绑定值 | Date/string/number |||
5959
| range | 时间范围,包括开始时间与结束时间。开始时间必须是周一,结束时间必须是周日,且时间跨度不能超过两个月。 | Array |||
60+
| first-day-of-week | 周起始日 | Number | 1 到 7 | 1 |
6061

6162
### dateCell scoped slot 参数
6263
| 参数 | 说明 | 类型 | 可选值 | 默认值 |

packages/calendar/src/date-table.vue

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<script>
22
import fecha from 'element-ui/src/utils/date';
33
import { range as rangeArr, getFirstDayOfMonth, getPrevMonthLastDays, getMonthDays, getI18nSettings, validateRangeInOneMonth } from 'element-ui/src/utils/date-util';
4-
export default {
54
5+
const WEEK_DAYS = getI18nSettings().dayNames;
6+
export default {
67
props: {
78
selectedDay: String, // formated date yyyy-MM-dd
89
range: {
@@ -14,7 +15,8 @@ export default {
1415
}
1516
},
1617
date: Date,
17-
hideHeader: Boolean
18+
hideHeader: Boolean,
19+
firstDayOfWeek: Number
1820
},
1921
2022
inject: ['elCalendar'],
@@ -119,7 +121,8 @@ export default {
119121
const date = this.date;
120122
let firstDay = getFirstDayOfMonth(date);
121123
firstDay = firstDay === 0 ? 7 : firstDay;
122-
const prevMonthDays = getPrevMonthLastDays(date, firstDay - 1).map(day => ({
124+
const firstDayOfWeek = typeof this.firstDayOfWeek === 'number' ? this.firstDayOfWeek : 1;
125+
const prevMonthDays = getPrevMonthLastDays(date, firstDay - firstDayOfWeek).map(day => ({
123126
text: day,
124127
type: 'prev'
125128
}));
@@ -135,20 +138,22 @@ export default {
135138
days = days.concat(nextMonthDays);
136139
}
137140
return this.toNestedArr(days);
138-
}
139-
},
141+
},
140142
141-
data() {
142-
const dayNames = getI18nSettings().dayNames;
143-
return {
144-
DAYS: dayNames.slice(1).concat(dayNames[0])
145-
};
143+
weekDays() {
144+
const start = this.firstDayOfWeek;
145+
if (typeof start !== 'number' || start === 0) {
146+
return WEEK_DAYS.slice();
147+
} else {
148+
return WEEK_DAYS.slice(start).concat(WEEK_DAYS.slice(0, start));
149+
}
150+
}
146151
},
147152
148153
render() {
149154
const thead = this.hideHeader ? null : (<thead>
150155
{
151-
this.DAYS.map(day => <th key={day}>{ day }</th>)
156+
this.weekDays.map(day => <th key={day}>{ day }</th>)
152157
}
153158
</thead>);
154159
return (

packages/calendar/src/main.vue

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<date-table
3737
:date="date"
3838
:selected-day="realSelectedDay"
39+
:first-day-of-week="realFirstDayOfWeek"
3940
@pick="pickDay" />
4041
</div>
4142
<div
@@ -86,6 +87,10 @@ export default {
8687
return true;
8788
}
8889
}
90+
},
91+
firstDayOfWeek: {
92+
type: Number,
93+
default: 1
8994
}
9095
},
9196
@@ -238,6 +243,13 @@ export default {
238243
return data;
239244
}
240245
return [];
246+
},
247+
248+
realFirstDayOfWeek() {
249+
if (this.firstDayOfWeek < 1 || this.firstDayOfWeek > 6) {
250+
return 0;
251+
}
252+
return Math.floor(this.firstDayOfWeek);
241253
}
242254
},
243255

test/unit/specs/calendar.spec.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,24 @@ describe('Calendar', () => {
6666
expect(/2019.*5/.test(titleEl.innerText)).to.be.true;
6767
expect(cell.classList.contains('is-selected')).to.be.true;
6868
});
69+
70+
it('firstDayOfWeek', async() => {
71+
vm = createVue({
72+
template: `
73+
<el-calendar v-model="value" :first-day-of-week="0"></el-calendar>
74+
`,
75+
data() {
76+
return {
77+
value: new Date('2019-04-01')
78+
};
79+
}
80+
}, true);
81+
const head = vm.$el.querySelector('.el-calendar-table thead');
82+
expect(head.firstElementChild.innerText).to.be.equal('日');
83+
expect(head.lastElementChild.innerText).to.be.equal('六');
84+
const firstRow = vm.$el.querySelector('.el-calendar-table__row');
85+
expect(firstRow.firstElementChild.innerText).to.be.equal('31');
86+
expect(firstRow.lastElementChild.innerText).to.be.equal('6');
87+
});
6988
});
7089

types/calendar.d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ export declare class ElCalendar extends ElementUIComponent {
99

1010
/** Specify the display range of the calendar */
1111
range: DateType[]
12+
13+
/** First day of week */
14+
firstDayOfWeek: number
1215
}

0 commit comments

Comments
 (0)