// 主要用于日和星期的互斥使用
|
const TYPE_NOT_SET = 'TYPE_NOT_SET'
|
const TYPE_EVERY = 'TYPE_EVERY'
|
const TYPE_RANGE = 'TYPE_RANGE'
|
const TYPE_LOOP = 'TYPE_LOOP'
|
const TYPE_WORK = 'TYPE_WORK'
|
const TYPE_LAST = 'TYPE_LAST'
|
const TYPE_SPECIFY = 'TYPE_SPECIFY'
|
|
const DEFAULT_VALUE = '?'
|
|
export default {
|
model: {
|
prop: 'prop',
|
event: 'change'
|
},
|
props: {
|
prop: {
|
type: String,
|
default: DEFAULT_VALUE
|
},
|
disabled: {
|
type: Boolean,
|
default: false
|
}
|
},
|
data () {
|
const type = TYPE_EVERY
|
return {
|
DEFAULT_VALUE,
|
// 类型
|
type,
|
// 启用日或者星期互斥用
|
TYPE_NOT_SET,
|
TYPE_EVERY,
|
TYPE_RANGE,
|
TYPE_LOOP,
|
TYPE_WORK,
|
TYPE_LAST,
|
TYPE_SPECIFY,
|
// 对于不同的类型,所定义的值也有所不同
|
valueRange: {
|
start: 0,
|
end: 0
|
},
|
valueLoop: {
|
start: 0,
|
interval: 1
|
},
|
valueWeek: {
|
start: 0,
|
end: 0
|
},
|
valueList: [],
|
valueWork: 1,
|
maxValue: 0,
|
minValue: 0
|
}
|
},
|
watch: {
|
prop (newVal, oldVal) {
|
if (newVal === this.value_c) {
|
// console.info('skip ' + newVal)
|
return
|
}
|
this.parseProp(newVal)
|
}
|
},
|
computed: {
|
value_c () {
|
let result = []
|
switch (this.type) {
|
case TYPE_NOT_SET:
|
result.push('?')
|
break
|
case TYPE_EVERY:
|
result.push('*')
|
break
|
case TYPE_RANGE:
|
result.push(`${this.valueRange.start}-${this.valueRange.end}`)
|
break
|
case TYPE_LOOP:
|
result.push(`${this.valueLoop.start}/${this.valueLoop.interval}`)
|
break
|
case TYPE_WORK:
|
result.push(`${this.valueWork}W`)
|
break
|
case TYPE_LAST:
|
result.push('L')
|
break
|
case TYPE_SPECIFY:
|
if (this.valueList.length === 0) {
|
this.valueList.push(this.minValue)
|
}
|
result.push(this.valueList.join(','))
|
break
|
default:
|
result.push(this.DEFAULT_VALUE)
|
break
|
}
|
return result.length > 0 ? result.join('') : this.DEFAULT_VALUE
|
},
|
// 指定值范围区间,介于最小值和最大值之间
|
specifyRange() {
|
let range = []
|
for (let i = this.minValue; i <= this.maxValue; i++) {
|
range.push(i)
|
}
|
return range
|
},
|
},
|
methods: {
|
parseProp (value) {
|
if (value === this.value_c) {
|
// console.info('same ' + value)
|
return
|
}
|
if (typeof (this.preProcessProp) === 'function') {
|
value = this.preProcessProp(value)
|
}
|
try {
|
if (!value || value === this.DEFAULT_VALUE) {
|
this.type = TYPE_EVERY
|
} else if (value.indexOf('?') >= 0) {
|
this.type = TYPE_NOT_SET
|
} else if (value.indexOf('-') >= 0) {
|
this.type = TYPE_RANGE
|
const values = value.split('-')
|
if (values.length >= 2) {
|
this.valueRange.start = parseInt(values[0])
|
this.valueRange.end = parseInt(values[1])
|
}
|
} else if (value.indexOf('/') >= 0) {
|
this.type = TYPE_LOOP
|
const values = value.split('/')
|
if (values.length >= 2) {
|
this.valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0])
|
this.valueLoop.interval = parseInt(values[1])
|
}
|
} else if (value.indexOf('W') >= 0) {
|
this.type = TYPE_WORK
|
const values = value.split('W')
|
if (!values[0] && !isNaN(values[0])) {
|
this.valueWork = parseInt(values[0])
|
}
|
} else if (value.indexOf('L') >= 0) {
|
this.type = TYPE_LAST
|
const values = value.split('L')
|
this.valueLast = parseInt(values[0])
|
} else if (value.indexOf(',') >= 0 || !isNaN(value)) {
|
this.type = TYPE_SPECIFY
|
this.valueList = value.split(',').map(item => parseInt(item))
|
} else {
|
this.type = TYPE_EVERY
|
}
|
} catch (e) {
|
// console.info(e)
|
this.type = TYPE_EVERY
|
}
|
}
|
}
|
}
|