fix(components,plugin-detail): 动作 disabled 的「已声明」判定剩余五处改读 hasDeclaredVisibilityGate (#3849) - #3861
Merged
Merged
Conversation
…VisibilityGate (#3849) #3842 / PR #3851 只修了 action:button 与 app-shell 的 DeclaredActionsBar,同形 的另外五处仍停在 `!= null`:同一个组件里 visible 门问「已声明」,隔一行的 disabled 门问 `!= null`,一个问题两种拼法。 - packages/components:action:icon、action:group 的内联按钮与下拉项、 action:menu 的菜单项(四处,均含 legacy `enabled` 腿) - packages/plugin-detail:record:quick_actions 的 QuickActionButton(无 `enabled` 腿) 机理与 #3842 逐字相同:`toPredicateInput('')` 为 `undefined`, `evaluateCondition(undefined)` 为 `true`。这个 `true` 在 visible 上意味着「显示」 (与过宽的「已声明」判定互相抵消),在 disabled 上意味着「禁用」——于是两个错误 叠加,`disabled: ''`(空谓词,等于没声明)变成永久置灰,作者写什么都解不开。 五处统一改读 hasDeclaredVisibilityGate(`!= null && !== ''`):包内三个文件从 `./visibility-gate` 相对取,plugin-detail 从 @object-ui/components barrel 取 (#3835 开的跨包路子)。按 #3842 裁定不重命名、不加别名、不上提 core,每处落点 就地注释说明。 行为变更面刻意窄:只有 `disabled: ''` 从「置灰」变「可点」。`disabled: true` 仍 置灰,`disabled: false` 与未声明仍不置灰,表达式取值的 verdict 一律不变。四处带 legacy `enabled` 腿的落点多一条推论:空 `disabled` 现在落到 `enabled` 腿而不再在 空谓词上短路。`enabled` 腿本身取反,四形状在新旧判定下同 verdict,属推演等价而非 修复(#3842 的推演表连同「无任何 enabled 用例能因还原该腿而变红」一并抄在钉子旁)。 反向验证:单还原 action-icon 一处的 `!= null` 后,恰好两条钉子变红且都点名 action:icon(`disabled: ''` 与「空 disabled 落到 enabled 腿」),其余四处与 record:quick_actions 全绿——方向与 issue 的预判一致。
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
Collaborator
Author
|
✅ 验收(PM,session 实物核验: 裁定要点:
转 ready 并挂 auto-merge。#3862 归分诊席定级。 Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3849
基于
origin/main@993336f7c481e1fd724512363b8b2f15b305da86(即 #3842 / PR #3851 的合并点)。落点核对(逐处,不整批假设)
开工前在该 sha 上逐处核过现拼法,issue 正文的五处落点表全部成立,五处现拼法一律是
disabled != null:enabled腿packages/components/src/renderers/action/action-icon.tsx:97action:icondisabled != nullpackages/components/src/renderers/action/action-group.tsx:106InlineActionButtondisabled != nullpackages/components/src/renderers/action/action-group.tsx:148DropdownActionItemdisabled != nullpackages/components/src/renderers/action/action-menu.tsx:98ActionMenuItemdisabled != nullpackages/plugin-detail/src/renderers/record-quick-actions.tsx:208QuickActionButtondisabled != null三个
packages/components文件此前已经导入了hasDeclaredVisibilityGate(visible门在 #3812 / #3823 就改过),所以是同一文件同一按钮上visible问「已声明」、隔一行的disabled问!= null—— 一个问题两种拼法。record-quick-actions.tsx从@object-ui/componentsbarrel 新增导入(#3835 开的跨包路子)。SchemaRenderer.tsx:323的第三种拼法(!== undefined)确认存在但不在本单文件面,未动,见下方「越界发现」。机理(与 #3842 逐字相同,方向是关键)
toPredicateInput('')为undefined,evaluateCondition(undefined)为true。visible上这个true意味着「显示」,与过宽的「已声明」判定互相抵消 —— 所以visible: ''前后都渲染,''在那一侧不是变异探测器。disabled上同一个true意味着「禁用」,两个错误叠加:空谓词从「没有门」变成「永久置灰」,作者写什么都解不开。五处统一改读
hasDeclaredVisibilityGate(!= null && !== '')。按 #3842 裁定:不重命名、不加别名、不上提 core;包内三处从./visibility-gate相对取;每处落点就地注释说明名称系历史、语义为谓词通用。行为变更面(刻意窄)
只有
disabled: ''从「置灰」变「可点」—— 这正是「没有谓词」本来要求的结果。disabled: true仍置灰,disabled: false与未声明仍不置灰,表达式取值的 verdict 一律不变。四处带 legacy
enabled腿的落点多一条推论:空disabled现在落到enabled腿,而不再在空谓词上短路,所以同时写disabled: ''+enabled: true的动作变为可点。record:quick_actions没有enabled腿,它的链条就是单个门。enabled腿本身取反(disabled = !isEnabled),空谓词的true到达时已是!true= 「不置灰」,与「没声明门」同 verdict —— 四形状在新旧判定下完全一致,属推演等价而非修复。#3842 的四形状推演表连同「没有任何enabled用例能因还原该腿而变红」这句话一并抄在钉子旁,如实说明而不包装成覆盖率。测试
新增两个钉子文件,形状抄 PR #3851 的
action-disabled-declared-gate.test.tsx保持家族一致:packages/components/src/renderers/action/__tests__/action-member-disabled-declared-gate.test.tsx—— 四处落点 × (''/true/false/ 未声明 / 表达式双向) +enabled腿五形状,表驱动。宿主按各自真实路径挂载:action:icon按action:bar的成员方式把整个 action 摊到叶子自己的schema上;InlineActionButton走真实action:group宿主;两个下拉叶子放在 controlled-open 菜单里(沿用action-member-visible-gate.test.tsx的 harness)。packages/plugin-detail/src/renderers/__tests__/record-quick-actions.disabled-declared-gate.test.tsx—— 真实驱动宿主(useActionEngine按locations过滤 → 渲染器 map 出QuickActionButton),useCondition/toPredicateInput一律用真的,不 stub —— 空谓词链条本身就是被测机理。判定探针按 DOM 形状区分:原生 button 元素读它的
disabledDOM 属性;RadixDropdownMenuItem渲染成role="menuitem"的 div,禁用时带的是data-disabled(沿用action-group-dropdown-visible.test.tsx为 #1885 立的探针)。实跑(仓根、
flock串行、--maxWorkers=2):Test Files 2 passed (2)/Tests 45 passed (45)renderers/action/__tests__全量 +components的 action-bar / action-group +plugin-detail/renderers/__tests__全量 +DeclaredActionsBar+actionPredicate.parity+ console 的record-block-record-reach):Test Files 17 passed (17)/Tests 243 passed (243)turbo run type-check --concurrency=2:Tasks: 78 successful, 78 total反向验证(方向先判后跑)
预判写在跑之前:单还原
action-icon.tsx一处的!= null,该处''钉子必须红且点名该处;其余四处与record:quick_actions保持绿。实跑与预判一致 —— 恰好两条红,都在
'action:icon'名下:第二条红是预判到的同一处的另一面:
disabled: ''一旦重新算作「已声明」,链条就在空谓词上短路,作者的enabled: true根本没被读到。还原后已复原为hasDeclaredVisibilityGate。越界发现
packages/react/src/SchemaRenderer.tsx:322-334的newSchema.disabled !== undefined(第三种拼法,范围比!= null再宽一格 ——disabled: null也会置灰)确认存在于origin/main,不在本单文件面,本 PR 未动。已立单 #3862(未认领,附 file:line 取证:该值经SchemaRenderer.tsx:461的disabled: __disabled || undefined转发成组件 prop,不是死标记;修法涉及「共享定义放哪一层」的跨包裁定,建议与 #3850 同批裁),交 PM 分诊。Generated by Claude Code