fix: usage datepicker

This commit is contained in:
jialin
2026-04-22 13:16:48 +08:00
committed by jialin
parent ad7fc3a993
commit daa3d74500
8 changed files with 157 additions and 49 deletions
@@ -18,6 +18,11 @@ export default function useRangePickerPreset(options?: RangePickerPreset): {
label: React.ReactNode;
value: [Dayjs, Dayjs] | (() => [Dayjs, Dayjs]);
}[];
normalizeRangeValue: (
startDate: string,
endDate: string,
picker: 'date' | 'week' | 'month' | 'quarter' | 'year'
) => [Dayjs, Dayjs];
handleOnPickerChange: (
value: 'date' | 'week' | 'month' | 'quarter' | 'year'
) => void;
@@ -28,22 +33,76 @@ export default function useRangePickerPreset(options?: RangePickerPreset): {
const intl = useIntl();
const [picker, setPicker] = useState<
'date' | 'week' | 'month' | 'quarter' | 'year'
>('month');
>('date');
const getYearMonth = (date: Dayjs) => date.year() * 12 + date.month();
const normalizeRangeValue = (
startDate: string,
endDate: string,
picker: 'date' | 'week' | 'month' | 'quarter' | 'year'
): [Dayjs, Dayjs] => {
const start = dayjs(startDate);
const end = dayjs(endDate);
switch (picker) {
case 'week':
return [start.startOf('week'), end.endOf('week')];
case 'month':
return [start.startOf('month'), end.endOf('month')];
case 'year':
return [start.startOf('year'), end.endOf('year')];
default:
return [start, end];
}
};
const getRangeBoundary = (
from: Dayjs,
range: number,
type: 'date' | 'week' | 'month' | 'quarter' | 'year'
) => {
switch (type) {
case 'year':
return {
minDate: from.add(1 - range, 'year'),
maxDate: from.add(range - 1, 'year')
};
case 'month':
return {
minDate: from.add(1 - range, 'month'),
maxDate: from.add(range - 1, 'month')
};
case 'week':
return {
minDate: from.add(1 - range, 'week'),
maxDate: from.add(range - 1, 'week')
};
default:
return {
minDate: from.add(1 - range, 'day'),
maxDate: from.add(range - 1, 'day')
};
}
};
const disabledRangeDaysDate: DatePickerProps['disabledDate'] = (
current,
{ from, type }
) => {
if (!disabledDate) {
if (!disabledDate || !from) {
return false;
}
if (from) {
const minDate = from.add(1 - range, 'days');
const maxDate = from.add(range - 1, 'days');
const { minDate, maxDate } = getRangeBoundary(from, range, type as any);
if (from) {
switch (type) {
case 'year':
return (
@@ -56,6 +115,16 @@ export default function useRangePickerPreset(options?: RangePickerPreset): {
getYearMonth(current) > getYearMonth(maxDate)
);
case 'week': {
const currentWeekStart = current.startOf('week');
const currentWeekEnd = current.endOf('week');
return (
currentWeekEnd.isBefore(minDate, 'day') ||
currentWeekStart.isAfter(maxDate, 'day')
);
}
default:
return current.isBefore(minDate) || current.isAfter(maxDate);
}
@@ -94,6 +163,7 @@ export default function useRangePickerPreset(options?: RangePickerPreset): {
return {
disabledRangeDaysDate,
handleOnPickerChange,
normalizeRangeValue,
rangePresets,
picker,
range