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.
296 lines
7.6 KiB
296 lines
7.6 KiB
<template>
|
|
<div class="field-box">
|
|
<el-avatar class="avater" :icon="avaterCpd.icon" :style="{backgroundColor:avaterCpd.color}">{{avaterCpd.innerText}}</el-avatar>
|
|
|
|
<div class="field-info">
|
|
<slot name="field-info" :value="dateRange">
|
|
<span class="field-value" v-if="!avaterCpd.isNull">{{avaterCpd.innerText}} </span>
|
|
<span class="field-value" v-else><span class="label-font-color">无</span></span>
|
|
<slot name="label">
|
|
<span class="field-label">{{label}}</span>
|
|
|
|
<div v-if="disabled!==true" class="my-select" name="select" :value="dateRange">
|
|
|
|
<el-date-picker :type="type" :style="styleObj" v-model="dateRange" :value-format="valueFormat" :format="format"
|
|
unlink-panels
|
|
:range-separator="rangeSepaSrator"
|
|
:start-placeholder="startPlaceholder"
|
|
:end-placeholder="endPlaceholder"
|
|
:default-range="[-30,0]"
|
|
@change="onDateRangeChange"
|
|
:picker-options="pickerOptions"
|
|
></el-date-picker>
|
|
</div>
|
|
</slot>
|
|
</slot>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import util from '@/common/js/util'
|
|
export default {
|
|
name: 'date-range',
|
|
components: { },
|
|
computed: {
|
|
avaterCpd(){
|
|
var isEmpty=this.dateRange==null ||this.dateRange.length==0
|
|
var formatDate=isEmpty?"":this.formatDateRange(this.dateRange);
|
|
var obj={isNull:isEmpty,icon:'el-icon-date',color:'#E4E7ED',innerText:formatDate}
|
|
if(this.getColor||this.color){
|
|
if(this.getColor){
|
|
obj.color= this.getColor(this.dateRange)
|
|
}else{
|
|
obj.color=this.color
|
|
}
|
|
|
|
}else{
|
|
if(!isEmpty){
|
|
obj.color= util.getColor(this.dateRange)
|
|
}
|
|
}
|
|
if(this.getIcon||this.icon){
|
|
if(this.getIcon){
|
|
obj.icon= this.getIcon(this.dateRange)
|
|
}else if(this.icon){
|
|
obj.icon=this.icon
|
|
}
|
|
}
|
|
|
|
return obj;
|
|
}
|
|
},
|
|
data(){
|
|
return {
|
|
dateRange:[],
|
|
}
|
|
},
|
|
watch:{
|
|
dateRange(){
|
|
|
|
},
|
|
value:{
|
|
deep:true,
|
|
handler(){
|
|
this.initData();
|
|
}
|
|
|
|
}
|
|
},
|
|
props: {
|
|
disabled:{
|
|
type:Boolean,
|
|
default:false,
|
|
},
|
|
value: {
|
|
|
|
},
|
|
label:{
|
|
type:String,
|
|
default:'起止时间',
|
|
},
|
|
type: {
|
|
type: String,
|
|
default: 'daterange'
|
|
},
|
|
startKey: {
|
|
type: String,
|
|
default: 'startTime'
|
|
},
|
|
|
|
styleObj:{
|
|
typeof:Object,
|
|
default:function(){return { maxWidth:'100%' }}
|
|
},
|
|
|
|
endKey: {
|
|
type: String,
|
|
default: 'endTime'
|
|
},
|
|
|
|
valueFormat: {
|
|
type: String,
|
|
default: 'yyyy-MM-dd HH:mm:ss'
|
|
},
|
|
|
|
format: {
|
|
type: String,
|
|
default: 'yyyy-MM-dd'
|
|
},
|
|
startPlaceholder: {
|
|
type: String,
|
|
default: '开始日期'
|
|
},
|
|
|
|
endPlaceholder: {
|
|
type: String,
|
|
default: '结束日期'
|
|
},
|
|
rangeSepaSrator:{
|
|
type: String,
|
|
default: '~'
|
|
},
|
|
pickerOptions:{
|
|
typeof:Object,
|
|
default:function(){return util.getPickerOptions('datarange')}
|
|
},
|
|
autoDefault:{
|
|
type:Boolean,
|
|
default:true,
|
|
},
|
|
defaultRange:{
|
|
type:Array,
|
|
default:function(){
|
|
return [-15,15]
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
formatDateRange(dateRange){
|
|
if(!dateRange||dateRange.length==0){
|
|
return ""
|
|
}else{
|
|
if(dateRange.length==1){
|
|
return util.formatDate(new Date(dateRange[0]),this.format)
|
|
}else if(dateRange.length==2){
|
|
return util.formatDate(new Date(dateRange[0]),this.format)+this.rangeSepaSrator+util.formatDate(new Date(dateRange[1]),this.format)
|
|
}
|
|
}
|
|
},
|
|
initData(){
|
|
this.dateRange=[];
|
|
if(this.value instanceof Array){
|
|
this.dateRange=this.value
|
|
}else if(this.value instanceof Object){
|
|
if(this.value && this.value[this.startKey] && this.value[this.endKey]){
|
|
this.dateRange=[this.value[this.startKey],this.value[this.endKey]]
|
|
}
|
|
}
|
|
if( !this.dateRange || this.dateRange.length===0){
|
|
if(this.autoDefault===true || (this.autoDefault!==false && this.defaultRange && this.defaultRange.length==2)){
|
|
var now=new Date();
|
|
var start=new Date();
|
|
var end=new Date();
|
|
start.setTime(now.getTime() + 3600 * 1000 * 24 * this.defaultRange[0]);
|
|
end.setTime(now.getTime() + 3600 * 1000 * 24 * this.defaultRange[1]);
|
|
this.dateRange.push(util.formatDate(start,this.valueFormat))
|
|
this.dateRange.push(util.formatDate(end,this.valueFormat))
|
|
this.onDateRangeChange(this.dateRange);
|
|
}
|
|
}
|
|
|
|
},
|
|
onDateRangeChange(dates){
|
|
if(this.value && this.value instanceof Object){
|
|
if(dates && dates.length===2){
|
|
this.value[this.startKey]=dates[0]
|
|
this.value[this.endKey]=dates[1]
|
|
}else if(dates && dates.length===1){
|
|
this.value[this.startKey]=dates[0]
|
|
this.value[this.endKey]=null
|
|
}else if(dates && dates.length===0){
|
|
this.value[this.startKey]=null
|
|
this.value[this.endKey]=null
|
|
}
|
|
this.$emit('input',this.value)
|
|
}else if(this.value instanceof Array){
|
|
this.$emit('input',dates)
|
|
}
|
|
this.$emit('change',dates)
|
|
},
|
|
getMyAvaterInfo(item){
|
|
if(!item||item.length==0){
|
|
return ""
|
|
}else{
|
|
return item[0]
|
|
}
|
|
},
|
|
getMyColor(item){
|
|
if(this.getColor){
|
|
return this.getColor(item)
|
|
}
|
|
if(item && item.length>0){
|
|
return util.getColor(item[0])
|
|
}else{
|
|
return util.getColor("")
|
|
}
|
|
},
|
|
getMyIcon(item){
|
|
if(this.getIcon){
|
|
return this.getIcon(item)
|
|
}else{
|
|
return "el-icon-date";
|
|
}
|
|
},
|
|
},
|
|
mounted(){
|
|
this.initData();
|
|
}
|
|
}
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
|
|
|
.field-box {
|
|
display: flex;
|
|
margin-right:5px;
|
|
align-items: center;
|
|
cursor: pointer;
|
|
height: 40px;
|
|
line-height: 40px;
|
|
.avater {
|
|
background-color:#FF9F73;
|
|
}
|
|
|
|
.field-info {
|
|
|
|
height: 40px;
|
|
line-height: 40px;
|
|
margin-left: 10px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
.field-value {
|
|
height: 20px;
|
|
line-height: 20px;
|
|
font-size: 0.75rem;
|
|
}
|
|
.field-label{
|
|
height: 20px;
|
|
line-height: 20px;
|
|
font-size: 0.75rem;
|
|
color: #C0C4CC;
|
|
}
|
|
|
|
}
|
|
.my-select{
|
|
height: 20px;
|
|
line-height: 20px;
|
|
margin-left: 5px;
|
|
margin-right:5px;
|
|
max-width: 250px;
|
|
display: none;
|
|
}
|
|
|
|
}
|
|
.field-box:hover .field-label{
|
|
display: none;
|
|
}
|
|
.field-box:hover .my-select{
|
|
height: 20px;
|
|
margin-left: 5px;
|
|
display: inline;
|
|
}
|
|
.dashed-circle{
|
|
width:40px;
|
|
height:40px;
|
|
border:2px dashed #000000;
|
|
border-radius:40px/40px;
|
|
}
|
|
.field-box:hover .dashed-circle{
|
|
|
|
border:2px dashed #409EFF;
|
|
}
|
|
</style>
|