fix(w05): 走查逮到的三处 —— 漏掉的 profile 闸 · 圆点投影搬到行外包裹层 · 类型查名加诚实守卫

① profile 的编辑闸与缺项红带在第一版 body 里整个漏掉:宿主在而闸不在,轨道打不开编辑,
XL 的必填永远补不上(Task 7 那颗「按不下去的确认钮」同款)。「四道闸」旧断言只查
data-edit 宿主没查 [data-edit-for] 闸,逮不到 —— 断言补强为闸 + 开钮都在。

② 行内的 data-class-of 只认行作用域(renderRows 末段 renderTemplate(…, one) 拿的是
行对象),作用域级读数在行内投不出 —— 圆点上的 data-class-of 是死属性,永远不亮。
投影搬到行外的三层 .pj 包裹层,样式表按后代选择器点亮;代价是两条轨道的圆点一起亮
(基座数本来就是表级的,分到每颗料头上的数基座没有,不编)。

③ data-by 在行缺键时落回外层同名字段(终审 I3 已记档的平台缺陷):XL 没选类型、
它的 sub_eval.part 行与 parts.profile 草稿行都没有 chip_type_id 键,查名 pill 借外层
摊平的 chip_type_id 摆出「DC-DC 降压稳压器」—— 档案卡与字段行都在替人表态。
守卫认 selectCurrent 按这一行自己的值写下的 option[selected]:行里没真选上,
名字不摆、摆「(未选择)」;判断全在样式表。

三条新钉各做变异(恰红一条、复原绿);pnpm gates 退出码 0(2497 测)。2.2.1 -> 2.2.2。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
xcs
2026-08-30 20:51:04 +08:00
co-authored by Claude Opus 5
parent 64fe4b43c9
commit 18de7653bd
3 changed files with 43 additions and 13 deletions
@@ -620,9 +620,11 @@ describe('件① 评估输入补全', () => {
expect(html).toContain('data-col="param_name"');
});
it('可改的四张表各有一道编辑闸', () => {
it('可改的四张表各有一道编辑闸 —— 查的是闸([data-edit-for] + 开钮),不是宿主:2026-08-30 换版面第一版恰好漏掉 profile 的闸,宿主在而闸不在,轨道打不开编辑,XL 的必填永远补不上(Task 7 那颗「按不下去的确认钮」同款),旧断言只查宿主没逮到', () => {
for (const address of ['parts.profile', 'parts.chip_type', 'parts.type_param', 'parts.parameter']) {
expect(html).toContain(`data-edit="${address}"`);
expect(html).toContain(`data-edit-for="${address}"`);
expect(html).toContain(`data-edit-open="${address}"`);
}
});
@@ -769,11 +771,18 @@ describe('件① 评估输入补全', () => {
expect(html).toContain('.jc-typewarn.v-2{display:flex');
});
it('**步骤圆点只按基座数点亮**:①③ 挂 _missing(v-0 档)、② 挂 distinct(v-1 档),不许模版自己判「办完了」', () => {
expect(html).toContain('class="sdot sd-m" data-class-of="parts_profile_missing"');
expect(html).toContain('class="sdot sd-d" data-class-of="sub_eval_part_distinct_chip_type_id"');
expect(html).toContain('class="sdot sd-m" data-class-of="parts_parameter_missing"');
expect(html).toContain('.sdot.sd-m.v-0,.sdot.sd-d.v-1{background:var(--data)');
it('**步骤圆点只按基座数点亮,投影挂在行外的包裹层** —— 行内 data-class-of 只认行作用域,作用域级读数在行内投不出(实测圆点永远不亮);圆点自己不许再挂 data-class-of(挂了也是死属性)', () => {
expect(html).toContain('class="pj pj-profile" data-class-of="parts_profile_missing"');
expect(html).toContain('class="pj pj-type" data-class-of="sub_eval_part_distinct_chip_type_id"');
expect(html).toContain('class="pj pj-param" data-class-of="parts_parameter_missing"');
expect(html).toContain('.pj-profile.v-0 .sdot.sd-1,.pj-type.v-1 .sdot.sd-2,.pj-param.v-0 .sdot.sd-3{background:var(--data)');
expect(html).not.toMatch(/class="sdot[^"]*" data-class-of=/);
});
it('**类型查名有诚实守卫**(data-by 行缺键落回外层同名字段,终审 I3):行里没真选上类型(selectCurrent 没写下 option[selected]),查名 pill 与字段行的名字都不摆', () => {
expect(html).toContain('.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .idcard .tpill{display:none}');
expect(html).toContain('.lane:not(:has(select[data-col="chip_type_id"] option[selected])) .tywrap span{display:none}');
expect(html).toContain('class="jc-vcell tywrap"');
});
it('**新增类型面板是 <details>,且绑定层把抽取样式的 display:none 让开** —— 少了这条让位规则,整个面板(含两道闸与两张表)永远不可见', () => {