Brak opisu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

deptList.vue 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. <template>
  2. <van-overlay :show="overlayloading">
  3. <div class="wrapper">
  4. <van-loading color="#0094ff"> 加载中... </van-loading>
  5. </div>
  6. </van-overlay>
  7. <seltopbar
  8. showtype="deptList"
  9. @commitSelect="commitSelect"
  10. @cancelSelect="cancelSelect"
  11. ></seltopbar>
  12. <van-search v-model="filterText" show-action placeholder="请输入搜索部门" />
  13. <div :style="{ height: divHeight + 'px' }" class="divTree">
  14. <el-tree
  15. v-if="data.length > 0"
  16. ref="treeRef"
  17. :data="data"
  18. :props="defaultProps"
  19. :filter-node-method="filterNode"
  20. node-key="id"
  21. accordion
  22. :default-expanded-keys="expandNodes"
  23. show-checkbox
  24. @check="handleNodeClick"
  25. />
  26. </div>
  27. </template>
  28. <script setup>
  29. import { ref, watch, nextTick, reactive, onMounted } from "vue";
  30. import seltopbar from "@/components/selTopbar.vue";
  31. import { getDeptList } from "@/api/index.js";
  32. // import { ElTree, ElInput } from "element-plus";
  33. // import "element-plus/dist/index.css";
  34. import { DGFilterTrees } from "@/utils/transTreeData.js";
  35. const overlayloading = ref(false);
  36. //列表数据
  37. const data = reactive([]);
  38. const props = defineProps({
  39. selDept: Array,
  40. });
  41. const emit = defineEmits(["closeFullPicker"]);
  42. // 设置树的高度
  43. const divHeight = ref(0);
  44. //默认展开节点
  45. const expandNodes = ref([]);
  46. // 树
  47. const treeRef = ref();
  48. nextTick(() => {
  49. divHeight.value = document.documentElement.clientHeight - 46 - 54 - 5;
  50. //默认展开节点['L01']
  51. if (props.selDept.length == 0) {
  52. expandNodes.value = ["L01"];
  53. } else {
  54. expandNodes.value = props.selDept.map((item) => item.id);
  55. }
  56. });
  57. onMounted(() => {
  58. console.log(props.selDept);
  59. getDept();
  60. });
  61. // 搜索
  62. const filterText = ref("");
  63. watch(filterText, (val) => {
  64. treeRef.value.filter(val);
  65. });
  66. const filterNode = (value, data) => {
  67. if (!value) return true;
  68. return data.text.includes(value);
  69. };
  70. //树单选
  71. const handleNodeClick = (data) => {
  72. // console.log(data.parent);
  73. // if (data.parent) {
  74. // showFailToast("不能选择父节点,请重新选择");
  75. // } else {
  76. treeRef.value.setCheckedKeys([data.id]);
  77. // props.selDept.push(data);
  78. // }
  79. };
  80. const defaultProps = {
  81. label: "text",
  82. children: "children",
  83. id: "id",
  84. disabled: "parent",
  85. };
  86. function getDept() {
  87. overlayloading.value = true;
  88. let param = {};
  89. getDeptList(param).then((res) => {
  90. console.log(res);
  91. if (typeof res === "object" && Array.isArray(res)) {
  92. let treeData = DGFilterTrees(res);
  93. console.log("1111111", treeData);
  94. data.push(treeData[1]);
  95. nextTick(() => {
  96. console.log("props.selDept", props.selDept);
  97. //获取所有的id为默认选中
  98. treeRef.value.setCheckedNodes(props.selDept);
  99. });
  100. overlayloading.value = false;
  101. } else {
  102. showFailToast("部门列表获取失败");
  103. overlayloading.value = false;
  104. }
  105. });
  106. }
  107. // 选中的人员
  108. const commitSelect = () => {
  109. // console.log("123", treeRef.value.getCheckedNodes());
  110. const pers = treeRef.value.getCheckedNodes();
  111. if (pers.length == 0) {
  112. showFailToast("至少选择一位人员");
  113. } else {
  114. props.selDept.length = 0;
  115. props.selDept.push(...pers);
  116. emit("closeFullPicker", "ok");
  117. }
  118. };
  119. const cancelSelect = () => {
  120. emit("closeFullPicker", "cancel");
  121. };
  122. </script>
  123. <style>
  124. .divTree {
  125. overflow-y: scroll;
  126. margin-bottom: 5px;
  127. }
  128. /* 搜索行 */
  129. .van-search--show-action {
  130. padding-right: 10px;
  131. }
  132. /* 遮罩 */
  133. .wrapper {
  134. display: flex;
  135. align-items: center;
  136. justify-content: center;
  137. height: 100%;
  138. }
  139. .van-overlay {
  140. z-index: 2;
  141. background-color: rgba(0, 0, 0, 0.5);
  142. }
  143. </style>