更换日期选择器

This commit is contained in:
WindowBird 2025-11-10 11:52:29 +08:00
parent 0a11371dbb
commit 97868a55b2

View File

@ -190,69 +190,21 @@
@close-picker="handleClosePicker" @close-picker="handleClosePicker"
/> />
<!-- 跟进时间选择器弹窗移动端 --> <!-- 跟进时间选择器 -->
<view v-if="showFollowTimePicker" class="modal-mask" @click="showFollowTimePicker = false"> <uv-datetime-picker
<view class="modal-content datetime-modal" @click.stop> ref="followTimePickerRef"
<view class="modal-title">选择跟进时间</view> v-model="followTimeValue"
<picker-view mode="datetime"
class="datetime-picker" @confirm="onFollowTimeConfirm"
:value="followTimePickerValue" ></uv-datetime-picker>
@change="onFollowTimePickerChange"
>
<picker-view-column>
<view v-for="(year, index) in dateTimePickerRange[0]" :key="index" class="picker-item-small">{{ year }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(month, index) in dateTimePickerRange[1]" :key="index" class="picker-item-small">{{ month }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(day, index) in dateTimePickerRange[2]" :key="index" class="picker-item-small">{{ day }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(hour, index) in dateTimePickerRange[3]" :key="index" class="picker-item-small">{{ hour }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(minute, index) in dateTimePickerRange[4]" :key="index" class="picker-item-small">{{ minute }}</view>
</picker-view-column>
</picker-view>
<view class="modal-actions">
<text class="modal-btn cancel-btn" @click="showFollowTimePicker = false">取消</text>
<text class="modal-btn confirm-btn" @click="confirmFollowTime">确定</text>
</view>
</view>
</view>
<!-- 下次跟进时间选择器弹窗移动端 --> <!-- 下次跟进时间选择器 -->
<view v-if="showNextFollowTimePicker" class="modal-mask" @click="showNextFollowTimePicker = false"> <uv-datetime-picker
<view class="modal-content datetime-modal" @click.stop> ref="nextFollowTimePickerRef"
<view class="modal-title">选择下次跟进时间</view> v-model="nextFollowTimeValue"
<picker-view mode="datetime"
class="datetime-picker" @confirm="onNextFollowTimeConfirm"
:value="nextFollowTimePickerValue" ></uv-datetime-picker>
@change="onNextFollowTimePickerChange"
>
<picker-view-column>
<view v-for="(year, index) in dateTimePickerRange[0]" :key="index" class="picker-item-small">{{ year }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(month, index) in dateTimePickerRange[1]" :key="index" class="picker-item-small">{{ month }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(day, index) in dateTimePickerRange[2]" :key="index" class="picker-item-small">{{ day }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(hour, index) in dateTimePickerRange[3]" :key="index" class="picker-item-small">{{ hour }}</view>
</picker-view-column>
<picker-view-column>
<view v-for="(minute, index) in dateTimePickerRange[4]" :key="index" class="picker-item-small">{{ minute }}</view>
</picker-view-column>
</picker-view>
<view class="modal-actions">
<text class="modal-btn cancel-btn" @click="showNextFollowTimePicker = false">取消</text>
<text class="modal-btn confirm-btn" @click="confirmNextFollowTime">确定</text>
</view>
</view>
</view>
<!-- 底部按钮 --> <!-- 底部按钮 -->
<view class="button-wrapper"> <view class="button-wrapper">
@ -296,8 +248,14 @@ const formData = ref({
const showStatusPicker = ref(false); const showStatusPicker = ref(false);
const showIntentLevelPicker = ref(false); const showIntentLevelPicker = ref(false);
const showFollowTypePicker = ref(false); const showFollowTypePicker = ref(false);
const showFollowTimePicker = ref(false);
const showNextFollowTimePicker = ref(false); // ref
const followTimePickerRef = ref(null);
const nextFollowTimePickerRef = ref(null);
//
const followTimeValue = ref(Number(new Date()));
const nextFollowTimeValue = ref(Number(new Date()));
// //
const statusOptions = ref([]); const statusOptions = ref([]);
@ -345,11 +303,13 @@ onLoad((options) => {
// //
const now = new Date(); const now = new Date();
formData.value.followTime = formatDateTimeForInput(now); formData.value.followTime = formatDateTimeForInput(now);
followTimeValue.value = Number(now);
// 7 // 7
const nextWeek = new Date(now); const nextWeek = new Date(now);
nextWeek.setDate(nextWeek.getDate() + 7); nextWeek.setDate(nextWeek.getDate() + 7);
formData.value.nextFollowTime = formatDateTimeForInput(nextWeek); formData.value.nextFollowTime = formatDateTimeForInput(nextWeek);
nextFollowTimeValue.value = Number(nextWeek);
}); });
// //
@ -411,163 +371,38 @@ const handleClosePicker = (pickerType) => {
} }
}; };
//
const generateDateTimePickerRange = () => {
const years = [];
const months = [];
const days = [];
const hours = [];
const minutes = [];
const currentYear = new Date().getFullYear();
for (let i = currentYear - 1; i <= currentYear + 1; i++) {
years.push(i.toString());
}
for (let i = 1; i <= 12; i++) {
months.push(String(i).padStart(2, '0'));
}
for (let i = 1; i <= 31; i++) {
days.push(String(i).padStart(2, '0'));
}
for (let i = 0; i < 24; i++) {
hours.push(String(i).padStart(2, '0'));
}
for (let i = 0; i < 60; i += 1) {
minutes.push(String(i).padStart(2, '0'));
}
return [years, months, days, hours, minutes];
};
// 使
const dateTimePickerRange = generateDateTimePickerRange();
// picker
const getDateTimePickerValue = (dateTime) => {
if (!dateTime) {
const now = new Date();
return [
dateTimePickerRange[0].indexOf(now.getFullYear().toString()),
now.getMonth(),
now.getDate() - 1,
now.getHours(),
now.getMinutes()
];
}
const d = new Date(dateTime);
return [
dateTimePickerRange[0].indexOf(d.getFullYear().toString()),
d.getMonth(),
d.getDate() - 1,
d.getHours(),
d.getMinutes()
];
};
const followTimePickerValue = ref(getDateTimePickerValue(formData.value.followTime));
const nextFollowTimePickerValue = ref(getDateTimePickerValue(formData.value.nextFollowTime));
// picker-view
const onFollowTimePickerChange = (e) => {
followTimePickerValue.value = e.detail.value;
};
// //
const confirmFollowTime = () => { const onFollowTimeConfirm = (e) => {
const [yearIdx, monthIdx, dayIdx, hourIdx, minuteIdx] = followTimePickerValue.value; // 使 v-model
const year = dateTimePickerRange[0][yearIdx]; const date = new Date(followTimeValue.value);
const month = dateTimePickerRange[1][monthIdx]; formData.value.followTime = formatDateTimeForInput(date);
const day = dateTimePickerRange[2][dayIdx];
const hour = dateTimePickerRange[3][hourIdx];
const minute = dateTimePickerRange[4][minuteIdx];
formData.value.followTime = `${year}-${month}-${day} ${hour}:${minute}:00`;
showFollowTimePicker.value = false;
};
// picker-view
const onNextFollowTimePickerChange = (e) => {
nextFollowTimePickerValue.value = e.detail.value;
}; };
// //
const confirmNextFollowTime = () => { const onNextFollowTimeConfirm = (e) => {
const [yearIdx, monthIdx, dayIdx, hourIdx, minuteIdx] = nextFollowTimePickerValue.value; // 使 v-model
const year = dateTimePickerRange[0][yearIdx]; const date = new Date(nextFollowTimeValue.value);
const month = dateTimePickerRange[1][monthIdx]; formData.value.nextFollowTime = formatDateTimeForInput(date);
const day = dateTimePickerRange[2][dayIdx];
const hour = dateTimePickerRange[3][hourIdx];
const minute = dateTimePickerRange[4][minuteIdx];
formData.value.nextFollowTime = `${year}-${month}-${day} ${hour}:${minute}:00`;
showNextFollowTimePicker.value = false;
}; };
// //
const openFollowTimePicker = () => { const openFollowTimePicker = () => {
// #ifdef H5 //
// H5使input type="datetime-local" if (formData.value.followTime) {
const currentDate = formData.value.followTime || new Date(); const date = new Date(formData.value.followTime);
const d = currentDate instanceof Date ? currentDate : new Date(currentDate); followTimeValue.value = Number(date);
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const hours = String(d.getHours()).padStart(2, '0');
const minutes = String(d.getMinutes()).padStart(2, '0');
const dateStr = `${year}-${month}-${day}T${hours}:${minutes}`;
const input = document.createElement('input');
input.type = 'datetime-local';
input.value = dateStr;
input.onchange = (e) => {
if (e.target.value) {
formData.value.followTime = e.target.value.replace('T', ' ') + ':00';
} }
}; followTimePickerRef.value?.open();
input.click();
// #endif
// #ifndef H5
// 使picker-view
followTimePickerValue.value = getDateTimePickerValue(formData.value.followTime);
showFollowTimePicker.value = true;
// #endif
}; };
// //
const openNextFollowTimePicker = () => { const openNextFollowTimePicker = () => {
// #ifdef H5 //
// H5使input type="datetime-local" if (formData.value.nextFollowTime) {
const currentDate = formData.value.nextFollowTime || new Date(); const date = new Date(formData.value.nextFollowTime);
const d = currentDate instanceof Date ? currentDate : new Date(currentDate); nextFollowTimeValue.value = Number(date);
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
const hours = String(d.getHours()).padStart(2, '0');
const minutes = String(d.getMinutes()).padStart(2, '0');
const dateStr = `${year}-${month}-${day}T${hours}:${minutes}`;
const input = document.createElement('input');
input.type = 'datetime-local';
input.value = dateStr;
input.onchange = (e) => {
if (e.target.value) {
formData.value.nextFollowTime = e.target.value.replace('T', ' ') + ':00';
} }
}; nextFollowTimePickerRef.value?.open();
input.click();
// #endif
// #ifndef H5
// 使picker-view
nextFollowTimePickerValue.value = getDateTimePickerValue(formData.value.nextFollowTime);
showNextFollowTimePicker.value = true;
// #endif
}; };
// //
@ -1370,23 +1205,6 @@ const handleCancel = () => {
} }
} }
.datetime-modal {
max-height: 60vh;
}
.datetime-picker {
height: 200px;
margin: 16px 0;
}
.picker-item-small {
display: flex;
align-items: center;
justify-content: center;
height: 40px;
font-size: 14px;
color: #333;
}
.button-wrapper { .button-wrapper {
padding: 16px; padding: 16px;