351 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			351 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
| 
 | ||
| //import API from '../../../utils/API.js'
 | ||
| import ArrayUtils from 'ArrayUtils.js'
 | ||
| //import EventBus from '../../../components/NotificationCenter/WxNotificationCenter.js'
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| Page({
 | ||
|   data: {
 | ||
|     currentList: [], //当前展示的列表
 | ||
|     selectList: [],  //已选择的元素列表
 | ||
|     originalList: [], //最原始的数据列表
 | ||
|     indexList: [],  //存储目录层级的数组,用于准确的返回上一层
 | ||
|     selectList: [],  //已选中的人员列表
 | ||
|   },
 | ||
| 
 | ||
|   onLoad: function (options) {
 | ||
|     wx.setNavigationBarTitle({
 | ||
|       title: '选择分类'
 | ||
|     })
 | ||
|     this.init();
 | ||
|   },
 | ||
| 
 | ||
|   init() {
 | ||
|     //上次选中的列表,用于判断是不是取消选中了
 | ||
|     this.lastTimeSelect = []
 | ||
|     wx.request({
 | ||
|       url: getApp().globalData.serverUrl + 'api/questioncat?a=tree',
 | ||
|       header: {
 | ||
|         'content-type': 'application/json', // 默认值
 | ||
|         'Cookie': wx.getStorageSync("sessionid"),
 | ||
|       },
 | ||
|       data: {},
 | ||
|       success: res => {
 | ||
|         if (res.statusCode === 200) {
 | ||
|           let list = convert(res.data)
 | ||
|           this.setData({
 | ||
|             currentList: list,
 | ||
|             originalList: list
 | ||
|           })
 | ||
|         }
 | ||
|       }
 | ||
|     })
 | ||
|   },
 | ||
| 
 | ||
|   clickItem(res) {
 | ||
|     console.log(res)
 | ||
|     let index = res.currentTarget.id;
 | ||
|     let item = this.data.currentList[index]
 | ||
| 
 | ||
|     console.log("item", item)
 | ||
|     if(item.children.length!=0){
 | ||
|       this.setData({
 | ||
|         currentList: item.children
 | ||
|       })
 | ||
|       //将当前的索引存入索引目录中。索引多一个表示目录多一级
 | ||
|       let indexes = this.data.indexList
 | ||
|       indexes.push(index)
 | ||
|       //是目录不是具体的用户
 | ||
|       this.setData({
 | ||
|         indexList: indexes
 | ||
|       })
 | ||
|       //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect
 | ||
|       this.setLastTimeSelectList();
 | ||
|     }
 | ||
| 
 | ||
|   },
 | ||
| 
 | ||
| 
 | ||
|   //返回按钮
 | ||
|   goBack() {
 | ||
|     let indexList = this.data.indexList
 | ||
|     if (indexList.length > 0) {
 | ||
|       //返回时删掉最后一个索引
 | ||
|       indexList.pop()
 | ||
|       if (indexList.length == 0) {
 | ||
|         //indexList长度为0说明回到了最顶层
 | ||
|         this.setData({
 | ||
|           currentList: this.data.originalList,
 | ||
|           indexList: indexList
 | ||
|         })
 | ||
|       } else {
 | ||
|         //循环将当前索引的对应数组赋值给currentList
 | ||
|         let list = this.data.originalList
 | ||
|         for (let i = 0; i < indexList.length; i++) {
 | ||
|           let index = indexList[i]
 | ||
|           list = list[index].children
 | ||
|         }
 | ||
|         this.setData({
 | ||
|           currentList: list,
 | ||
|           indexList: indexList
 | ||
|         })
 | ||
|       }
 | ||
|       //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect
 | ||
|       this.setLastTimeSelectList();
 | ||
|     }
 | ||
|   },
 | ||
| 
 | ||
|   //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect
 | ||
|   setLastTimeSelectList() {
 | ||
|     this.lastTimeSelect = []
 | ||
|     this.data.currentList.forEach(item => {
 | ||
|       if (item.checked) {
 | ||
|         this.lastTimeSelect.push(item)
 | ||
|       }
 | ||
|     })
 | ||
|   },
 | ||
| 
 | ||
|   //根据部门获取下列列表
 | ||
|   // _getUserByGroup(item) {
 | ||
|   //   wx.request({
 | ||
|   //     url: getApp().globalData.serverUrl + 'api/partuser?a=getall&parentid=' + item.id,
 | ||
|   //     header: {
 | ||
|   //       'content-type': 'application/json', // 默认值
 | ||
|   //       'Cookie': wx.getStorageSync("sessionid"),
 | ||
|   //     },
 | ||
|   //     data: {},
 | ||
|   //     success: res => {
 | ||
|   //       if (res.statusCode === 200) {
 | ||
|   //         let list = res.data.data
 | ||
|   //         console.log(res.list)
 | ||
|   //         this.setData({
 | ||
|   //           currentList: list
 | ||
|   //         })
 | ||
|   //         this.addList2DataTree()
 | ||
|   //         this.setLastTimeSelectList();
 | ||
|   //       }
 | ||
|   //     }
 | ||
|   //   })
 | ||
|     // getApp().get(API.selectUserByGroup(), params, result => {
 | ||
|     //   console.log('result', result)
 | ||
|     //   let list = this.transformData(result.data.data, item.id)
 | ||
|     //   this.setData({
 | ||
|     //     currentList: list
 | ||
|     //   })
 | ||
|     //   this.addList2DataTree()
 | ||
|     //   //清空上次选中的元素列表,并设置上一层的选中状态给lastTimeSelect。写在这里防止异步请求时执行顺序问题
 | ||
|     //   this.setLastTimeSelectList();
 | ||
|     // })
 | ||
|   // },
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|   //将请求的数据转化为需要的格式
 | ||
|   // transformData(list, parentId) {
 | ||
|   //   //先将数据转化为固定的格式
 | ||
|   //   let newList = []
 | ||
|   //   for (let i = 0; i < list.length; i++) {
 | ||
|   //     let item = list[i]
 | ||
|   //     newList.push({
 | ||
|   //       id: item.id,
 | ||
|   //       name: item.realName,
 | ||
|   //       parentId: parentId,
 | ||
|   //       checked: false,
 | ||
|   //       isPeople: true,
 | ||
|   //       userType: item.userType,
 | ||
|   //       gender: item.gender,
 | ||
|   //       children: []
 | ||
|   //     })
 | ||
|   //   }
 | ||
|   //   return newList;
 | ||
|   // },
 | ||
| 
 | ||
|   //将当前列表挂载在原数据树上, 目前支持5层目录,如需更多接着往下写就好
 | ||
|   addList2DataTree() {
 | ||
|     let currentList = this.data.currentList;
 | ||
|     let originalList = this.data.originalList;
 | ||
|     let indexes = this.data.indexList
 | ||
|     switch (indexes.length) {
 | ||
|       case 1:
 | ||
|         originalList[indexes[0]].children = currentList
 | ||
|         break;
 | ||
|       case 2:
 | ||
|         originalList[indexes[0]].children[indexes[1]].children = currentList
 | ||
|         break;
 | ||
|       case 3:
 | ||
|         originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children = currentList
 | ||
|         break;
 | ||
|       case 4:
 | ||
|         originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children = currentList
 | ||
|         break;
 | ||
|       case 5:
 | ||
|         originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children[indexes[4]].children = currentList
 | ||
|         break;
 | ||
|       case 6:
 | ||
|         originalList[indexes[0]].children[indexes[1]].children[indexes[2]].children[indexes[3]].children[indexes[4]].children[indexes[5]].children = currentList
 | ||
|         break;
 | ||
|     }
 | ||
| 
 | ||
|     this.setData({
 | ||
|       originalList: originalList
 | ||
|     })
 | ||
|     console.log("originalList", originalList)
 | ||
|   },
 | ||
| 
 | ||
|   //选框变化回调
 | ||
|   checkChange(res) {
 | ||
|     console.log(res)
 | ||
|     let values = res.detail.value
 | ||
|     let selectItems = []
 | ||
|     //将值取出拼接成 id,name 格式
 | ||
|     values.forEach(value => {
 | ||
|       let arrs = value.split(",")
 | ||
|       selectItems.push({ id: arrs[0], name: arrs[1] })
 | ||
|     })
 | ||
|     console.log("selectItems", selectItems)
 | ||
|     console.log("lastTimeSelect", this.lastTimeSelect)
 | ||
| 
 | ||
|     //将本次选择的与上次选择的比对,本次比上次多说明新增了,本次比上次少说明删除了,找出被删除的那条数据,在footer中也删除
 | ||
|     if (selectItems.length > this.lastTimeSelect.length) {
 | ||
|       //将 selectList 与 selectItems 拼接并去重
 | ||
|       let newList = this.data.selectList.concat(selectItems)
 | ||
|       newList = ArrayUtils.checkRepeat(newList)
 | ||
|       this.setData({
 | ||
|         selectList: newList
 | ||
|       })
 | ||
|     } else {
 | ||
|       //找出取消勾选的item,从selectList中删除
 | ||
|       //比对出取消勾选的是哪个元素
 | ||
|       let diffItem = {}
 | ||
|       this.lastTimeSelect.forEach(item => {
 | ||
|         let flag = false;
 | ||
|         selectItems.forEach(item2 => {
 | ||
|           if (item.id === item2.id) {
 | ||
|             flag = true
 | ||
|           }
 | ||
|         })
 | ||
|         if (!flag) {
 | ||
|           diffItem = item
 | ||
|           console.log("diff=", item)
 | ||
|         }
 | ||
|       })
 | ||
|       //找出被删除的元素在 selectList 中的位置
 | ||
|       let list = this.data.selectList
 | ||
|       let delIndex = 0;
 | ||
|       for (let i = 0; i < list.length; i++) {
 | ||
|         if (list[i].id === diffItem.id) {
 | ||
|           delIndex = i;
 | ||
|           break;
 | ||
|         }
 | ||
|       }
 | ||
|       //从list中删除这个元素
 | ||
|       list.splice(delIndex, 1)
 | ||
|       this.setData({
 | ||
|         selectList: list
 | ||
|       })
 | ||
|     }
 | ||
|     console.log("selectList", this.data.selectList)
 | ||
|     //更新 currentList 选中状态并重新挂载在数据树上,以保存选择状态
 | ||
|     this.updateCurrentList(this.data.currentList, this.data.selectList)
 | ||
|   },
 | ||
| 
 | ||
|   //footer点击删除回调
 | ||
|   footerDelete(res) {
 | ||
|     console.log(res)
 | ||
|     this.setData({
 | ||
|       selectList: res.detail.selectList
 | ||
|     })
 | ||
| 
 | ||
|     console.log('selectList', this.data.selectList)
 | ||
|     this.updateCurrentList(this.data.currentList, res.detail.selectList)
 | ||
|   },
 | ||
| 
 | ||
|   //点击 footer 的确定按钮提交数据
 | ||
|   submitData(res) {
 | ||
|     let selectList = this.data.selectList
 | ||
|     //通过 WxNotificationCenter 发送选择的结果通知
 | ||
|     //EventBus.postNotificationName("SelectPeopleDone", selectList)
 | ||
|     //将选择结果存入 app.js 的 globalData
 | ||
|     getApp().globalData.selectList = selectList
 | ||
|     wx.setStorage({
 | ||
|       key: 'questioncats',
 | ||
|       data: selectList,
 | ||
|       success: function(res) {},
 | ||
|       fail: function(res) {},
 | ||
|       complete: function(res) {},
 | ||
|     })
 | ||
|     //返回
 | ||
|     wx.navigateBack({
 | ||
|       delta: 1
 | ||
|     })
 | ||
|     console.log("selectdone", selectList)
 | ||
|   },
 | ||
| 
 | ||
|   //更新 currentList 并将更新后的列表挂载在数据树上
 | ||
|   updateCurrentList(currentList, selectList) {
 | ||
|     //let newList = []
 | ||
|     let selectids = []
 | ||
|     for (var i = 0; i < selectList.length; i++) {
 | ||
|       selectids.push(selectList[i]['id'])
 | ||
|     }
 | ||
|     for (var i = 0; i < currentList.length; i++) {
 | ||
|       if (selectids.indexOf(currentList[i]['id'].toString()) >= 0) {
 | ||
|         currentList[i]['checked'] = true
 | ||
|       } else {
 | ||
|         currentList[i]['checked'] = false
 | ||
|       }
 | ||
|     }
 | ||
|     console.log(currentList)
 | ||
|     this.setData({
 | ||
|       currentList: currentList
 | ||
|     })
 | ||
|     this.addList2DataTree()
 | ||
|     this.setLastTimeSelectList()
 | ||
|   }
 | ||
| })
 | ||
| function convert(rows) {
 | ||
|   function exists(rows, parentId) {
 | ||
|     for (var i = 0; i < rows.length; i++) {
 | ||
|       if (rows[i].id == parentId) return true;
 | ||
|     }
 | ||
|     return false;
 | ||
|   }
 | ||
| 
 | ||
|   var nodes = [];
 | ||
|   // get the top level nodes
 | ||
|   for (var i = 0; i < rows.length; i++) {
 | ||
|     var row = rows[i];
 | ||
|     if (!exists(rows, row.parentId)) {
 | ||
|       nodes.push({
 | ||
|         id: row.id,
 | ||
|         parentId: 0,
 | ||
|         name: row.name,
 | ||
|         checked:false,
 | ||
|         children:[]
 | ||
|       });
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   var toDo = [];
 | ||
|   for (var i = 0; i < nodes.length; i++) {
 | ||
|     toDo.push(nodes[i]);
 | ||
|   }
 | ||
|   while (toDo.length) {
 | ||
|     var node = toDo.shift();	// the parent node
 | ||
|     // get the children nodes
 | ||
|     for (var i = 0; i < rows.length; i++) {
 | ||
|       var row = rows[i];
 | ||
|       if (row.parentId == node.id) {
 | ||
|         var child = { id: row.id, name: row.name,parentId:row.parentId,checked:false,children:[] };
 | ||
|         if (node.children) {
 | ||
|           node.children.push(child);
 | ||
|         } else {
 | ||
|           node.children = [child];
 | ||
|         }
 | ||
|         toDo.push(child);
 | ||
|       }
 | ||
|     }
 | ||
|   }
 | ||
|   return nodes;
 | ||
| } |