mirror of
				https://gitee.com/vant-contrib/vant.git
				synced 2025-11-04 21:02:09 +08:00 
			
		
		
		
	[improvement] DatetimePicker: split into two components (#3995)
This commit is contained in:
		
							parent
							
								
									d9ecab9647
								
							
						
					
					
						commit
						8c6b05aa62
					
				
							
								
								
									
										210
									
								
								src/datetime-picker/DatePicker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								src/datetime-picker/DatePicker.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,210 @@
 | 
				
			|||||||
 | 
					import { createNamespace } from '../utils';
 | 
				
			||||||
 | 
					import { isDate } from '../utils/validate/date';
 | 
				
			||||||
 | 
					import { padZero } from '../utils/format/string';
 | 
				
			||||||
 | 
					import { pickerProps } from '../picker/shared';
 | 
				
			||||||
 | 
					import { getTrueValue, getMonthEndDay } from './utils';
 | 
				
			||||||
 | 
					import { sharedProps, TimePickerMixin } from './shared';
 | 
				
			||||||
 | 
					import Picker from '../picker';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const currentYear = new Date().getFullYear();
 | 
				
			||||||
 | 
					const [createComponent, bem] = createNamespace('date-picker');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default createComponent({
 | 
				
			||||||
 | 
					  mixins: [TimePickerMixin],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    ...sharedProps,
 | 
				
			||||||
 | 
					    type: {
 | 
				
			||||||
 | 
					      type: String,
 | 
				
			||||||
 | 
					      default: 'datetime'
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    minDate: {
 | 
				
			||||||
 | 
					      type: Date,
 | 
				
			||||||
 | 
					      default: () => new Date(currentYear - 10, 0, 1),
 | 
				
			||||||
 | 
					      validator: isDate
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    maxDate: {
 | 
				
			||||||
 | 
					      type: Date,
 | 
				
			||||||
 | 
					      default: () => new Date(currentYear + 10, 11, 31),
 | 
				
			||||||
 | 
					      validator: isDate
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    value(val) {
 | 
				
			||||||
 | 
					      val = this.formatValue(val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (val.valueOf() !== this.innerValue.valueOf()) {
 | 
				
			||||||
 | 
					        this.innerValue = val;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    ranges() {
 | 
				
			||||||
 | 
					      const { maxYear, maxDate, maxMonth, maxHour, maxMinute } = this.getBoundary(
 | 
				
			||||||
 | 
					        'max',
 | 
				
			||||||
 | 
					        this.innerValue
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const { minYear, minDate, minMonth, minHour, minMinute } = this.getBoundary(
 | 
				
			||||||
 | 
					        'min',
 | 
				
			||||||
 | 
					        this.innerValue
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const result = [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'year',
 | 
				
			||||||
 | 
					          range: [minYear, maxYear]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'month',
 | 
				
			||||||
 | 
					          range: [minMonth, maxMonth]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'day',
 | 
				
			||||||
 | 
					          range: [minDate, maxDate]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'hour',
 | 
				
			||||||
 | 
					          range: [minHour, maxHour]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'minute',
 | 
				
			||||||
 | 
					          range: [minMinute, maxMinute]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.type === 'date') result.splice(3, 2);
 | 
				
			||||||
 | 
					      if (this.type === 'year-month') result.splice(2, 3);
 | 
				
			||||||
 | 
					      return result;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    formatValue(value) {
 | 
				
			||||||
 | 
					      if (!isDate(value)) {
 | 
				
			||||||
 | 
					        value = this.minDate;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      value = Math.max(value, this.minDate.getTime());
 | 
				
			||||||
 | 
					      value = Math.min(value, this.maxDate.getTime());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return new Date(value);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    getBoundary(type, value) {
 | 
				
			||||||
 | 
					      const boundary = this[`${type}Date`];
 | 
				
			||||||
 | 
					      const year = boundary.getFullYear();
 | 
				
			||||||
 | 
					      let month = 1;
 | 
				
			||||||
 | 
					      let date = 1;
 | 
				
			||||||
 | 
					      let hour = 0;
 | 
				
			||||||
 | 
					      let minute = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (type === 'max') {
 | 
				
			||||||
 | 
					        month = 12;
 | 
				
			||||||
 | 
					        date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
 | 
				
			||||||
 | 
					        hour = 23;
 | 
				
			||||||
 | 
					        minute = 59;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (value.getFullYear() === year) {
 | 
				
			||||||
 | 
					        month = boundary.getMonth() + 1;
 | 
				
			||||||
 | 
					        if (value.getMonth() + 1 === month) {
 | 
				
			||||||
 | 
					          date = boundary.getDate();
 | 
				
			||||||
 | 
					          if (value.getDate() === date) {
 | 
				
			||||||
 | 
					            hour = boundary.getHours();
 | 
				
			||||||
 | 
					            if (value.getHours() === hour) {
 | 
				
			||||||
 | 
					              minute = boundary.getMinutes();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return {
 | 
				
			||||||
 | 
					        [`${type}Year`]: year,
 | 
				
			||||||
 | 
					        [`${type}Month`]: month,
 | 
				
			||||||
 | 
					        [`${type}Date`]: date,
 | 
				
			||||||
 | 
					        [`${type}Hour`]: hour,
 | 
				
			||||||
 | 
					        [`${type}Minute`]: minute
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onChange(picker) {
 | 
				
			||||||
 | 
					      const values = picker.getValues();
 | 
				
			||||||
 | 
					      const year = getTrueValue(values[0]);
 | 
				
			||||||
 | 
					      const month = getTrueValue(values[1]);
 | 
				
			||||||
 | 
					      const maxDate = getMonthEndDay(year, month);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let date = getTrueValue(values[2]);
 | 
				
			||||||
 | 
					      if (this.type === 'year-month') {
 | 
				
			||||||
 | 
					        date = 1;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      date = date > maxDate ? maxDate : date;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let hour = 0;
 | 
				
			||||||
 | 
					      let minute = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.type === 'datetime') {
 | 
				
			||||||
 | 
					        hour = getTrueValue(values[3]);
 | 
				
			||||||
 | 
					        minute = getTrueValue(values[4]);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      const value = new Date(year, month - 1, date, hour, minute);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.innerValue = this.formatValue(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
 | 
					        this.$nextTick(() => {
 | 
				
			||||||
 | 
					          this.$emit('change', picker);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateColumnValue(value) {
 | 
				
			||||||
 | 
					      const { formatter } = this;
 | 
				
			||||||
 | 
					      let values = [
 | 
				
			||||||
 | 
					        formatter('year', `${value.getFullYear()}`),
 | 
				
			||||||
 | 
					        formatter('month', padZero(value.getMonth() + 1)),
 | 
				
			||||||
 | 
					        formatter('day', padZero(value.getDate()))
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.type === 'datetime') {
 | 
				
			||||||
 | 
					        values.push(
 | 
				
			||||||
 | 
					          formatter('hour', padZero(value.getHours())),
 | 
				
			||||||
 | 
					          formatter('minute', padZero(value.getMinutes()))
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (this.type === 'year-month') {
 | 
				
			||||||
 | 
					        values = values.slice(0, 2);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
 | 
					        this.$refs.picker.setValues(values);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  render() {
 | 
				
			||||||
 | 
					    const props = {};
 | 
				
			||||||
 | 
					    Object.keys(pickerProps).forEach(key => {
 | 
				
			||||||
 | 
					      props[key] = this[key];
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <Picker
 | 
				
			||||||
 | 
					        class={bem()}
 | 
				
			||||||
 | 
					        ref="picker"
 | 
				
			||||||
 | 
					        columns={this.columns}
 | 
				
			||||||
 | 
					        onChange={this.onChange}
 | 
				
			||||||
 | 
					        onConfirm={this.onConfirm}
 | 
				
			||||||
 | 
					        onCancel={() => {
 | 
				
			||||||
 | 
					          this.$emit('cancel');
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					        {...{ props }}
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										118
									
								
								src/datetime-picker/TimePicker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								src/datetime-picker/TimePicker.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					import { createNamespace } from '../utils';
 | 
				
			||||||
 | 
					import { padZero } from '../utils/format/string';
 | 
				
			||||||
 | 
					import { range } from '../utils/format/number';
 | 
				
			||||||
 | 
					import { pickerProps } from '../picker/shared';
 | 
				
			||||||
 | 
					import { sharedProps, TimePickerMixin } from './shared';
 | 
				
			||||||
 | 
					import Picker from '../picker';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const [createComponent, bem] = createNamespace('time-picker');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export default createComponent({
 | 
				
			||||||
 | 
					  mixins: [TimePickerMixin],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  props: {
 | 
				
			||||||
 | 
					    ...sharedProps,
 | 
				
			||||||
 | 
					    minHour: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 0
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    maxHour: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 23
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    minMinute: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 0
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    maxMinute: {
 | 
				
			||||||
 | 
					      type: Number,
 | 
				
			||||||
 | 
					      default: 59
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    ranges() {
 | 
				
			||||||
 | 
					      return [
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'hour',
 | 
				
			||||||
 | 
					          range: [this.minHour, this.maxHour]
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					          type: 'minute',
 | 
				
			||||||
 | 
					          range: [this.minMinute, this.maxMinute]
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      ];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    value(val) {
 | 
				
			||||||
 | 
					      val = this.formatValue(val);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (val !== this.innerValue) {
 | 
				
			||||||
 | 
					        this.innerValue = val;
 | 
				
			||||||
 | 
					        this.updateColumnValue(val);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    formatValue(value) {
 | 
				
			||||||
 | 
					      if (!value) {
 | 
				
			||||||
 | 
					        value = `${padZero(this.minHour)}:${padZero(this.minMinute)}`;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      let [hour, minute] = value.split(':');
 | 
				
			||||||
 | 
					      hour = padZero(range(hour, this.minHour, this.maxHour));
 | 
				
			||||||
 | 
					      minute = padZero(range(minute, this.minMinute, this.maxMinute));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return `${hour}:${minute}`;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    onChange(picker) {
 | 
				
			||||||
 | 
					      const indexes = picker.getIndexes();
 | 
				
			||||||
 | 
					      const hour = this.originColumns[0].values[indexes[0]];
 | 
				
			||||||
 | 
					      const minute = this.originColumns[1].values[indexes[1]];
 | 
				
			||||||
 | 
					      const value = `${hour}:${minute}`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.innerValue = this.formatValue(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
 | 
					        this.$nextTick(() => {
 | 
				
			||||||
 | 
					          this.$emit('change', picker);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    updateColumnValue(value) {
 | 
				
			||||||
 | 
					      const { formatter } = this;
 | 
				
			||||||
 | 
					      const pair = value.split(':');
 | 
				
			||||||
 | 
					      const values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      this.$nextTick(() => {
 | 
				
			||||||
 | 
					        this.$refs.picker.setValues(values);
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  render() {
 | 
				
			||||||
 | 
					    const props = {};
 | 
				
			||||||
 | 
					    Object.keys(pickerProps).forEach(key => {
 | 
				
			||||||
 | 
					      props[key] = this[key];
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					      <Picker
 | 
				
			||||||
 | 
					        class={bem()}
 | 
				
			||||||
 | 
					        ref="picker"
 | 
				
			||||||
 | 
					        columns={this.columns}
 | 
				
			||||||
 | 
					        onChange={this.onChange}
 | 
				
			||||||
 | 
					        onConfirm={this.onConfirm}
 | 
				
			||||||
 | 
					        onCancel={() => {
 | 
				
			||||||
 | 
					          this.$emit('cancel');
 | 
				
			||||||
 | 
					        }}
 | 
				
			||||||
 | 
					        {...{ props }}
 | 
				
			||||||
 | 
					      />
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -1,333 +1,25 @@
 | 
				
			|||||||
import { createNamespace } from '../utils';
 | 
					import { createNamespace } from '../utils';
 | 
				
			||||||
import { range } from '../utils/format/number';
 | 
					import TimePicker from './TimePicker';
 | 
				
			||||||
import { isDate } from '../utils/validate/date';
 | 
					import DatePicker from './DatePicker';
 | 
				
			||||||
import { padZero } from '../utils/format/string';
 | 
					 | 
				
			||||||
import Picker from '../picker';
 | 
					 | 
				
			||||||
import { pickerProps } from '../picker/shared';
 | 
					 | 
				
			||||||
import { times, getTrueValue, getMonthEndDay } from './utils';
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
const [createComponent, bem] = createNamespace('datetime-picker');
 | 
					const [createComponent, bem] = createNamespace('datetime-picker');
 | 
				
			||||||
const currentYear = new Date().getFullYear();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default createComponent({
 | 
					export default createComponent({
 | 
				
			||||||
  props: {
 | 
					  props: {
 | 
				
			||||||
    ...pickerProps,
 | 
					    ...TimePicker.props,
 | 
				
			||||||
    value: null,
 | 
					    ...DatePicker.props
 | 
				
			||||||
    filter: Function,
 | 
					 | 
				
			||||||
    minHour: {
 | 
					 | 
				
			||||||
      type: Number,
 | 
					 | 
				
			||||||
      default: 0
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    minMinute: {
 | 
					 | 
				
			||||||
      type: Number,
 | 
					 | 
				
			||||||
      default: 0
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    type: {
 | 
					 | 
				
			||||||
      type: String,
 | 
					 | 
				
			||||||
      default: 'datetime'
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    showToolbar: {
 | 
					 | 
				
			||||||
      type: Boolean,
 | 
					 | 
				
			||||||
      default: true
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    formatter: {
 | 
					 | 
				
			||||||
      type: Function,
 | 
					 | 
				
			||||||
      default: (type, value) => value
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    minDate: {
 | 
					 | 
				
			||||||
      type: Date,
 | 
					 | 
				
			||||||
      default: () => new Date(currentYear - 10, 0, 1),
 | 
					 | 
				
			||||||
      validator: isDate
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    maxDate: {
 | 
					 | 
				
			||||||
      type: Date,
 | 
					 | 
				
			||||||
      default: () => new Date(currentYear + 10, 11, 31),
 | 
					 | 
				
			||||||
      validator: isDate
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    maxHour: {
 | 
					 | 
				
			||||||
      type: Number,
 | 
					 | 
				
			||||||
      default: 23
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
    maxMinute: {
 | 
					 | 
				
			||||||
      type: Number,
 | 
					 | 
				
			||||||
      default: 59
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  data() {
 | 
					 | 
				
			||||||
    return {
 | 
					 | 
				
			||||||
      innerValue: this.correctValue(this.value)
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  watch: {
 | 
					 | 
				
			||||||
    value(val) {
 | 
					 | 
				
			||||||
      val = this.correctValue(val);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const isEqual =
 | 
					 | 
				
			||||||
        this.type === 'time'
 | 
					 | 
				
			||||||
          ? val === this.innerValue
 | 
					 | 
				
			||||||
          : val.valueOf() === this.innerValue.valueOf();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (!isEqual) {
 | 
					 | 
				
			||||||
        this.innerValue = val;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.type === 'time') {
 | 
					 | 
				
			||||||
          this.updateColumnValue(val);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    innerValue(val) {
 | 
					 | 
				
			||||||
      this.$emit('input', val);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    columns() {
 | 
					 | 
				
			||||||
      this.updateColumnValue(this.innerValue);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  computed: {
 | 
					 | 
				
			||||||
    ranges() {
 | 
					 | 
				
			||||||
      if (this.type === 'time') {
 | 
					 | 
				
			||||||
        return [
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            type: 'hour',
 | 
					 | 
				
			||||||
            range: [this.minHour, this.maxHour]
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
          {
 | 
					 | 
				
			||||||
            type: 'minute',
 | 
					 | 
				
			||||||
            range: [this.minMinute, this.maxMinute]
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const { maxYear, maxDate, maxMonth, maxHour, maxMinute } = this.getBoundary(
 | 
					 | 
				
			||||||
        'max',
 | 
					 | 
				
			||||||
        this.innerValue
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const { minYear, minDate, minMonth, minHour, minMinute } = this.getBoundary(
 | 
					 | 
				
			||||||
        'min',
 | 
					 | 
				
			||||||
        this.innerValue
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      const result = [
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          type: 'year',
 | 
					 | 
				
			||||||
          range: [minYear, maxYear]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          type: 'month',
 | 
					 | 
				
			||||||
          range: [minMonth, maxMonth]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          type: 'day',
 | 
					 | 
				
			||||||
          range: [minDate, maxDate]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          type: 'hour',
 | 
					 | 
				
			||||||
          range: [minHour, maxHour]
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
          type: 'minute',
 | 
					 | 
				
			||||||
          range: [minMinute, maxMinute]
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (this.type === 'date') result.splice(3, 2);
 | 
					 | 
				
			||||||
      if (this.type === 'year-month') result.splice(2, 3);
 | 
					 | 
				
			||||||
      return result;
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    originColumns() {
 | 
					 | 
				
			||||||
      return this.ranges.map(({ type, range: rangeArr }) => {
 | 
					 | 
				
			||||||
        let values = times(rangeArr[1] - rangeArr[0] + 1, index => {
 | 
					 | 
				
			||||||
          const value = padZero(rangeArr[0] + index);
 | 
					 | 
				
			||||||
          return value;
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.filter) {
 | 
					 | 
				
			||||||
          values = this.filter(type, values);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return {
 | 
					 | 
				
			||||||
          type,
 | 
					 | 
				
			||||||
          values
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    columns() {
 | 
					 | 
				
			||||||
      return this.originColumns.map(column => ({
 | 
					 | 
				
			||||||
        values: column.values.map(value => this.formatter(column.type, value))
 | 
					 | 
				
			||||||
      }));
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  mounted() {
 | 
					 | 
				
			||||||
    this.updateColumnValue(this.innerValue);
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  methods: {
 | 
					 | 
				
			||||||
    correctValue(value) {
 | 
					 | 
				
			||||||
      // validate value
 | 
					 | 
				
			||||||
      const isDateType = this.type !== 'time';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (isDateType && !isDate(value)) {
 | 
					 | 
				
			||||||
        value = this.minDate;
 | 
					 | 
				
			||||||
      } else if (!value) {
 | 
					 | 
				
			||||||
        value = `${padZero(this.minHour)}:00`;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // time type
 | 
					 | 
				
			||||||
      if (!isDateType) {
 | 
					 | 
				
			||||||
        let [hour, minute] = value.split(':');
 | 
					 | 
				
			||||||
        hour = padZero(range(hour, this.minHour, this.maxHour));
 | 
					 | 
				
			||||||
        minute = padZero(range(minute, this.minMinute, this.maxMinute));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return `${hour}:${minute}`;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // date type
 | 
					 | 
				
			||||||
      value = Math.max(value, this.minDate.getTime());
 | 
					 | 
				
			||||||
      value = Math.min(value, this.maxDate.getTime());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      return new Date(value);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    getBoundary(type, value) {
 | 
					 | 
				
			||||||
      const boundary = this[`${type}Date`];
 | 
					 | 
				
			||||||
      const year = boundary.getFullYear();
 | 
					 | 
				
			||||||
      let month = 1;
 | 
					 | 
				
			||||||
      let date = 1;
 | 
					 | 
				
			||||||
      let hour = 0;
 | 
					 | 
				
			||||||
      let minute = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (type === 'max') {
 | 
					 | 
				
			||||||
        month = 12;
 | 
					 | 
				
			||||||
        date = getMonthEndDay(value.getFullYear(), value.getMonth() + 1);
 | 
					 | 
				
			||||||
        hour = 23;
 | 
					 | 
				
			||||||
        minute = 59;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (value.getFullYear() === year) {
 | 
					 | 
				
			||||||
        month = boundary.getMonth() + 1;
 | 
					 | 
				
			||||||
        if (value.getMonth() + 1 === month) {
 | 
					 | 
				
			||||||
          date = boundary.getDate();
 | 
					 | 
				
			||||||
          if (value.getDate() === date) {
 | 
					 | 
				
			||||||
            hour = boundary.getHours();
 | 
					 | 
				
			||||||
            if (value.getHours() === hour) {
 | 
					 | 
				
			||||||
              minute = boundary.getMinutes();
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      return {
 | 
					 | 
				
			||||||
        [`${type}Year`]: year,
 | 
					 | 
				
			||||||
        [`${type}Month`]: month,
 | 
					 | 
				
			||||||
        [`${type}Date`]: date,
 | 
					 | 
				
			||||||
        [`${type}Hour`]: hour,
 | 
					 | 
				
			||||||
        [`${type}Minute`]: minute
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    onConfirm() {
 | 
					 | 
				
			||||||
      this.$emit('confirm', this.innerValue);
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    onChange(picker) {
 | 
					 | 
				
			||||||
      let value;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (this.type === 'time') {
 | 
					 | 
				
			||||||
        const indexes = picker.getIndexes();
 | 
					 | 
				
			||||||
        const hour = this.originColumns[0].values[indexes[0]];
 | 
					 | 
				
			||||||
        const minute = this.originColumns[1].values[indexes[1]];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        value = `${hour}:${minute}`;
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        const values = picker.getValues();
 | 
					 | 
				
			||||||
        const year = getTrueValue(values[0]);
 | 
					 | 
				
			||||||
        const month = getTrueValue(values[1]);
 | 
					 | 
				
			||||||
        const maxDate = getMonthEndDay(year, month);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let date = getTrueValue(values[2]);
 | 
					 | 
				
			||||||
        if (this.type === 'year-month') {
 | 
					 | 
				
			||||||
          date = 1;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        date = date > maxDate ? maxDate : date;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        let hour = 0;
 | 
					 | 
				
			||||||
        let minute = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.type === 'datetime') {
 | 
					 | 
				
			||||||
          hour = getTrueValue(values[3]);
 | 
					 | 
				
			||||||
          minute = getTrueValue(values[4]);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        value = new Date(year, month - 1, date, hour, minute);
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      this.innerValue = this.correctValue(value);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      this.$nextTick(() => {
 | 
					 | 
				
			||||||
        this.$nextTick(() => {
 | 
					 | 
				
			||||||
          this.$emit('change', picker);
 | 
					 | 
				
			||||||
        });
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    updateColumnValue(value) {
 | 
					 | 
				
			||||||
      let values = [];
 | 
					 | 
				
			||||||
      const { formatter } = this;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (this.type === 'time') {
 | 
					 | 
				
			||||||
        const pair = value.split(':');
 | 
					 | 
				
			||||||
        values = [formatter('hour', pair[0]), formatter('minute', pair[1])];
 | 
					 | 
				
			||||||
      } else {
 | 
					 | 
				
			||||||
        values = [
 | 
					 | 
				
			||||||
          formatter('year', `${value.getFullYear()}`),
 | 
					 | 
				
			||||||
          formatter('month', padZero(value.getMonth() + 1)),
 | 
					 | 
				
			||||||
          formatter('day', padZero(value.getDate()))
 | 
					 | 
				
			||||||
        ];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.type === 'datetime') {
 | 
					 | 
				
			||||||
          values.push(
 | 
					 | 
				
			||||||
            formatter('hour', padZero(value.getHours())),
 | 
					 | 
				
			||||||
            formatter('minute', padZero(value.getMinutes()))
 | 
					 | 
				
			||||||
          );
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (this.type === 'year-month') {
 | 
					 | 
				
			||||||
          values = values.slice(0, 2);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      this.$nextTick(() => {
 | 
					 | 
				
			||||||
        this.$refs.picker.setValues(values);
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  render() {
 | 
					  render() {
 | 
				
			||||||
    const props = {};
 | 
					    const Component = this.type === 'time' ? TimePicker : DatePicker;
 | 
				
			||||||
    Object.keys(pickerProps).forEach(key => {
 | 
					 | 
				
			||||||
      props[key] = this[key];
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return (
 | 
					    return (
 | 
				
			||||||
      <Picker
 | 
					      <Component
 | 
				
			||||||
        class={bem()}
 | 
					        class={bem()}
 | 
				
			||||||
        ref="picker"
 | 
					        {...{
 | 
				
			||||||
        columns={this.columns}
 | 
					          props: this.$props,
 | 
				
			||||||
        onChange={this.onChange}
 | 
					          listeners: this.$listeners
 | 
				
			||||||
        onConfirm={this.onConfirm}
 | 
					 | 
				
			||||||
        onCancel={() => {
 | 
					 | 
				
			||||||
          this.$emit('cancel');
 | 
					 | 
				
			||||||
        }}
 | 
					        }}
 | 
				
			||||||
        {...{ props }}
 | 
					 | 
				
			||||||
      />
 | 
					      />
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										71
									
								
								src/datetime-picker/shared.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/datetime-picker/shared.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,71 @@
 | 
				
			|||||||
 | 
					import { times } from './utils';
 | 
				
			||||||
 | 
					import { padZero } from '../utils/format/string';
 | 
				
			||||||
 | 
					import { pickerProps } from '../picker/shared';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const sharedProps = {
 | 
				
			||||||
 | 
					  ...pickerProps,
 | 
				
			||||||
 | 
					  value: null,
 | 
				
			||||||
 | 
					  filter: Function,
 | 
				
			||||||
 | 
					  showToolbar: {
 | 
				
			||||||
 | 
					    type: Boolean,
 | 
				
			||||||
 | 
					    default: true
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  formatter: {
 | 
				
			||||||
 | 
					    type: Function,
 | 
				
			||||||
 | 
					    default: (type, value) => value
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const TimePickerMixin = {
 | 
				
			||||||
 | 
					  data() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      innerValue: this.formatValue(this.value)
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  computed: {
 | 
				
			||||||
 | 
					    originColumns() {
 | 
				
			||||||
 | 
					      return this.ranges.map(({ type, range: rangeArr }) => {
 | 
				
			||||||
 | 
					        let values = times(rangeArr[1] - rangeArr[0] + 1, index => {
 | 
				
			||||||
 | 
					          const value = padZero(rangeArr[0] + index);
 | 
				
			||||||
 | 
					          return value;
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (this.filter) {
 | 
				
			||||||
 | 
					          values = this.filter(type, values);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return {
 | 
				
			||||||
 | 
					          type,
 | 
				
			||||||
 | 
					          values
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    columns() {
 | 
				
			||||||
 | 
					      return this.originColumns.map(column => ({
 | 
				
			||||||
 | 
					        values: column.values.map(value => this.formatter(column.type, value))
 | 
				
			||||||
 | 
					      }));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  watch: {
 | 
				
			||||||
 | 
					    innerValue(val) {
 | 
				
			||||||
 | 
					      this.$emit('input', val);
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    columns() {
 | 
				
			||||||
 | 
					      this.updateColumnValue(this.innerValue);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  mounted() {
 | 
				
			||||||
 | 
					    this.updateColumnValue(this.innerValue);
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  methods: {
 | 
				
			||||||
 | 
					    onConfirm() {
 | 
				
			||||||
 | 
					      this.$emit('confirm', this.innerValue);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										125
									
								
								src/datetime-picker/test/__snapshots__/date-picker.spec.js.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/datetime-picker/test/__snapshots__/date-picker.spec.js.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,125 @@
 | 
				
			|||||||
 | 
					// Jest Snapshot v1, https://goo.gl/fbAQLP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`filter prop 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-date-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">2010</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">2020</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">05</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">05</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">25</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">35</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">40</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">45</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">50</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">55</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`formatter prop 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-date-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">2010 year</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">2020 year</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">05 month</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 month</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">05 day</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 day</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15 day</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20 day</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">25 day</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30 day</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20 hour</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">25 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">35 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">40 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">45 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">50 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">55 minute</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
@ -3,7 +3,7 @@
 | 
				
			|||||||
exports[`renders demo correctly 1`] = `
 | 
					exports[`renders demo correctly 1`] = `
 | 
				
			||||||
<div>
 | 
					<div>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <div class="van-picker van-datetime-picker">
 | 
					    <div class="van-picker van-date-picker van-datetime-picker">
 | 
				
			||||||
      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
					      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
@ -166,7 +166,7 @@ exports[`renders demo correctly 1`] = `
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <div class="van-picker van-datetime-picker">
 | 
					    <div class="van-picker van-date-picker van-datetime-picker">
 | 
				
			||||||
      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
					      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
@ -247,7 +247,7 @@ exports[`renders demo correctly 1`] = `
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <div class="van-picker van-datetime-picker">
 | 
					    <div class="van-picker van-date-picker van-datetime-picker">
 | 
				
			||||||
      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
					      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
@ -293,7 +293,7 @@ exports[`renders demo correctly 1`] = `
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <div class="van-picker van-datetime-picker">
 | 
					    <div class="van-picker van-time-picker van-datetime-picker">
 | 
				
			||||||
      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
					      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
@ -386,7 +386,7 @@ exports[`renders demo correctly 1`] = `
 | 
				
			|||||||
    </div>
 | 
					    </div>
 | 
				
			||||||
  </div>
 | 
					  </div>
 | 
				
			||||||
  <div>
 | 
					  <div>
 | 
				
			||||||
    <div class="van-picker van-datetime-picker">
 | 
					    <div class="van-picker van-time-picker van-datetime-picker">
 | 
				
			||||||
      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
					      <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
					        <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										125
									
								
								src/datetime-picker/test/__snapshots__/time-picker.spec.js.snap
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										125
									
								
								src/datetime-picker/test/__snapshots__/time-picker.spec.js.snap
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,125 @@
 | 
				
			|||||||
 | 
					// Jest Snapshot v1, https://goo.gl/fbAQLP
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`filter prop 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-time-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">40</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">50</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`format initial value 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-time-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">22</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">23</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">58</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">59</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`formatter prop 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-time-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">05 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">15 hour</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20 hour</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">10 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">20 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">30 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">40 minute</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">50 minute</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exports[`max-hour & max-minute 1`] = `
 | 
				
			||||||
 | 
					<div class="van-picker van-time-picker">
 | 
				
			||||||
 | 
					  <div class="van-hairline--top-bottom van-picker__toolbar">
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__cancel">取消</div>
 | 
				
			||||||
 | 
					    <div role="button" tabindex="0" class="van-picker__confirm">确认</div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					  <div class="van-picker__columns" style="height: 220px;">
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker-column">
 | 
				
			||||||
 | 
					      <ul class="van-picker-column__wrapper" style="transform: translate3d(0, 88px, 0); transition-duration: 0ms; transition-property: none; line-height: 44px;">
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item van-picker-column__item--selected" style="height: 44px;">00</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">01</li>
 | 
				
			||||||
 | 
					        <li class="van-ellipsis van-picker-column__item" style="height: 44px;">02</li>
 | 
				
			||||||
 | 
					      </ul>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					    <div class="van-picker__mask" style="background-size: 100% 88px;"></div>
 | 
				
			||||||
 | 
					    <div class="van-hairline--top-bottom van-picker__frame" style="height: 44px;"></div>
 | 
				
			||||||
 | 
					  </div>
 | 
				
			||||||
 | 
					  <!---->
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					`;
 | 
				
			||||||
							
								
								
									
										112
									
								
								src/datetime-picker/test/date-picker.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/datetime-picker/test/date-picker.spec.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,112 @@
 | 
				
			|||||||
 | 
					import DatePicker from '../DatePicker';
 | 
				
			||||||
 | 
					import { mount, later, triggerDrag } from '../../../test/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function filter(type, options) {
 | 
				
			||||||
 | 
					  const mod = type === 'year' ? 10 : 5;
 | 
				
			||||||
 | 
					  return options.filter(option => option % mod === 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function formatter(type, value) {
 | 
				
			||||||
 | 
					  return `${value} ${type}`;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('filter prop', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      filter,
 | 
				
			||||||
 | 
					      value: new Date(2019, 10, 1, 0, 0)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('formatter prop', async () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      filter,
 | 
				
			||||||
 | 
					      formatter,
 | 
				
			||||||
 | 
					      value: new Date(2019, 10, 1, 0, 0)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
				
			||||||
 | 
					  await later();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('change')[0][0].getValues()).toEqual([
 | 
				
			||||||
 | 
					    '2020 year',
 | 
				
			||||||
 | 
					    '05 month',
 | 
				
			||||||
 | 
					    '05 day',
 | 
				
			||||||
 | 
					    '00 hour',
 | 
				
			||||||
 | 
					    '00 minute'
 | 
				
			||||||
 | 
					  ]);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('confirm event', () => {
 | 
				
			||||||
 | 
					  const date = new Date(2019, 10, 1, 0, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: date
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0].getFullYear()).toEqual(2019);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[1][0].getFullYear()).toEqual(2029);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('cancel event', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__cancel').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('cancel')).toBeTruthy();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('max-date prop', () => {
 | 
				
			||||||
 | 
					  const maxDate = new Date(2010, 5, 0, 0, 0);
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: new Date(2020, 10, 30, 30, 30),
 | 
				
			||||||
 | 
					      maxDate
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0]).toEqual(maxDate);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('min-date prop', () => {
 | 
				
			||||||
 | 
					  const minDate = new Date(2030, 0, 0, 0, 0);
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: new Date(2020, 0, 0, 0, 0),
 | 
				
			||||||
 | 
					      minDate
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0]).toEqual(minDate);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('dynamic set value', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(DatePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: new Date(2019, 1, 1)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.setProps({ value: new Date(2019, 1, 1) });
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  wrapper.setProps({ value: new Date(2025, 1, 1) });
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0].getFullYear()).toEqual(2019);
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[1][0].getFullYear()).toEqual(2025);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
							
								
								
									
										94
									
								
								src/datetime-picker/test/time-picker.spec.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								src/datetime-picker/test/time-picker.spec.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,94 @@
 | 
				
			|||||||
 | 
					import TimePicker from '../TimePicker';
 | 
				
			||||||
 | 
					import { mount, later, triggerDrag } from '../../../test/utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function filter(type, options) {
 | 
				
			||||||
 | 
					  const mod = type === 'minute' ? 10 : 5;
 | 
				
			||||||
 | 
					  return options.filter(option => option % mod === 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function formatter(type, value) {
 | 
				
			||||||
 | 
					  return `${value} ${type}`;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('format initial value', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      minHour: 22,
 | 
				
			||||||
 | 
					      minMinute: 58
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('max-hour & max-minute', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: '23:59',
 | 
				
			||||||
 | 
					      maxHour: 2,
 | 
				
			||||||
 | 
					      maxMinute: 2
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('filter prop', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      filter,
 | 
				
			||||||
 | 
					      value: '12:00'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('formatter prop', async () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      filter,
 | 
				
			||||||
 | 
					      formatter,
 | 
				
			||||||
 | 
					      value: '12:00'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper).toMatchSnapshot();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
				
			||||||
 | 
					  await later();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('change')[0][0].getValues()).toEqual(['20 hour', '00 minute']);
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('confirm event', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker, {
 | 
				
			||||||
 | 
					    propsData: {
 | 
				
			||||||
 | 
					      value: '12:00'
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0]).toEqual('23:00');
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('cancel event', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__cancel').trigger('click');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('cancel')).toBeTruthy();
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					test('dynamic set value', () => {
 | 
				
			||||||
 | 
					  const wrapper = mount(TimePicker);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  wrapper.setProps({ value: '00:00' });
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					  wrapper.setProps({ value: '22:30' });
 | 
				
			||||||
 | 
					  wrapper.find('.van-picker__confirm').trigger('click');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[0][0]).toEqual('00:00');
 | 
				
			||||||
 | 
					  expect(wrapper.emitted('confirm')[1][0]).toEqual('22:30');
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
@ -80,12 +80,13 @@ test('set picker values', () => {
 | 
				
			|||||||
  expect(vm.getColumnValue(2)).toEqual(undefined);
 | 
					  expect(vm.getColumnValue(2)).toEqual(undefined);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test('drag columns', async () => {
 | 
					test('drag columns', () => {
 | 
				
			||||||
  const wrapper = mount(Picker, {
 | 
					  const wrapper = mount(Picker, {
 | 
				
			||||||
    propsData: {
 | 
					    propsData: {
 | 
				
			||||||
      columns
 | 
					      columns
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
					  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -94,12 +95,13 @@ test('drag columns', async () => {
 | 
				
			|||||||
  expect(wrapper.emitted('change')[0][1]).toEqual(['normal', '1990']);
 | 
					  expect(wrapper.emitted('change')[0][1]).toEqual(['normal', '1990']);
 | 
				
			||||||
});
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
test('drag simple columns', async () => {
 | 
					test('drag simple columns', () => {
 | 
				
			||||||
  const wrapper = mount(Picker, {
 | 
					  const wrapper = mount(Picker, {
 | 
				
			||||||
    propsData: {
 | 
					    propsData: {
 | 
				
			||||||
      columns: simpleColumn
 | 
					      columns: simpleColumn
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
					  triggerDrag(wrapper.find('.van-picker-column'), 0, -100);
 | 
				
			||||||
  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
					  wrapper.find('.van-picker-column ul').trigger('transitionend');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user