2017-02-06 11:24:03 +08:00
|
|
|
<template>
|
2017-03-24 20:52:14 +08:00
|
|
|
<div :class="prefixCls">
|
|
|
|
<Tree-node
|
2017-03-24 21:06:49 +08:00
|
|
|
v-for="item in data"
|
2017-03-24 20:52:14 +08:00
|
|
|
:key="item"
|
|
|
|
:data="item"
|
|
|
|
visible
|
|
|
|
:multiple="multiple"
|
|
|
|
:show-checkbox="showCheckbox">
|
|
|
|
</Tree-node>
|
2017-03-30 16:05:20 +08:00
|
|
|
<div :class="[prefixCls + '-empty']" v-if="!data.length">{{ localeEmptyText }}</div>
|
2017-03-24 20:52:14 +08:00
|
|
|
</div>
|
2017-02-06 11:24:03 +08:00
|
|
|
</template>
|
|
|
|
<script>
|
2017-03-24 20:52:14 +08:00
|
|
|
import TreeNode from './node.vue';
|
|
|
|
import { findComponentsDownward } from '../../utils/assist';
|
2017-03-03 11:00:11 +08:00
|
|
|
import Emitter from '../../mixins/emitter';
|
2017-03-30 16:05:20 +08:00
|
|
|
import Locale from '../../mixins/locale';
|
2017-02-07 11:34:00 +08:00
|
|
|
|
|
|
|
const prefixCls = 'ivu-tree';
|
|
|
|
|
2017-02-06 11:24:03 +08:00
|
|
|
export default {
|
2017-03-02 17:40:19 +08:00
|
|
|
name: 'Tree',
|
2017-03-30 16:05:20 +08:00
|
|
|
mixins: [ Emitter, Locale ],
|
2017-03-24 20:52:14 +08:00
|
|
|
components: { TreeNode },
|
2017-02-07 11:34:00 +08:00
|
|
|
props: {
|
2017-03-03 11:35:33 +08:00
|
|
|
data: {
|
2017-02-07 11:34:00 +08:00
|
|
|
type: Array,
|
|
|
|
default () {
|
|
|
|
return [];
|
|
|
|
}
|
|
|
|
},
|
|
|
|
multiple: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false
|
|
|
|
},
|
|
|
|
showCheckbox: {
|
|
|
|
type: Boolean,
|
|
|
|
default: false
|
|
|
|
},
|
|
|
|
emptyText: {
|
2017-03-30 16:05:20 +08:00
|
|
|
type: String
|
2017-02-07 11:34:00 +08:00
|
|
|
}
|
|
|
|
},
|
2017-02-06 11:24:03 +08:00
|
|
|
data () {
|
2017-02-07 11:34:00 +08:00
|
|
|
return {
|
2017-03-24 21:06:49 +08:00
|
|
|
prefixCls: prefixCls
|
2017-02-07 11:34:00 +08:00
|
|
|
};
|
2017-02-06 11:24:03 +08:00
|
|
|
},
|
2017-03-30 16:05:20 +08:00
|
|
|
computed: {
|
|
|
|
localeEmptyText () {
|
|
|
|
if (this.emptyText === undefined) {
|
|
|
|
return this.t('i.tree.emptyText');
|
|
|
|
} else {
|
|
|
|
return this.emptyText;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2017-02-07 11:34:00 +08:00
|
|
|
methods: {
|
2017-03-24 20:52:14 +08:00
|
|
|
getSelectedNodes () {
|
|
|
|
const nodes = findComponentsDownward(this, 'TreeNode');
|
|
|
|
return nodes.filter(node => node.data.selected).map(node => node.data);
|
|
|
|
},
|
2017-03-24 23:14:10 +08:00
|
|
|
getCheckedNodes () {
|
|
|
|
const nodes = findComponentsDownward(this, 'TreeNode');
|
|
|
|
return nodes.filter(node => node.data.checked).map(node => node.data);
|
|
|
|
},
|
2017-03-24 21:06:49 +08:00
|
|
|
updateData (isInit = true) {
|
2017-03-24 20:52:14 +08:00
|
|
|
// init checked status
|
|
|
|
function reverseChecked(data) {
|
|
|
|
if (data.children) {
|
|
|
|
let checkedLength = 0;
|
|
|
|
data.children.forEach(node => {
|
|
|
|
if (node.children) node = reverseChecked(node);
|
|
|
|
if (node.checked) checkedLength++;
|
2017-03-02 17:40:19 +08:00
|
|
|
});
|
2017-03-24 21:06:49 +08:00
|
|
|
if (isInit) {
|
|
|
|
if (checkedLength >= data.children.length) data.checked = true;
|
|
|
|
} else {
|
|
|
|
data.checked = checkedLength >= data.children.length;
|
|
|
|
}
|
2017-03-24 20:52:14 +08:00
|
|
|
return data;
|
2017-02-07 11:34:00 +08:00
|
|
|
} else {
|
2017-03-24 20:52:14 +08:00
|
|
|
return data;
|
2017-02-07 11:34:00 +08:00
|
|
|
}
|
|
|
|
}
|
2017-03-24 20:52:14 +08:00
|
|
|
|
|
|
|
function forwardChecked(data) {
|
|
|
|
if (data.children) {
|
|
|
|
data.children.forEach(node => {
|
|
|
|
if (data.checked) node.checked = true;
|
|
|
|
if (node.children) node = forwardChecked(node);
|
2017-03-24 20:50:13 +08:00
|
|
|
});
|
2017-03-24 20:52:14 +08:00
|
|
|
return data;
|
2017-03-24 20:50:13 +08:00
|
|
|
} else {
|
2017-03-24 20:52:14 +08:00
|
|
|
return data;
|
2017-03-24 20:50:13 +08:00
|
|
|
}
|
2017-02-07 11:34:00 +08:00
|
|
|
}
|
2017-03-24 21:06:49 +08:00
|
|
|
this.data.map(node => reverseChecked(node)).map(node => forwardChecked(node));
|
2017-03-24 20:52:14 +08:00
|
|
|
this.broadcast('TreeNode', 'indeterminate');
|
2017-02-07 11:34:00 +08:00
|
|
|
}
|
|
|
|
},
|
2017-03-02 17:40:19 +08:00
|
|
|
mounted () {
|
2017-03-24 20:52:14 +08:00
|
|
|
this.updateData();
|
2017-02-07 11:34:00 +08:00
|
|
|
|
2017-03-24 20:52:14 +08:00
|
|
|
this.$on('selected', ori => {
|
|
|
|
const nodes = findComponentsDownward(this, 'TreeNode');
|
|
|
|
nodes.forEach(node => {
|
|
|
|
this.$set(node.data, 'selected', false);
|
2017-02-07 15:29:53 +08:00
|
|
|
});
|
2017-03-24 20:52:14 +08:00
|
|
|
this.$set(ori, 'selected', true);
|
2017-02-07 11:34:00 +08:00
|
|
|
});
|
2017-03-24 20:52:14 +08:00
|
|
|
this.$on('on-selected', () => {
|
|
|
|
this.$emit('on-select-change', this.getSelectedNodes());
|
2017-02-07 11:34:00 +08:00
|
|
|
});
|
2017-03-24 20:52:14 +08:00
|
|
|
this.$on('checked', () => {
|
2017-03-24 21:06:49 +08:00
|
|
|
this.updateData(false);
|
2017-02-07 11:34:00 +08:00
|
|
|
});
|
2017-03-24 23:14:10 +08:00
|
|
|
this.$on('on-checked', () => {
|
|
|
|
this.$emit('on-check-change', this.getCheckedNodes());
|
|
|
|
});
|
2017-02-07 11:34:00 +08:00
|
|
|
}
|
2017-02-06 11:24:03 +08:00
|
|
|
};
|
|
|
|
</script>
|