fix: 修复RangePicker回填时间时的bug

pull/8366/head
yuanyi 2025-09-19 18:06:13 +04:00
parent 5843bf5fd9
commit b4603d2eeb
5 changed files with 334 additions and 10 deletions

View File

@ -54,7 +54,7 @@ RangePicker supports two new features:
</template>
<script lang="ts" setup>
import dayjs, { Dayjs } from 'dayjs';
import { Dayjs } from 'dayjs';
type RangeValue = [Dayjs, Dayjs];
@ -84,7 +84,7 @@ const onWholeDayChange = (
dateStrings: [string, string],
currentPreset?: any,
) => {
if (values) {
if (values && values[0] && values[1]) {
console.log(
'Whole Day - From: ',
values[0].format('YYYY-MM-DD HH:mm:ss'),
@ -105,7 +105,7 @@ const onCombinedChange = (
dateStrings: [string, string],
currentPreset?: any,
) => {
if (values) {
if (values && values[0] && values[1]) {
console.log(
'Combined - From: ',
values[0].format('YYYY-MM-DD HH:mm:ss'),

View File

@ -18,6 +18,7 @@
<statusVue />
<placementVue />
<AutoFillWholeDay />
<PresetAutofill />
</demo-sort>
</template>
<script>
@ -38,6 +39,7 @@ import Bordered from './bordered.vue';
import RangePicker from './range-picker.vue';
import placementVue from './placement.vue';
import AutoFillWholeDay from './auto-fill-whole-day.vue';
import PresetAutofill from './preset-autofill.vue';
import statusVue from './status.vue';
import CN from '../index.zh-CN.md';
import US from '../index.en-US.md';
@ -65,6 +67,7 @@ export default defineComponent({
Bordered,
RangePicker,
AutoFillWholeDay,
PresetAutofill,
},
});
</script>

View File

@ -0,0 +1,154 @@
<docs>
---
order: 8
title:
zh-CN: Preset自动回填
en-US: Preset Auto Fill
---
## zh-CN
RangePicker 现在支持preset自动回填功能当传入的value包含preset信息时会根据preset自动计算对应的日期范围
## en-US
RangePicker now supports preset auto fill functionality. When the passed value contains preset information, it will automatically calculate the corresponding date range based on the preset.
</docs>
<template>
<a-space direction="vertical" :size="12">
<div>
<h4>Preset自动回填功能</h4>
<p>当传入的value包含preset信息时会根据preset自动计算日期范围</p>
<p>
<strong>当前设置</strong>
is-whole-day={{ isWholeDay }}show-time=true
</p>
<p>
<strong>行为</strong>
当isWholeDay为false时点击preset时会使用当前时间的时分秒而不是00:00:00 - 23:59:59
</p>
<a-range-picker
v-model:value="rangeValue"
show-time
:is-whole-day="isWholeDay"
format="YYYY/MM/DD HH:mm:ss"
:presets="rangePresets"
@change="onRangeChange"
/>
</div>
<div>
<h4>切换is-whole-day</h4>
<p>
<a-button @click="toggleIsWholeDay">is-whole-day</a-button>
</p>
<h4>测试按钮</h4>
<a-space>
<a-button @click="setTodayPreset">preset</a-button>
<a-button @click="setLast7DaysPreset">7preset</a-button>
<a-button @click="setLast30DaysPreset">30preset</a-button>
<a-button @click="setCurrentTimePreset">preset</a-button>
<a-button @click="clearValue"></a-button>
</a-space>
</div>
<div>
<h4>当前值</h4>
<pre>{{ JSON.stringify(rangeValue, null, 2) }}</pre>
</div>
</a-space>
</template>
<script lang="ts" setup>
import dayjs, { Dayjs } from 'dayjs';
import { ref } from 'vue';
type RangeValue = [Dayjs, Dayjs] | [Dayjs, Dayjs, any];
const isWholeDay = ref(false);
const rangeValue = ref<RangeValue | null>(null);
const onRangeChange = (values: RangeValue, dateStrings: [string, string], currentPreset?: any) => {
if (values) {
console.log('From: ', values[0], ', to: ', values[1]);
console.log('From: ', dateStrings[0], ', to: ', dateStrings[1]);
if (currentPreset) {
console.log('Selected preset key: ', currentPreset.key);
console.log('Selected preset label: ', currentPreset.label);
} else {
console.log('Manual selection (no preset)');
}
} else {
console.log('Clear');
}
};
const rangePresets = ref([
{
label: '今天',
value: [dayjs().startOf('day'), dayjs().endOf('day')],
key: 'today',
},
{
label: '最近7天',
value: [dayjs().subtract(7, 'day').startOf('day'), dayjs().endOf('day')],
key: 'last7days',
},
{
label: '最近30天',
value: [dayjs().subtract(30, 'day').startOf('day'), dayjs().endOf('day')],
key: 'last30days',
},
{
label: '最近90天',
value: [dayjs().subtract(90, 'day').startOf('day'), dayjs().endOf('day')],
key: 'last90days',
},
]);
const setTodayPreset = () => {
const todayPreset = rangePresets.value.find(p => p.key === 'today');
if (todayPreset) {
// presetvalueRangePickerpreset
rangeValue.value = [dayjs(), dayjs(), todayPreset] as any;
}
};
const setLast7DaysPreset = () => {
const last7DaysPreset = rangePresets.value.find(p => p.key === 'last7days');
if (last7DaysPreset) {
// presetvalueRangePickerpreset
rangeValue.value = [dayjs(), dayjs(), last7DaysPreset] as any;
}
};
const setLast30DaysPreset = () => {
const last30DaysPreset = rangePresets.value.find(p => p.key === 'last30days');
if (last30DaysPreset) {
// presetvalueRangePickerpreset
rangeValue.value = [dayjs(), dayjs(), last30DaysPreset] as any;
}
};
const setCurrentTimePreset = () => {
// preset
const currentTimePreset = {
label: '当前时间',
value: [dayjs(), dayjs()], // 使startOf/endOf
key: 'currentTime',
};
// presetvalueRangePickerpreset
rangeValue.value = [dayjs(), dayjs(), currentTimePreset] as any;
};
const clearValue = () => {
rangeValue.value = null;
};
const toggleIsWholeDay = () => {
isWholeDay.value = !isWholeDay.value;
};
</script>

View File

@ -186,7 +186,7 @@ function injectSorter<RecordType>(
const cell = (column.customHeaderCell && column.customHeaderCell(col)) || {};
const originOnClick = cell.onClick;
const originOKeyDown = cell.onKeydown;
cell.onClick = (event: MouseEvent) => {
cell.onClick = (event: PointerEvent) => {
triggerSorter({
column,
key: columnKey,

View File

@ -320,10 +320,64 @@ function RangerPicker<DateType>() {
const [mergedValue, setInnerValue] = useMergedState<RangeValue<DateType>>(null, {
value: toRef(props, 'value'),
defaultValue: props.defaultValue,
postState: values =>
props.picker === 'time' && !props.order
postState: values => {
// presetvalue [date, date, preset]
if (
values &&
Array.isArray(values) &&
(values as any).length === 3 &&
(values as any)[2]
) {
const preset = (values as any)[2];
// presetvalue使presetvalue
if (preset.value && Array.isArray(preset.value) && preset.value.length === 2) {
const presetValues = preset.value;
// preset.value
let startValue =
typeof presetValues[0] === 'function' ? presetValues[0]() : presetValues[0];
let endValue =
typeof presetValues[1] === 'function' ? presetValues[1]() : presetValues[1];
// props.isWholeDaytruefalse使
if (!props.isWholeDay) {
const now = props.generateConfig.getNow();
const currentHour = props.generateConfig.getHour(now);
const currentMinute = props.generateConfig.getMinute(now);
const currentSecond = props.generateConfig.getSecond(now);
startValue = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(startValue, currentSecond),
currentMinute,
),
currentHour,
);
endValue = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(endValue, currentSecond),
currentMinute,
),
currentHour,
);
}
if (startValue && endValue) {
// preset
setCurrentPreset(preset);
// preset
return props.picker === 'time' && !props.order
? [startValue, endValue]
: reorderValues([startValue, endValue], props.generateConfig);
}
}
}
// value
return props.picker === 'time' && !props.order
? values
: reorderValues(values, props.generateConfig),
: reorderValues(values, props.generateConfig);
},
});
// ========================= Current Preset =========================
@ -597,6 +651,61 @@ function RangerPicker<DateType>() {
values = [startWithTime, endWithTime];
}
// presetpresetvalue
if (
fromPreset &&
currentPreset.value &&
Array.isArray(currentPreset.value) &&
currentPreset.value.length === 2
) {
const presetValues = currentPreset.value;
// preset.value
const presetStartValue =
typeof presetValues[0] === 'function' ? presetValues[0]() : presetValues[0];
const presetEndValue =
typeof presetValues[1] === 'function' ? presetValues[1]() : presetValues[1];
if (presetStartValue && presetEndValue) {
// isWholeDay
if (props.isWholeDay && showTime) {
const startWithTime = generateConfig.setHour(
generateConfig.setMinute(generateConfig.setSecond(presetStartValue, 0), 0),
0,
);
const endWithTime = generateConfig.setHour(
generateConfig.setMinute(generateConfig.setSecond(presetEndValue, 59), 59),
23,
);
values = [startWithTime, endWithTime];
} else if (showTime) {
// isWholeDayshowTime使
const now = generateConfig.getNow();
const currentHour = generateConfig.getHour(now);
const currentMinute = generateConfig.getMinute(now);
const currentSecond = generateConfig.getSecond(now);
const startWithCurrentTime = generateConfig.setHour(
generateConfig.setMinute(
generateConfig.setSecond(presetStartValue, currentSecond),
currentMinute,
),
currentHour,
);
const endWithCurrentTime = generateConfig.setHour(
generateConfig.setMinute(
generateConfig.setSecond(presetEndValue, currentSecond),
currentMinute,
),
currentHour,
);
values = [startWithCurrentTime, endWithCurrentTime];
} else {
// showTimepreset
values = [presetStartValue, presetEndValue];
}
}
}
setSelectedValue(values);
// preset currentPreset
@ -638,9 +747,11 @@ function RangerPicker<DateType>() {
(!isEqual(generateConfig, getValue(mergedValue.value, 0), startValue) ||
!isEqual(generateConfig, getValue(mergedValue.value, 1), endValue))
) {
// presetpreset
const presetToPass = fromPreset ? currentPreset.value : currentPreset.value;
onChange(
[startValue, endValue, currentPreset.value],
[startStr, endStr, currentPreset.value?.key || null],
[startValue, endValue, presetToPass],
[startStr, endStr, presetToPass?.key || null],
);
}
}
@ -1247,7 +1358,63 @@ function RangerPicker<DateType>() {
currentPreset={currentPreset.value}
onClick={(nextValue, preset) => {
setCurrentPreset(preset);
triggerChange(nextValue, null, true);
// presetvalue使presetvalue
let valuesToUse = nextValue;
if (preset.value && Array.isArray(preset.value) && preset.value.length === 2) {
const presetValues = preset.value;
// preset.value
const presetStartValue =
typeof presetValues[0] === 'function' ? presetValues[0]() : presetValues[0];
const presetEndValue =
typeof presetValues[1] === 'function' ? presetValues[1]() : presetValues[1];
if (presetStartValue && presetEndValue) {
// isWholeDay
if (props.isWholeDay && props.showTime) {
const startWithTime = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(presetStartValue, 0),
0,
),
0,
);
const endWithTime = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(presetEndValue, 59),
59,
),
23,
);
valuesToUse = [startWithTime, endWithTime];
} else if (props.showTime) {
// isWholeDayshowTime使
const now = props.generateConfig.getNow();
const currentHour = props.generateConfig.getHour(now);
const currentMinute = props.generateConfig.getMinute(now);
const currentSecond = props.generateConfig.getSecond(now);
const startWithCurrentTime = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(presetStartValue, currentSecond),
currentMinute,
),
currentHour,
);
const endWithCurrentTime = props.generateConfig.setHour(
props.generateConfig.setMinute(
props.generateConfig.setSecond(presetEndValue, currentSecond),
currentMinute,
),
currentHour,
);
valuesToUse = [startWithCurrentTime, endWithCurrentTime];
} else {
// showTimepreset
valuesToUse = [presetStartValue, presetEndValue];
}
}
}
triggerChange(valuesToUse, null, true);
triggerOpen(false, mergedActivePickerIndex.value);
}}
onHover={hoverValue => {