fe-drone-ci/src/components/TreeTable/index.vue

170 lines
4.1 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-table :data="tableData" :row-style="showRow" v-bind="$attrs">
<slot name="selection" />
<el-table-column
v-for="item in columns"
:label="item.label"
:key="item.key"
:width="item.width"
:align="item.align||'center'"
:header-align="item.headerAlign">
<template slot-scope="scope">
<slot :scope="scope" :name="item.key">
<template v-if="item.expand">
<span :style="{'padding-left':+scope.row._level*spreadOffset + 'px'} "/>
<span v-show="showSperadIcon(scope.row)" class="tree-ctrl" @click="toggleExpanded(scope.$index)">
<i v-if="!scope.row._expand" class="el-icon-plus" />
<i v-else class="el-icon-minus" />
</span>
</template>
<template v-if="item.checkbox">
<el-checkbox
v-if="scope.row[defaultChildren]&&scope.row[defaultChildren].length>0"
:style="{'padding-left':+scope.row._level*checkboxOffset + 'px'} "
:indeterminate="scope.row._select"
v-model="scope.row._select"
@change="handleCheckAllChange(scope.row)" />
<el-checkbox
v-else
:style="{'padding-left':+scope.row._level*checkboxOffset + 'px'} "
v-model="scope.row._select"
@change="handleCheckAllChange(scope.row)" />
</template>
{{ scope.row[item.key] }}
</slot>
</template>
</el-table-column>
</el-table>
</template>
<script>
import treeToArray, { addAttrs } from './eval.js'
export default {
name: 'TreeTable',
props: {
data: {
type: Array,
required: true,
default: () => []
},
columns: {
type: Array,
default: () => []
},
/* eslint-enable */
defaultExpandAll: {
type: Boolean,
default: false
},
defaultChildren: {
type: String,
default: 'children'
},
spreadOffset: {
type: Number,
default: 50
},
checkboxOffset: {
type: Number,
default: 50
}
},
data() {
return {
tableData: [],
guard: 1
}
},
computed: {
children() {
return this.defaultChildren
}
},
watch: {
data: {
// deep watch监听树表的数据的增删如果仅仅是展示可以不用deep watch
handler(val) {
if (val.length === 0) {
this.tableData = []
return
}
console.log('render')
if (this.guard > 0) {
addAttrs(val, {
expand: this.defaultExpandAll,
children: this.defaultChildren
})
this.guard--
}
const retval = treeToArray(val, this.defaultChildren)
this.tableData = retval
},
// deep: true,
immediate: true
}
},
methods: {
showRow: function({ row }) {
const parent = row._parent
const show = parent ? parent._expand && parent._show : true
row._show = show
return show
? 'animation:treeTableShow 1s;-webkit-animation:treeTableShow 1s;'
: 'display:none;'
},
showSperadIcon(record) {
return record[this.children] && record[this.children].length > 0
},
toggleExpanded(trIndex) {
const record = this.tableData[trIndex]
const expand = !record._expand
record._expand = expand
},
handleCheckAllChange(row) {
this.selcetRecursion(row, row._select, this.defaultChildren)
this.isIndeterminate = row._select
},
selcetRecursion(row, select, children = 'children') {
if (select) {
this.$set(row, '_expand', true)
this.$set(row, '_show', true)
}
const sub_item = row[children]
if (sub_item && sub_item.length > 0) {
sub_item.map(child => {
child._select = select
this.selcetRecursion(child, select, children)
})
}
}
}
}
</script>
<style>
@keyframes treeTableShow {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@-webkit-keyframes treeTableShow {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.tree-ctrl {
position: relative;
cursor: pointer;
color: #2196f3;
}
</style>