You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							379 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							379 lines
						
					
					
						
							13 KiB
						
					
					
				| "use strict"; | |
| var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { | |
|     if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { | |
|         if (ar || !(i in from)) { | |
|             if (!ar) ar = Array.prototype.slice.call(from, 0, i); | |
|             ar[i] = from[i]; | |
|         } | |
|     } | |
|     return to.concat(ar || Array.prototype.slice.call(from)); | |
| }; | |
| var __importDefault = (this && this.__importDefault) || function (mod) { | |
|     return (mod && mod.__esModule) ? mod : { "default": mod }; | |
| }; | |
| Object.defineProperty(exports, "__esModule", { value: true }); | |
| var component_1 = require("../common/component"); | |
| var utils_1 = require("./utils"); | |
| var toast_1 = __importDefault(require("../toast/toast")); | |
| var utils_2 = require("../common/utils"); | |
| var initialMinDate = (0, utils_1.getToday)().getTime(); | |
| var initialMaxDate = (function () { | |
|     var now = (0, utils_1.getToday)(); | |
|     return new Date(now.getFullYear(), now.getMonth() + 6, now.getDate()).getTime(); | |
| })(); | |
| var getTime = function (date) { | |
|     return date instanceof Date ? date.getTime() : date; | |
| }; | |
| (0, component_1.VantComponent)({ | |
|     props: { | |
|         title: { | |
|             type: String, | |
|             value: '日期选择', | |
|         }, | |
|         color: String, | |
|         show: { | |
|             type: Boolean, | |
|             observer: function (val) { | |
|                 if (val) { | |
|                     this.initRect(); | |
|                     this.scrollIntoView(); | |
|                 } | |
|             }, | |
|         }, | |
|         formatter: null, | |
|         confirmText: { | |
|             type: String, | |
|             value: '确定', | |
|         }, | |
|         confirmDisabledText: { | |
|             type: String, | |
|             value: '确定', | |
|         }, | |
|         rangePrompt: String, | |
|         showRangePrompt: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         defaultDate: { | |
|             type: null, | |
|             value: (0, utils_1.getToday)().getTime(), | |
|             observer: function (val) { | |
|                 this.setData({ currentDate: val }); | |
|                 this.scrollIntoView(); | |
|             }, | |
|         }, | |
|         allowSameDay: Boolean, | |
|         type: { | |
|             type: String, | |
|             value: 'single', | |
|             observer: 'reset', | |
|         }, | |
|         minDate: { | |
|             type: Number, | |
|             value: initialMinDate, | |
|         }, | |
|         maxDate: { | |
|             type: Number, | |
|             value: initialMaxDate, | |
|         }, | |
|         position: { | |
|             type: String, | |
|             value: 'bottom', | |
|         }, | |
|         rowHeight: { | |
|             type: null, | |
|             value: utils_1.ROW_HEIGHT, | |
|         }, | |
|         round: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         poppable: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         showMark: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         showTitle: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         showConfirm: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         showSubtitle: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         safeAreaInsetBottom: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         closeOnClickOverlay: { | |
|             type: Boolean, | |
|             value: true, | |
|         }, | |
|         maxRange: { | |
|             type: null, | |
|             value: null, | |
|         }, | |
|         minRange: { | |
|             type: Number, | |
|             value: 1, | |
|         }, | |
|         firstDayOfWeek: { | |
|             type: Number, | |
|             value: 0, | |
|         }, | |
|         readonly: Boolean, | |
|     }, | |
|     data: { | |
|         subtitle: '', | |
|         currentDate: null, | |
|         scrollIntoView: '', | |
|     }, | |
|     watch: { | |
|         minDate: function () { | |
|             this.initRect(); | |
|         }, | |
|         maxDate: function () { | |
|             this.initRect(); | |
|         }, | |
|     }, | |
|     created: function () { | |
|         this.setData({ | |
|             currentDate: this.getInitialDate(this.data.defaultDate), | |
|         }); | |
|     }, | |
|     mounted: function () { | |
|         if (this.data.show || !this.data.poppable) { | |
|             this.initRect(); | |
|             this.scrollIntoView(); | |
|         } | |
|     }, | |
|     methods: { | |
|         reset: function () { | |
|             this.setData({ currentDate: this.getInitialDate(this.data.defaultDate) }); | |
|             this.scrollIntoView(); | |
|         }, | |
|         initRect: function () { | |
|             var _this = this; | |
|             if (this.contentObserver != null) { | |
|                 this.contentObserver.disconnect(); | |
|             } | |
|             var contentObserver = this.createIntersectionObserver({ | |
|                 thresholds: [0, 0.1, 0.9, 1], | |
|                 observeAll: true, | |
|             }); | |
|             this.contentObserver = contentObserver; | |
|             contentObserver.relativeTo('.van-calendar__body'); | |
|             contentObserver.observe('.month', function (res) { | |
|                 if (res.boundingClientRect.top <= res.relativeRect.top) { | |
|                     // @ts-ignore | |
|                     _this.setData({ subtitle: (0, utils_1.formatMonthTitle)(res.dataset.date) }); | |
|                 } | |
|             }); | |
|         }, | |
|         limitDateRange: function (date, minDate, maxDate) { | |
|             if (minDate === void 0) { minDate = null; } | |
|             if (maxDate === void 0) { maxDate = null; } | |
|             minDate = minDate || this.data.minDate; | |
|             maxDate = maxDate || this.data.maxDate; | |
|             if ((0, utils_1.compareDay)(date, minDate) === -1) { | |
|                 return minDate; | |
|             } | |
|             if ((0, utils_1.compareDay)(date, maxDate) === 1) { | |
|                 return maxDate; | |
|             } | |
|             return date; | |
|         }, | |
|         getInitialDate: function (defaultDate) { | |
|             var _this = this; | |
|             if (defaultDate === void 0) { defaultDate = null; } | |
|             var _a = this.data, type = _a.type, minDate = _a.minDate, maxDate = _a.maxDate, allowSameDay = _a.allowSameDay; | |
|             if (!defaultDate) | |
|                 return []; | |
|             var now = (0, utils_1.getToday)().getTime(); | |
|             if (type === 'range') { | |
|                 if (!Array.isArray(defaultDate)) { | |
|                     defaultDate = []; | |
|                 } | |
|                 var _b = defaultDate || [], startDay = _b[0], endDay = _b[1]; | |
|                 var startDate = getTime(startDay || now); | |
|                 var start = this.limitDateRange(startDate, minDate, allowSameDay ? startDate : (0, utils_1.getPrevDay)(new Date(maxDate)).getTime()); | |
|                 var date = getTime(endDay || now); | |
|                 var end = this.limitDateRange(date, allowSameDay ? date : (0, utils_1.getNextDay)(new Date(minDate)).getTime()); | |
|                 return [start, end]; | |
|             } | |
|             if (type === 'multiple') { | |
|                 if (Array.isArray(defaultDate)) { | |
|                     return defaultDate.map(function (date) { return _this.limitDateRange(date); }); | |
|                 } | |
|                 return [this.limitDateRange(now)]; | |
|             } | |
|             if (!defaultDate || Array.isArray(defaultDate)) { | |
|                 defaultDate = now; | |
|             } | |
|             return this.limitDateRange(defaultDate); | |
|         }, | |
|         scrollIntoView: function () { | |
|             var _this = this; | |
|             (0, utils_2.requestAnimationFrame)(function () { | |
|                 var _a = _this.data, currentDate = _a.currentDate, type = _a.type, show = _a.show, poppable = _a.poppable, minDate = _a.minDate, maxDate = _a.maxDate; | |
|                 if (!currentDate) | |
|                     return; | |
|                 // @ts-ignore | |
|                 var targetDate = type === 'single' ? currentDate : currentDate[0]; | |
|                 var displayed = show || !poppable; | |
|                 if (!targetDate || !displayed) { | |
|                     return; | |
|                 } | |
|                 var months = (0, utils_1.getMonths)(minDate, maxDate); | |
|                 months.some(function (month, index) { | |
|                     if ((0, utils_1.compareMonth)(month, targetDate) === 0) { | |
|                         _this.setData({ scrollIntoView: "month".concat(index) }); | |
|                         return true; | |
|                     } | |
|                     return false; | |
|                 }); | |
|             }); | |
|         }, | |
|         onOpen: function () { | |
|             this.$emit('open'); | |
|         }, | |
|         onOpened: function () { | |
|             this.$emit('opened'); | |
|         }, | |
|         onClose: function () { | |
|             this.$emit('close'); | |
|         }, | |
|         onClosed: function () { | |
|             this.$emit('closed'); | |
|         }, | |
|         onClickDay: function (event) { | |
|             if (this.data.readonly) { | |
|                 return; | |
|             } | |
|             var date = event.detail.date; | |
|             var _a = this.data, type = _a.type, currentDate = _a.currentDate, allowSameDay = _a.allowSameDay; | |
|             if (type === 'range') { | |
|                 // @ts-ignore | |
|                 var startDay_1 = currentDate[0], endDay = currentDate[1]; | |
|                 if (startDay_1 && !endDay) { | |
|                     var compareToStart = (0, utils_1.compareDay)(date, startDay_1); | |
|                     if (compareToStart === 1) { | |
|                         var days_1 = this.selectComponent('.month').data.days; | |
|                         days_1.some(function (day, index) { | |
|                             var isDisabled = day.type === 'disabled' && | |
|                                 getTime(startDay_1) < getTime(day.date) && | |
|                                 getTime(day.date) < getTime(date); | |
|                             if (isDisabled) { | |
|                                 (date = days_1[index - 1].date); | |
|                             } | |
|                             return isDisabled; | |
|                         }); | |
|                         this.select([startDay_1, date], true); | |
|                     } | |
|                     else if (compareToStart === -1) { | |
|                         this.select([date, null]); | |
|                     } | |
|                     else if (allowSameDay) { | |
|                         this.select([date, date], true); | |
|                     } | |
|                 } | |
|                 else { | |
|                     this.select([date, null]); | |
|                 } | |
|             } | |
|             else if (type === 'multiple') { | |
|                 var selectedIndex_1; | |
|                 // @ts-ignore | |
|                 var selected = currentDate.some(function (dateItem, index) { | |
|                     var equal = (0, utils_1.compareDay)(dateItem, date) === 0; | |
|                     if (equal) { | |
|                         selectedIndex_1 = index; | |
|                     } | |
|                     return equal; | |
|                 }); | |
|                 if (selected) { | |
|                     // @ts-ignore | |
|                     var cancelDate = currentDate.splice(selectedIndex_1, 1); | |
|                     this.setData({ currentDate: currentDate }); | |
|                     this.unselect(cancelDate); | |
|                 } | |
|                 else { | |
|                     // @ts-ignore | |
|                     this.select(__spreadArray(__spreadArray([], currentDate, true), [date], false)); | |
|                 } | |
|             } | |
|             else { | |
|                 this.select(date, true); | |
|             } | |
|         }, | |
|         unselect: function (dateArray) { | |
|             var date = dateArray[0]; | |
|             if (date) { | |
|                 this.$emit('unselect', (0, utils_1.copyDates)(date)); | |
|             } | |
|         }, | |
|         select: function (date, complete) { | |
|             if (complete && this.data.type === 'range') { | |
|                 var valid = this.checkRange(date); | |
|                 if (!valid) { | |
|                     // auto selected to max range if showConfirm | |
|                     if (this.data.showConfirm) { | |
|                         this.emit([ | |
|                             date[0], | |
|                             (0, utils_1.getDayByOffset)(date[0], this.data.maxRange - 1), | |
|                         ]); | |
|                     } | |
|                     else { | |
|                         this.emit(date); | |
|                     } | |
|                     return; | |
|                 } | |
|             } | |
|             this.emit(date); | |
|             if (complete && !this.data.showConfirm) { | |
|                 this.onConfirm(); | |
|             } | |
|         }, | |
|         emit: function (date) { | |
|             this.setData({ | |
|                 currentDate: Array.isArray(date) ? date.map(getTime) : getTime(date), | |
|             }); | |
|             this.$emit('select', (0, utils_1.copyDates)(date)); | |
|         }, | |
|         checkRange: function (date) { | |
|             var _a = this.data, maxRange = _a.maxRange, rangePrompt = _a.rangePrompt, showRangePrompt = _a.showRangePrompt; | |
|             if (maxRange && (0, utils_1.calcDateNum)(date) > maxRange) { | |
|                 if (showRangePrompt) { | |
|                     (0, toast_1.default)({ | |
|                         context: this, | |
|                         message: rangePrompt || "\u9009\u62E9\u5929\u6570\u4E0D\u80FD\u8D85\u8FC7 ".concat(maxRange, " \u5929"), | |
|                     }); | |
|                 } | |
|                 this.$emit('over-range'); | |
|                 return false; | |
|             } | |
|             return true; | |
|         }, | |
|         onConfirm: function () { | |
|             var _this = this; | |
|             if (this.data.type === 'range' && | |
|                 !this.checkRange(this.data.currentDate)) { | |
|                 return; | |
|             } | |
|             wx.nextTick(function () { | |
|                 // @ts-ignore | |
|                 _this.$emit('confirm', (0, utils_1.copyDates)(_this.data.currentDate)); | |
|             }); | |
|         }, | |
|         onClickSubtitle: function (event) { | |
|             this.$emit('click-subtitle', event); | |
|         }, | |
|     }, | |
| });
 | |
| 
 |