SelectBlueDimensionDialog.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. v-if="treeData.length"
  15. ref="treeRef"
  16. :data="treeData"
  17. show-checkbox
  18. check-on-click-node
  19. node-key="kid"
  20. :props="defaultProps"
  21. @check-change="updateTreeStatus"
  22. >
  23. </el-tree>
  24. <div slot="footer">
  25. <el-button type="primary" @click="submit">确认</el-button>
  26. <el-button @click="cancel">取消</el-button>
  27. </div>
  28. </el-dialog>
  29. </template>
  30. <script>
  31. export default {
  32. name: "select-blue-dimension-dialog",
  33. props: {
  34. selectedData: {
  35. type: Array,
  36. default() {
  37. return [];
  38. },
  39. },
  40. treeData: {
  41. type: Array,
  42. default() {
  43. return [];
  44. },
  45. },
  46. unuseTargets: {
  47. type: Array,
  48. default() {
  49. return [];
  50. },
  51. },
  52. },
  53. data() {
  54. return {
  55. modalIsShow: false,
  56. defaultProps: {
  57. children: "children",
  58. label: "name",
  59. },
  60. };
  61. },
  62. methods: {
  63. visibleChange() {
  64. this.$refs.treeRef.setCheckedKeys(this.selectedData);
  65. this.$nextTick(() => {
  66. this.updateTreeStatus();
  67. });
  68. },
  69. cancel() {
  70. this.modalIsShow = false;
  71. },
  72. open() {
  73. this.modalIsShow = true;
  74. },
  75. updateTreeStatus() {
  76. const selectedNodes = this.$refs.treeRef.getCheckedNodes(false, true);
  77. const targetNodes = selectedNodes.filter(
  78. (item) => item.children && item.children.length
  79. );
  80. const selectTargetId = targetNodes.length ? targetNodes[0].id : "";
  81. this.treeData.forEach((item) => {
  82. if (this.unuseTargets.includes(item.id)) {
  83. item.disabled = true;
  84. } else {
  85. item.disabled = selectTargetId ? item.id !== selectTargetId : false;
  86. }
  87. item.children.forEach((elem) => {
  88. elem.disabled = item.disabled;
  89. });
  90. });
  91. },
  92. submit() {
  93. const selectedNodes = this.$refs.treeRef.getCheckedNodes(false, true);
  94. if (!selectedNodes.length) {
  95. this.$message.error("请选择知识点");
  96. return;
  97. }
  98. const targetNodes = selectedNodes.filter(
  99. (item) => item.children && item.children.length
  100. );
  101. if (targetNodes.length > 1) {
  102. this.$message.error("只能选择一个课程目标的知识点");
  103. return;
  104. }
  105. const dimensionIds = selectedNodes
  106. .filter((item) => !item.children)
  107. .map((item) => item.id);
  108. this.$emit(
  109. "confirm",
  110. targetNodes.map((item) => {
  111. return {
  112. targetId: item.id,
  113. targetName: item.name,
  114. dimensionList: item.children
  115. .filter((ditem) => dimensionIds.includes(ditem.id))
  116. .map((dimension) => {
  117. return {
  118. dimensionId: dimension.id,
  119. dimensionCode: dimension.code,
  120. dimensionName: dimension.name,
  121. };
  122. }),
  123. };
  124. })
  125. );
  126. this.cancel();
  127. },
  128. },
  129. };
  130. </script>