fix(valuation): 修复折叠分组后表头消失无法展开的问题

问题:折叠一个分组时,该组所有列被 hideCol 隐藏后,buildGroupHeaders
因 visibleColsInGroup 为空而 continue 跳过该分组,导致分组表头不渲染,
用户失去展开入口(表现为"收起后整组列和表头都不见了")。

修复:
- applyGroupHeaders:折叠时保留该组首列作为"展开锚点"(只隐藏 slice(1)),
  确保 setGroupHeaders 仍能为该分组渲染表头单元格
- buildGroupHeaders:折叠态下 numberOfColumns=1,表头显示 ▶ 可点击展开;
  被 setcolumnChooser 主动隐藏的分组仍跳过(不影响)
- 展开时恢复该组全部列

测试场景:
1. 互换估值Tab折叠任一分组 → 表头保留(▶),点击可展开恢复
2. 框架合约Tab同上
3. 全部折叠 → 每组各保留1列锚点,页面仍有列可操作
This commit is contained in:
hjhan
2026-07-08 09:08:08 +08:00
parent 5e27d6cef8
commit 0bef986e10
+19 -10
View File
@@ -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] ? '&#9654;' : '&#9660;';
var titleClass = collapseState[group.title] ? 'group-header-title group-collapsed' : 'group-header-title';
groupHeaders.push({
startColumnName: visibleColsInGroup[0],
numberOfColumns: visibleColsInGroup.length,
titleText: '<span class="group-header-title" data-group="' + g + '">' +
(collapseState[group.title] ? '&#9654;' : '&#9660;') + '&nbsp;' + group.title + '</span>'
startColumnName: group.columns[0], //锚点列始终是首列(折叠时首列被保留)
numberOfColumns: count,
titleText: '<span class="' + titleClass + '" data-group="' + g + '">' + icon + '&nbsp;' + group.title + '</span>'
});
}
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();
}