You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

380 lines
9.4 KiB

<template>
<view class="jnpf-dateTime">
<u-input input-align='right' type="select" :select-open="selectShow" v-model="innerValue"
:placeholder="placeholder" @click="openSelect" :disabled="disabled">
</u-input>
<u-popup v-model="selectShow" mode="bottom" @click="colse()">
<view class="t-pop" @tap.stop>
<view class="pop-main">
<view class="top">
<view class="top-l">
<view @click="changeSwp('1')" :style="{color:sindex==1?'#1E79FF':'#333333'}">
<text>{{checkyear}}</text>
</view>
<view @click="changeSwp('2')" :style="{color:sindex==2?'#1E79FF':'#333333'}"
v-if="allDay==0">
<text>{{checkhour}}:{{checkminute}}</text>
</view>
</view>
<view class="top-r" @click="onOK()">
<text>确定</text>
</view>
</view>
<swiper class="swiper" circular :current-item-id="sindex">
<swiper-item :item-id="'1'">
<view class="mid">
<scroll-view scroll-y="true" style="height: 960rpx" @scrolltolower="tolower">
<uni-calendar ref="calendar" :insert="insert" :lunar='lunar'
@change='calendarChange' :date='today' />
</scroll-view>
</view>
</swiper-item>
<swiper-item :item-id="'2'" v-if="allDay==0">
<picker-view :indicator-style="indicatorStyle" :value="swiperTime" @change="bindChange"
class="picker-view">
<picker-view-column>
<view class="item" v-for="(v,i) in 24" :key="i">{{i<10?'0'+i:i}}时</view>
</picker-view-column>
<picker-view-column>
<view class="item" v-for="(v,i) in 12" :key="i">{{i<2?'0'+i*5:i*5}}
</view>
</picker-view-column>
</picker-view>
</swiper-item>
</swiper>
</view>
</view>
</u-popup>
</view>
</template>
<script>
export default {
name: "t-datetime",
model: {
prop: 'value',
event: 'input'
},
props: {
type: {
type: Number,
default: 0 //默认时间后推0分钟
},
allDay: {
type: Number,
default: 0
},
value: {
type: String,
default: ''
},
date: {
type: Object,
default: () => {}
},
placeholder: {
type: String,
default: '请选择'
},
delayMin: {
type: Number,
default: 0 //默认时间后推0分钟
},
disabled: {
type: Boolean,
default: false
},
canToday: { //是否可选择当天之前的时间
type: Boolean,
default: false
},
},
data() {
return {
textList: ['日', '一', '二', '三', '四', '五', '六'],
mList: [],
checkyear: 0,
checkmonth: 0,
checkdate: 0,
checkhour: 0,
checkminute: 0,
indicatorStyle: `height: 50px;`,
sindex: '1',
nowYear: 0,
nowMonth: 0,
nowDate: 0,
lunar: false,
insert: true,
innerValue: '',
selectShow: false,
swiperTime: [],
year: 0,
hours: '',
minutes: '',
today: ''
};
},
watch: {
allDay(val) {
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
this.today = allTime
let srt = this.time(allTime)
this.innerValue = ''
if (srt) {
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
} else {
if (this.date.year == this.year) {
this.innerValue = this.date.month + '月' + this.date.date + '日'
} else {
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
}
}
if (this.allDay == 0) {
this.innerValue = this.innerValue + ' ' + this.hours + ':' +
this.minutes
}
},
date(val) {
this.init()
},
},
created() {
this.timestampToTime(+new Date())
this.init()
},
methods: {
tolower() {
this.init()
},
openSelect() {
if (this.disabled) return
this.selectShow = true
this.init()
},
calendarChange(e) {
this.date.year = e.year
this.date.month = e.month
this.date.date = e.date
this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
.year +
'年' + this.date.month + '月' + this.date.date + '日'
this.sindex = '2'
},
init() {
this.innerValue = ''
this.today = this.date.year + '-' + this.date.month + '-' + this.date.date
this.date.minutes = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
this.date.hours = this.date.hours < 10 ? '0' + Number(this.date.hours) : this.date.hours
this.date.date = this.date.date < 10 ? '0' + Number(this.date.date) : this.date.date
this.date.month = this.date.month < 10 ? '0' + Number(this.date.month) : this.date.month
this.checkyear = this.year == this.date.year ? this.date.month + '月' + this.date.date + '日' : this.date
.year + '年' + this.date.month + '月' + this.date.date + '日'
this.checkhour = this.date.hours
this.checkminute = this.date.minutes < 10 ? '0' + Number(this.date.minutes) : this.date.minutes
let checkminute = this.date.minutes / 5
this.swiperTime = [Number(this.checkhour), checkminute]
this.hours = this.date.hours
this.minutes = this.date.minutes
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
let srt = this.time(allTime)
if (srt) {
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
} else {
if (this.date.year == this.year) {
this.innerValue = this.date.month + '月' + this.date.date + '日'
} else {
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
}
}
if (this.allDay == 0) {
this.innerValue = this.innerValue + ' ' + this.hours + ':' +
this.checkminute
}
},
colse() {
this.selectShow = false
},
bindChange(e) {
const val = e.detail.value
this.swiperTime = [val[0], val[1]]
this.checkhour = Number(val[0]) < 10 ? '0' + val[0] : val[0]
this.checkminute = val[1] == '天' ? '00' : val[1] < 2 ? '0' + val[1] * 5 : val[1] * 5
},
changeSwp(i) {
this.sindex = i
},
onOK() {
if (this.allDay == 1) {
this.date.hours = '00'
this.date.minutes = '00'
} else {
this.date.hours = this.checkhour
this.date.minutes = this.checkminute
}
this.selectShow = false
let allTime = this.date.year + '-' + this.date.month + '-' + this.date.date
let srt = this.time(allTime)
if (srt) {
this.innerValue = srt + this.date.month + '月' + this.date.date + '日'
if (this.allDay == 0) {
this.innerValue = this.innerValue + ' ' + this.date.hours +
':' + this.date.minutes
}
} else {
if (this.date.year == this.year) {
this.innerValue = this.date.month + '月' + this.date.date + '日'
} else {
this.innerValue = this.date.year + '年' + this.date.month + '月' + this.date.date + '日'
}
if (this.allDay == 0) {
this.innerValue = this.innerValue + ' ' + this.date.hours +
':' + this.date.minutes
}
}
this.selectShow = false
this.$emit('confirm', this.date, this.type)
},
timestampToTime(timestamp) {
var date = new Date(timestamp);
this.year = date.getFullYear();
},
time(date) {
if (this.date.year != this.year) return false
let time_str = "";
if (new Date(date).getDate() === new Date().getDate()) {
time_str = "今天 · ";
} else if (new Date(date).getDate() === (new Date().getDate() - 1)) {
time_str = "昨天 · ";
} else if (new Date(date).getDate() === (new Date().getDate() + 1)) {
time_str = "明天 · ";
} else if (new Date(date).getDate() < new Date().getDate()) {
time_str = "";
}
return time_str;
}
}
}
</script>
<style lang="scss" scoped>
.jnpf-dateTime {
width: 100%;
/deep/.u-drawer {
z-index: 999 !important;
}
}
/deep/.uni-calendar-item__weeks-box-item {
line-height: 36rpx;
}
.t-pop {
width: 100%;
display: flex;
justify-content: center;
align-items: center;
.pop-main {
display: flex;
flex-direction: column;
justify-content: space-between;
align-items: center;
background-color: #fff;
border-radius: 24px;
height: 900rpx;
width: 100%;
}
}
.swiper {
height: 840rpx;
width: 100vw;
}
.top {
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
width: 100%;
margin: 20rpx 0;
.top-l {
display: flex;
flex-direction: row;
margin-left: 30rpx;
}
.top-r {
margin-right: 30rpx;
color: #1E79FF;
}
}
.calendar {
display: flex;
flex-wrap: wrap;
flex-direction: row;
align-items: center;
width: 100vw;
position: relative;
}
.ca-top {
width: 14.2vw;
display: flex;
justify-content: center;
align-items: center;
height: 66rpx;
z-index: 10;
}
.cell {
width: 60rpx;
height: 60rpx;
display: flex;
justify-content: center;
align-items: center;
align-content: center;
border-radius: 30rpx;
}
.cell-active {
background-color: #1E79FF;
color: #fff;
}
.cabg {
display: flex;
justify-content: center;
width: 100vw;
font-size: 180rpx;
color: beige;
position: absolute;
z-index: 9;
}
.picker-view {
width: 750rpx;
height: 600rpx;
margin-top: 20rpx;
}
.item {
height: 50px;
display: flex;
align-items: center;
justify-content: center;
text-align: center;
}
</style>