195 lines
5.5 KiB
Vue
195 lines
5.5 KiB
Vue
<template>
|
|
<view class="px-2 text-3.5">
|
|
<view v-if="inline">
|
|
<view class="flex flex-items-center pos-relative pb-1.5" @click="toSelect">
|
|
<view v-if="required" class="color-#f62933 pos-absolute left--2 mt-1">*</view>
|
|
<view>{{ title }}</view>
|
|
<view class="ml-a mr-2" :class="[text ? 'custom-color-black' : 'color-#bfbfbf']">
|
|
{{ text || placeholder }}
|
|
</view>
|
|
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
|
</view>
|
|
</view>
|
|
<view v-else>
|
|
<view class="flex flex-items-center pos-relative">
|
|
<view v-if="required" class="color-#f62933 pos-absolute left--2 mt-1">*</view>
|
|
<view>{{ title }}</view>
|
|
</view>
|
|
<view class="py-2" @click="toSelect">
|
|
<view class="flex flex-items-center flex-justify-between">
|
|
<view :class="[text ? 'custom-color-black' : 'color-#bfbfbf']">
|
|
{{ text || placeholder }}
|
|
</view>
|
|
<wd-icon name="arrow-right" color="rgba(0,0,0,0.25)" size="18px"></wd-icon>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
<wd-popup v-model="show" position="bottom" custom-style="border-radius:12rpx;">
|
|
<view v-if="showDuration">
|
|
<view
|
|
class="px-4 py-2 text-3.5 border-b-1 border-[#dcdcdc] border-solid flex flex-items-center"
|
|
>
|
|
<view @click="show = false">取消</view>
|
|
<view class="font-bold text-4 flex-1 text-center">访问时长</view>
|
|
<view class="flex flex-items-center" @click="changeSelect">
|
|
<view class="custom-color-blue">自定义时间</view>
|
|
<wd-icon name="arrow-right" size="14px" class="ml-1" color="#255cf7"></wd-icon>
|
|
</view>
|
|
</view>
|
|
<scroll-view class="h-60 text-3.5" :scroll-y="true">
|
|
<view
|
|
v-for="item in durationList"
|
|
:key="item.value"
|
|
@click="changeDuration(item)"
|
|
class="py-4 px-4 flex flex-items-center"
|
|
>
|
|
<view>{{ item.label }}</view>
|
|
<view
|
|
class="bg-#f3f5fa ml-a w-12 h-6 rounded-5 flex flex-items-center flex-justify-center"
|
|
>
|
|
<wd-icon
|
|
v-if="duration === item.label"
|
|
name="check"
|
|
size="15px"
|
|
class="ml-1"
|
|
color="#255cf7"
|
|
></wd-icon>
|
|
</view>
|
|
</view>
|
|
</scroll-view>
|
|
</view>
|
|
<view v-else>
|
|
<view
|
|
class="px-4 py-2 text-3.5 border-b-1 border-[#dcdcdc] border-solid flex flex-items-center"
|
|
>
|
|
<view class="flex flex-items-center" @click="showDuration = true">
|
|
<wd-icon name="arrow-left" size="14px" class="ml-1" color="#0d0f10"></wd-icon>
|
|
<view class="custom-color-black">返回</view>
|
|
</view>
|
|
<view class="font-bold text-4 flex-1 text-center">时间选择器</view>
|
|
<wd-icon
|
|
name="close"
|
|
size="14px"
|
|
class="ml-1"
|
|
color="#0d0f10"
|
|
@click="show = false"
|
|
></wd-icon>
|
|
</view>
|
|
<wd-datetime-picker-view
|
|
:formatter="formatter"
|
|
type="datetime"
|
|
v-model="timestamp"
|
|
@change="change"
|
|
/>
|
|
</view>
|
|
<view
|
|
@click="confirm"
|
|
class="py-2.5 rounded custom-bg-blue w-90% mx-5% font-bold text-center color-white text-3.5 my-2"
|
|
>
|
|
完成
|
|
</view>
|
|
</wd-popup>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import dayjs from 'dayjs'
|
|
|
|
const text = ref<string | null>(null)
|
|
const show = ref<boolean>(false)
|
|
const timestamp = ref<number>(0)
|
|
const duration = ref<string>('')
|
|
|
|
const showDuration = ref<boolean>(true)
|
|
|
|
const formatter = (type, value) => {
|
|
switch (type) {
|
|
case 'year':
|
|
return value + '年'
|
|
case 'month':
|
|
return value + '月'
|
|
case 'date':
|
|
return value + '日'
|
|
case 'hour':
|
|
return value + '时'
|
|
case 'minute':
|
|
return value + '分'
|
|
default:
|
|
return value
|
|
}
|
|
}
|
|
|
|
const props = defineProps({
|
|
id: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
required: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
title: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
value: {
|
|
type: [String, null],
|
|
default: null
|
|
},
|
|
placeholder: {
|
|
type: String,
|
|
default: '请选择'
|
|
},
|
|
inline: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
})
|
|
|
|
const durationList = [
|
|
{ label: '30分钟', value: 1800000 },
|
|
{ label: '1小时', value: 3600000 },
|
|
{ label: '2小时', value: 7200000 },
|
|
{ label: '3小时', value: 10800000 },
|
|
{ label: '5小时', value: 18000000 },
|
|
{ label: '8小时', value: 28800000 },
|
|
{ label: '12小时', value: 43200000 },
|
|
{ label: '24小时', value: 86400000 }
|
|
]
|
|
|
|
onMounted(() => {
|
|
if (props.value) {
|
|
text.value = props.value
|
|
duration.value = props.value
|
|
}
|
|
})
|
|
|
|
const changeSelect = () => {
|
|
timestamp.value = new Date().getTime()
|
|
showDuration.value = false
|
|
}
|
|
|
|
const toSelect = () => {
|
|
show.value = true
|
|
}
|
|
|
|
const change = value => {
|
|
timestamp.value = value.value
|
|
duration.value = ''
|
|
}
|
|
|
|
const changeDuration = item => {
|
|
duration.value = item.label
|
|
timestamp.value = 0
|
|
}
|
|
|
|
const confirm = () => {
|
|
if (timestamp.value === 0) {
|
|
text.value = duration.value
|
|
} else {
|
|
text.value = dayjs(timestamp.value).format('YYYY-M-D HH:mm')
|
|
}
|
|
show.value = false
|
|
}
|
|
</script>
|