elective-generation-steps.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <div class="fx-column pl20 pr20">
  3. <div class="fx-row fx-cen-cen f18 f-333 bold">
  4. {{ title }}
  5. </div>
  6. <el-steps :active="activeStep" class="mt20">
  7. <el-step v-for="(step,idx) in steps" :key="step.key" :title="step.title" :status="step.status"
  8. @click.native="handleStepChange(step)" class="pointer">
  9. <template #title>
  10. <div class="rel"
  11. :class="{'bold':activeStep==idx+1, 'f-333':activeStep==idx+1&&step.value>generation.current}">
  12. <i v-if="activeStep==idx+1" class="el-icon-thumb current-pointer current-animation abs"></i>
  13. <el-popover v-else-if="!disableHiddenFeature&&step.value<generation.current&&step.value<activeStep"
  14. trigger="hover" class="abs current-view">
  15. <el-checkbox :value="generation.hiddenGenerations.includes(step.value)"
  16. @input="toggleGenerationTableData($event,step)">
  17. 隐藏{{ step.title }}表格数据
  18. </el-checkbox>
  19. <i slot="reference" class="el-icon-view pointer"
  20. :class="{'current-disabled': generation.hiddenGenerations.includes(step.value)}"
  21. @click.stop="toggleGenerationTableData(!generation.hiddenGenerations.includes(step.value), step)"></i>
  22. </el-popover>
  23. <span>
  24. {{ step.title }}</span>
  25. </div>
  26. </template>
  27. </el-step>
  28. </el-steps>
  29. </div>
  30. </template>
  31. <script>
  32. import { mapGetters } from 'vuex'
  33. export default {
  34. name: 'elective-generation-steps',
  35. model: {
  36. prop: 'modelValue',
  37. event: 'change'
  38. },
  39. props: {
  40. generation: {
  41. type: Object,
  42. default: () => ({})
  43. },
  44. modelValue: {
  45. type: String,
  46. default: '' // active step key.
  47. },
  48. disableHiddenFeature: {
  49. type: Boolean,
  50. default: false
  51. }
  52. },
  53. data() {
  54. return {
  55. activeStep: 0
  56. }
  57. },
  58. computed: {
  59. ...mapGetters(['school']),
  60. steps() {
  61. const options = this.generation.options
  62. const current = this.generation.current
  63. const visibleSteps = Object.keys(options)
  64. .filter(key => options[key].stepsVisible)
  65. return visibleSteps.map(key => {
  66. const opt = options[key]
  67. return {
  68. key: key,
  69. value: opt.value,
  70. title: opt.title,
  71. status: opt.value < current
  72. ? 'success'
  73. : opt.value > current
  74. ? 'wait'
  75. : 'process'
  76. }
  77. })
  78. },
  79. title() {
  80. const year = (this.generation.status.year + '').tailingFix('学年')
  81. const schoolName = this.school.schoolName
  82. const roundName = this.generation.status.roundName
  83. const options = this.generation.options
  84. let statusTip = this.generation.currentOpt?.title + '进行中...'
  85. let defaultOpt = this.generation.currentOpt
  86. if (this.generation.current < options.primary.value) {
  87. statusTip = '选科未开启'
  88. defaultOpt = options.primary
  89. } else if (this.generation.current > options.rankBalance.value) {
  90. statusTip = '选科结束'
  91. defaultOpt = options.forceAdjust
  92. }
  93. if (!this.modelValue) {
  94. console.log(this.steps.findIndex(item => item.value == defaultOpt.value) + 1)
  95. this.activeStep = this.steps.findIndex(item => item.value == defaultOpt.value) + 1
  96. this.$emit('change', defaultOpt.key)
  97. }
  98. return `${year}${schoolName}${roundName}(${statusTip})`
  99. }
  100. },
  101. methods: {
  102. handleStepChange(step) {
  103. const target = step.value
  104. this.generation.hiddenGenerations.remove(target) // force display
  105. if (target != this.activeStep) {
  106. this.activeStep = target
  107. this.$emit('change', step.key)
  108. }
  109. },
  110. toggleGenerationTableData(e, step) {
  111. if (e) {
  112. if (!this.generation.hiddenGenerations.includes(step.value)) {
  113. this.generation.hiddenGenerations.push(step.value)
  114. }
  115. } else {
  116. this.generation.hiddenGenerations.remove(step.value)
  117. }
  118. }
  119. }
  120. }
  121. </script>
  122. <style scoped>
  123. .current-pointer {
  124. left: -20px;
  125. top: 10px;
  126. }
  127. .current-view {
  128. left: -20px;
  129. }
  130. .current-disabled {
  131. color: #999999;
  132. }
  133. .current-animation {
  134. animation: finger infinite 2s;
  135. }
  136. @keyframes finger {
  137. 0% {
  138. transform: translate(-5px) rotate(90deg)
  139. }
  140. 25% {
  141. transform: translate(5px) rotate(90deg)
  142. }
  143. 50% {
  144. transform: translate(-5px) rotate(90deg)
  145. }
  146. 75% {
  147. transform: translate(5px) rotate(90deg)
  148. }
  149. 100% {
  150. transform: translate(-5px) rotate(90deg)
  151. }
  152. }
  153. </style>