From d412b90320c27f954507f2eedadbafbca79040ed Mon Sep 17 00:00:00 2001
From: sunxiaobin89 <285584806@qq.com>
Date: Fri, 14 Apr 2023 18:27:18 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=A0=E9=99=A4=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=E4=B9=8B=E5=90=8E=E7=9B=B8=E5=85=B3=E7=9A=84=E8=8A=82?=
=?UTF-8?q?=E7=82=B9=E5=A4=8D=E9=80=89=E6=A1=86=E7=8A=B6=E6=80=81=E5=BC=82?=
=?UTF-8?q?=E5=B8=B8=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/css/layui.css | 7 ++-
src/modules/treeTable.js | 129 ++++++++++++++++++++++++++++-----------
2 files changed, 97 insertions(+), 39 deletions(-)
diff --git a/src/css/layui.css b/src/css/layui.css
index 68de0302..87c82bb1 100644
--- a/src/css/layui.css
+++ b/src/css/layui.css
@@ -1108,10 +1108,13 @@ body .layui-table-tips .layui-layer-content{background: none; padding: 0; box-sh
.layui-table-tips-c:before{position: relative; right: -2px;}
/** 树表 **/
-.layui-table-tree-nodeIcon {padding-right: 2px;width: 20px;}
+.layui-table-tree .layui-table-cell {display: inline-flex; align-items: center;}
+.layui-table-tree-nodeIcon {width: 20px;}
.layui-table-tree-nodeIcon > * {width: 100%;}
+.layui-table-tree-flexIcon,.layui-table-tree-nodeIcon {margin-right: 2px;}
+.layui-table-tree-flexIcon {cursor: pointer;}
-/** 文件上传 **/
+ /** 文件上传 **/
.layui-upload-file{display: none!important; opacity: .01; filter: Alpha(opacity=1);}
.layui-upload-list{margin: 11px 0;}
.layui-upload-choose{max-width: 200px; padding: 0 10px; color: #999; font-size: 14px; text-overflow: ellipsis; overflow: hidden; white-space: nowrap;}
diff --git a/src/modules/treeTable.js b/src/modules/treeTable.js
index 2c179790..0e474628 100644
--- a/src/modules/treeTable.js
+++ b/src/modules/treeTable.js
@@ -171,6 +171,15 @@ layui.define(['table'], function (exports) {
});
// 更新cache中的内容 将子节点也存到cache中
updateCache();
+ // 更新全选框的状态
+ var layTableAllChooseElem = tableView.find('[name="layTableCheckbox"][lay-filter="layTableAllChoose"]');
+ if (layTableAllChooseElem.length) {
+ var checkStatus = treeTable.checkStatus(id);
+ layTableAllChooseElem.prop({
+ checked: checkStatus.isAll && checkStatus.data.length,
+ indeterminate: !checkStatus.isAll && checkStatus.data.length
+ })
+ }
that.renderTreeTable(tableView);
@@ -661,7 +670,7 @@ layui.define(['table'], function (exports) {
.html(['
',
treeOptions.view.flexIconClose, // 折叠图标
'
',
@@ -814,6 +823,7 @@ layui.define(['table'], function (exports) {
var tableThat = getThisTable(tableId);
var trData = obj.data = treeTable.getNodeDataByIndex(tableId, obj.index); // 克隆的
var trIndex = trData[LAY_DATA_INDEX];
+ obj.dataIndex = trIndex;
// 处理update方法
var updateFn = obj.update;
@@ -827,17 +837,9 @@ layui.define(['table'], function (exports) {
}
// 处理del方法
- var delFn = obj.del;
obj.del = function () {
- var updateThat = this;
- var args = arguments;
- // 原始的方法是讲对应下标的元素换成空数组,并删除相关节点,已经由
- // var ret = delFn.apply(updateThat, args);
- // delete table.cache[tableId][trIndex];
treeTable.removeNode(tableId, trIndex);
- // return ret;
}
-
}
// 更新数据
@@ -857,7 +859,6 @@ layui.define(['table'], function (exports) {
var newNodeTemp = that.getNodeDataByIndex(index, false, newNode);
// 获取新的tr替换
var trNew = table.getTrHtml(id, [newNodeTemp]);
- debugger;
// 重新渲染tr
layui.each(['main', 'fixed-l', 'fixed-r'], function (i, item) {
tableView.find('.layui-table-' + item + ' tbody tr[lay-data-index="' + index + '"]').replaceWith($(trNew[['trs', 'trs_fixed', 'trs_fixed_r'][i]].join('')).attr({
@@ -881,6 +882,8 @@ layui.define(['table'], function (exports) {
var indexArr = [];
layui.each(index, function (index, indexValue) {
delNode = that.getNodeDataByIndex(indexValue, false, 'delete');
+ var nodeP = that.getNodeDataByIndex(delNode[LAY_PARENT_INDEX]);
+ that.updateCheckStatus(nodeP, true);// 删除节点接近取消选择 todo
var delNodesFlat = that.treeToFlat([delNode], delNode[treeOptions.data.simpleData.pIdKey], delNode[LAY_PARENT_INDEX]);
layui.each(delNodesFlat, function (i2, item2) {
indexArr.push('tr[lay-data-index="' + item2[LAY_DATA_INDEX] + '"]');
@@ -1137,6 +1140,47 @@ layui.define(['table'], function (exports) {
}
})
+ // 更新表格的复选框状态
+ Class.prototype.updateCheckStatus = function (dataP, checked) {
+ var that = this;
+ var options = that.getOptions();
+ var treeOptions = options.tree;
+ var tableId = options.id;
+ var tableView = options.elem.next();
+
+ var checkName = table.config.checkName;
+
+ // 如有必要更新父节点们的状态
+ if (dataP) {
+ var trsP = that.updateParentCheckStatus(dataP, checked);
+ layui.each(trsP, function (indexP, itemP) {
+ form.render(tableView.find('tr[lay-data-index="' + itemP[LAY_DATA_INDEX] + '"] input[name="layTableCheckbox"]:not(:disabled)').prop({
+ checked: itemP[checkName],
+ indeterminate: itemP[LAY_CHECKBOX_HALF]
+ }))
+ })
+ }
+
+ // 更新全选的状态
+ var isAll = true;
+ var isIndeterminate = false;
+ layui.each(table.cache[tableId], function (i1, item1) {
+ if (item1[checkName] || item1[LAY_CHECKBOX_HALF]) {
+ isIndeterminate = true;
+ }
+ if (!item1[checkName]) {
+ isAll = false;
+ }
+ })
+ isIndeterminate = isIndeterminate && !isAll;
+ form.render(tableView.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({
+ 'checked': isAll,
+ indeterminate: isIndeterminate
+ }));
+
+ return isAll
+ }
+
// 更新父节点的选中状态
Class.prototype.updateParentCheckStatus = function (dataP, checked) {
var that = this;
@@ -1197,42 +1241,53 @@ layui.define(['table'], function (exports) {
var checkedStatus = {};
checkedStatus[checkName] = checked;
checkedStatus[LAY_CHECKBOX_HALF] = false;
- var trs = that.updateStatus(trData ? [trData] : table.cache[tableId], checkedStatus);
+
+ // 处理不可操作的信息
+ var checkedStatusFn = function (d) {
+ if (!d[table.config.disabledName]) { // 节点不可操作的不处理
+ d[checkName] = checked;
+ d[LAY_CHECKBOX_HALF] = false;
+ }
+ }
+
+ // var trs = that.updateStatus(trData ? [trData] : table.cache[tableId], checkedStatus);
+ var trs = that.updateStatus(trData ? [trData] : table.cache[tableId], checkedStatusFn);
form.render(tableView.find(trs.map(function (value) {
- return 'tr[lay-data-index="' + value[LAY_DATA_INDEX] + '"] input[name="layTableCheckbox"]';
+ return 'tr[lay-data-index="' + value[LAY_DATA_INDEX] + '"] input[name="layTableCheckbox"]:not(:disabled)';
}).join(',')).prop({checked: checked, indeterminate: false}));
}
-
+ var trDataP;
// 更新父节点以及更上层节点的状态
if (trData && trData[LAY_PARENT_INDEX]) {
// 找到父节点,然后判断父节点的子节点是否全部选中
- var trDataP = that.getNodeDataByIndex(trData[LAY_PARENT_INDEX]);
- var trsP = that.updateParentCheckStatus(trDataP, checked);
- layui.each(trsP, function (indexP, itemP) {
- form.render(tableView.find('tr[lay-data-index="' + itemP[LAY_DATA_INDEX] + '"] input[name="layTableCheckbox"]').prop({
- checked: itemP[checkName],
- indeterminate: itemP[LAY_CHECKBOX_HALF]
- }))
- })
+ trDataP = that.getNodeDataByIndex(trData[LAY_PARENT_INDEX]);
+ // var trsP = that.updateParentCheckStatus(trDataP, checked);
+ // layui.each(trsP, function (indexP, itemP) {
+ // form.render(tableView.find('tr[lay-data-index="' + itemP[LAY_DATA_INDEX] + '"] input[name="layTableCheckbox"]:not(:disabled)').prop({
+ // checked: itemP[checkName],
+ // indeterminate: itemP[LAY_CHECKBOX_HALF]
+ // }))
+ // })
}
+ obj.isAll = that.updateCheckStatus(trDataP, checked);
+
// 全选图标的状态更新
- obj.isAll = true;
- var isIndeterminate = false;
- layui.each(table.cache[tableId], function (i1, item1) {
- if (item1[checkName] || item1[LAY_CHECKBOX_HALF]) {
- isIndeterminate = true;
- }
- if (!item1[checkName]) {
- obj.isAll = false;
- return true;
- }
- })
- isIndeterminate = isIndeterminate && !obj.isAll;
- form.render(tableView.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({
- 'checked': obj.isAll,
- indeterminate: isIndeterminate
- }));
+ // obj.isAll = true;
+ // var isIndeterminate = false;
+ // layui.each(table.cache[tableId], function (i1, item1) {
+ // if (item1[checkName] || item1[LAY_CHECKBOX_HALF]) {
+ // isIndeterminate = true;
+ // }
+ // if (!item1[checkName]) {
+ // obj.isAll = false;
+ // }
+ // })
+ // isIndeterminate = isIndeterminate && !obj.isAll;
+ // form.render(tableView.find('input[name="layTableCheckbox"][lay-filter="layTableAllChoose"]').prop({
+ // 'checked': obj.isAll,
+ // indeterminate: isIndeterminate
+ // }));
}
})