From 0bef986e1056df036fc0262ebf19ebc384422d27 Mon Sep 17 00:00:00 2001 From: hjhan Date: Wed, 8 Jul 2026 09:08:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(valuation):=20=E4=BF=AE=E5=A4=8D=E6=8A=98?= =?UTF-8?q?=E5=8F=A0=E5=88=86=E7=BB=84=E5=90=8E=E8=A1=A8=E5=A4=B4=E6=B6=88?= =?UTF-8?q?=E5=A4=B1=E6=97=A0=E6=B3=95=E5=B1=95=E5=BC=80=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题:折叠一个分组时,该组所有列被 hideCol 隐藏后,buildGroupHeaders 因 visibleColsInGroup 为空而 continue 跳过该分组,导致分组表头不渲染, 用户失去展开入口(表现为"收起后整组列和表头都不见了")。 修复: - applyGroupHeaders:折叠时保留该组首列作为"展开锚点"(只隐藏 slice(1)), 确保 setGroupHeaders 仍能为该分组渲染表头单元格 - buildGroupHeaders:折叠态下 numberOfColumns=1,表头显示 ▶ 可点击展开; 被 setcolumnChooser 主动隐藏的分组仍跳过(不影响) - 展开时恢复该组全部列 测试场景: 1. 互换估值Tab折叠任一分组 → 表头保留(▶),点击可展开恢复 2. 框架合约Tab同上 3. 全部折叠 → 每组各保留1列锚点,页面仍有列可操作 --- YLErpWeb/wwwroot/Scripts/utils.js | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/YLErpWeb/wwwroot/Scripts/utils.js b/YLErpWeb/wwwroot/Scripts/utils.js index 05aee8b1..993ad26c 100644 --- a/YLErpWeb/wwwroot/Scripts/utils.js +++ b/YLErpWeb/wwwroot/Scripts/utils.js @@ -1118,21 +1118,25 @@ main.initCollapsibleGroupHeaders = function (jgrid, groupConfig) { var collapseState = {}; // 根据 groupConfig + 当前 colModel 可见性,构造 setGroupHeaders 所需的 groupHeaders 参数。 - // 同步剔除"该组所有列都被隐藏"的分组(与 setcolumnChooser2:185-186 的 notShow 逻辑一致)。 + // 关键:折叠的分组仍需保留一个表头单元格作为"展开锚点",否则用户无法再次展开。 function buildGroupHeaders() { var colModel = jgrid.jqGrid('getGridParam', 'colModel'); var visibleNames = colModel.filter(function (c) { return !c.hidden; }).map(function (c) { return c.name; }); var groupHeaders = []; for (var g = 0; g < groupConfig.length; g++) { var group = groupConfig[g]; - // 计算该分组在当前可见列中的连续段,用于 setGroupHeaders 的 startColumnName/numberOfColumns var visibleColsInGroup = group.columns.filter(function (n) { return visibleNames.indexOf(n) > -1; }); - if (!visibleColsInGroup.length) continue; // 整组都隐藏,跳过 + //整组都不可见:若是被折叠的分组,仍需保留锚点(下方 applyGroupHeaders 已保留首列); + //若是被 setcolumnChooser 主动隐藏的分组,则跳过不渲染表头 + if (!visibleColsInGroup.length && !collapseState[group.title]) continue; + //锚点列:折叠态下 numberOfColumns=1(首列被保留);展开态为该组可见列数 + var count = visibleColsInGroup.length || 1; + var icon = collapseState[group.title] ? '▶' : '▼'; + var titleClass = collapseState[group.title] ? 'group-header-title group-collapsed' : 'group-header-title'; groupHeaders.push({ - startColumnName: visibleColsInGroup[0], - numberOfColumns: visibleColsInGroup.length, - titleText: '' + - (collapseState[group.title] ? '▶' : '▼') + ' ' + group.title + '' + startColumnName: group.columns[0], //锚点列始终是首列(折叠时首列被保留) + numberOfColumns: count, + titleText: '' + icon + ' ' + group.title + '' }); } return groupHeaders; @@ -1141,12 +1145,17 @@ main.initCollapsibleGroupHeaders = function (jgrid, groupConfig) { // 应用一次分组表头(含折叠态显隐),复用 destroyGroupHeader → setGroupHeaders 模式 function applyGroupHeaders() { jgrid.jqGrid('destroyGroupHeader', true); // true: 不恢复为单行表头 - // 先按折叠状态显隐列 + // 按折叠状态显隐列:折叠的分组保留首列作为锚点(避免整组表头消失无法展开) for (var g = 0; g < groupConfig.length; g++) { var group = groupConfig[g]; if (collapseState[group.title]) { - jgrid.setGridParam().hideCol(group.columns); + //折叠:隐藏除首列外的所有列,保留首列作为锚点 + if (group.columns.length > 1) { + jgrid.setGridParam().hideCol(group.columns.slice(1)); + } + jgrid.setGridParam().showCol([group.columns[0]]); } else { + //展开:恢复该组所有列 jgrid.setGridParam().showCol(group.columns); } } @@ -1154,7 +1163,7 @@ main.initCollapsibleGroupHeaders = function (jgrid, groupConfig) { if (groupHeaders.length) { jgrid.jqGrid('setGroupHeaders', { useColSpanStyle: true, groupHeaders: groupHeaders }); } - // 保存到 jqGrid 参数,便于与 setcolumnChooser 协调 + //保存到 jqGrid 参数,便于与 setcolumnChooser 协调 jgrid.jqGrid('setGridParam', { collapsibleGroupConfig: groupConfig, collapseState: collapseState }); bindHeaderClick(); }