| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- <template>
- <table @click="handleYearTableClick" class="el-year-table">
- <tbody>
- <tr>
- <td class="available" :class="getCellStyle(startYear + 0)">
- <a class="cell">{{ startYear }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 1)">
- <a class="cell">{{ startYear + 1 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 2)">
- <a class="cell">{{ startYear + 2 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 3)">
- <a class="cell">{{ startYear + 3 }}</a>
- </td>
- </tr>
- <tr>
- <td class="available" :class="getCellStyle(startYear + 4)">
- <a class="cell">{{ startYear + 4 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 5)">
- <a class="cell">{{ startYear + 5 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 6)">
- <a class="cell">{{ startYear + 6 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 7)">
- <a class="cell">{{ startYear + 7 }}</a>
- </td>
- </tr>
- <tr>
- <td class="available" :class="getCellStyle(startYear + 8)">
- <a class="cell">{{ startYear + 8 }}</a>
- </td>
- <td class="available" :class="getCellStyle(startYear + 9)">
- <a class="cell">{{ startYear + 9 }}</a>
- </td>
- <td></td>
- <td></td>
- </tr>
- </tbody>
- </table>
- </template>
- <script type="text/babel">
- import { hasClass } from 'element-ui/src/utils/dom';
- import { isDate, range, nextDate, getDayCountOfYear } from 'element-ui/src/utils/date-util';
- import { arrayFindIndex, coerceTruthyValueToArray } from 'element-ui/src/utils/util';
- const datesInYear = year => {
- const numOfDays = getDayCountOfYear(year);
- const firstDay = new Date(year, 0, 1);
- return range(numOfDays).map(n => nextDate(firstDay, n));
- };
- export default {
- props: {
- disabledDate: {},
- value: {},
- defaultValue: {
- validator(val) {
- // null or valid Date Object
- return val === null || (val instanceof Date && isDate(val));
- }
- },
- date: {},
- selectionMode: {}
- },
- computed: {
- startYear() {
- return Math.floor(this.date.getFullYear() / 10) * 10;
- }
- },
- methods: {
- getCellStyle(year) {
- const style = {};
- const today = new Date();
- style.disabled = typeof this.disabledDate === 'function'
- ? datesInYear(year).every(this.disabledDate)
- : false;
- style.current = arrayFindIndex(coerceTruthyValueToArray(this.value), date => date.getFullYear() === year) >= 0;
- style.today = today.getFullYear() === year;
- style.default = this.defaultValue && this.defaultValue.getFullYear() === year;
- return style;
- },
- handleYearTableClick(event) {
- const target = event.target;
- if (target.tagName === 'A') {
- if (hasClass(target.parentNode, 'disabled')) return;
- const year = target.textContent || target.innerText;
- if (this.selectionMode === 'years') {
- const value = this.value || [];
- const idx = arrayFindIndex(value, date => date.getFullYear() === Number(year));
- const newValue = idx > -1
- ? [...value.slice(0, idx), ...value.slice(idx + 1)]
- : [...value, new Date(year)];
- this.$emit('pick', newValue);
- } else {
- this.$emit('pick', Number(year));
- }
- }
- }
- }
- };
- </script>
|