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:
@@ -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: '<span class="group-header-title" data-group="' + g + '">' +
|
||||
(collapseState[group.title] ? '▶' : '▼') + ' ' + group.title + '</span>'
|
||||
startColumnName: group.columns[0], //锚点列始终是首列(折叠时首列被保留)
|
||||
numberOfColumns: count,
|
||||
titleText: '<span class="' + titleClass + '" data-group="' + g + '">' + icon + ' ' + 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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user