Calendar: add first-day-of-week attribute (#16047)

This commit is contained in:
hetech 2019-06-24 15:07:49 +08:00 committed by Zhi Cun
parent 4069f37ef0
commit e2303b85a4
8 changed files with 65 additions and 22 deletions

View File

@ -53,10 +53,11 @@ Display date.
:::
### Attributes
| Attribute | Description | Type | Accepted Values | Default |
|-----------------|-------------- |---------- |---------------------- |--------- |
| value / v-model | binding value | Date/string/number | — | — |
| 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 | — | — |
| Attribute | Description | Type | Accepted Values | Default |
|-----------------|------------------- |---------- |---------------------- |--------- |
| value / v-model | binding value | Date/string/number | — | — |
| 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 | — | — |
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
### dateCell scoped slot 参数
| Attribute | Description | Type | Accepted Values | Default |

View File

@ -54,10 +54,11 @@ Muestra fechas.
:::
### Atributos
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |
|-----------------|-------------- |---------- |---------------------- |--------- |
| value / v-model | valor vinculante | Date/string/number | — | — |
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |
|-----------------|------------------- |---------- |---------------------- |------------ |
| value / v-model | valor vinculante | Date/string/number | — | — |
| 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 | — | — |
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
### dateCell scoped slot
| Atributo | Descripción | Tipo | Valores aceptados | Por defecto |

View File

@ -54,10 +54,11 @@ Affiche un calendrier.
### Attributs
| Attribut | Description | Type | Valeurs acceptées | Défaut |
|-----------------|-------------- |---------- |---------------------- |--------- |
| value / v-model | Valeur liée. | Date/string/number | — | — |
| 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 | — | — |
| Attribut | Description | Type | Valeurs acceptées | Défaut |
|------------------ |-------------- |---------- |---------------------- |--------- |
| value / v-model | Valeur liée. | Date/string/number | — | — |
| 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 | — | — |
| first-day-of-week | fisrt day of week| Number | 1 to 7 | 1 |
### Slot dateCell

View File

@ -57,6 +57,7 @@
|-----------------|-------------- |---------- |------------ |-------- |
| value / v-model | 绑定值 | Date/string/number | — | — |
| range | 时间范围,包括开始时间与结束时间。开始时间必须是周一,结束时间必须是周日,且时间跨度不能超过两个月。 | Array | — | — |
| first-day-of-week | 周起始日 | Number | 1 到 7 | 1 |
### dateCell scoped slot 参数
| 参数 | 说明 | 类型 | 可选值 | 默认值 |

View File

@ -1,8 +1,9 @@
<script>
import fecha from 'element-ui/src/utils/date';
import { range as rangeArr, getFirstDayOfMonth, getPrevMonthLastDays, getMonthDays, getI18nSettings, validateRangeInOneMonth } from 'element-ui/src/utils/date-util';
export default {
const WEEK_DAYS = getI18nSettings().dayNames;
export default {
props: {
selectedDay: String, // formated date yyyy-MM-dd
range: {
@ -14,7 +15,8 @@ export default {
}
},
date: Date,
hideHeader: Boolean
hideHeader: Boolean,
firstDayOfWeek: Number
},
inject: ['elCalendar'],
@ -119,7 +121,8 @@ export default {
const date = this.date;
let firstDay = getFirstDayOfMonth(date);
firstDay = firstDay === 0 ? 7 : firstDay;
const prevMonthDays = getPrevMonthLastDays(date, firstDay - 1).map(day => ({
const firstDayOfWeek = typeof this.firstDayOfWeek === 'number' ? this.firstDayOfWeek : 1;
const prevMonthDays = getPrevMonthLastDays(date, firstDay - firstDayOfWeek).map(day => ({
text: day,
type: 'prev'
}));
@ -135,20 +138,22 @@ export default {
days = days.concat(nextMonthDays);
}
return this.toNestedArr(days);
}
},
},
data() {
const dayNames = getI18nSettings().dayNames;
return {
DAYS: dayNames.slice(1).concat(dayNames[0])
};
weekDays() {
const start = this.firstDayOfWeek;
if (typeof start !== 'number' || start === 0) {
return WEEK_DAYS.slice();
} else {
return WEEK_DAYS.slice(start).concat(WEEK_DAYS.slice(0, start));
}
}
},
render() {
const thead = this.hideHeader ? null : (<thead>
{
this.DAYS.map(day => <th key={day}>{ day }</th>)
this.weekDays.map(day => <th key={day}>{ day }</th>)
}
</thead>);
return (

View File

@ -36,6 +36,7 @@
<date-table
:date="date"
:selected-day="realSelectedDay"
:first-day-of-week="realFirstDayOfWeek"
@pick="pickDay" />
</div>
<div
@ -86,6 +87,10 @@ export default {
return true;
}
}
},
firstDayOfWeek: {
type: Number,
default: 1
}
},
@ -238,6 +243,13 @@ export default {
return data;
}
return [];
},
realFirstDayOfWeek() {
if (this.firstDayOfWeek < 1 || this.firstDayOfWeek > 6) {
return 0;
}
return Math.floor(this.firstDayOfWeek);
}
},

View File

@ -66,5 +66,24 @@ describe('Calendar', () => {
expect(/2019.*5/.test(titleEl.innerText)).to.be.true;
expect(cell.classList.contains('is-selected')).to.be.true;
});
it('firstDayOfWeek', async() => {
vm = createVue({
template: `
<el-calendar v-model="value" :first-day-of-week="0"></el-calendar>
`,
data() {
return {
value: new Date('2019-04-01')
};
}
}, true);
const head = vm.$el.querySelector('.el-calendar-table thead');
expect(head.firstElementChild.innerText).to.be.equal('日');
expect(head.lastElementChild.innerText).to.be.equal('六');
const firstRow = vm.$el.querySelector('.el-calendar-table__row');
expect(firstRow.firstElementChild.innerText).to.be.equal('31');
expect(firstRow.lastElementChild.innerText).to.be.equal('6');
});
});

3
types/calendar.d.ts vendored
View File

@ -9,4 +9,7 @@ export declare class ElCalendar extends ElementUIComponent {
/** Specify the display range of the calendar */
range: DateType[]
/** First day of week */
firstDayOfWeek: number
}