| | |
| | | <div class="title">文件列表</div> |
| | | <div class="file-list" @contextmenu.prevent="openContextMenu($event)"> |
| | | <el-tree |
| | | :class="['station-tree', { empty: !stationData.length }]" |
| | | :data="stationData" |
| | | @node-click="handleNodeClick" |
| | | @node-contextmenu="nodeContextClick" |
| | |
| | | </div> |
| | | <div class="handle" ref="handle"></div> |
| | | <div class="right"> |
| | | <div class="" @click="select">选文件</div> |
| | | <div class="">当前选中的文件夹为:{{ path }}</div> |
| | | <router-view /> |
| | | <div class="right-inner"> |
| | | <!-- 文件标签 --> |
| | | <tabs-bar></tabs-bar> |
| | | <div class="right-content"> |
| | | <div class="posIner"> |
| | | <keep-alive :include="cachedViews"> |
| | | <router-view :key="$route.fullPath" /> |
| | | </keep-alive> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 右键菜单 --> |
| | | <context-menu |
| | | v-model="contextMenu.visible" |
| | | :disabled-list="disabledList" |
| | | :context-data="contextMenu.node" |
| | | :style="{ left: contextMenu.x + 'px', top: contextMenu.y + 'px' }" |
| | | @reload="reload" |
| | | ></context-menu> |
| | | </div> |
| | | </template> |
| | |
| | | |
| | | import MenuList from "@/components/menuList"; |
| | | import ContextMenu from "@/components/contextMenu"; |
| | | import TabsBar from "@/components/tabsBar"; |
| | | import { getStation } from "./apis"; |
| | | |
| | | export default { |
| | |
| | | components: { |
| | | MenuList, |
| | | ContextMenu, |
| | | TabsBar, |
| | | }, |
| | | data() { |
| | | return { |
| | | path: "", |
| | | startX: 0, |
| | | leftW: 0, |
| | | stationData: [], |
| | |
| | | x: 0, |
| | | y: 0, |
| | | visible: false, |
| | | node: {}, |
| | | }, |
| | | disabledList: [], |
| | | }; |
| | | }, |
| | | methods: { |
| | | select() { |
| | | window.api.send("open-file-dialog"); |
| | | computed: { |
| | | cachedViews() { |
| | | return this.$store.state.tagsView.cachedViews; |
| | | }, |
| | | }, |
| | | methods: { |
| | | onMouseDown(e) { |
| | | // const el = e.target; |
| | | this.startX = e.clientX; |
| | |
| | | } |
| | | left.style.width = CurBoxLen + "px"; |
| | | el.style.left = CurBoxLen + "px"; |
| | | this.$bus.$emit("checkScroll"); |
| | | }, |
| | | getStation() { |
| | | getStation().then((res) => { |
| | |
| | | label: item1.fileName, |
| | | url: item1.fileUrl, |
| | | level: 3, |
| | | parent: [v.station1, val.station2, item.station3], |
| | | })), |
| | | level: 2, |
| | | parent: [v.station1, val.station2], |
| | | }); |
| | | } else { |
| | | children.push( |
| | |
| | | label: item1.fileName, |
| | | url: item1.fileUrl, |
| | | level: 3, |
| | | parent: [v.station1, val.station2], |
| | | })) |
| | | ); |
| | | } |
| | |
| | | label: val.station2, |
| | | children, |
| | | level: 1, |
| | | parent: [v.station1], |
| | | }); |
| | | } else { |
| | | sname2s.push( |
| | |
| | | label: item.fileName, |
| | | url: item.fileUrl, |
| | | level: 3, |
| | | parent: [v.station1], |
| | | })) |
| | | ); |
| | | } |
| | |
| | | children: sname2s, |
| | | label: v.station1, |
| | | level: 0, |
| | | parent: [], |
| | | }; |
| | | }); |
| | | console.log(res); |
| | | return res; |
| | | }, |
| | | reload() { |
| | | this.getStation(); |
| | | }, |
| | | handleNodeClick(obj) { |
| | | console.log(123, obj); |
| | | }, |
| | | nodeContextClick($e, obj) { |
| | | console.log(obj); |
| | | // console.log(obj); |
| | | const { clientX, clientY } = $e; |
| | | this.contextMenu.x = clientX; |
| | | let y = clientY; |
| | |
| | | switch (obj.level) { |
| | | case 0: |
| | | case 1: |
| | | case 2: |
| | | // 子站上按鼠标右键,不能“打开文件”、“新建根文件” |
| | | this.disabledList = [0, 11]; |
| | | break; |
| | | case 2: |
| | | // 此层级 只能添加文件 不能新建子站 |
| | | this.disabledList = [0, 1]; |
| | | break; |
| | | case 3: |
| | | // 添加的测试文件上按鼠标右键,可以点击“打开文件”、“重命名”、“删除” |
| | |
| | | default: |
| | | return false; |
| | | } |
| | | this.contextMenu.node = obj; |
| | | this.contextMenu.visible = true; |
| | | }, |
| | | // 右键菜单 |
| | |
| | | if (classList.contains("file-list")) { |
| | | // 在空白处点击的右键 只能新建 |
| | | this.disabledList = [0, 12, 2, 3, 4]; |
| | | |
| | | this.contextMenu.node = {}; |
| | | this.contextMenu.visible = true; |
| | | } |
| | | }, |
| | |
| | | maskClick() { |
| | | this.closeContextMenu(); |
| | | }, |
| | | test() { |
| | | setTimeout(() => { |
| | | console.log(this.cachedViews, "cachedViews"); |
| | | this.test(); |
| | | }, 2000); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | window.api.receive("selected-directory", (path) => { |
| | | this.path = path.filePaths; |
| | | }); |
| | | let handle = this.$refs.handle; |
| | | handle.addEventListener("mousedown", this.onMouseDown); |
| | | this.getStation(); |
| | | this.test(); |
| | | }, |
| | | }; |
| | | </script> |
| | |
| | | padding: 0; |
| | | overflow: hidden; |
| | | } |
| | | div { |
| | | box-sizing: border-box; |
| | | } |
| | | #app { |
| | | height: 100%; |
| | | font-family: Avenir, Helvetica, Arial, sans-serif; |
| | |
| | | -moz-osx-font-smoothing: grayscale; |
| | | text-align: center; |
| | | color: #000; |
| | | background: #fff; |
| | | background: #076fec; |
| | | } |
| | | ul, |
| | | li { |
| | |
| | | height: 100%; |
| | | position: relative; |
| | | display: flex; |
| | | z-index: 1; |
| | | } |
| | | .left { |
| | | width: 14em; |
| | |
| | | display: flex; |
| | | flex-direction: column; |
| | | .title { |
| | | background: #999; |
| | | background: #0055bf; |
| | | color: #fff; |
| | | padding: 4px; |
| | | } |
| | | .file-list { |
| | | flex: 1; |
| | | overflow-y: auto; |
| | | text-align: left; |
| | | /deep/ .el-tree { |
| | | color: #333; |
| | | user-select: none; |
| | | :deep(.el-tree.station-tree) { |
| | | background: transparent; |
| | | color: #fff; |
| | | display: inline-block; |
| | | &.empty { |
| | | display: block; |
| | | } |
| | | .el-tree-node__content { |
| | | display: inline-block; |
| | | } |
| | | // .el-tree-node.is-expanded>.el-tree-node__children { |
| | | // display: inline-block; |
| | | // } |
| | | .el-tree-node:hover, |
| | | .el-tree-node:focus > .el-tree-node__content { |
| | | background-color: rgba(39, 134, 255, 0.4); |
| | | .el-tree-node__label { |
| | | color: #000; |
| | | } |
| | | } |
| | | .el-tree-node__content.el-tree-node__content:hover, |
| | | .el-tree-node__content.el-upload-list__item:hover { |
| | | background-color: rgba(200, 200, 200, 0.4); |
| | | color: #000; |
| | | .el-tree-node__label { |
| | | color: #000; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .handle { |
| | | width: 6px; |
| | | z-index: 1; |
| | | position: absolute; |
| | | top: 0; |
| | | bottom: 0; |
| | |
| | | .right { |
| | | /* background: rgba(0,0,0,.4); */ |
| | | flex: 1; |
| | | } |
| | | .context-menu { |
| | | position: relative; |
| | | .right-inner { |
| | | position: absolute; |
| | | z-index: 100; |
| | | background: #fff; |
| | | border: 1px #ccc solid; |
| | | border-radius: 4px; |
| | | padding: 4px; |
| | | .main-ul { |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | display: flex; |
| | | flex-direction: column; |
| | | .main-li { |
| | | cursor: pointer; |
| | | .right-content { |
| | | flex: 1; |
| | | border: 1px #ccc solid; |
| | | padding: 4px; |
| | | &:hover { |
| | | background: #f0f0f0; |
| | | } |
| | | & ~ .main-li { |
| | | margin-top: 2px; |
| | | position: relative; |
| | | .posIner { |
| | | position: absolute; |
| | | left: 0; |
| | | top: 0; |
| | | right: 0; |
| | | bottom: 0; |
| | | } |
| | | } |
| | | } |