SelectBlueDimensionDialog.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <template>
  2. <el-dialog
  3. class="select-blue-dimension-dialog"
  4. :visible.sync="modalIsShow"
  5. title="选择知识点"
  6. top="10vh"
  7. width="600px"
  8. :close-on-click-modal="false"
  9. :close-on-press-escape="false"
  10. append-to-body
  11. @opened="visibleChange"
  12. >
  13. <el-tree
  14. ref="treeRef"
  15. :data="treeData"
  16. show-checkbox
  17. check-on-click-node
  18. node-key="id"
  19. :props="defaultProps"
  20. >
  21. </el-tree>
  22. <div slot="footer">
  23. <el-button type="primary" @click="submit">确认</el-button>
  24. <el-button @click="cancel">取消</el-button>
  25. </div>
  26. </el-dialog>
  27. </template>
  28. <script>
  29. import { courseTargetList } from "../../base/api";
  30. export default {
  31. name: "select-blue-dimension-dialog",
  32. props: {
  33. selectedData: {
  34. type: Array,
  35. default() {
  36. return [];
  37. },
  38. },
  39. course: {
  40. type: Object,
  41. default() {
  42. return {
  43. examId: "",
  44. courseCode: "",
  45. };
  46. },
  47. },
  48. },
  49. data() {
  50. return {
  51. modalIsShow: false,
  52. treeData: [],
  53. defaultProps: {
  54. children: "children",
  55. label: "name",
  56. },
  57. };
  58. },
  59. watch: {
  60. course: {
  61. immediate: true,
  62. handler(val, oldVal) {
  63. if (!val) return;
  64. if (val !== oldVal) this.getTree();
  65. },
  66. },
  67. },
  68. methods: {
  69. async getTree() {
  70. const data = await courseTargetList({
  71. examId: this.course.examId,
  72. courseCode: this.course.courseCode,
  73. });
  74. this.treeData = (data || []).map((item) => {
  75. return {
  76. id: item.id,
  77. name: item.targetName,
  78. children: item.dimensionList,
  79. };
  80. });
  81. },
  82. visibleChange() {
  83. this.$refs.treeRef.setCheckedKeys(this.selectedData);
  84. },
  85. cancel() {
  86. this.modalIsShow = false;
  87. },
  88. open() {
  89. this.modalIsShow = true;
  90. },
  91. submit() {
  92. const selectedNodes = this.$refs.treeRef.getCheckedNodes(false, true);
  93. if (!selectedNodes.length) {
  94. this.$message.error("请选择知识点");
  95. return;
  96. }
  97. const targetNodes = selectedNodes.filter(
  98. (item) => item.children && item.children.length
  99. );
  100. if (targetNodes.length > 1) {
  101. this.$message.error("只能选择一个课程目标的知识点");
  102. return;
  103. }
  104. const dimensionIds = selectedNodes
  105. .filter((item) => !item.children)
  106. .map((item) => item.id);
  107. this.$emit(
  108. "confirm",
  109. targetNodes.map((item) => {
  110. return {
  111. targetId: item.id,
  112. targetName: item.name,
  113. dimensionList: item.children
  114. .filter((ditem) => dimensionIds.includes(ditem.id))
  115. .map((dimension) => {
  116. return {
  117. dimensionId: dimension.id,
  118. dimensionCode: dimension.code,
  119. dimensionName: dimension.name,
  120. };
  121. }),
  122. };
  123. })
  124. );
  125. this.cancel();
  126. },
  127. },
  128. };
  129. </script>