lina/src/components/Table/TreeTable/index.vue
2024-12-27 17:20:59 +08:00

293 lines
6.1 KiB
Vue

<template>
<el-collapse-transition>
<div class="tree-table-content">
<div
v-show="iShowTree"
:class="iShowTree ? '' : 'hidden'"
:style="{width: treeWidth}"
class="left"
>
<span v-if="component === 'AutoDataZTree'" class="title">{{ $t('AssetTree') }}</span>
<component
:is="component"
:key="componentTreeKey"
ref="AutoDataZTree"
:setting="treeSetting"
class="auto-data-ztree"
v-bind="treeTabConfig"
@urlChange="handleUrlChange"
v-on="$listeners"
>
<div slot="rMenu" slot-scope="{data}">
<slot :data="data" name="rMenu" />
</div>
</component>
</div>
<div
:style="{'width': iShowTree ? ('calc(100% - ' + treeWidth + ')') : '100%'}"
class="right"
style="display: flex"
>
<div v-if="true" class="mini">
<div :class="{'is-show': iShowTree}" class="mini-button" @click="iShowTree = !iShowTree">
<svg-icon
:style="{'transform': iShowTree ? 'none' : 'rotate(180deg)'}"
class="icon-left"
icon-class="double-left"
/>
</div>
</div>
<div class="transition-box" style="width: calc(100% - 7px);">
<slot name="table">
<ListTable
:key="componentKey"
ref="ListTable"
:header-actions="headerActions"
:quick-filters="quickFilters"
:quick-summary="quickSummary"
:table-config="iTableConfig"
v-on="$listeners"
/>
</slot>
</div>
</div>
</div>
</el-collapse-transition>
</template>
<script>
import Dialog from '@/components/Dialog/index.vue'
import { setUrlParam } from '@/utils/common'
import ListTable from '@/components/Table/DrawerListTable/index.vue'
import FileTree from '@/components/Table/TreeTable/components/FileTree.vue'
import IBox from '../../IBox/index.vue'
import TabTree from '../TabTree/index.vue'
import AutoDataZTree from '@/components/Tree/AutoDataZTree/index.vue'
export default {
name: 'TreeTable',
components: {
ListTable,
AutoDataZTree,
FileTree,
TabTree,
IBox,
Dialog
},
props: {
...ListTable.props,
treeSetting: {
type: Object,
default: () => AutoDataZTree.props.setting.default()
},
showTree: {
type: Boolean,
default: true
},
// 默认引用的Tree组件
component: {
type: String,
default: () => 'AutoDataZTree'
},
treeTabConfig: {
type: Object,
default: () => ({})
},
treeWidth: {
type: String,
default: () => '23.6%'
},
quickFilters: {
type: Array,
default: null
},
quickSummary: {
type: Array,
default: null
},
headerActions: {
type: Object,
default: () => ({})
}
},
data() {
return {
iTableConfig: this.tableConfig,
iShowTree: this.showTree,
componentKey: 0,
componentTreeKey: 0
}
},
watch: {
treeConfig: {
handler(val) {
},
deep: true
},
showTree(val) {
this.iShowTree = val
}
},
mounted() {
// debug(this.treeSetting)
this.initSetTableUrl()
},
methods: {
initSetTableUrl() {
const { asset = '', node = '' } = this.$route.query || {}
let url = this.iTableConfig?.url || ''
if (url) {
url = setUrlParam(url, 'asset', asset)
url = setUrlParam(url, 'node', node)
this.$set(this.iTableConfig, 'url', url)
}
},
handleUrlChange(url) {
this.$set(this.iTableConfig, 'url', url)
this.$emit('urlChange', url)
this.forceRerender()
},
forceRerender() {
this.componentKey += 1
},
forceRerenderTree() {
this.componentTreeKey += 1
},
hideRMenu() {
this.$refs.AutoDataZTree.hideRMenu()
},
getSelectedNodes: function() {
return this.$refs.AutoDataZTree.getSelectedNodes()
},
getNodes: function() {
return this.$refs.AutoDataZTree.getNodes()
},
selectNode: function(node) {
return this.$refs.AutoDataZTree.selectNode(node)
},
reloadTable() {
this.$refs.ListTable.reloadTable()
}
}
}
</script>
<style lang="scss" scoped>
$origin-color: #ffffff;
.tree-table-content {
display: flex;
flex-wrap: nowrap;
justify-content: space-between;
.left {
//height: 100%;
background: $origin-color;
color: var(--color-border);
// title 部分
.title {
display: flex;
align-items: center;
height: 40px;
padding: 0 20px;
width: 100%;
border-bottom: solid 2px var(--color-primary);
font-size: 13px;
font-weight: 600;
color: var(--color-text-primary);
&:hover {
cursor: pointer;
color: var(--color-primary);
}
}
.auto-data-ztree {
overflow: auto;
height: 100%;
&.tree-tab ::v-deep .page-submenu {
height: 40px;
}
}
// tree 部分
.data-z-tree {
//margin-left: -20px;
//width: calc(100% + 20px);
.treebox {
padding-left: 10px;
padding-bottom: 10px;
}
}
::v-deep .tab-text {
font-size: 13px;
}
&:hover {
~ .right .is-show {
display: block !important;;
}
}
}
}
.is-show {
display: none;
}
.hidden {
width: 0;
}
.is-rotate {
display: block;
transform: rotate(180deg);
}
.mini-button {
position: absolute;
top: 50%;
transform: translate(-100%, -50%);
width: 13px;
float: right;
text-align: center;
padding: 5px 0;
border: 1px solid #DCDFE6;
background-color: #f3f3f3;
border-radius: 2px;
cursor: pointer;
height: 30px;
&:hover {
display: block;
border: 1px solid #d2d2d2;
}
.icon-left {
font-size: 11px;
vertical-align: 0;
}
}
.el-tree {
background-color: inherit !important;
}
.mini {
position: relative;
margin-right: 5px;
width: 2px !important;
}
.transition-box.left {
background: white;
border: 1px solid #e0e0e0;
border-radius: 2px;
}
</style>