4104c1bdbaf1b6a332295b33f2d1f4f58402c013.svn-base 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // 主要用于日和星期的互斥使用
  2. const TYPE_NOT_SET = 'TYPE_NOT_SET'
  3. const TYPE_EVERY = 'TYPE_EVERY'
  4. const TYPE_RANGE = 'TYPE_RANGE'
  5. const TYPE_LOOP = 'TYPE_LOOP'
  6. const TYPE_WORK = 'TYPE_WORK'
  7. const TYPE_LAST = 'TYPE_LAST'
  8. const TYPE_SPECIFY = 'TYPE_SPECIFY'
  9. const DEFAULT_VALUE = '?'
  10. export default {
  11. model: {
  12. prop: 'prop',
  13. event: 'change'
  14. },
  15. props: {
  16. prop: {
  17. type: String,
  18. default: DEFAULT_VALUE
  19. },
  20. disabled: {
  21. type: Boolean,
  22. default: false
  23. }
  24. },
  25. data () {
  26. const type = TYPE_EVERY
  27. return {
  28. DEFAULT_VALUE,
  29. // 类型
  30. type,
  31. // 启用日或者星期互斥用
  32. TYPE_NOT_SET,
  33. TYPE_EVERY,
  34. TYPE_RANGE,
  35. TYPE_LOOP,
  36. TYPE_WORK,
  37. TYPE_LAST,
  38. TYPE_SPECIFY,
  39. // 对于不同的类型,所定义的值也有所不同
  40. valueRange: {
  41. start: 0,
  42. end: 0
  43. },
  44. valueLoop: {
  45. start: 0,
  46. interval: 1
  47. },
  48. valueWeek: {
  49. start: 0,
  50. end: 0
  51. },
  52. valueList: [],
  53. valueWork: 1,
  54. maxValue: 0,
  55. minValue: 0
  56. }
  57. },
  58. watch: {
  59. prop (newVal, oldVal) {
  60. if (newVal === this.value_c) {
  61. // console.info('skip ' + newVal)
  62. return
  63. }
  64. this.parseProp(newVal)
  65. }
  66. },
  67. computed: {
  68. value_c () {
  69. let result = []
  70. switch (this.type) {
  71. case TYPE_NOT_SET:
  72. result.push('?')
  73. break
  74. case TYPE_EVERY:
  75. result.push('*')
  76. break
  77. case TYPE_RANGE:
  78. result.push(`${this.valueRange.start}-${this.valueRange.end}`)
  79. break
  80. case TYPE_LOOP:
  81. result.push(`${this.valueLoop.start}/${this.valueLoop.interval}`)
  82. break
  83. case TYPE_WORK:
  84. result.push(`${this.valueWork}W`)
  85. break
  86. case TYPE_LAST:
  87. result.push('L')
  88. break
  89. case TYPE_SPECIFY:
  90. if (this.valueList.length === 0) {
  91. this.valueList.push(this.minValue)
  92. }
  93. result.push(this.valueList.join(','))
  94. break
  95. default:
  96. result.push(this.DEFAULT_VALUE)
  97. break
  98. }
  99. return result.length > 0 ? result.join('') : this.DEFAULT_VALUE
  100. },
  101. // 指定值范围区间,介于最小值和最大值之间
  102. specifyRange() {
  103. let range = []
  104. for (let i = this.minValue; i <= this.maxValue; i++) {
  105. range.push(i)
  106. }
  107. return range
  108. },
  109. },
  110. methods: {
  111. parseProp (value) {
  112. if (value === this.value_c) {
  113. // console.info('same ' + value)
  114. return
  115. }
  116. if (typeof (this.preProcessProp) === 'function') {
  117. value = this.preProcessProp(value)
  118. }
  119. try {
  120. if (!value || value === this.DEFAULT_VALUE) {
  121. this.type = TYPE_EVERY
  122. } else if (value.indexOf('?') >= 0) {
  123. this.type = TYPE_NOT_SET
  124. } else if (value.indexOf('-') >= 0) {
  125. this.type = TYPE_RANGE
  126. const values = value.split('-')
  127. if (values.length >= 2) {
  128. this.valueRange.start = parseInt(values[0])
  129. this.valueRange.end = parseInt(values[1])
  130. }
  131. } else if (value.indexOf('/') >= 0) {
  132. this.type = TYPE_LOOP
  133. const values = value.split('/')
  134. if (values.length >= 2) {
  135. this.valueLoop.start = value[0] === '*' ? 0 : parseInt(values[0])
  136. this.valueLoop.interval = parseInt(values[1])
  137. }
  138. } else if (value.indexOf('W') >= 0) {
  139. this.type = TYPE_WORK
  140. const values = value.split('W')
  141. if (!values[0] && !isNaN(values[0])) {
  142. this.valueWork = parseInt(values[0])
  143. }
  144. } else if (value.indexOf('L') >= 0) {
  145. this.type = TYPE_LAST
  146. const values = value.split('L')
  147. this.valueLast = parseInt(values[0])
  148. } else if (value.indexOf(',') >= 0 || !isNaN(value)) {
  149. this.type = TYPE_SPECIFY
  150. this.valueList = value.split(',').map(item => parseInt(item))
  151. } else {
  152. this.type = TYPE_EVERY
  153. }
  154. } catch (e) {
  155. // console.info(e)
  156. this.type = TYPE_EVERY
  157. }
  158. }
  159. }
  160. }