probar.vue 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <template>
  2. <el-drawer class="pro-drawer" v-model="visible" :size="800" append-to-body @closed="$emit('closed')">
  3. <template #header="{ titleId, titleClass }">
  4. <span :id="titleId" :class="titleClass">当前企业:<span>{{ deptData?.name }}</span></span>
  5. </template>
  6. <el-container class="dept-content">
  7. <el-aside width="300px">
  8. <el-header>企业列表</el-header>
  9. <el-main class="nopadding">
  10. <el-scrollbar>
  11. <el-tree node-key="id" :current-node-key="filter.deptId" :data="deptTree" :default-expanded-keys="expandedKeys" highlight-current expand-on-click-node accordion @node-click="data => filter.deptId = data.id">
  12. <template #default="{ data }">
  13. <vxe-text-ellipsis :id="data.id" :title="data.name" class="custom-tree-node" :content="data.name"></vxe-text-ellipsis>
  14. </template>
  15. </el-tree>
  16. </el-scrollbar>
  17. </el-main>
  18. </el-aside>
  19. <el-container>
  20. <el-header>项目列表
  21. <el-input v-model="filter.text" placeholder="输入项目名称" clearable></el-input>
  22. </el-header>
  23. <el-main class="nopadding">
  24. <el-scrollbar>
  25. <el-tree node-key="fpiId" :current-node-key="$store.state.project.projectId" :data="projects" highlight-current @node-click="data => nodeClick(data)">
  26. <template #default="{ data }">
  27. <vxe-text-ellipsis :id="data.fpiId" :title="data.projectName" class="custom-tree-node" :content="data.projectName"></vxe-text-ellipsis>
  28. </template>
  29. </el-tree>
  30. </el-scrollbar>
  31. </el-main>
  32. </el-container>
  33. </el-container>
  34. </el-drawer>
  35. </template>
  36. <script>
  37. import XEUtils from "xe-utils";
  38. export default {
  39. data() {
  40. return {
  41. visible: false,
  42. filter: {
  43. deptId: XEUtils.toNumber(XEUtils.get(XEUtils.find(this.$TOOL.data.get("PROJECTS"), item => item.fpiId == this.$store.state.project.projectId), "belongDeptId")),
  44. text: ""
  45. }
  46. }
  47. },
  48. computed: {
  49. expandedKeys() {
  50. return XEUtils.map(XEUtils.toTreeArray(XEUtils.searchTree(this.deptTree, item => item.id == this.filter.deptId)), item => item.id);
  51. },
  52. deptTree() {
  53. return XEUtils.first(XEUtils.toArrayTree(this.$TOOL.data.get("DEPTS"), { parentKey: "pid" })).children;
  54. },
  55. projects() {
  56. if (this.filter.text) return XEUtils.filter(this.$TOOL.data.get("PROJECTS"), item => item.projectName.includes(this.filter.text));
  57. return XEUtils.filter(this.$TOOL.data.get("PROJECTS"), item => item.belongDeptId == this.deptData.id);
  58. },
  59. deptData() {
  60. return XEUtils.find(this.$TOOL.data.get("DEPTS"), item => item.id == this.filter.deptId);
  61. }
  62. },
  63. methods: {
  64. open() {
  65. this.visible = true;
  66. nextTick(() => XEUtils.arrayEach(document.querySelectorAll(".el-tree-node.is-current"), el => el.scrollIntoView({ block: "center" })));
  67. return this;
  68. },
  69. nodeClick(data) {
  70. this.$store.commit("SET_projectId", data.fpiId);
  71. this.visible = false;
  72. },
  73. }
  74. }
  75. </script>
  76. <style lang="scss" scoped>
  77. .dept-content {border-top: 1px solid var(--el-border-color-light);}
  78. .dept-content :deep(.el-header) {height: fit-content;padding: 10px;padding-left: 0;border: none;font-size: 14px;font-weight: bold;color: rgba(0, 0, 0, 0.85);}
  79. .dept-content .el-aside {display: flex;flex-direction: column;}
  80. .dept-content .el-aside + .el-container {padding-left: 15px;}
  81. .dept-content .el-aside + .el-container .el-header {flex-direction: column;align-items: flex-start;}
  82. .dept-content .el-aside + .el-container .el-header .el-input {width: 200px;margin-top: 10px;}
  83. </style>