实现 objectstack#5473(objectui PR #3414 ,修 plugin-dashboard/DatasetWidget.tsx 的 cell key)时,按「规则消费半径」清扫同名 testid 的其它渲染器发现的。属另一个 widget、另一个包,#5473 的文件面不含它,按 Prime Directive #10 单独开单。
位置
packages/plugin-report/src/DatasetReportRenderer.tsx(objectui 仓):
// 742
function bucketId(dims: string[], row: Row): string {
return dims.map((d) => String(row[d] ?? EMPTY)).join(''); // 空串
}
// 818(pivot useMemo 内)
const rid = bucketId(rows, r);
const cid = bucketId(columnsAcross, r);
cells.set(`${rid} ${cid}`, { row: r, index }); // 空格
已核对字节:742 行的 join('') 是真空串 ,不是被显示吞掉的控制字符(cat -A 确认,该文件全文无 [\x00-\x08\x0b\x0c\x0e-\x1f])。
两个缺陷
多维度 bucket 之间完全没有边界 。bucketId(['region','segment'], …) 对 x + yz 和 xy + z 都产出 xyz —— 两个不同的行(或列)桶合并成一个,后写覆盖先写。这比 objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 修掉的那个更早触发:objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 里 row id 至少还有一个分隔字符,这里一个都没有。DatasetWidget 的旧用例注释里写的「an empty (or absent) separator collapses these into ONE row header」正是这里的现状。
cell key 用普通空格拼接 rid/cid —— 与 objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 完全同形:维度值含空格(New York / In Progress / Closed Won)时,两行可落进同一个 key。
cells 的 value 同时带 index,而 drill-through 用它读原始行,所以和 #5473 一样,串格的同时会钻到另一行的记录。全程无报错。
为什么现有用例照不到
packages/plugin-report/src/__tests__/DatasetReportRenderer.test.tsx 的 pivot fixture 与 dashboard 侧同病:行/列维度各只有一个,值也不含空格。单维度时 join('') 与任何分隔符恰好等价,所以缺陷 1 从未被跑到;缺陷 2 需要值含空格,也从未被跑到。
建议方向
与 #5473 / PR objectui#3414 同形:bucket id 与 cell key 都走 JSON.stringify(该 PR 里落成 pivotRowId / pivotCellKey 两个 helper),不再依赖「数据不会包含的字符」。注意这里 bucketId 同时被 rowTotalById(863 行)使用 —— 与 dashboard 侧不同,它三处用的是同一个 encoder,所以换编码时必须整体换 ,否则会把 dashboard 侧刚修掉的「表头与小计各用一套编码」的问题引进来。用例同步扩到多维度 + 含空格的值。
两处是否合并成一个共享 helper(pivot 编码只此一家),请 triage 时一并裁定 —— 两个包各写一份是这次两边同时出问题的根因。
发现来源:objectstack#5473 / PR objectui#3414。严重度按贵重口径判,我按发现原样记。
实现 objectstack#5473(objectui PR #3414,修
plugin-dashboard/DatasetWidget.tsx的 cell key)时,按「规则消费半径」清扫同名 testid 的其它渲染器发现的。属另一个 widget、另一个包,#5473 的文件面不含它,按 Prime Directive #10 单独开单。位置
packages/plugin-report/src/DatasetReportRenderer.tsx(objectui 仓):已核对字节:742 行的
join('')是真空串,不是被显示吞掉的控制字符(cat -A确认,该文件全文无[\x00-\x08\x0b\x0c\x0e-\x1f])。两个缺陷
bucketId(['region','segment'], …)对x+yz和xy+z都产出xyz—— 两个不同的行(或列)桶合并成一个,后写覆盖先写。这比 objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 修掉的那个更早触发:objectui: buildPivot 的 cell key 用空格拼接 rowId 与 colId,维度值含空格时会静默串格 #5473 里 row id 至少还有一个分隔字符,这里一个都没有。DatasetWidget 的旧用例注释里写的「an empty (or absent) separator collapses these into ONE row header」正是这里的现状。New York/In Progress/Closed Won)时,两行可落进同一个 key。cells的 value 同时带index,而 drill-through 用它读原始行,所以和 #5473 一样,串格的同时会钻到另一行的记录。全程无报错。为什么现有用例照不到
packages/plugin-report/src/__tests__/DatasetReportRenderer.test.tsx的 pivot fixture 与 dashboard 侧同病:行/列维度各只有一个,值也不含空格。单维度时join('')与任何分隔符恰好等价,所以缺陷 1 从未被跑到;缺陷 2 需要值含空格,也从未被跑到。建议方向
与 #5473 / PR objectui#3414 同形:bucket id 与 cell key 都走
JSON.stringify(该 PR 里落成pivotRowId/pivotCellKey两个 helper),不再依赖「数据不会包含的字符」。注意这里bucketId同时被rowTotalById(863 行)使用 —— 与 dashboard 侧不同,它三处用的是同一个 encoder,所以换编码时必须整体换,否则会把 dashboard 侧刚修掉的「表头与小计各用一套编码」的问题引进来。用例同步扩到多维度 + 含空格的值。两处是否合并成一个共享 helper(pivot 编码只此一家),请 triage 时一并裁定 —— 两个包各写一份是这次两边同时出问题的根因。
发现来源:objectstack#5473 / PR objectui#3414。严重度按贵重口径判,我按发现原样记。