|
@@ -35,6 +35,7 @@
|
|
|
import { getFirstDayOfMonth, getDayCountOfMonth, getWeekNumber, getStartDateOfMonth, nextDate, isDate } from '../util';
|
|
|
import { hasClass } from 'element-ui/src/utils/dom';
|
|
|
import Locale from 'element-ui/src/mixins/locale';
|
|
|
+ import { arrayFindIndex, arrayFind, coerceTruthyValueToArray } from 'element-ui/src/utils/util';
|
|
|
|
|
|
const WEEKS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
|
|
const clearHours = function(time) {
|
|
@@ -43,6 +44,14 @@
|
|
|
return cloneDate.getTime();
|
|
|
};
|
|
|
|
|
|
+ // remove the first element that satisfies `pred` from arr
|
|
|
+ // return a new array if modification occurs
|
|
|
+ // return the original array otherwise
|
|
|
+ const removeFromArray = function(arr, pred) {
|
|
|
+ const idx = typeof pred === 'function' ? arrayFindIndex(arr, pred) : arr.indexOf(pred);
|
|
|
+ return idx >= 0 ? [...arr.slice(0, idx), ...arr.slice(idx + 1)] : arr;
|
|
|
+ };
|
|
|
+
|
|
|
export default {
|
|
|
mixins: [Locale],
|
|
|
|
|
@@ -75,10 +84,6 @@
|
|
|
|
|
|
disabledDate: {},
|
|
|
|
|
|
- selectedDate: {
|
|
|
- type: Array
|
|
|
- },
|
|
|
-
|
|
|
minDate: {},
|
|
|
|
|
|
maxDate: {},
|
|
@@ -135,7 +140,7 @@
|
|
|
|
|
|
const startDate = this.startDate;
|
|
|
const disabledDate = this.disabledDate;
|
|
|
- const selectedDate = this.selectedDate || this.value;
|
|
|
+ const selectedDate = this.selectionMode === 'dates' ? coerceTruthyValueToArray(this.value) : [];
|
|
|
const now = clearHours(new Date());
|
|
|
|
|
|
for (let i = 0; i < 6; i++) {
|
|
@@ -188,10 +193,9 @@
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- let newDate = new Date(time);
|
|
|
- cell.disabled = typeof disabledDate === 'function' && disabledDate(newDate);
|
|
|
- cell.selected = Array.isArray(selectedDate) &&
|
|
|
- selectedDate.filter(date => date.toString() === newDate.toString())[0];
|
|
|
+ let cellDate = new Date(time);
|
|
|
+ cell.disabled = typeof disabledDate === 'function' && disabledDate(cellDate);
|
|
|
+ cell.selected = arrayFind(selectedDate, date => date.getTime() === cellDate.getTime());
|
|
|
|
|
|
this.$set(row, this.showWeekNumber ? j + 1 : j, cell);
|
|
|
}
|
|
@@ -483,19 +487,11 @@
|
|
|
date: newDate
|
|
|
});
|
|
|
} else if (selectionMode === 'dates') {
|
|
|
- let selectedDate = this.selectedDate;
|
|
|
-
|
|
|
- if (!cell.selected) {
|
|
|
- selectedDate.push(newDate);
|
|
|
- } else {
|
|
|
- selectedDate.forEach((date, index) => {
|
|
|
- if (date.toString() === newDate.toString()) {
|
|
|
- selectedDate.splice(index, 1);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- this.$emit('select', selectedDate);
|
|
|
+ const value = this.value || [];
|
|
|
+ const newValue = cell.selected
|
|
|
+ ? removeFromArray(value, date => date.getTime() === newDate.getTime())
|
|
|
+ : [...value, newDate];
|
|
|
+ this.$emit('pick', newValue);
|
|
|
}
|
|
|
}
|
|
|
}
|