You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

999 lines
28 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="tm-tree ">
<view v-for="(item, index) in list_c" :key="index">
<view :class="['text-size-s', 'py-16 ml-32']">
<view v-if="!item.isDir" class=" flex-start">
<view v-if="!read" @click.stop="changeCheckboxItem(item)" class="pr-12">
<tm-checkbox :fllowTheme="fllowTheme" :color="color_tmeme" :disabled="item['disabled']" dense
v-model="item.checked"></tm-checkbox>
</view>
<view class="flex-start">
<view v-if="item['icon']" class="pr-10">
<tm-icons :fllowTheme="fllowTheme" :color="color_tmeme" dense :name="item['icon']"
:size="32"></tm-icons>
</view>
<text :class="[`text-${item.checked ? color_tmeme : black_tmeme ? 'grey' : 'black'}`]"
class="text-size-n">{{ item["title"]||item["text"] }}</text>
</view>
</view>
<view v-if="item.isDir" class="">
<view @click.stop="groupOpenChange(item)" class="flex-between">
<view class="flex-start">
<tm-icons :fllowTheme="fllowTheme" :color="color_tmeme"
:name="item.openDir ? dirIconList[1] : dirIconList[0]" :size="32"></tm-icons>
<view v-if="!read && mode=='multi'" @click.stop="changeCheckboxGroupItem(item)" class="px-12">
<tm-checkbox :icon="item['dirType']==3?'icon-minus':'icon-check'"
:fllowTheme="fllowTheme" :color="color_tmeme" :disabled="item['disabled']" dense
v-model="item.checked"></tm-checkbox>
</view>
<text
:class="[`text-${item.checked ? color_tmeme : black_tmeme ? 'grey' : 'black'}`, black_tmeme ? 'bk' : '']"
class="text-size-n">
{{ item["title"]||item["text"] }}
</text>
</view>
</view>
<view v-if="item.openDir && item['children'].length > 0" class="ml-24 flex-shrink border-l-1 "
:class="[black_tmeme ? 'bk' : '']" style="border-left-style: dotted;">
<tm-tree :mode="mode" :read="read" :fllowTheme="fllowTheme" :color="color_tmeme"
:dirOpenIcon="dirIconList[1]" :dirCloseIcon="dirIconList[0]" @changePrarent="changePrarent"
:list="item['children']" :prarent="item" @praentclear="preantchangClearChecked"></tm-tree>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* 树状结构
* @property {Array} list = [] 默认数据列表。
* @property {Array} defalut-value = [] 默认选中的项通过id的集合。
* @property {String} dirCloseIcon = [] 默认 'icon-caret-right',关闭后的图标
* @property {String} dirOpenIcon = [] 默认 'icon-sort-down',打开后的图标
* @property {String} color = [] 默认 'primary',主题色
* @property {String} mode = [multi|radio] 默认 'multi',多选或单选模式。
* @property {Boolean|String} read = [] 默认 false是否只读作为目录展示
*/
import tmCheckbox from '@/tm-vuetify/components/tm-checkbox/tm-checkbox.vue';
import tmIcons from '@/tm-vuetify/components/tm-icons/tm-icons.vue';
import tmTree from '@/tm-vuetify/components/tm-tree/tm-tree.vue';
export default {
name: 'tm-tree',
components: {
tmCheckbox,
tmTree,
tmIcons
},
props: {
list: {
type: Array,
default: () => {
return [];
}
},
defalutValue: {
type: Array,
default: () => []
},
dirCloseIcon: {
type: String,
default: 'icon-caret-right'
},
dirOpenIcon: {
type: String,
default: 'icon-sort-down'
},
color: {
type: String,
default: 'primary'
},
//外部不允许使用。
prarent: {
type: Object,
default: () => null
},
// 跟随主题色的改变而改变。
fllowTheme: {
type: Boolean | String,
default: true
},
// 是否开启暗黑模式
black: {
type: String | Boolean,
default: null
},
read: {
type: Boolean | String,
default: false
},
mode:{
type:String,
default:'multi' //radio 单选 multi多选
}
},
watch: {
list: {
deep: true,
handler() {
this.list_c = this.list;
}
}
},
computed: {
black_tmeme: function() {
if (this.black !== null) return this.black;
return this.$tm.vx.state().tmVuetify.black;
},
color_tmeme: function() {
if (this.$tm.vx.state().tmVuetify.color !== null && this.$tm.vx.state().tmVuetify.color && this
.fllowTheme) {
return this.$tm.vx.state().tmVuetify.color;
}
return this.color;
},
dirIconList: function() {
return [this.dirCloseIcon, this.dirOpenIcon];
},
list_c: {
get() {
return this.listData;
},
set(val) {
this.chulilist(val);
let rulst = this.getCheckedArray();
this.$emit('change', rulst);
}
}
},
data() {
return {
showContent: true,
listData: []
};
},
mounted() {
this.list_c = this.list;
this.setDefaultSelectedKey();
},
methods: {
groupOpenChange(item) {
if (item['disabled'] === true) return;
this.$nextTick(function() {
let p = !item.openDir;
this.list_c = this.setChildListData(this.list_c, item, 'openDir', !item.openDir);
});
},
// 子项目点击选中切换。
changeCheckboxItem(item) {
if (item['disabled'] === true || this.prarent?.disabled === true) return;
this.$nextTick(function() {
this.list_c = this.setChildListData(this.list_c, item, 'checked', item.checked);
if(this.mode=="radio"){
this.clearChecked()
item.checked = true;
this.$emit('praentclear',item);
if(!this.prarent){
this.preantchangClearChecked(item)
}
return;
}
this.$nextTick(function() {
if (this.prarent) {
//递归修改父节点。
let p = {
...this.prarent
};
p.children = [...this.list_c];
let prenatKeyArray = this.getChildrenKeyToArray(p, 'checked');
let isAllChecked = true; //是否全部选中。
let isAllChecked_min = true; //是否半选中。
let isAllCheckedAr_all_true = prenatKeyArray.filter((el, eindex) => {
return el == true;
})
let isAllCheckedAr_all_false = prenatKeyArray.filter((el, eindex) => {
return el == false;
})
isAllChecked = isAllCheckedAr_all_true.length === prenatKeyArray.length ?
true : false;
isAllChecked_min = isAllCheckedAr_all_true.length > 0 &&
isAllCheckedAr_all_false.length > 0 ? true : false;
p['children'] = this.checkAllChildren(p['children']);
if (isAllChecked) {
p['dirType'] = 2;
}
if (isAllChecked_min) {
p['dirType'] = 3;
}
if (isAllCheckedAr_all_true.length == 0) {
p['dirType'] = 1;
}
isAllChecked = isAllChecked_min || isAllChecked ? true : false;
p['checked'] = isAllChecked;
// let prenatKeyArray = this.getChildrenKeyToArray(p, 'checked');
// let isAllChecked = true;
// for (let i = 0; i < prenatKeyArray.length; i++) {
// if (prenatKeyArray[i] === false) {
// isAllChecked = false;
// break;
// }
// }
// p.checked = isAllChecked;
this.$emit('changePrarent', p);
}else{
}
});
});
},
//收到子节点修改父节点的请求。
changePrarent(item) {
this.$nextTick(function() {
let index = this.list_c.findIndex(ix => ix.id === item.id);
this.list_c.splice(index, 1, item);
if (this.prarent) {
if (item['disabled'] === true) return;
if (this.prarent['disabled'] === true) return;
// 再反递归,修改它的上一级,一直类推到第一级。
let p = {
...this.prarent
};
p.children = [...this.list_c];
let prenatKeyArray = this.getChildrenKeyToArray(p, 'checked');
let isAllChecked = true; //是否全部选中。
let isAllChecked_min = true; //是否半选中。
let isAllCheckedAr_all_true = prenatKeyArray.filter((el, eindex) => {
return el == true;
})
let isAllCheckedAr_all_false = prenatKeyArray.filter((el, eindex) => {
return el == false;
})
isAllChecked = isAllCheckedAr_all_true.length === prenatKeyArray.length ? true : false;
isAllChecked_min = isAllCheckedAr_all_true.length > 0 && isAllCheckedAr_all_false.length >
0 ? true : false;
p['children'] = this.checkAllChildren(p['children']);
if (isAllChecked) {
p['dirType'] = 2;
}
if (isAllChecked_min) {
p['dirType'] = 3;
}
if (isAllCheckedAr_all_true.length == 0) {
p['dirType'] = 1;
}
isAllChecked = isAllChecked_min || isAllChecked ? true : false;
p['checked'] = isAllChecked;
this.$emit('changePrarent', p);
} else {
// 第一级。
let rulst = this.getCheckedArray();
this.$emit('change', rulst);
}
});
},
//收到子节点请求清空所有选择,并设置某个属性
preantchangClearChecked(item){
if(!this.prarent){
this.clearChecked();
if(item){
let t = this
if(typeof item == 'object' && !Array.isArray(item)){
setTimeout(function(){
t.setDefaultSelectedKey([item.id])
},150)
}else if(typeof item == 'object' && Array.isArray(item)){
setTimeout(function(){
t.setDefaultSelectedKey([...item])
},150)
}
}
}else{
this.$emit('praentclear',item);
}
},
//设置某一个key的属性。
/**
* @param {Object} list 目标数组
* @param {Object} item 待修改的对象根据item.id修改
* @param {Object} key 待修改的字段名称
* @param {Object} value 待修改的字段变量。
*/
setChildListData(list, item, key, value) {
let parar = [...list];
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children) && children.length>0) {
let xg = {};
if (item.id === objAr.id) {
if(key=='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
}
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
openDir: objAr['openDir'] || false,
dirType: objAr['dirType'] || 1,
children: ch(children),
...xg
};
} else {
let xg = {};
if (item.id === objAr.id) {
if(objAr!='checked'){
if(item['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
}
let isDir = false;
if (typeof objAr['isDir'] === 'boolean') isDir = objAr['isDir'];
if (typeof objAr['children'] === 'object' && Array.isArray(objAr['children']) && children.length>0) {
if (objAr['children'].length > 0) {
isDir = true;
}
}
return {
...objAr,
isDir: isDir || false,
checked: objAr['checked'] || false,
...xg
};
}
}
}
return ch(parar);
},
//通过key的唯一属性取得子集。
/**
* @param {Object} item 目标数组
* @param {Object} key 筛选的字段名称
* @param {Object} value 筛选的的字段变量。
*/
getChildren(item, key, value) {
let parar = [...item];
function ch(objAr) {
let p = null;
if (typeof objAr == 'object' && Array.isArray(objAr) && objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p = ch(objAr[i]);
if (p) {
break;
}
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children) && children.length>0) {
if (objAr[key] == value) {
return objAr;
}
p = ch(objAr.children);
if (p) {
return p;
}
return false;
} else {
if (objAr[key] == value) {
return objAr;
}
return false;
}
}
}
return ch(parar);
},
//取得子集下所有相同属性的集合。根据指定key的变量条件取得。
getChildrenKeyToArrayByvalue(item, quereyKey, key, value) {
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(...ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
if (objAr[key] === value) {
return [objAr[quereyKey], ...ch(children)];
}
return [];
} else {
if (objAr[key] === value) {
return [objAr[quereyKey]];
}
return [];
}
}
}
let ru = [];
//添加父节点。
if (item[key] === value) {
ru.push(item[quereyKey]);
}
if(typeof item =='object' && Array.isArray() && item?.children.lenght>0){
let parar = [...item];
ru = [...ru, ...ch(parar)];
}
if(typeof item =='object' && !Array.isArray()&& Array.isArray(item?.children)){
let parar = [...item?.children];
ru = [...ru, ...ch(parar)];
}
if(typeof item?.id == 'underfined'){
return []
}
return ru;
},
//取得子集下所有相同属性的集合。
getChildrenKeyToArray(item, key) {
let parar = [...item.children];
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(...ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
return [objAr[key], ...ch(children)];
} else {
return [objAr[key]];
}
}
}
return ch(parar);
},
//打开某一项目录。通过id进行控制打开。
/**
* @param {Object} id 目录id,如果不是目录,不会执行。
* @param {Object} dirType 打开类型true,打开close关闭。
*/
__openDir(id, dirType = true) {
//子节点不允许操作此函数。
if (this.prarent == null) {
let children = this.getChildren(this.list_c, 'id', id);
if (children['isDir']) {
children['openDir'] = dirType;
this.setDirListData(children, 'openDir', dirType);
}
}
},
//打开所有折叠.
__openAll(){
// this.setDirListData(this.list_c, 'openDir', true);
for(let i=0;i<this.list_c.length;i++){
this.__openDir(this.list_c[i].id,true)
}
},
//获取当前列表数据。子级不能调用。
__getListdata() {
if (this.prarent) return [];
return this.list_c;
},
//添加数据。子级不可调用。
//注意如果提供的id是dir则在其子集中添加数据。因此如果想在本级添加数据需要提供父级id.
//如果提供的id不是目录id,那么会自动创建它的子集。
__addData(id, data = null) {
if (this.prarent) return [];
if (!data || typeof data != 'object') return;
//不提供id默认在根目录添加数据追加。
if (typeof id === 'undefined' || id == null || id == '') {
let cp = uni.$tm.deepClone(this.list_c);
cp.push(...data);
this.list_c = cp;
} else {
let ps = uni.$tm.deepClone(this.list_c);
for (let i = 0; i < ps.length; i++) {
let children = this.getChildren(ps, 'id', id);
//如果是目录,向其子集添加数据。
if (children['isDir']) {
children['children'].push(...data);
this.list_c = this.setChildListData(ps, children, 'children', children['children']);
//不是目录。它没有子集。创建子集。
} else {
children = {
...children,
isDir: true,
children: [...data]
};
ps = this.setChildListData(ps, children, 'isDir', true);
ps = this.setChildListData(ps, children, 'children', children['children']);
this.list_c = ps;
}
if (children) {
break;
}
}
}
},
// 项目父节点击选中切换。
changeCheckboxGroupItem(item) {
if (item['disabled'] === true) return;
let t = this;
t.setDirListData(item, 'checked', item.checked);
if (t.prarent) {
let p = {
...t.prarent
};
p.children = [...t.list_c];
let prenatKeyArray = this.getChildrenKeyToArray(p, 'checked');
let isAllChecked = true; //是否全部选中。
let isAllChecked_min = true; //是否半选中。
let isAllCheckedAr_all_true = prenatKeyArray.filter((el, eindex) => {
return el == true;
})
let isAllCheckedAr_all_false = prenatKeyArray.filter((el, eindex) => {
return el == false;
})
isAllChecked = isAllCheckedAr_all_true.length === prenatKeyArray.length ? true : false;
isAllChecked_min = isAllCheckedAr_all_true.length > 0 && isAllCheckedAr_all_false.length > 0 ? true :
false;
p['children'] = this.checkAllChildren(p['children']);
if (isAllChecked) {
p['dirType'] = 2;
}
if (isAllChecked_min) {
p['dirType'] = 3;
}
if (isAllCheckedAr_all_true.length == 0) {
p['dirType'] = 1;
}
isAllChecked = isAllChecked_min || isAllChecked ? true : false;
p['checked'] = isAllChecked;
// let prenatKeyArray = t.getChildrenKeyToArray(p, 'checked');
// let isAllChecked = true;
// for (let i = 0; i < prenatKeyArray.length; i++) {
// if (prenatKeyArray[i] === false) {
// isAllChecked = false;
// break;
// }
// }
// p.checked = isAllChecked;
t.$emit('changePrarent', p);
}else{
this.$nextTick(function(){
this.list_c = this.checkAllChildren(this.list_c)
})
}
},
//设置dir下所有子集相同的属性。
setDirListData(item, key, value, callback) {
let parar = uni.$tm.deepClone(item);
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
let xg = {};
if(key=='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
openDir: objAr['openDir'] || false,
dirType: objAr['dirType'] || 1,
children: ch(children),
...xg
};
} else {
let xg = {};
if(key=='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
isDir: objAr['isDir'] || false,
checked: objAr['checked'] || false,
...xg
};
}
}
}
let ts = ch(parar.children);
let new_list = this.setChildListData(this.list_c, item, 'children', ts);
this.list_c = [...new_list];
if (callback) {
callback();
}
},
chulilist(list) {
let parar = [...list];
//dirType=1未选中2选中3有选中有未选中的
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
dirType: objAr['dirType'] || 1,
openDir: objAr['openDir'] || false,
children: ch(children)
};
} else {
return {
...objAr,
isDir: objAr['isDir'] || false,
checked: objAr['checked'] || false
};
}
}
}
this.listData = ch(parar);
},
// 获取所有选中的条目指定条件的属性。id
/**
* @param {Object} key 需要取得的字段名称。 默认是id
* @param {Object} quereyKey 条件查询的字段。默认是checked即选中的条目字段
* @param {Object} value 条件查询的字段的变量。默认是true即选中的条目值
*/
getCheckedArray(key, quereyKey, value) {
key = typeof key === 'undefined' ? 'id' : key;
quereyKey = typeof quereyKey === 'undefined' ? 'checked' : quereyKey;
value = typeof value === 'undefined' ? true : value;
if (this.prarent) return;
let ps = uni.$tm.deepClone(this.list_c);
let rulst = [];
for (let i = 0; i < ps.length; i++) {
let idArray = this.getChildrenKeyToArrayByvalue(ps[i], key, quereyKey, value);
rulst.push(...idArray);
}
return rulst;
},
setDirListDataBySync(item, key, value) {
let parar = uni.$tm.deepClone(item);
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
let xg = {};
if(key=='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
openDir: objAr['openDir'] || false,
dirType: objAr['dirType'] || 1,
children: ch(children),
...xg
};
} else {
let xg = {};
if(key=='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
isDir: objAr['isDir'] || false,
checked: objAr['checked'] || false,
...xg
};
}
}
}
let ts = ch(parar.children);
let new_list = this.setChildListData(this.list_c, item, 'children', ts);
this.list_c = [...new_list];
},
//清空所有选择。
clearChecked() {
let ps = uni.$tm.deepClone(this.list_c);
for (let i = 0; i < ps.length; i++) {
ps[i].checked = false;
ps[i].dirType = 1;
let new_list = this.setChildListData(this.list_c, ps[i], 'checked', ps[i].checked);
this.list_c = [...new_list];
this.setDirListDataBySync(ps[i], 'checked', false);
}
},
//选中所有选择。
seletedAll() {
let ps = uni.$tm.deepClone(this.list_c);
for (let i = 0; i < ps.length; i++) {
ps[i].checked = true;
let new_list = this.setChildListData(this.list_c, ps[i], 'checked', ps[i].checked);
this.list_c = [...new_list];
this.setDirListDataBySync(ps[i], 'checked', true);
}
this.$nextTick(function() {
this.list_c = this.setDirListDataBySyncToDir(this.list_c, 'dirType', 2)
})
},
//给定一个数组设置它下面所有dir目录只设置目录不含其子级相同的属性。
setDirListDataBySyncToDir(list, key, value) {
let new_list = uni.$tm.deepClone(list);
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
let xg = {};
if(objAr!='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
openDir: objAr['openDir'] || false,
dirType: objAr['dirType'] || 1,
children: ch(children),
...xg
};
} else {
let xg = {};
// xg[key] = value;
return {
...objAr,
isDir: objAr['isDir'] || false,
checked: objAr['checked'] || false,
...xg
};
}
}
}
for (let i = 0; i < new_list.length; i++) {
let parar = new_list[i];
parar[key] = value
parar['children'] = ch(parar.children);
}
return new_list;
},
//给定一个数组设置它下面所有项目相同的属性。
setDirListDataBySyncToItem(list, item, key, value) {
let parar = uni.$tm.deepClone(item);
function ch(objAr) {
let p = [];
if (typeof objAr == 'object' && Array.isArray(objAr)&& objAr.length>0) {
for (let i = 0; i < objAr.length; i++) {
p.push(ch(objAr[i]));
}
return p;
} else if (typeof objAr === 'object') {
let children = objAr['children'];
if (typeof children === 'object' && Array.isArray(children)&& children.length>0) {
let xg = {};
if(objAr!='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
checked: objAr['checked'] || false,
isDir: objAr['isDir'] || true,
openDir: objAr['openDir'] || false,
dirType: objAr['dirType'] || 1,
children: ch(children),
...xg
};
} else {
let xg = {};
if(objAr!='checked'){
if(objAr['disabled']!==true){
xg[key] = value;
}
}else{
xg[key] = value;
}
return {
...objAr,
isDir: objAr['isDir'] || false,
checked: objAr['checked'] || false,
...xg
};
}
}
}
let ts = ch(parar.children);
let new_list = this.setChildListData(list, item, 'children', ts);
return new_list;
},
//检查选择情况。
checkAllChildren(o_item) {
let t = this;
// 检查各个子集的选择情况。
// this.changePrarent(children)
// 再反递归,修改它的上一级,一直类推到第一级。
let otem = uni.$tm.deepClone(o_item);
let ls = [];
for (let j = 0; j < otem.length; j++) {
let pr = otem[j];
if (pr['isDir']) {
let prenatKeyArray = t.getChildrenKeyToArray(pr, 'checked');
let isAllChecked = true; //是否全部选中。
let isAllChecked_min = true; //是否半选中。
let isAllCheckedAr_all_true = prenatKeyArray.filter((el, eindex) => {
return el == true;
})
let isAllCheckedAr_all_false = prenatKeyArray.filter((el, eindex) => {
return el == false;
})
isAllChecked = isAllCheckedAr_all_true.length === prenatKeyArray.length ? true : false;
isAllChecked_min = isAllCheckedAr_all_true.length > 0 && isAllCheckedAr_all_false.length > 0 ?
true : false;
pr['children'] = t.checkAllChildren(pr['children']);
if (isAllChecked) {
pr['dirType'] = 2;
}
if (isAllChecked_min) {
pr['dirType'] = 3;
}
if (isAllCheckedAr_all_true.length == 0) {
pr['dirType'] = 1;
}
isAllChecked = isAllChecked_min || isAllChecked ? true : false;
pr['checked'] = isAllChecked;
}
ls.push(pr)
}
return ls;
},
setDefaultSelectedKey(defaultValue) {
let t = this;
if (!defaultValue) {
defaultValue = this.defalutValue;
}
let rulst = defaultValue;
if (this.prarent == null) {
//清空所有选择。
// this.clearChecked();
let ps = uni.$tm.deepClone(this.list_c);
for (let i = 0; i < rulst.length; i++) {
let children = this.getChildren(ps, 'id', rulst[i]);
children['checked'] = true;
if (children['isDir']) {
let index = ps.findIndex(ix => ix.id === children.id);
// this.list_c.splice(index, 1, children);
// this.changeCheckboxGroupItem(children)
ps = this.setDirListDataBySyncToItem(ps, children, 'checked', children.checked);
} else {
ps = this.setChildListData(ps, children, 'checked', children.checked);
}
}
let pc = [];
ps = this.checkAllChildren(ps);
this.$nextTick(function() {
this.list_c = ps;
});
}
}
}
};
</script>
<style lang="scss"></style>