From c1330e026a5030be381656fb8ff08e287255ea40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B4=A4=E5=BF=83?= <3277200+sentsim@users.noreply.github.com> Date: Sun, 23 Apr 2023 11:03:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=20treeTable=20=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/treeTable.js | 102 ++++++++++++++++++++------------------- 1 file changed, 53 insertions(+), 49 deletions(-) diff --git a/src/modules/treeTable.js b/src/modules/treeTable.js index cf89c2fe..f743cc79 100644 --- a/src/modules/treeTable.js +++ b/src/modules/treeTable.js @@ -126,8 +126,9 @@ layui.define(['table'], function (exports) { that.tableIns = tableIns; var treeOptions = options.tree; - var isParentKey = treeOptions.data.key.isParent; - var childrenKey = treeOptions.data.key.children; + var customName = treeOptions.customName; + var isParentKey = customName.isParent; + var childrenKey = customName.children; // 处理属性 var parseData = options.parseData; @@ -143,8 +144,8 @@ layui.define(['table'], function (exports) { retData = parseData.apply(parseDataThat, args) || args[0]; } var dataName = parseDataThat.response.dataName; - // 处理simpleData - if (treeOptions.data.simpleData.enable && !treeOptions.async.enable) { // 异步加载和simpleData不应该一起使用 + // 处理 isSimpleData + if (treeOptions.data.isSimpleData && !treeOptions.async.enable) { // 异步加载和 isSimpleData 不应该一起使用 retData[dataName] = that.flatToTree(retData[dataName]); } @@ -154,8 +155,8 @@ layui.define(['table'], function (exports) { } } else { options.data = options.data || []; - // 处理simpleData - if (treeOptions.data.simpleData.enable) { + // 处理 isSimpleData + if (treeOptions.data.isSimpleData) { options.data = that.flatToTree(options.data); } if (options.initSort && options.initSort.type) { @@ -195,6 +196,17 @@ layui.define(['table'], function (exports) { // 初始默认配置 Class.prototype.config = { tree: { + customName: { + checked: 'LAY_CHECKED', // 节点数据中保存 check 状态的属性名称 + children: "children", // 节点数据中保存子节点数据的属性名称 + isParent: "isParent", // 节点数据保存节点是否为父节点的属性名称 + isHidden: "hidden", // 节点数据保存节点是否隐藏的属性名称 + name: "name", // 节点数据保存节点名称的属性名称 + url: "url", // 节点数据保存节点链接的目标 URL 的属性名称 + id: "id", // 唯一标识的属性名称 + pid: "parentId", + rootId: null + }, view: { indent: 14, // 层级缩进量 flexIconClose: '', // 关闭时候的折叠图标 @@ -208,21 +220,7 @@ layui.define(['table'], function (exports) { dblClickExpand: true, // 双击节点时,是否自动展开父节点的标识 }, data: { - key: { - checked: 'LAY_CHECKED', // 节点数据中保存 check 状态的属性名称 - children: "children", // 节点数据中保存子节点数据的属性名称 - isParent: "isParent", // 节点数据保存节点是否为父节点的属性名称 - isHidden: "hidden", // 节点数据保存节点是否隐藏的属性名称 - name: "name", // 节点数据保存节点名称的属性名称 - title: "", // 节点数据保存节点提示信息的属性名称 - url: "url", // 节点数据保存节点链接的目标 URL 的属性名称 - }, - simpleData: { - enable: false, // 是否简单数据模式 - idKey: "id", // 唯一标识的属性名称 - pIdKey: "parentId", - rootPId: null - } + isSimpleData: false // 是否简单数据模式 }, async: { enable: false, // 是否开启异步加载模式,只有开启的时候其他参数才起作用 @@ -277,20 +275,21 @@ layui.define(['table'], function (exports) { var that = this; var options = that.getOptions(); var treeOptions = options.tree; - var simpleDataOptions = treeOptions.data.simpleData; + var customName = treeOptions.customName; var tableId = options.id; tableData = tableData || table.cache[tableId]; - return flatToTree(tableData, simpleDataOptions.idKey, simpleDataOptions.pIdKey, treeOptions.data.key.children, simpleDataOptions.rootPId) + return flatToTree(tableData, customName.id, customName.pid, customName.children, customName.rootId) } Class.prototype.treeToFlat = function (tableData, parentId, parentIndex) { var that = this; var options = that.getOptions(); var treeOptions = options.tree; - var childrenKey = treeOptions.data.key.children; - var pIdKey = treeOptions.data.simpleData.pIdKey; + var customName = treeOptions.customName; + var childrenKey = customName.children; + var pIdKey = customName.pid; var flat = []; layui.each(tableData, function (i1, item1) { @@ -299,7 +298,7 @@ layui.define(['table'], function (exports) { dataNew[childrenKey] = null; dataNew[pIdKey] = item1[pIdKey] || parentId; flat.push(dataNew); - flat = flat.concat(that.treeToFlat(item1[childrenKey], item1[treeOptions.data.simpleData.idKey], dataIndex)); + flat = flat.concat(that.treeToFlat(item1[childrenKey], item1[customName.id], dataIndex)); }); return flat; @@ -323,7 +322,7 @@ layui.define(['table'], function (exports) { var dataRet = tableData; var tableCache = (options.url || indexArr.length > 1) ? null : table.cache[tableId]; // 只有在删除根节点的时候才需要处理 - for (var i = 0, childrenKey = treeOptions.data.key.children; i < indexArr.length; i++) { + for (var i = 0, childrenKey = treeOptions.customName.children; i < indexArr.length; i++) { if (newValue && i === indexArr.length - 1) { if (newValue === 'delete') { // 删除 @@ -373,9 +372,12 @@ layui.define(['table'], function (exports) { var options = that.getOptions(); var treeOptions = options.tree; var tableId = options.id; + data = data || that.getTableData(); - var isParentKey = treeOptions.data.key.isParent; - var childrenKey = treeOptions.data.key.children; + + var customName = treeOptions.customName; + var isParentKey = customName.isParent; + var childrenKey = customName.children; layui.each(data, function (i1, item1) { if (!(isParentKey in item1)) { @@ -400,7 +402,8 @@ layui.define(['table'], function (exports) { var tableId = tableViewElem.attr('lay-id'); var options = table.getOptions(tableId); var treeOptions = options.tree || {}; - var isParentKey = treeOptions.data.key.isParent; + var customName = treeOptions.customName || {}; + var isParentKey = customName.isParent; var trIndex = trElem.attr('lay-data-index'); // 可能出现多层 var treeTableThat = getThisTable(tableId); var tableData = treeTableThat.getTableData(); @@ -438,7 +441,7 @@ layui.define(['table'], function (exports) { nodeIconElem.html(trExpand ? treeOptions.view.iconOpen : treeOptions.view.iconClose); } - var childNodes = trData[treeOptions.data.key.children] || []; // 测试用后续需要改成子节点的字段名称 + var childNodes = trData[customName.children] || []; // 测试用后续需要改成子节点的字段名称 // 处理子节点展示与否 if (trExpand) { // 展开 @@ -506,8 +509,8 @@ layui.define(['table'], function (exports) { flexIconElem.html(''); // 事件 } else { - trData[treeOptions.data.key.children] = res[asyncResponse.dataName]; - treeTableThat.initData(trData[treeOptions.data.key.children], trData[LAY_DATA_INDEX]) + trData[customName.children] = res[asyncResponse.dataName]; + treeTableThat.initData(trData[customName.children], trData[LAY_DATA_INDEX]) // 正常返回 expandNode(treeNode, true, isToggle ? false : sonSign, focus, callbackFlag); } @@ -527,13 +530,13 @@ layui.define(['table'], function (exports) { if (options.initSort && !options.url) { var initSort = options.initSort; if (initSort.type) { - childNodes = trData[treeOptions.data.key.children] = layui.sort(childNodes, initSort.field, initSort.type === 'desc'); + childNodes = trData[customName.children] = layui.sort(childNodes, initSort.field, initSort.type === 'desc'); } else { // 恢复默认 - childNodes = trData[treeOptions.data.key.children] = layui.sort(childNodes, table.config.indexName); + childNodes = trData[customName.children] = layui.sort(childNodes, table.config.indexName); } } - treeTableThat.initData(trData[treeOptions.data.key.children], trData[LAY_DATA_INDEX]); + treeTableThat.initData(trData[customName.children], trData[LAY_DATA_INDEX]); // 将数据通过模板得出节点的html代码 var str2 = table.getTrHtml(tableId, childNodes, null, null, trIndex); @@ -588,7 +591,7 @@ layui.define(['table'], function (exports) { return 'tr[lay-data-index="' + value[LAY_DATA_INDEX] + '"]' }).join(',')).addClass('layui-hide'); } else { - var childNodesFlat = treeTableThat.treeToFlat(childNodes, trData[treeOptions.data.simpleData.idKey], trIndex); + var childNodesFlat = treeTableThat.treeToFlat(childNodes, trData[customName.id], trIndex); tableViewElem.find(childNodesFlat.map(function (value, index, array) { return 'tr[lay-data-index="' + value[LAY_DATA_INDEX] + '"]' }).join(',')).addClass('layui-hide'); @@ -700,7 +703,8 @@ layui.define(['table'], function (exports) { var treeOptions = options.tree || {}; var treeOptionsData = treeOptions.data || {}; var treeOptionsView = treeOptions.view || {}; - var isParentKey = treeOptionsData.key.isParent; + var customName = treeOptions.customName || {}; + var isParentKey = customName.isParent; var tableFilterId = tableViewElem.attr('lay-filter'); var treeTableThat = that; // var tableData = treeTableThat.getTableData(); @@ -718,7 +722,7 @@ layui.define(['table'], function (exports) { } var dataExpand = {}; // 记录需要展开的数据 - var nameKey = treeOptions.data.key.name; + var nameKey = customName.name; var indent = treeOptions.view.indent || 14; layui.each(tableView.find('td[data-field="' + nameKey + '"]'), function (index, item) { item = $(item); @@ -854,7 +858,7 @@ layui.define(['table'], function (exports) { var treeOptions = options.tree; data = data || table.cache[options.id]; - return updateStatus(data, statusObj, treeOptions.data.key.children); + return updateStatus(data, statusObj, treeOptions.customName.children); } Class.prototype.getTableData = function () { @@ -971,7 +975,7 @@ layui.define(['table'], function (exports) { delNode = that.getNodeDataByIndex(layui.type(node) === 'string' ? node : node[LAY_DATA_INDEX], false, 'delete'); var nodeP = that.getNodeDataByIndex(delNode[LAY_PARENT_INDEX]); that.updateCheckStatus(nodeP, true); - var delNodesFlat = that.treeToFlat([delNode], delNode[treeOptions.data.simpleData.pIdKey], delNode[LAY_PARENT_INDEX]); + var delNodesFlat = that.treeToFlat([delNode], delNode[treeOptions.customName.pid], delNode[LAY_PARENT_INDEX]); layui.each(delNodesFlat, function (i2, item2) { indexArr.push('tr[lay-data-index="' + item2[LAY_DATA_INDEX] + '"]'); }) @@ -1101,8 +1105,8 @@ layui.define(['table'], function (exports) { return 'tr[lay-data-index="' + value[LAY_DATA_INDEX] + '"]' }).join(','))); } else { - var isParentKey = treeOptions.data.key.isParent; - var childKey = treeOptions.data.key.children; + var isParentKey = treeOptions.customName.isParent; + var childKey = treeOptions.customName.children; parentNode[isParentKey] = true; var childrenNodes = parentNode[childKey]; @@ -1220,7 +1224,7 @@ layui.define(['table'], function (exports) { if (tableView.hasClass('layui-table-tree')) { updateObjParams(obj); - if (obj.field === options.tree.data.key.name) { + if (obj.field === options.tree.customName.name) { obj.tr.find('td[data-field="' + obj.field + '"]').children('div.layui-table-cell').removeClass('layui-table-tree-item') obj.update({}); // 通过update调用执行tr节点的更新 } @@ -1288,7 +1292,7 @@ layui.define(['table'], function (exports) { var treeOptions = options.tree; var tableId = options.id; var checkName = table.config.checkName; - var childrenKey = treeOptions.data.key.children; + var childrenKey = treeOptions.customName.children; var dataRet = []; dataP[LAY_CHECKBOX_HALF] = false; // 先设置为非半选,是否为半选又下面逻辑判断 @@ -1378,7 +1382,7 @@ layui.define(['table'], function (exports) { trData[checkName] = checked; form.render(trElem.find('input[type="radio"][lay-type="layTableRadio"]').prop('checked', checked)); } else { - var isParentKey = options.tree.data.key.isParent; + var isParentKey = options.tree.customName.isParent; // 切换只能用到单条,全选到这一步的时候应该是一个确定的状态 checked = layui.type(checked) === 'boolean' ? checked : !trData[checkName]; // 状态切换,如果遇到不可操作的节点待处理 todo // 全选或者是一个父节点,将子节点的状态同步为当前节点的状态 @@ -1476,16 +1480,16 @@ layui.define(['table'], function (exports) { /** * 获得数据 * @param {String} id 表格id - * @param {Boolean} simpleData 是否返回平铺结构的数据 + * @param {Boolean} isSimpleData 是否返回平铺结构的数据 * @return {Array} 表格数据 * */ - treeTable.getData = function (id, simpleData) { + treeTable.getData = function (id, isSimpleData) { var tableData = []; layui.each($.extend(true, [], table.cache[id] || []), function (index, item) { // 遍历排除掉临时的数据 tableData.push(item); }) - return simpleData ? getThisTable(id).treeToFlat(tableData) : tableData; + return isSimpleData ? getThisTable(id).treeToFlat(tableData) : tableData; } // 记录所有实例