elective-generation-steps.vue 4.4 KB

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