qa-prevention-gwj-first-app/components/rattenking-dtpicker/rattenking-dtpicker.vue

229 lines
5.3 KiB
Vue
Raw Normal View History

2023-11-07 09:43:46 +08:00
<template>
<picker class='rui-picker rui-class' mode="multiSelector" :range="times" :start="startValue" :end="endValue" :value="timesIndex" :disabled="curDisabled" @change='changeDate' @cancel="cancelDate" @columnchange="columnchangeDate">
{{curValue}}
</picker>
</template>
<script>
import GetDate from './GetDate.js';
export default {
name: 'rattenking-dtpicker',
props: {
/**
* picker允许选中的最小值
*/
start: {
type: String,
default: '2000-01-01'
},
/**
* picker允许选中的最大值
*/
end: {
type: String,
default: '2100-12-31'
},
/**
* picker默认展示的值
*/
value: {
type: String,
default: ''
},
/**
* picker的时间粒度
*/
fields: {
type: String,
default: 'day'
},
/**
* picker是否禁止
*/
disabled: {
type: Boolean,
default: false
},
/**
* 是否显示中文
*/
isShowChinese: {
type: Boolean,
default: true
}
},
data() {
return {
times:[],
timesIndex: [],
timesString: null,
curValue: null,
startValue: null,
endValue: null,
curDisabled: null,
cancel: null,
lens: {
year: 1,
month: 2,
day: 3,
hour: 4,
minute: 5,
second: 6
}
}
},
watch: {
curDisabled(val){
this.curDisabled = val;
},
curValue(val) {
this.curValue = val;
this.$emit('change', val);
},
start(val){
if (this.validStr(val)) {
this.startValue = val;
}
},
end(val){
if (this.validStr(val)) {
this.endValue = val;
this.judgeStartEndTime();
this.updateTimesAndIndex();
}
},
times(val){
this.times = val;
},
timesIndex(val){
this.timesIndex = val;
},
cancel(val) {
this.$emit('cancel', val);
}
},
created() {
this.initData();
this.judgeTimeFields();
this.judgeStartEndTime();
this.updateTimesAndIndex();
},
methods: {
initData(){
// 初始化默认时间和是否禁止
this.curValue = this.value;
this.curDisabled = this.disabled;
},
judgeStartEndTime(){
// 判断开始和结束时间大小
let starttimestamp = GetDate.getTimes(this.start);
let endtimestamp = GetDate.getTimes(this.end);
if(endtimestamp <= starttimestamp){
this.curTimes = GetDate.getCurrentTimes(starttimestamp);
this.endTimes = GetDate.getCurrentTimes(starttimestamp);
this.startTimes = GetDate.getCurrentTimes(starttimestamp);
this.startValue = this.start;
this.endValue = this.start;
} else {
this.endTimes = GetDate.getCurrentTimes(endtimestamp);
this.startTimes = GetDate.getCurrentTimes(starttimestamp);
this.startValue = this.start;
this.endValue = this.end;
}
},
judgeTimeFields(){
// 处理默认显示时间
let fields = this.fields;
let curTimes = GetDate.getCurrentTimes();
let curtimestamp = +new Date(this.curValue);
if(curtimestamp === 0 || curtimestamp){
curTimes = GetDate.getCurrentTimes(curtimestamp);
}
this.curTimes = curTimes;
},
updateTimesAndIndex(){
// 更新times和index
let opts = {
startTimes: this.startTimes.detail,
endTimes: this.endTimes.detail,
curTimes: this.curTimes.detail,
fields: this.fields
}
let times = GetDate.getDateTimes(opts);
// console.info(times)
this.times = times;
let curtimes = Object.values(this.curTimes.detail);
// console.info(curtimes)
this.timesIndex = times.map((cur,index) => {
var idn = cur.findIndex((cu,idx) => curtimes[index] == cu);
return idn > -1 ? idn : 0;
})
},
getRealCurValue(){
// 获取当前选中的时间字符串
// console.info(this.timesIndex)
var arr = this.timesIndex.map((cur, index) => {
return this.times[index][cur]
})
// console.info(arr)
let flag = true
while (flag) {
if (this.checkDate(arr[0]+'-'+GetDate.withData(arr[1])+'-'+GetDate.withData(arr[2]))) {
flag = false
} else {
arr[2] = arr[2] - 1
}
}
return GetDate.format(arr);
},
checkDate(date){
return (new Date(date).getDate()==date.substring(date.length-2));
},
changeDate(e){
// 确认选中时间
let values = e.detail.value;
this.timesIndex = values;
this.curValue = this.getRealCurValue();
},
columnchangeDate(e){
// 滑动更新times和index
let column = e.detail.column;
let value = e.detail.value;
// console.info('column:' + column +' , value:' + value)
// console.info(this.timesIndex)
this.timesIndex[column] = value;
for(let i = 0; i < this.lens[this.fields]; i++){
// console.info('------------------' + i + '------------------')
let realvalue = this.getRealCurValue();
// console.info(realvalue)
// console.info(GetDate.getTimes(realvalue))
this.curTimes = GetDate.getCurrentTimes(GetDate.getTimes(realvalue));
// console.info(this.curTimes)
this.updateTimesAndIndex();
}
},
cancelDate(e){
this.cancel = e
}
}
}
</script>
<style>
.rui-picker{
height: 10vw;
font-size: 4vw;
color: #000;
display: -webkit-flex;
display: flex;
align-items: center;
padding: 0 20px 0 10px;
box-sizing: border-box;
justify-content: flex-end;
font-size: 26upx
}
.rui-picker::after{
top: -6px;
}
</style>