| var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { | 
|     var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; | 
|     if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); | 
|     else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; | 
|     return c > 3 && r && Object.defineProperty(target, key, r), r; | 
| }; | 
| var _a, _b; | 
| import dayjs from 'dayjs'; | 
| import localeData from 'dayjs/plugin/localeData'; | 
| import config from '../common/config'; | 
| import { SuperComponent, wxComponent } from '../common/src/index'; | 
| import props from './props'; | 
| import dayjsLocaleMap from './locale/dayjs'; | 
| dayjs.extend(localeData); | 
| dayjs.locale('zh-cn'); | 
| const defaultLocale = ((_a = dayjsLocaleMap[dayjs.locale()]) === null || _a === void 0 ? void 0 : _a.key) || ((_b = dayjsLocaleMap.default) === null || _b === void 0 ? void 0 : _b.key); | 
| const { prefix } = config; | 
| const name = `${prefix}-date-time-picker`; | 
| var ModeItem; | 
| (function (ModeItem) { | 
|     ModeItem["YEAR"] = "year"; | 
|     ModeItem["MONTH"] = "month"; | 
|     ModeItem["DATE"] = "date"; | 
|     ModeItem["HOUR"] = "hour"; | 
|     ModeItem["MINUTE"] = "minute"; | 
|     ModeItem["SECOND"] = "second"; | 
| })(ModeItem || (ModeItem = {})); | 
| const DATE_MODES = ['year', 'month', 'date']; | 
| const TIME_MODES = ['hour', 'minute', 'second']; | 
| const FULL_MODES = [...DATE_MODES, ...TIME_MODES]; | 
| const DEFAULT_MIN_DATE = dayjs('2000-01-01 00:00:00'); | 
| const DEFAULT_MAX_DATE = dayjs('2030-12-31 23:59:59'); | 
| let DateTimePicker = class DateTimePicker extends SuperComponent { | 
|     constructor() { | 
|         super(...arguments); | 
|         this.properties = props; | 
|         this.externalClasses = [`${prefix}-class`, `${prefix}-class-confirm`, `${prefix}-class-cancel`, `${prefix}-class-title`]; | 
|         this.options = { | 
|             multipleSlots: true, | 
|         }; | 
|         this.observers = { | 
|             'start, end, value': function () { | 
|                 this.updateColumns(); | 
|             }, | 
|             customLocale(v) { | 
|                 if (!v || !dayjsLocaleMap[v].key) | 
|                     return; | 
|                 this.setData({ | 
|                     locale: dayjsLocaleMap[v].i18n, | 
|                     dayjsLocale: dayjsLocaleMap[v].key, | 
|                 }); | 
|             }, | 
|             mode(m) { | 
|                 const fullModes = this.getFullModeArray(m); | 
|                 this.setData({ | 
|                     fullModes, | 
|                 }); | 
|                 this.updateColumns(); | 
|             }, | 
|         }; | 
|         this.date = null; | 
|         this.data = { | 
|             prefix, | 
|             classPrefix: name, | 
|             columns: [], | 
|             columnsValue: [], | 
|             fullModes: [], | 
|             locale: dayjsLocaleMap[defaultLocale].i18n, | 
|             dayjsLocale: dayjsLocaleMap[defaultLocale].key, | 
|         }; | 
|         this.controlledProps = [ | 
|             { | 
|                 key: 'value', | 
|                 event: 'change', | 
|             }, | 
|         ]; | 
|         this.methods = { | 
|             updateColumns() { | 
|                 this.date = this.getParseDate(); | 
|                 const { columns, columnsValue } = this.getValueCols(); | 
|                 this.setData({ | 
|                     columns, | 
|                     columnsValue, | 
|                 }); | 
|             }, | 
|             getParseDate() { | 
|                 const { value, defaultValue } = this.properties; | 
|                 const minDate = this.getMinDate(); | 
|                 const isTimeMode = this.isTimeMode(); | 
|                 let currentValue = value || defaultValue; | 
|                 if (isTimeMode) { | 
|                     const dateStr = dayjs(minDate).format('YYYY-MM-DD'); | 
|                     currentValue = dayjs(`${dateStr} ${currentValue}`); | 
|                 } | 
|                 const parseDate = dayjs(currentValue || minDate); | 
|                 const isDateValid = parseDate.isValid(); | 
|                 return isDateValid ? parseDate : minDate; | 
|             }, | 
|             getMinDate() { | 
|                 const { start } = this.properties; | 
|                 return start ? dayjs(start) : DEFAULT_MIN_DATE; | 
|             }, | 
|             getMaxDate() { | 
|                 const { end } = this.properties; | 
|                 return end ? dayjs(end) : DEFAULT_MAX_DATE; | 
|             }, | 
|             getDateRect(type = 'default') { | 
|                 const map = { | 
|                     min: 'getMinDate', | 
|                     max: 'getMaxDate', | 
|                     default: 'getDate', | 
|                 }; | 
|                 const date = this[map[type]](); | 
|                 const keys = ['year', 'month', 'date', 'hour', 'minute', 'second']; | 
|                 return keys.map((k) => { var _a; return (_a = date[k]) === null || _a === void 0 ? void 0 : _a.call(date); }); | 
|             }, | 
|             getDate() { | 
|                 return this.clipDate((this === null || this === void 0 ? void 0 : this.date) || DEFAULT_MIN_DATE); | 
|             }, | 
|             clipDate(date) { | 
|                 const minDate = this.getMinDate(); | 
|                 const maxDate = this.getMaxDate(); | 
|                 return dayjs(Math.min(Math.max(minDate.valueOf(), date.valueOf()), maxDate.valueOf())); | 
|             }, | 
|             setYear(date, year) { | 
|                 const beforeMonthDays = date.date(); | 
|                 const afterMonthDays = date.year(year).daysInMonth(); | 
|                 const tempDate = date.date(Math.min(beforeMonthDays.valueOf(), afterMonthDays.valueOf())); | 
|                 return tempDate.year(year); | 
|             }, | 
|             setMonth(date, month) { | 
|                 const beforeMonthDays = date.date(); | 
|                 const afterMonthDays = date.month(month).daysInMonth(); | 
|                 const tempDate = date.date(Math.min(beforeMonthDays.valueOf(), afterMonthDays.valueOf())); | 
|                 return tempDate.month(month); | 
|             }, | 
|             getColumnOptions() { | 
|                 const { fullModes } = this.data; | 
|                 const columnOptions = []; | 
|                 fullModes === null || fullModes === void 0 ? void 0 : fullModes.forEach((mode) => { | 
|                     const columnOption = this.getOptionByType(mode); | 
|                     columnOptions.push(columnOption); | 
|                 }); | 
|                 return columnOptions; | 
|             }, | 
|             getOptionByType(type) { | 
|                 var _a; | 
|                 const { locale, steps } = this.data; | 
|                 const options = []; | 
|                 const minEdge = this.getOptionEdge('min', type); | 
|                 const maxEdge = this.getOptionEdge('max', type); | 
|                 const step = (_a = steps === null || steps === void 0 ? void 0 : steps[type]) !== null && _a !== void 0 ? _a : 1; | 
|                 const dayjsMonthsShort = dayjs().locale(this.data.dayjsLocale).localeData().monthsShort(); | 
|                 for (let i = minEdge; i <= maxEdge; i += step) { | 
|                     options.push({ | 
|                         value: `${i}`, | 
|                         label: type === 'month' ? dayjsMonthsShort[i] : `${i + locale[type]}`, | 
|                     }); | 
|                 } | 
|                 return options; | 
|             }, | 
|             getYearOptions(dateParams) { | 
|                 const { locale } = this.data; | 
|                 const { minDateYear, maxDateYear } = dateParams; | 
|                 const years = []; | 
|                 for (let i = minDateYear; i <= maxDateYear; i += 1) { | 
|                     years.push({ | 
|                         value: `${i}`, | 
|                         label: `${i + locale.year}`, | 
|                     }); | 
|                 } | 
|                 return years; | 
|             }, | 
|             getOptionEdge(minOrMax, type) { | 
|                 const selDateArray = this.getDateRect(); | 
|                 const compareArray = this.getDateRect(minOrMax); | 
|                 const edge = { | 
|                     month: [0, 11], | 
|                     date: [1, this.getDate().daysInMonth()], | 
|                     hour: [0, 23], | 
|                     minute: [0, 59], | 
|                     second: [0, 59], | 
|                 }; | 
|                 const types = ['year', 'month', 'date', 'hour', 'minute', 'second']; | 
|                 for (let i = 0, size = selDateArray.length; i < size; i += 1) { | 
|                     if (types[i] === type) | 
|                         return compareArray[i]; | 
|                     if (compareArray[i] !== selDateArray[i]) | 
|                         return edge[type][minOrMax === 'min' ? 0 : 1]; | 
|                 } | 
|                 return edge[type][minOrMax === 'min' ? 0 : 1]; | 
|             }, | 
|             getMonthOptions() { | 
|                 const months = []; | 
|                 const minMonth = this.getOptionEdge('min', 'month'); | 
|                 const maxMonth = this.getOptionEdge('max', 'month'); | 
|                 const dayjsMonthsShort = dayjs.monthsShort(); | 
|                 for (let i = minMonth; i <= maxMonth; i += 1) { | 
|                     months.push({ | 
|                         value: `${i}`, | 
|                         label: dayjsMonthsShort[i], | 
|                     }); | 
|                 } | 
|                 return months; | 
|             }, | 
|             getDayOptions() { | 
|                 const { locale } = this.data; | 
|                 const days = []; | 
|                 const minDay = this.getOptionEdge('min', 'date'); | 
|                 const maxDay = this.getOptionEdge('max', 'date'); | 
|                 for (let i = minDay; i <= maxDay; i += 1) { | 
|                     days.push({ | 
|                         value: `${i}`, | 
|                         label: `${i + locale.day}`, | 
|                     }); | 
|                 } | 
|                 return days; | 
|             }, | 
|             getHourOptions() { | 
|                 const { locale } = this.data; | 
|                 const hours = []; | 
|                 const minHour = this.getOptionEdge('min', 'hour'); | 
|                 const maxHour = this.getOptionEdge('max', 'hour'); | 
|                 for (let i = minHour; i <= maxHour; i += 1) { | 
|                     hours.push({ | 
|                         value: `${i}`, | 
|                         label: `${i + locale.hour}`, | 
|                     }); | 
|                 } | 
|                 return hours; | 
|             }, | 
|             getMinuteOptions() { | 
|                 const { locale } = this.data; | 
|                 const minutes = []; | 
|                 const minMinute = this.getOptionEdge('min', 'minute'); | 
|                 const maxMinute = this.getOptionEdge('max', 'minute'); | 
|                 for (let i = minMinute; i <= maxMinute; i += 1) { | 
|                     minutes.push({ | 
|                         value: `${i}`, | 
|                         label: `${i + locale.minute}`, | 
|                     }); | 
|                 } | 
|                 return minutes; | 
|             }, | 
|             getValueCols() { | 
|                 return { | 
|                     columns: this.getColumnOptions(), | 
|                     columnsValue: this.getColumnsValue(), | 
|                 }; | 
|             }, | 
|             getColumnsValue() { | 
|                 const { fullModes } = this.data; | 
|                 const date = this.getDate(); | 
|                 const columnsValue = []; | 
|                 fullModes === null || fullModes === void 0 ? void 0 : fullModes.forEach((mode) => { | 
|                     columnsValue.push(`${date[mode]()}`); | 
|                 }); | 
|                 return columnsValue; | 
|             }, | 
|             getNewDate(value, type) { | 
|                 let newValue = this.getDate(); | 
|                 switch (type) { | 
|                     case ModeItem.YEAR: | 
|                         newValue = this.setYear(newValue, value); | 
|                         break; | 
|                     case ModeItem.MONTH: | 
|                         newValue = this.setMonth(newValue, value); | 
|                         break; | 
|                     case ModeItem.DATE: | 
|                         newValue = newValue.date(value); | 
|                         break; | 
|                     case ModeItem.HOUR: | 
|                         newValue = newValue.hour(value); | 
|                         break; | 
|                     case ModeItem.MINUTE: | 
|                         newValue = newValue.minute(value); | 
|                         break; | 
|                     case ModeItem.SECOND: | 
|                         newValue = newValue.second(value); | 
|                         break; | 
|                     default: | 
|                         break; | 
|                 } | 
|                 return this.clipDate(newValue); | 
|             }, | 
|             onColumnChange(e) { | 
|                 const { value, column } = e === null || e === void 0 ? void 0 : e.detail; | 
|                 const { fullModes, format } = this.data; | 
|                 const columnValue = value === null || value === void 0 ? void 0 : value[column]; | 
|                 const columnType = fullModes === null || fullModes === void 0 ? void 0 : fullModes[column]; | 
|                 const newValue = this.getNewDate(parseInt(columnValue, 10), columnType); | 
|                 this.date = newValue; | 
|                 const { columns, columnsValue } = this.getValueCols(); | 
|                 this.setData({ | 
|                     columns, | 
|                     columnsValue, | 
|                 }); | 
|                 const date = this.getDate(); | 
|                 const pickValue = format ? date.format(format) : date.valueOf(); | 
|                 this.triggerEvent('pick', { value: pickValue }); | 
|             }, | 
|             onConfirm() { | 
|                 const { format } = this.properties; | 
|                 const date = this.getDate(); | 
|                 const value = format ? date.format(format) : date.valueOf(); | 
|                 this._trigger('change', { value }); | 
|                 this.triggerEvent('confirm', { value }); | 
|                 this.resetColumns(); | 
|             }, | 
|             onCancel() { | 
|                 this.resetColumns(); | 
|                 this.triggerEvent('cancel'); | 
|             }, | 
|             onVisibleChange(e) { | 
|                 if (!e.detail.visible) { | 
|                     this.resetColumns(); | 
|                 } | 
|             }, | 
|             onClose(e) { | 
|                 const { trigger } = e.detail; | 
|                 this.triggerEvent('close', { trigger }); | 
|             }, | 
|             resetColumns() { | 
|                 const parseDate = this.getParseDate(); | 
|                 this.date = parseDate; | 
|                 const { columns, columnsValue } = this.getValueCols(); | 
|                 this.setData({ | 
|                     columns, | 
|                     columnsValue, | 
|                 }); | 
|             }, | 
|         }; | 
|     } | 
|     getFullModeArray(mode) { | 
|         if (typeof mode === 'string' || mode instanceof String) { | 
|             return this.getFullModeByModeString(mode, FULL_MODES); | 
|         } | 
|         if (Array.isArray(mode)) { | 
|             if ((mode === null || mode === void 0 ? void 0 : mode.length) === 1) { | 
|                 return this.getFullModeByModeString(mode[0], FULL_MODES); | 
|             } | 
|             if ((mode === null || mode === void 0 ? void 0 : mode.length) === 2) { | 
|                 const dateModes = this.getFullModeByModeString(mode[0], DATE_MODES); | 
|                 const timeModes = this.getFullModeByModeString(mode[1], TIME_MODES); | 
|                 return [...dateModes, ...timeModes]; | 
|             } | 
|         } | 
|     } | 
|     getFullModeByModeString(modeString, matchModes) { | 
|         if (!modeString) { | 
|             return []; | 
|         } | 
|         const endIndex = matchModes === null || matchModes === void 0 ? void 0 : matchModes.findIndex((mode) => modeString === mode); | 
|         return matchModes === null || matchModes === void 0 ? void 0 : matchModes.slice(0, endIndex + 1); | 
|     } | 
|     isTimeMode() { | 
|         const { fullModes } = this.data; | 
|         return fullModes[0] === ModeItem.HOUR; | 
|     } | 
| }; | 
| DateTimePicker = __decorate([ | 
|     wxComponent() | 
| ], DateTimePicker); | 
| export default DateTimePicker; |