SelectDimensionDialog.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <div>
  3. <el-dialog
  4. class="select-dimension-dialog page-dialog"
  5. :visible.sync="modalIsShow"
  6. title="选择知识点"
  7. top="10px"
  8. width="600px"
  9. :close-on-click-modal="false"
  10. :close-on-press-escape="false"
  11. append-to-body
  12. @opened="visibleChange"
  13. >
  14. <div class="box-justify mb-2">
  15. <div></div>
  16. <el-button type="success" @click="toImport">导入课程知识点</el-button>
  17. </div>
  18. <div class="part-box part-box-pad mb-0">
  19. <el-tree
  20. ref="treeRef"
  21. :data="treeData"
  22. show-checkbox
  23. check-on-click-node
  24. check-strictly
  25. :expand-on-click-node="false"
  26. node-key="id"
  27. default-expand-all
  28. :props="defaultProps"
  29. >
  30. </el-tree>
  31. </div>
  32. <div slot="footer">
  33. <el-button type="primary" @click="submit">确认</el-button>
  34. <el-button @click="cancel">取消</el-button>
  35. </div>
  36. </el-dialog>
  37. <!-- ImportFile -->
  38. <import-file
  39. ref="ImportFile"
  40. title="导入课程知识点"
  41. :upload-url="uploadUrl"
  42. :upload-data="{
  43. teachCourseId: course.teachCourseId,
  44. }"
  45. :format="['xls', 'xlsx']"
  46. :download-handle="() => downloadTemplate('courseProperty')"
  47. :download-filename="dfilename"
  48. :auto-upload="false"
  49. @upload-success="dimensionUploaded"
  50. ></import-file>
  51. </div>
  52. </template>
  53. <script>
  54. import { courseDimensionTree } from "../../api";
  55. import ImportFile from "@/components/ImportFile.vue";
  56. import templateDownload from "@/mixins/templateDownload";
  57. export default {
  58. name: "select-dimension-dialog",
  59. components: { ImportFile },
  60. mixins: [templateDownload],
  61. props: {
  62. selectedData: {
  63. type: Array,
  64. default() {
  65. return [];
  66. },
  67. },
  68. disabledData: {
  69. type: Array,
  70. default() {
  71. return [];
  72. },
  73. },
  74. course: {
  75. type: Object,
  76. default() {
  77. return {
  78. teachCourseId: "",
  79. };
  80. },
  81. },
  82. },
  83. data() {
  84. return {
  85. modalIsShow: false,
  86. treeData: [],
  87. defaultProps: {
  88. children: "children",
  89. label: "name",
  90. },
  91. // import
  92. uploadUrl: "/api/admin/teach/course_target/dimension_import",
  93. dfilename: "课程知识点导入模板.xlsx",
  94. };
  95. },
  96. watch: {
  97. "course.teachCourseId": {
  98. immediate: true,
  99. handler(val, oldVal) {
  100. if (val !== oldVal) {
  101. this.getTree();
  102. }
  103. },
  104. },
  105. },
  106. methods: {
  107. async dimensionUploaded() {
  108. const data = await courseDimensionTree({
  109. teachCourseId: this.course.teachCourseId,
  110. });
  111. this.treeData = data || [];
  112. // 已存在课程目标的情况,强制关闭弹窗
  113. if (this.disabledData.length) {
  114. this.modalIsShow = false;
  115. this.$emit("enforce-close");
  116. return;
  117. }
  118. this.$nextTick(() => {
  119. this.$refs.treeRef.setCheckedKeys([]);
  120. });
  121. },
  122. async getTree() {
  123. if (!this.course.teachCourseId) return;
  124. const data = await courseDimensionTree({
  125. teachCourseId: this.course.teachCourseId,
  126. });
  127. this.treeData = data || [];
  128. this.updateDisableNode();
  129. },
  130. updateDisableNode() {
  131. const mdTree = (list) => {
  132. list.forEach((item) => {
  133. item.disabled = this.disabledData.includes(item.id);
  134. if (item.children && item.children.length) mdTree(item.children);
  135. });
  136. };
  137. mdTree(this.treeData);
  138. },
  139. toImport() {
  140. this.$refs.ImportFile.open();
  141. },
  142. visibleChange() {
  143. this.updateDisableNode();
  144. this.$refs.treeRef.setCheckedKeys(this.selectedData);
  145. },
  146. cancel() {
  147. this.modalIsShow = false;
  148. },
  149. open() {
  150. this.modalIsShow = true;
  151. },
  152. submit() {
  153. const selectedNodes = this.$refs.treeRef.getCheckedNodes();
  154. console.log(selectedNodes);
  155. if (!selectedNodes.length) {
  156. this.$message.error("请选择知识点");
  157. return;
  158. }
  159. this.$emit(
  160. "confirm",
  161. selectedNodes.map((item) => {
  162. return {
  163. id: item.id,
  164. name: item.name,
  165. code: item.code,
  166. };
  167. })
  168. );
  169. this.cancel();
  170. },
  171. },
  172. };
  173. </script>