city-casereport/miniprogram_npm/tdesign-miniprogram/date-time-picker/date-time-picker.js
2023-12-08 11:30:29 +08:00

351 lines
14 KiB
JavaScript

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;
};
import dayjs from 'dayjs';
import config from '../common/config';
import { SuperComponent, wxComponent } from '../common/src/index';
import defaultLocale from './locale/zh';
import props from './props';
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();
},
mode(m) {
const fullModes = this.getFullModeArray(m);
this.setData({
fullModes,
});
this.updateColumns();
},
};
this.date = null;
this.data = {
prefix,
classPrefix: name,
columns: [],
columnsValue: [],
fullModes: [],
locale: defaultLocale,
};
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;
for (let i = minEdge; i <= maxEdge; i += step) {
const label = type === 'month' ? i + 1 : i;
options.push({
value: `${i}`,
label: `${label + 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 { locale } = this.data;
const months = [];
const minMonth = this.getOptionEdge('min', 'month');
const maxMonth = this.getOptionEdge('max', 'month');
for (let i = minMonth; i <= maxMonth; i += 1) {
months.push({
value: `${i}`,
label: `${i + 1 + locale.month}`,
});
}
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;