@nutui/nutui-react
Version:
京东风格的轻量级移动端 React 组件库,支持一套代码生成 H5 和小程序
249 lines (248 loc) • 9.91 kB
JavaScript
import { _ as _define_property } from "@swc/helpers/_/_define_property";
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
import { padZero } from "../../utils/pad-zero";
import { isDate } from "../../utils/is-date";
/**
* 获取指定年份和月份的最后一天
* @param year - 年份
* @param month - 月份(1 到 12)
* @returns 返回该月份的最后一天
*/ export function getLastDayOfMonth(year, month) {
return new Date(year, month, 0).getDate();
}
/**
* 根据类型和日期值,计算并返回日期边界值(年、月、日、时、分、秒)
* @param type 边界类型:'min' 表示最小值,'max' 表示最大值
* @param value 传入的日期值
* @param startDate 传入的开始时间
* @param endDate 传入的结束时间
* @returns 返回包含边界值的对象
*/ export var calculateDateBoundary = function(type, value, startDate, endDate) {
var boundary = type === 'min' ? startDate : endDate;
var year = boundary.getFullYear();
var isMax = type === 'max';
var month = isMax ? 12 : 1;
var date = isMax ? getLastDayOfMonth(value.getFullYear(), value.getMonth() + 1) : 1;
var hour = isMax ? 23 : 0;
var minute = isMax ? 59 : 0;
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();
}
}
}
}
var _obj;
// 返回边界值的对象
return _obj = {}, _define_property(_obj, "".concat(type, "Year"), year), _define_property(_obj, "".concat(type, "Month"), month), _define_property(_obj, "".concat(type, "Date"), date), _define_property(_obj, "".concat(type, "Hour"), hour), _define_property(_obj, "".concat(type, "Minute"), minute), _define_property(_obj, "".concat(type, "Seconds"), minute), _obj;
};
/**
* 根据选中的日期和类型,生成日期选择器的范围配置
* @returns {Array} 返回日期选择器的范围配置数组
*/ export var generateDatePickerRanges = function(type, selectedDate, startDate, endDate) {
var selected = new Date(selectedDate);
if (!selected) return [];
// 获取最大和最小边界值
var _calculateDateBoundary = calculateDateBoundary('max', selected, startDate, endDate), maxYear = _calculateDateBoundary.maxYear, maxDate = _calculateDateBoundary.maxDate, maxMonth = _calculateDateBoundary.maxMonth, maxHour = _calculateDateBoundary.maxHour, maxMinute = _calculateDateBoundary.maxMinute, maxSeconds = _calculateDateBoundary.maxSeconds;
var _calculateDateBoundary1 = calculateDateBoundary('min', selected, startDate, endDate), minYear = _calculateDateBoundary1.minYear, minDate = _calculateDateBoundary1.minDate, minMonth = _calculateDateBoundary1.minMonth, minHour = _calculateDateBoundary1.minHour, minMinute = _calculateDateBoundary1.minMinute, minSeconds = _calculateDateBoundary1.minSeconds;
var fullRanges = [
{
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
]
},
{
type: 'seconds',
range: [
minSeconds,
maxSeconds
]
}
];
// 根据类型返回对应的范围配置
switch(type.toLocaleLowerCase()){
case 'date':
return fullRanges.slice(0, 3);
case 'datetime':
return fullRanges.slice(0, 5);
case 'time':
return fullRanges.slice(3, 6);
case 'year-month':
return fullRanges.slice(0, 2);
case 'hour-minutes':
return fullRanges.slice(3, 5);
case 'month-day':
return fullRanges.slice(1, 3);
case 'datehour':
return fullRanges.slice(0, 4);
default:
return fullRanges;
}
};
/**
* 根据类型获取日期对象中对应的值
* @param type 需要获取的日期部分(如 'year', 'month', 'day' 等)
* @param selectedDate 选中的日期时间戳
* @returns 返回日期对象中对应部分的值,如果类型无效或日期无效,返回 0
*/ export var getDatePartValue = function(type, selectedDate) {
var date = new Date(selectedDate);
if (!selectedDate) return 0;
switch(type){
case 'year':
return date.getFullYear();
case 'month':
return date.getMonth() + 1;
case 'day':
return date.getDate();
case 'hour':
return date.getHours();
case 'minute':
return date.getMinutes();
case 'seconds':
return date.getSeconds();
default:
return 0;
}
};
/**
* 生成 Picker 的列数据,并触发回调函数返回选中索引
* @param min 最小值
* @param max 最大值
* @param currentValue 当前选中的值
* @param type 列的类型(如 'year', 'month', 'minute' 等)
* @param minuteStep 分钟步长(仅当类型为 'minute' 时生效)
* @param callback 回调函数,用于返回选中索引
* @returns 返回生成的 Picker 列数据
*/ export var generatePickerColumnWithCallback = function(min, max, currentValue, type, minuteStep, callback, showChinese, zhCNType, formatter) {
var currentMin = min;
var options = [];
var selectedIndex = 0;
// 遍历从最小值到最大值的范围
while(currentMin <= max){
// 将当前值格式化为 PickerOption 并添加到数组中
options.push(formatPickerOption(type, currentMin, showChinese, zhCNType, formatter));
// 根据类型决定步长:如果是分钟,使用 minuteStep,否则步长为 1
if (type === 'minute') {
currentMin += minuteStep;
} else {
currentMin++;
}
// 如果当前值小于等于选中的值,更新选中索引
if (currentMin <= Number(currentValue)) {
selectedIndex++;
}
}
callback(selectedIndex, options);
return options;
};
/**
* 格式化 Picker 选项
* @param type 选项类型(如 'year', 'month', 'minute' 等)
* @param value 选项的值
* @param showChinese 是否显示中文文本
* @param zhCNType 中文文本映射对象
* @param formatter 自定义格式化函数
* @returns 返回格式化后的 Picker 选项
*/ export var formatPickerOption = function(type, value, showChinese, zhCNType, formatter) {
if (formatter) {
return formatter(type, {
label: padZero(value, 2),
value: padZero(value, 2)
});
}
var paddedValue = padZero(value, 2);
var chineseText = showChinese ? zhCNType[type] : '';
return {
label: paddedValue + chineseText,
value: paddedValue
};
};
/**
* 格式化日期值,确保其在 startDate 和 endDate 之间
*/ export var formatValue = function(value, startDate, endDate) {
if (!value || value && !isDate(value)) {
value = startDate;
}
return Math.min(Math.max(value.getTime(), startDate.getTime()), endDate.getTime());
};
/**
* 处理 Picker 值变化的逻辑
* @param selectedOptions 选中的选项数组
* @param selectedValue 选中的值数组
* @param index 当前列的索引
*/ export var handlePickerValueChange = function(selectedOptions, selectedValue, index, type, defaultDate, handleDateComparison) {
var rangeType = type.toLocaleLowerCase();
if ([
'date',
'datetime',
'datehour',
'month-day',
'year-month'
].includes(rangeType)) {
var formattedDate = [];
selectedValue.forEach(function(item) {
formattedDate.push(item);
});
if (rangeType === 'month-day' && formattedDate.length < 3) {
formattedDate.unshift(new Date(defaultDate).getFullYear());
}
if (rangeType === 'year-month' && formattedDate.length < 3) {
formattedDate.push(new Date(defaultDate).getDate());
}
var year = Number(formattedDate[0]);
var month = Number(formattedDate[1]) - 1;
var day = Math.min(Number(formattedDate[2]), getLastDayOfMonth(year, month + 1));
var date = null;
if (rangeType === 'date' || rangeType === 'month-day' || rangeType === 'year-month') {
date = new Date(year, month, day);
} else if (rangeType === 'datetime') {
date = new Date(year, month, day, Number(formattedDate[3]), Number(formattedDate[4]));
} else if (rangeType === 'datehour') {
date = new Date(year, month, day, Number(formattedDate[3]));
}
handleDateComparison(date, selectedOptions, index);
} else {
var _selectedValue = _sliced_to_array(selectedValue, 3), hour = _selectedValue[0], minute = _selectedValue[1], seconds = _selectedValue[2];
var currentDate = new Date(defaultDate);
var year1 = currentDate.getFullYear();
var month1 = currentDate.getMonth();
var day1 = currentDate.getDate();
var date1 = new Date(year1, month1, day1, Number(hour), Number(minute), rangeType === 'time' ? Number(seconds) : 0);
handleDateComparison(date1, selectedOptions, index);
}
};