createTasnsfer.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <template>
  2. <div class="transBox" v-if="open">
  3. <div class="allBag">
  4. <el-input style="width: 220px; margin-left: 18px; margin-top: 5px" v-model="allBag" placeholder="搜索"></el-input>
  5. <div class="allLog">
  6. <el-tree ref="treeRef" :filter-node-method="filterNode" :data="allTreeData" :props="allTreeProps" show-checkbox
  7. node-key="id" :default-expanded-keys="openTree" @check="allTreeChange" :default-checked-keys="backScreen"
  8. :check-strictly="false" />
  9. </div>
  10. </div>
  11. <div class="needBag">
  12. <div style="border-bottom: 1px solid gray" class="needBag_top">
  13. <span>已选择{{ chooseTagData.length }}人</span>
  14. <span style="color: red; font-size: 14px; float: right" @click="cleanPeople">清空</span>
  15. </div>
  16. <div class="needLog">
  17. <el-scrollbar>
  18. <el-tag v-for="(item) in chooseTagData" :key="item.userId" class="tagtag" :closable="true"
  19. @close="handleClose(item)">
  20. {{ item.userName ? item.userName : item.name }}
  21. </el-tag>
  22. </el-scrollbar>
  23. </div>
  24. </div>
  25. </div>
  26. </template>
  27. <script setup>
  28. import { ref, onMounted, toRef, watch, defineEmits, toRaw } from "vue";
  29. import userTree from "../../../api/user/userTree";
  30. import fileShare from "../../../api/fileShare/fileShare";
  31. import fileCount from "../../../api/fileCount/fileCount";
  32. import { ElMessage } from "element-plus";
  33. const open = ref(true);
  34. const allTreeData = ref([]);
  35. const chooseTagData = ref([]);
  36. const lastPeople = ref(false);
  37. const openTree = ref([]);
  38. const backScreen = ref(props.checkUser);
  39. const allTreeProps = {
  40. label: "label",
  41. children: "children",
  42. disabled: false,
  43. id: "id",
  44. };
  45. let treeRef = ref(null)
  46. const emit = defineEmits(["setUsers"]);
  47. let allBag = ref('')
  48. const props = defineProps({
  49. openTrans: {
  50. type: Boolean,
  51. default: true,
  52. },
  53. checkUser: {
  54. type: Array,
  55. required: true,
  56. default: () => [],
  57. },
  58. });
  59. watch(
  60. () => props.openTrans,
  61. (newValue) => {
  62. console.log(111);
  63. open.value = newValue;
  64. }
  65. );
  66. watch(() => allBag.value, (val) => {
  67. treeRef.value?.filter(val)
  68. })
  69. function filterNode(value, data) {
  70. if (!value) return true
  71. return data.label.includes(value)
  72. }
  73. function cleanPeople() {
  74. treeRef.value.setCheckedKeys([]);
  75. chooseTagData.value = [];
  76. emit("setUsers", toRaw(chooseTagData.value));
  77. setTimeout(() => {
  78. // antherClean()
  79. })
  80. }
  81. function antherClean() {
  82. treeRef.value.setCheckedKeys([]);
  83. chooseTagData.value = [];
  84. }
  85. function handleClose(tag) {
  86. chooseTagData.value.splice(chooseTagData.value.indexOf(tag), 1);
  87. let result = chooseTagData.value.map((item) => {
  88. return item.userId
  89. })
  90. treeRef.value.setCheckedKeys(result);
  91. emit("setUsers", toRaw(chooseTagData.value));
  92. setTimeout(() => {
  93. // antherClose(tag)
  94. }, 10)
  95. }
  96. function antherClose(tag) {
  97. chooseTagData.value.splice(chooseTagData.value.indexOf(tag), 1);
  98. let result = chooseTagData.value.map((item) => {
  99. return item.userId
  100. })
  101. treeRef.value.setCheckedKeys(result);
  102. }
  103. function allTreeChange(e) {
  104. const id = e.id;
  105. const label = e.label;
  106. const disabled = e.disabled;
  107. // 查找是否已经存在相同 userId 的数据的索引
  108. const existingIndex = chooseTagData.value.findIndex(
  109. (item) => item.userId === id
  110. );
  111. if (existingIndex !== -1) {
  112. // 如果已存在,删除该项
  113. chooseTagData.value.splice(existingIndex, 1);
  114. } else {
  115. // 选择操作,将数据添加到 needTagData 中
  116. chooseTagData.value.push({
  117. userId: id,
  118. userName: label,
  119. disabled: disabled,
  120. });
  121. }
  122. if (chooseTagData.value.length === 1) {
  123. lastPeople.value = true;
  124. } else {
  125. lastPeople.value = false;
  126. }
  127. chooseTagData.value = chooseTagData.value.filter((item) => !item.disabled);
  128. emit("setUsers", toRaw(chooseTagData.value));
  129. console.log("chooseTagData", chooseTagData.value);
  130. }
  131. // 获取用户树
  132. function getAllUser() {
  133. userTree.getUserTree({}).then((res) => {
  134. console.log("userTree", res);
  135. allTreeData.value = [res];
  136. console.log('open', open.value);
  137. userTree.getUserTree({}).then((res) => {
  138. allTreeData.value = [res];
  139. // 递归函数来获取所有节点的 id
  140. function getAllNodeIds(nodes) {
  141. nodes.forEach((node) => {
  142. openTree.value.push(node.id);
  143. if (node.children && node.children.length > 0) {
  144. getAllNodeIds(node.children);
  145. }
  146. });
  147. }
  148. // 调用递归函数获取所有节点的 id
  149. getAllNodeIds(allTreeData.value);
  150. });
  151. });
  152. }
  153. onMounted(async () => {
  154. getAllUser();
  155. const checkUser = toRaw(props.checkUser)
  156. // console.log('checkUser',checkUser);
  157. // console.log('allTreeData.value',allTreeData.value);
  158. //设置勾选项
  159. let arr = []
  160. if(checkUser){
  161. arr = checkUser.map(item => {
  162. return item.userId
  163. })
  164. }
  165. backScreen.value = arr
  166. // 设置右侧列表数据
  167. chooseTagData.value = checkUser.map(item => {
  168. return {
  169. userId: item.userId,
  170. userName: item.userName,
  171. disabled: false
  172. }
  173. })
  174. // console.log('arr',arr);
  175. });
  176. </script>
  177. <style lang="scss" scoped>
  178. .transBox {
  179. width: 100%;
  180. height: 400px;
  181. margin: 0 auto;
  182. display: flex;
  183. justify-content: space-around;
  184. align-items: center;
  185. /* border: 1px solid black; */
  186. }
  187. .tagtag {
  188. display: flex;
  189. justify-content: space-between;
  190. align-items: center;
  191. text-align: start;
  192. width: 230px;
  193. margin: 0 auto;
  194. }
  195. .allBag {
  196. width: 50%;
  197. height: 380px;
  198. border: 1px solid green;
  199. }
  200. .needBag {
  201. width: 50%;
  202. height: 380px;
  203. border: 1px solid green;
  204. overflow-y: auto;
  205. }
  206. .allLog {
  207. width: 245px;
  208. height: 330px;
  209. margin: 5px auto;
  210. /* border: 1px solid red; */
  211. overflow-y: auto;
  212. }
  213. .needBag_top {
  214. padding: 0 10px;
  215. height: 30px;
  216. display: flex;
  217. align-items: center;
  218. justify-content: space-between;
  219. }
  220. .needLog {
  221. height: 100%;
  222. }
  223. :deep(.el-tag__content) {
  224. display: block;
  225. }
  226. :deep(.el-icon el-tag__close) {
  227. display: block;
  228. }
  229. </style>