createTasnsfer.vue 6.8 KB

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