181 lines
4.6 KiB
Vue
181 lines
4.6 KiB
Vue
<template>
|
|
<u-popup
|
|
:show="show"
|
|
mode="bottom"
|
|
:round="10"
|
|
:closeable="true"
|
|
@close="handleClose"
|
|
>
|
|
<view class="c-dialog">
|
|
<view class="box"><text>常用时间选择</text></view>
|
|
<view class="box-btn">
|
|
<text
|
|
v-for="(item, index) in state.statusList"
|
|
:key="index"
|
|
:class="{ active: state.currentStates === item.id }"
|
|
@click="handleSelect(item)"
|
|
>{{ item.name }}</text
|
|
></view
|
|
>
|
|
<view class="box box-border"
|
|
><text>其它时间选择</text
|
|
><text class="btn" @click="handleCustom()">自定义</text></view
|
|
>
|
|
|
|
<view v-if="showCalendar">
|
|
<view class="line"></view>
|
|
<view class="box">
|
|
<text @click="showCalendar = false">取消</text>
|
|
<text class="btn" @click="confirm()">完成</text>
|
|
</view>
|
|
<view>{{ state.startTime }} - {{ state.endTime }}</view>
|
|
<uni-calendar
|
|
:insert="true"
|
|
:lunar="true"
|
|
:start-date="'2014-1-1'"
|
|
:end-date="'2034-1-1'"
|
|
:range="true"
|
|
@change="handleChangeDate"
|
|
color="#00D2E3"
|
|
/>
|
|
</view>
|
|
</view>
|
|
</u-popup>
|
|
</template>
|
|
<script setup lang="ts">
|
|
import { formatDate, getCurrentMonthStartAndEnd, getCurrentYearStartAndEnd } from "@/utils";
|
|
|
|
const props = defineProps<{
|
|
show: boolean;
|
|
}>();
|
|
const state = reactive<any>({
|
|
startTime: "",
|
|
endTime: "",
|
|
currentStates: -1,
|
|
statusList: [
|
|
{
|
|
id: 1,
|
|
name: "今日",
|
|
},
|
|
{
|
|
id: 2,
|
|
name: "昨日",
|
|
},
|
|
{
|
|
id: 3,
|
|
name: "本月",
|
|
},
|
|
{
|
|
id: 4,
|
|
name: "本年",
|
|
},
|
|
],
|
|
});
|
|
const emit = defineEmits(["handleDialog", "changeTime"]);
|
|
const handleClose = () => {
|
|
emit("handleDialog", false);
|
|
};
|
|
const handleCustom = () => {
|
|
showCalendar.value = true
|
|
state.currentStates = -1
|
|
}
|
|
|
|
const handleSelect = (item: any) => {
|
|
const today = new Date();
|
|
const yesterday = new Date((today as any) - (24 * 60 * 60 * 1000));
|
|
state.currentStates = item.id;
|
|
console.log(item);
|
|
if (item.id === 1) {
|
|
state.startTime = formatDate(today, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(today, "{y}-{m}-{d}");
|
|
} else if (item.id === 2) {
|
|
state.startTime = formatDate(yesterday, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(yesterday, "{y}-{m}-{d}");
|
|
} else if (item.id === 3) {
|
|
state.startTime = formatDate(getCurrentMonthStartAndEnd().start, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(getCurrentMonthStartAndEnd().end, "{y}-{m}-{d}");
|
|
} else if (item.id === 4) {
|
|
state.startTime = formatDate(getCurrentYearStartAndEnd().start, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(getCurrentYearStartAndEnd().end, "{y}-{m}-{d}");
|
|
}
|
|
emit("changeTime", {startTime: state.startTime, endTime: state.endTime});
|
|
emit("handleDialog", false);
|
|
};
|
|
|
|
const showCalendar = ref(false);
|
|
const handleChangeDate = (v: any) => {
|
|
const time1 = v.range.before;
|
|
const time2 = v.range.after;
|
|
if (time1 && time2) {
|
|
const date1 = new Date(time1);
|
|
const date2 = new Date(time2);
|
|
if (date1 < date2) {
|
|
state.startTime = formatDate(time1, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(time2, "{y}-{m}-{d}");
|
|
} else if (date1 > date2) {
|
|
state.startTime = formatDate(time2, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(time1, "{y}-{m}-{d}");
|
|
} else {
|
|
state.startTime = formatDate(time1, "{y}-{m}-{d}");
|
|
state.endTime = formatDate(time2, "{y}-{m}-{d}");
|
|
}
|
|
}
|
|
};
|
|
|
|
const confirm = () => {
|
|
showCalendar.value = false
|
|
emit("changeTime", {startTime: state.startTime, endTime: state.endTime});
|
|
emit("handleDialog", false);
|
|
}
|
|
</script>
|
|
<style lang="scss" scoped>
|
|
::v-deep .u-popup__content {
|
|
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
|
|
border-radius: 32rpx 32rpx 0rpx 0rpx;
|
|
}
|
|
.c-dialog {
|
|
margin: 65.38rpx 44.87rpx;
|
|
font-family: Source Han Sans CN;
|
|
font-weight: 500;
|
|
font-size: 26rpx;
|
|
color: #000000;
|
|
.box-btn,
|
|
.box {
|
|
line-height: 80rpx;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
}
|
|
.box-btn {
|
|
line-height: 40rpx;
|
|
margin-bottom: 30rpx;
|
|
text {
|
|
font-weight: 400;
|
|
font-size: 26rpx;
|
|
color: #999999;
|
|
width: 140rpx;
|
|
background: #ffffff;
|
|
border-radius: 6rpx;
|
|
border: 1px solid rgba(153, 153, 153, 0.64);
|
|
text-align: center;
|
|
cursor: pointer;
|
|
}
|
|
.active {
|
|
border-color: $u-primary;
|
|
color: $u-primary;
|
|
}
|
|
}
|
|
.btn {
|
|
font-weight: 500;
|
|
font-size: 26rpx;
|
|
color: $u-primary;
|
|
}
|
|
.box-border {
|
|
border-top: 1px solid rgba(233, 233, 233, 0.76);
|
|
}
|
|
.line {
|
|
height: 18rpx;
|
|
background: #f8f8f8;
|
|
}
|
|
}
|
|
</style>
|