SecSelect.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <div :class="['sec-select', { inline: inline }]">
  3. <el-form-item v-if="filterProps.includes('semesterId')" label="学期:">
  4. <semester-select
  5. v-model.trim="filter.semesterId"
  6. placeholder="学期"
  7. default-select
  8. :clearable="!defaultSelectExam"
  9. @default-selected="semesterDefaultSelect"
  10. @change="semesterChange"
  11. ></semester-select>
  12. </el-form-item>
  13. <el-form-item v-if="filterProps.includes('examId')" label="考试:">
  14. <exam-select
  15. v-model="filter.examId"
  16. :semester-id="filter.semesterId"
  17. :clearable="!defaultSelectExam || !defaultSelectCourse"
  18. :default-select="defaultSelectExam || defaultSelectCourse"
  19. @default-selected="examDefaultSelect"
  20. @change="examChange"
  21. ></exam-select>
  22. </el-form-item>
  23. <el-form-item
  24. v-if="filterProps.includes('courseCode')"
  25. label="课程(代码):"
  26. label-width="110px"
  27. >
  28. <course-select
  29. v-model.trim="filter.courseCode"
  30. :filter-data="{ semesterId: filter.semesterId, examId: filter.examId }"
  31. placeholder="课程(代码)"
  32. clearable
  33. :default-select="defaultSelectCourse"
  34. @default-selected="courseDefaultSelect"
  35. @change="courseChange"
  36. ></course-select>
  37. </el-form-item>
  38. </div>
  39. </template>
  40. <script>
  41. import SemesterSelect from "./base/SemesterSelect.vue";
  42. import ExamSelect from "./base/ExamSelect.vue";
  43. import CourseSelect from "./base/CourseSelect.vue";
  44. const fullProps = ["semesterId", "examId", "courseCode"];
  45. export default {
  46. name: "sec-select",
  47. components: { SemesterSelect, ExamSelect, CourseSelect },
  48. props: {
  49. value: {
  50. type: Object,
  51. default() {
  52. return {};
  53. },
  54. },
  55. inline: {
  56. type: Boolean,
  57. default: true,
  58. },
  59. defaultSelectExam: { type: Boolean, default: false },
  60. defaultSelectCourse: { type: Boolean, default: false },
  61. },
  62. data() {
  63. return {
  64. filter: {},
  65. filterProps: [],
  66. selectData: {},
  67. };
  68. },
  69. watch: {
  70. filter: {
  71. deep: true,
  72. handler() {
  73. this.emitChange();
  74. },
  75. },
  76. },
  77. created() {
  78. this.initData();
  79. this.filter = this.$objAssign(this.filter, this.value);
  80. },
  81. methods: {
  82. initData() {
  83. this.filterProps = fullProps.filter((field) =>
  84. Object.prototype.hasOwnProperty.call(this.value, field)
  85. );
  86. let filter = {};
  87. this.filterProps.forEach((field) => {
  88. filter[field] = "";
  89. });
  90. this.filter = filter;
  91. },
  92. getFilterData() {
  93. return Object.assign({}, this.value, this.filter);
  94. },
  95. emitChange() {
  96. const data = this.getFilterData();
  97. this.$emit("input", data);
  98. },
  99. semesterDefaultSelect() {
  100. if (this.defaultSelectExam) return;
  101. this.emitChange();
  102. this.$emit("semester-default", this.getFilterData());
  103. },
  104. examDefaultSelect() {
  105. if (this.defaultSelectCourse) return;
  106. this.emitChange();
  107. this.$emit("exam-default", this.getFilterData());
  108. },
  109. courseDefaultSelect() {
  110. this.emitChange();
  111. this.$emit("course-default", this.getFilterData());
  112. },
  113. semesterChange(val) {
  114. this.selectData.semester = val || {};
  115. this.$emit("change", this.selectData);
  116. },
  117. examChange(val) {
  118. this.selectData.exam = val || {};
  119. this.$emit("change", this.selectData);
  120. },
  121. courseChange(val) {
  122. this.selectData.course = val || {};
  123. this.$emit("change", this.selectData);
  124. },
  125. },
  126. };
  127. </script>
  128. <style scoped>
  129. .sec-select.inline {
  130. display: inline;
  131. }
  132. </style>