mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-07-02 03:02:19 +08:00
fix: incorrect range limitation on date fields with time (#7107)
This commit is contained in:
parent
bd900e9a92
commit
a0181b58b1
@ -58,90 +58,98 @@ export const DatePicker = (props: any) => {
|
|||||||
}, [props._maxDate, props._minDate, localVariables, parseVariable]);
|
}, [props._maxDate, props._minDate, localVariables, parseVariable]);
|
||||||
|
|
||||||
const limitDate = async () => {
|
const limitDate = async () => {
|
||||||
//dayjs()如果传入undefined可能会被解析成当前时间
|
// 直接将 UTC 时间字符串转换成 dayjs 对象(注意不转成本地时间)
|
||||||
let minDateTimePromise = props._minDate ? Promise.resolve(dayjs(props._minDate)) : Promise.resolve(null);
|
let minDateTimePromise = props._minDate
|
||||||
|
? Promise.resolve(dayjs(props._minDate)) // 保持 UTC 时间
|
||||||
|
: Promise.resolve(null);
|
||||||
let maxDateTimePromise = props._maxDate ? Promise.resolve(dayjs(props._maxDate)) : Promise.resolve(null);
|
let maxDateTimePromise = props._maxDate ? Promise.resolve(dayjs(props._maxDate)) : Promise.resolve(null);
|
||||||
|
|
||||||
if (isVariable(props._maxDate)) {
|
if (isVariable(props._maxDate)) {
|
||||||
maxDateTimePromise = parseVariable(props._maxDate, localVariables).then((result) => {
|
maxDateTimePromise = parseVariable(props._maxDate, localVariables).then((result) => {
|
||||||
|
console.log(dayjs(Array.isArray(result.value) ? last(result.value) : result.value));
|
||||||
return dayjs(Array.isArray(result.value) ? last(result.value) : result.value);
|
return dayjs(Array.isArray(result.value) ? last(result.value) : result.value);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (isVariable(props._minDate)) {
|
if (isVariable(props._minDate)) {
|
||||||
minDateTimePromise = parseVariable(props._minDate, localVariables).then((result) => {
|
minDateTimePromise = parseVariable(props._minDate, localVariables).then((result) =>
|
||||||
return dayjs(Array.isArray(result.value) ? first(result.value) : result.value);
|
dayjs(Array.isArray(result.value) ? first(result.value) : result.value),
|
||||||
});
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const [minDateTime, maxDateTime] = await Promise.all([minDateTimePromise, maxDateTimePromise]);
|
const [minDateTime, maxDateTime] = await Promise.all([minDateTimePromise, maxDateTimePromise]);
|
||||||
|
|
||||||
const fullTimeArr = Array.from({ length: 60 }, (_, i) => i);
|
const fullTimeArr = Array.from({ length: 60 }, (_, i) => i);
|
||||||
|
|
||||||
// 根据最小日期和最大日期限定日期时间
|
// disabledDate 只禁用日期,不要管时间部分
|
||||||
const disabledDate = (current) => {
|
const disabledDate = (current) => {
|
||||||
if (!dayjs.isDayjs(current)) return false;
|
if (!dayjs.isDayjs(current)) return false;
|
||||||
|
|
||||||
const currentDate = dayjs(current);
|
// 把 current 转成本地时间(不加 .utc(),因为 current 就是本地时间)
|
||||||
const min = minDateTime ? dayjs(minDateTime) : null;
|
// 然后和 maxDateTime(同为本地时间)做比较
|
||||||
const max = maxDateTime ? dayjs(maxDateTime).endOf('day') : null; // 设为 23:59:59
|
const min = minDateTime ? minDateTime.startOf('day') : null;
|
||||||
|
const max = maxDateTime ? maxDateTime.endOf('day') : null;
|
||||||
|
|
||||||
return (min && currentDate.isBefore(min, 'minute')) || (max && currentDate.isAfter(max, 'minute'));
|
return (min && current.isBefore(min, 'day')) || (max && current.isAfter(max, 'day'));
|
||||||
};
|
};
|
||||||
|
|
||||||
// 禁用时分秒
|
|
||||||
const disabledTime = (current) => {
|
const disabledTime = (current) => {
|
||||||
if (!current || (!minDateTime && !maxDateTime)) {
|
if (!current || (!minDateTime && !maxDateTime)) {
|
||||||
return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [] };
|
return { disabledHours: () => [], disabledMinutes: () => [], disabledSeconds: () => [] };
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentDate = dayjs(current);
|
// current 是本地时间,转成 UTC 时间
|
||||||
const isCurrentMinDay = currentDate.isSame(minDateTime, 'day');
|
const currentUtc = current.utc();
|
||||||
const isCurrentMaxDay = currentDate.isSame(maxDateTime, 'day');
|
|
||||||
|
// 判断是不是 minDate 和 maxDate 的同一天(UTC)
|
||||||
|
const isCurrentMinDay = minDateTime && currentUtc.isSame(minDateTime, 'day');
|
||||||
|
const isCurrentMaxDay = maxDateTime && currentUtc.isSame(maxDateTime, 'day');
|
||||||
|
|
||||||
const disabledHours = () => {
|
const disabledHours = () => {
|
||||||
const hours = [];
|
const hours = [];
|
||||||
if (isCurrentMinDay) {
|
if (isCurrentMinDay) {
|
||||||
hours.push(...Array.from({ length: minDateTime.hour() }, (_, i) => i));
|
for (let h = 0; h < minDateTime.hour(); h++) {
|
||||||
|
hours.push(h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (isCurrentMaxDay) {
|
if (isCurrentMaxDay) {
|
||||||
hours.push(...Array.from({ length: 24 - maxDateTime.hour() }, (_, i) => i + maxDateTime.hour() + 1));
|
for (let h = maxDateTime.hour() + 1; h < 24; h++) {
|
||||||
|
hours.push(h);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return hours;
|
return hours;
|
||||||
};
|
};
|
||||||
|
|
||||||
const getDisabledMinutes = (selectedHour: number) => {
|
const disabledMinutes = (selectedHour) => {
|
||||||
if (isCurrentMinDay && selectedHour === minDateTime.hour()) {
|
if (isCurrentMinDay && selectedHour === minDateTime.hour()) {
|
||||||
return fullTimeArr.filter((i) => i < minDateTime.minute());
|
return fullTimeArr.filter((m) => m < minDateTime.minute());
|
||||||
}
|
}
|
||||||
if (isCurrentMaxDay && selectedHour === maxDateTime.hour()) {
|
if (isCurrentMaxDay && selectedHour === maxDateTime.hour()) {
|
||||||
return fullTimeArr.filter((i) => i > maxDateTime.minute());
|
return fullTimeArr.filter((m) => m > maxDateTime.minute());
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
};
|
};
|
||||||
|
|
||||||
const getDisabledSeconds = (selectedHour: number, selectedMinute: number) => {
|
const disabledSeconds = (selectedHour, selectedMinute) => {
|
||||||
if (isCurrentMinDay && selectedHour === minDateTime.hour() && selectedMinute === minDateTime.minute()) {
|
if (isCurrentMinDay && selectedHour === minDateTime.hour() && selectedMinute === minDateTime.minute()) {
|
||||||
return fullTimeArr.filter((i) => i < minDateTime.second());
|
return fullTimeArr.filter((s) => s < minDateTime.second());
|
||||||
}
|
}
|
||||||
if (isCurrentMaxDay && selectedHour === maxDateTime.hour() && selectedMinute === maxDateTime.minute()) {
|
if (isCurrentMaxDay && selectedHour === maxDateTime.hour() && selectedMinute === maxDateTime.minute()) {
|
||||||
return fullTimeArr.filter((i) => i > maxDateTime.second());
|
return fullTimeArr.filter((s) => s > maxDateTime.second());
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
disabledHours,
|
disabledHours,
|
||||||
disabledMinutes: getDisabledMinutes,
|
disabledMinutes,
|
||||||
disabledSeconds: getDisabledSeconds,
|
disabledSeconds,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
setDisabledDate(() => {
|
|
||||||
return disabledDate;
|
setDisabledDate(() => disabledDate);
|
||||||
});
|
setDisabledTime(() => disabledTime);
|
||||||
setDisabledTime(() => {
|
|
||||||
return disabledTime;
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const newProps = {
|
const newProps = {
|
||||||
utc,
|
utc,
|
||||||
...props,
|
...props,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user