Archived
feat(w05): input-supplement 照新目标件换版面 —— 两条轨道 + details 面板 + 参数瓷贴
照 docs/ss02-act-05-new/ACT-WORK-05-数据工单-PN主数据创建.html 重排数据工单那一屏, 绑定面与功能一个不动(四张台账、四道闸、两处加行、终审 C1 的 disabled type_id、 主键钥匙全部原样带走)。用户定的三件事:每颗料一条轨道(两条并列)/ 新增类型面板 每行四格(parts.type_param 那张表本就是,搬进 details 面板,独立区退役)/ 不动平台 每步骤卡自带一道闸。 P08_CSS 整段换成新目标件的机械抽取(嵌进 TS 后与源文件 style 区间 diff 零差异); 旧目标件自带的孪生件显隐规则(.jc-vcell/.jc-cell/加删行)改由 BIND_P08 承载, focus 光环换成新 :root 里真存在的 --data-wash(旧名 --brand-wash 会被浏览器整条丢弃)。 步骤③ 不按轨道分两栏是机制不是偏好:bodyOf 单 querySelector、rowOf 认宿主直接 子元素 —— 嵌套形状会把一颗料的所有参数格并成一条记录(后写的覆盖先写的、静默), 探针用真实 renderView+collect 钉死(view-container-collect-div-rows.test.ts,前一提交)。 瓷贴单块平铺,主键钥匙收进 .rowkey(display:none 但真挂 data-col)。 目标件脚本驱动的状态全部无脚本翻译:保存即铺格顶掉「选类型即时加载」、details 顶掉 .newtype.show、步骤圆点按基座数点亮(_missing 的 v-0 / distinct 的 v-1)、类型不一致 护栏红带按 sub_eval_part_distinct_chip_type_id 的 v-2 档现身;gateprog 进度条如实退掉 (分母不是基座现有的数,编一个就是界面撒谎)。 活动自测 62 -> 72(8 条新钉逐条变异验证:恰红一条、复原即绿);pnpm gates 退出码 0 (2495 测)。包版本 2.1.9 -> 2.2.0(安装恒新增)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LKMZDwMbyKzjw6Hembwvet
This commit is contained in:
@@ -699,20 +699,83 @@ describe('件① 评估输入补全', () => {
|
||||
});
|
||||
|
||||
/*
|
||||
* 2026-08-29 评审 Important:BIND_COMMON 的序号计数器规则原来只认 `.tbl-wrap`
|
||||
* (继承自已删除的旧 P08_MASTER_CREATE,同一个 wrapper class,同一个坑),
|
||||
* 而这张件的三张表全用平台的 `.jc-tbl-wrap` —— 两个 class 对不上,计数器永不触发,
|
||||
* 只读态与编辑态下「#」列逐行都是空白。钉死 `.jc-tbl-wrap` 现在也接了这五条规则,
|
||||
* 且这张件确实只用 `.jc-tbl-wrap`(没有表在用没打这条补丁就会数不出来的 `.tbl-wrap`)。
|
||||
* 2026-08-29 评审 Important:BIND_COMMON 的序号计数器规则原来只认 `.tbl-wrap`,而工单件的表
|
||||
* 走平台的 `.jc-tbl-wrap` —— 两个 class 对不上,计数器永不触发,「#」列逐行空白。
|
||||
* 2026-08-30 换版面后这张件只剩面板里两张表(chip_type / type_param),包装是
|
||||
* `jc-tbl-wrap tbl-wrap` 双类(平台钩子 + 目标件的边框圆角);轨道与瓷贴没有 # 列,
|
||||
* 不走计数器。钉死:五条计数器规则还在,且两张表的双类包装恰好两处。
|
||||
*/
|
||||
it('四张表的序号列真的会数:.jc-tbl-wrap 也接了 CSS 计数器(不再只认 .tbl-wrap)', () => {
|
||||
it('面板两张表的序号列真的会数:计数器规则在,双类包装恰两处', () => {
|
||||
expect(html).toMatch(/\.jc-tbl-wrap\s+table\s*,\s*\.tbl-wrap\s+table\s*\{\s*counter-reset:\s*rn;?\s*\}/);
|
||||
expect(html).toMatch(/\.jc-tbl-wrap\s+table\s+td\.rn\s*,\s*\.tbl-wrap\s+table\s+td\.rn\s*\{\s*counter-increment:\s*rn;?\s*\}/);
|
||||
expect(html).toMatch(/\.jc-tbl-wrap\s+table\s+td\.rn\s+\.jc-rn-num::before\s*,\s*\.tbl-wrap\s+table\s+td\.rn\s+\.jc-rn-num::before\s*\{\s*content:\s*counter\(rn\);?\s*\}/);
|
||||
// 这张件的四张表都走 .jc-tbl-wrap(没有 .tbl-wrap)—— 补丁真的接在会用到的类上(Task 7b 新增 parts.chip_type 这一张,3→4)
|
||||
expect(html).not.toContain('class="tbl-wrap"');
|
||||
const jcTblWrapCount = html.match(/class="jc-tbl-wrap"/g)?.length ?? 0;
|
||||
expect(jcTblWrapCount).toBe(4);
|
||||
const wrapCount = html.match(/class="jc-tbl-wrap tbl-wrap"/g)?.length ?? 0;
|
||||
expect(wrapCount).toBe(2);
|
||||
// 不许再有单类的表包装 —— 单 .jc-tbl-wrap 缺目标件的边框,单 .tbl-wrap 缺平台的 :has 加行钩子
|
||||
expect(html).not.toMatch(/class="jc-tbl-wrap"/);
|
||||
expect(html).not.toMatch(/class="tbl-wrap"/);
|
||||
});
|
||||
|
||||
/* ==================== 2026-08-30 换版面(照 docs/ss02-act-05-new 新目标件)专属的钉子 ==================== */
|
||||
|
||||
it('**每个台账地址恰一个收值宿主**(chip_type/type_param 的两处是「外层 table + 内层 tbody」同宿主写法):bodyOf 是单 querySelector,同一地址挂两个各自独立的宿主,第二个的值一格都收不上去且不报错(终审 C1 / Task 7b 的族坑)', () => {
|
||||
const countOf = (addr: string): number => (html.match(new RegExp(`data-edit="${addr.replace('.', '\\.')}"`, 'g')) ?? []).length;
|
||||
expect(countOf('parts.profile')).toBe(1);
|
||||
expect(countOf('parts.parameter')).toBe(1);
|
||||
expect(countOf('parts.chip_type')).toBe(2);
|
||||
expect(countOf('parts.type_param')).toBe(2);
|
||||
});
|
||||
|
||||
it('**两条轨道:行源与写向同一元素,行模版是宿主直接子元素**(rowOf 认宿主直接子元素 —— 一条 lane = 一行;行模版里不许再有 <section>,行展开按第一个同名闭合标签截行内容)', () => {
|
||||
expect(html).toMatch(/<div class="lanes" data-rows="mine:sub_eval\.part" data-edit="parts\.profile">\s*<section class="lane">/);
|
||||
const laneBody = /<section class="lane">([\s\S]*?)<\/section>/.exec(html)?.[1] ?? '';
|
||||
expect(laneBody).not.toBe('');
|
||||
expect(laneBody).not.toContain('<section');
|
||||
});
|
||||
|
||||
it('**参数瓷贴单块平铺,瓷贴是宿主直接子元素** —— 按料嵌一层分栏会把一颗料的所有参数格并成一条记录(ui-kit view-container-collect-div-rows.test.ts 用真实 renderView+collect 钉死的「必然归并」)', () => {
|
||||
expect(html).toMatch(/<div class="pvgrid" data-rows="mine:parts\.parameter" data-edit="parts\.parameter"><section class="pv">/);
|
||||
const pvBody = /<section class="pv">([\s\S]*?)<\/section>/.exec(html)?.[1] ?? '';
|
||||
expect(pvBody).not.toBe('');
|
||||
expect(pvBody).not.toContain('<section');
|
||||
/* 瓷贴的主键钥匙(internal_pn / param_name)收在 .rowkey 里 —— 藏起来但必须真挂 data-col */
|
||||
expect(pvBody).toContain('class="rowkey"');
|
||||
expect(pvBody).toContain('data-col="internal_pn"');
|
||||
expect(pvBody).toContain('data-col="param_name"');
|
||||
expect(html).toContain('.pv .rowkey{display:none}');
|
||||
});
|
||||
|
||||
it('**类型不一致护栏**:distinct 是基座数,红带只在 v-2 档现身,模版不算不判', () => {
|
||||
expect(html).toMatch(/class="jc-typewarn" data-class-of="sub_eval_part_distinct_chip_type_id"/);
|
||||
expect(html).toContain('.jc-typewarn{display:none}');
|
||||
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('**新增类型面板是 <details>,且绑定层把抽取样式的 display:none 让开** —— 少了这条让位规则,整个面板(含两道闸与两张表)永远不可见', () => {
|
||||
expect(html).toContain('<details class="newtype">');
|
||||
expect(html).toContain('details.newtype{display:block');
|
||||
});
|
||||
|
||||
it('**目标件里靠脚本驱动的两样,搬过来时如实退掉**:进度条 gateprog 的分母不是基座现有的数(编一个就是界面撒谎);viewarea/editarea 双区靠 body.editing 切换,沙箱零脚本切不动 —— 抽取的 CSS 里留着它们的规则,但标记一处都不许用', () => {
|
||||
const body = html.slice(html.indexOf('</style>'));
|
||||
expect(body).not.toContain('gateprog');
|
||||
expect(body).not.toContain('class="viewarea"');
|
||||
expect(body).not.toContain('class="editarea"');
|
||||
/* .editarea{display:none} 还在 CSS 里 —— 谁把内容包进它,那块就永远消失 */
|
||||
expect(html).toContain('.editarea{display:none}');
|
||||
});
|
||||
|
||||
it('**保存即铺格之前的空态**:pvnull 按 parts_parameter_rows 的 v-0 档现身(零行才摆提示,有行不摆 —— 界面不撒谎)', () => {
|
||||
expect(html).toContain('class="pv-empty pvnull" data-class-of="parts_parameter_rows"');
|
||||
expect(html).toContain('.pvnull{display:none}');
|
||||
expect(html).toContain('.pv-empty.pvnull.v-0{display:block}');
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user