index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <template>
  2. <el-dialog v-model="isOpen" append-to-body width="700">
  3. <template #header>
  4. <div class="my-header">
  5. <div class="title">转存到</div>
  6. </div>
  7. </template>
  8. <div class="main-cont">
  9. <div class="main-cont-left">
  10. <div class="build-file" v-if="dirBulidNow">
  11. <img :src="fileImg" alt="" class="left-img build-img" />
  12. <el-input
  13. v-model="dirName"
  14. class="bulid-input"
  15. clearable
  16. placeholder="新建目录"
  17. />
  18. <el-icon size="20" color="#327CEC" @click="sureDir"
  19. ><CircleCheckFilled
  20. /></el-icon>
  21. </div>
  22. <el-tree-v2
  23. ref="treeRef"
  24. :data="treeData.data"
  25. :highlight-current="true"
  26. :default-expanded-keys="[spaceId]"
  27. :show-checkbox="false"
  28. :height="280"
  29. :props="defaultProps"
  30. @node-click="handleNodeClick"
  31. >
  32. <template #default="{ node }">
  33. <span style="display: flex; align-items: center">
  34. <img :src="fileImg" alt="" class="left-img" />
  35. <!-- 放置图片 -->
  36. <span>{{ node.label }}</span>
  37. <!-- 显示节点标签 -->
  38. </span>
  39. </template>
  40. </el-tree-v2>
  41. </div>
  42. </div>
  43. <template #footer>
  44. <div class="footer">
  45. <span
  46. ><el-button @click.stop="buildFile" class="cancel-button"
  47. >新建文件夹</el-button
  48. ></span
  49. >
  50. <div>
  51. <span class="dialog-footer">
  52. <el-button @click="isOpen = false" class="cancel-button"
  53. >取消</el-button
  54. >
  55. <el-button type="primary" @click="confirm" class="sure-button">
  56. 确认
  57. </el-button>
  58. </span>
  59. </div>
  60. </div>
  61. </template>
  62. </el-dialog>
  63. </template>
  64. <script setup>
  65. import { reactive, ref, toRaw, toRefs, watch, nextTick, onMounted } from "vue";
  66. import { ElMessage } from "element-plus";
  67. import fileImg from "@/assets/images/file-img.png";
  68. import direction from "@/assets/images/direction.png";
  69. import useUserStore from "@/store/modules/user";
  70. import { defineEmits } from "vue";
  71. import { builtDir, fileCopy, spaceInfo, dirTree } from "@/api/chat/msg";
  72. const opent = ref(true);
  73. const props = defineProps({
  74. openForwardFile: {
  75. type: Boolean,
  76. default: false,
  77. },
  78. forwardTreeData: {
  79. type: Object,
  80. default: () => {},
  81. },
  82. docId: {
  83. type: String,
  84. },
  85. spaceId: {
  86. type: String,
  87. },
  88. });
  89. const defaultProps = {
  90. children: "children",
  91. label: "label",
  92. value: "id",
  93. };
  94. const dirName = ref(""); //新建文件夹名称
  95. const dirBulidNow = ref(false);
  96. const treeRef = ref(null);
  97. const isOpen = ref(props.openForwardFile);
  98. watch(
  99. () => props.openForwardFile,
  100. (newValue) => {
  101. isOpen.value = newValue;
  102. }
  103. );
  104. const treeData = reactive({ data: [] });
  105. const defaultExpandedKeys = ref([]);
  106. watchEffect(() => {
  107. treeData.data[0] = props.forwardTreeData;
  108. // //默认展开第二级
  109. // treeData.data.forEach((node) => {
  110. // if (node.children) {
  111. // // 如果节点有子节点
  112. // const childKeys = node.children.map((child) => child.id); // 获取子节点的 key 数组
  113. // defaultExpandedKeys.value= [... defaultExpandedKeys.value, ...childKeys]; // 将子节点的 key 数组合并到 defaultExpandedKeys 中
  114. // }
  115. // });
  116. });
  117. watchEffect(() => {
  118. console.log("props.docId", props.docId);
  119. });
  120. //树
  121. const clickData = ref({});
  122. const handleNodeClick = (data) => {
  123. clickData.value = data;
  124. };
  125. //确定按钮
  126. const emit = defineEmits(["forwardChangeMsg"]);
  127. const confirm = async () => {
  128. const copyRes = await fileCopy({
  129. docId: props.docId,
  130. dirId: clickData.value.id,
  131. spaceId: props.spaceId,
  132. });
  133. if (copyRes.code === 200) {
  134. ElMessage({ message: "转存成功", type: "success" });
  135. dirBulidNow.value = false;
  136. }
  137. isOpen.value = false;
  138. };
  139. //新建目录显示
  140. const clickId = ref("");
  141. const buildFile = async () => {
  142. clickId.value = clickData.value.id;
  143. if (!clickId.value) {
  144. return ElMessage({ message: "请选中目录", type: "error" });
  145. }
  146. dirBulidNow.value = true;
  147. };
  148. //确认新建目录--点击勾选
  149. const sureDir = async () => {
  150. const dirRes = await builtDir({
  151. dirName: dirName.value,
  152. spaceId: props.spaceId,
  153. parentId: clickData.value.id,
  154. });
  155. if (dirRes.code === 200) {
  156. ElMessage({ message: "创建成功", type: "success" });
  157. dirBulidNow.value = false;
  158. clickId.value = "";
  159. dirName.value = "";
  160. //重新获取树结构
  161. const resDir = await dirTree(3);
  162. treeData.data[0] = resDir;
  163. // treeRef.value.setCurrentKey(clickData.value.id)
  164. }
  165. };
  166. </script>
  167. <style lang="scss" scoped>
  168. @import "@/assets/styles/tree-common.scss";
  169. .sure-button,
  170. .cancel-button {
  171. width: 120px;
  172. }
  173. .left-img {
  174. width: 20px;
  175. height: 20px;
  176. margin-right: 5px;
  177. }
  178. .footer {
  179. display: flex;
  180. justify-content: space-between;
  181. }
  182. .title {
  183. font-family: "Inter-Medium";
  184. font-weight: 600;
  185. }
  186. :deep .el-tree {
  187. // margin-top: 4px;
  188. width: 100%;
  189. }
  190. .arrow-img {
  191. margin-left: 5px;
  192. width: 12px;
  193. height: 12px;
  194. }
  195. .build-file {
  196. background: #f5f7f9;
  197. padding: 3px 0;
  198. margin: 4px 0;
  199. display: flex;
  200. align-items: center;
  201. .build-img {
  202. margin-left: 24px;
  203. }
  204. .bulid-input {
  205. margin-right: 10px;
  206. }
  207. :deep .el-input {
  208. width: 240px !important;
  209. height: 29px;
  210. }
  211. }
  212. </style>