Skip to content

docs(plugin-view): README 的 13 个 schema 示例按 ObjectView 真读的键面重写 - #5101

Merged
yinlianghui merged 1 commit into
mainfrom
claude/issue-5077-view-readme-keys
Aug 18, 2026
Merged

docs(plugin-view): README 的 13 个 schema 示例按 ObjectView 真读的键面重写#5101
yinlianghui merged 1 commit into
mainfrom
claude/issue-5077-view-readme-keys

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

Fixes#5077

基线 671c0d320732345584038e45141f7175d044df8e(显式实 sha)。仅动
packages/plugin-view/README.md + 一个 changeset。

前提门插曲(先读这一段)

按派发的 cast 感知口径复测卡面读数时,pagination 一格被推翻:
src/ObjectView.tsx:1032pagination: activeView?.pagination ?? (schema as any).pagination,
普通 schema\.[A-Za-z_]* grep 看不见。据此停工报告(复测全表见
#5077 评论),
PM 裁定取 A(只教声明成员,pagination 落规范位)。

落地时又发现裁定所依据的那条机制本身不成立,如实记录并据实改写:

  • 裁定设想的规范位是 table: { pagination: { pageSize: 25 } },依据是探针 E
    编译通过。但探针 E 的 rc=0 不构成读点证据 —— ObjectViewSchema['table']
    的类型是 Partial< Omit< ObjectGridSchema, 'type' | 'objectName' > >,而
    keyof ObjectGridSchema 因 BaseSchema 的 [key: string]: any 退化成
    string,Omit 于是塌成纯索引签名:该类型零声明成员,塞任何键都编译通过
    (改前探针 H 的 zzzNotAGridKey rc=0 正是同一原因)。
  • 实测 ObjectView 构建 gridSchema逐键白名单(:833-848),
    不读也不转发 table.pagination;本路径上唯一到得了 ObjectGrid 的分页键是
    table.pageSize(:846)。
  • 因此没有把 table.pagination 写进 README —— 那会正好复制本卡要修的缺陷
    (教一个不被读的键)。两处按实测写 table.pageSize,并在 README 写明
    pageSizeObjectGridSchema 上被标记为 legacy、而本组件不读 pagination
    这一层已另立卡(见文末),本 PR 不引用其未来方向。

cast 感知逐键复测表

口径 = plain schema.K + schema['K'] + (schema as X).K + 解构 + 中间变量,
全包非测试文件。声明成员集取自构建产物(checker.getPropertiesOfType = 42,
required 仅 objectName / type,index signature string -> any),与卡面 ① 逐字一致。

README 键声明成员复测读点判定
object / viewMode / mode / recordId / fieldConfig / nestedFields / tabs0卡面吻合
searchable / sortable / enableDelete0卡面吻合
onCreate / onUpdate / onDelete / onSubmit0卡面吻合
dataSource(写在 schema 里)0卡面吻合;是 ObjectViewProps 必填 prop(:145)
fields0(object-view 上)3 处 schema.fieldsSortUI.tsx(sort-ui,出半径)
filters0(object-view 上)1 处在 FilterUI.tsx(filter-ui,出半径)
pagination1(:1032,as any)⛔ 卡面被推翻 → PM 裁定 A → 落 table.pageSize

正对照:objectName 21、form 26 —— 与卡面 ② 的 20 行计数逐字相同。

逐块判定 / 删因表

原键面改后删因
:26 自动注册object + viewModeobjectName + defaultViewType,加类型标注两键均 0 读点
:135 Schema API 参考面object / viewMode? / fields? / onCreate?按真读键面重写为完整参考块 + 三条结构事实 + table/form 转发键表参考面是最容易被照抄的一块
:212 Grid ViewviewMode:'grid' + fields + dataSourcedefaultViewType + table.columns / defaultSortdataSource 是 prop
:226 Form ViewviewMode:'form' + mode:'create' + onSubmitlayout(drawer/modal/page)+ form 子配置类型 omit 掉 form.mode,mode 是内部状态
:243 Detail ViewviewMode:'detail' + recordIdnavigation.mode + onNavigate(recordId, mode)记录由点击决定,非授权
:257 Createmode:'create' + onCreateshowCreate + operations.create;page 布局走 onNavigate('new','edit')无该回调
:272 Read/Listpagination:true + searchable + filtersshow* + table.columns/defaultFilters/pageSize,并补 listViews/defaultListView 示例见前提门段
:287 Updatemode:'edit' + recordId + onUpdateoperations.update + layout同上
:303 DeleteenableDelete + onDeleteoperations.delete两键均 0 读点
:320 ObjectQL 集成schema 里塞 dataSource + paginationdataSource 作 prop 传入(或经 Provider context)+ table.pageSize结构事实
:346 Field ConfigurationfieldConfigtable.columns + form.fields/sections/customFields字段元信息来自对象元数据
:382 Nested ObjectsnestedFieldsform.subforms(childObject 必填)真身是 subform
:400 Tabs ViewviewMode:'tabs' + tabssaved-view 页签:listViews + showViewSwitcher + allowCreateViewform.layout 无 tabs 取值

:153 / :172 / :193(ViewSwitcher / FilterUI / SortUI)未动,diff 可验。

探针读数分层

改前 8 项(A-H)已在 #5077 评论中登记,预判 8/8 命中,此处不重复。改后新增:

结果
改后文本名集合核对(机械)20 个顶层键全部 declared=true 且读点 > 0;table.* 4 个、form.* 7 个全部在转发白名单内 —— ALL KEYS VERIFIED
改后探针 F 复跑(全部 15 个带标注示例编译)tsc --strict --noEmitrc=0
反向:15 个示例逐一抽掉 objectName15/15 报 TS2741,即类型标注在每一个示例上都真的有牙

⛔ 不拿探针绿冒充键面证据:上表第二行只证明「编译得过」,键面结论一律来自第一行的
读点核对与前述白名单实测。

  • 仓根 pnpm exec turbo run type-check --concurrency=2:81 successful, 81 total
  • node scripts/check-doc-links.mjs:Links are valid across 13 scan roots.
  • node scripts/check-control-bytes.mjs:OK (scanned 4526 tracked text file(s));改动文件另行自扫 [\x00-\x08\x0b\x0c\x0e-\x1f] 无命中

顺带立卡(不在本 PR 修)


Generated by Claude Code

README 里所有未加类型标注的 schema 字面量,用的键 ObjectViewSchema 一个都没
声明、ObjectView 一个都不读:对象名写成 `object`(真名 `objectName`,除 `type`
外唯一必填),并围绕不存在的 `viewMode` 组织了三种「视图模式」叙事,连同
`fields` / `mode` / `recordId` / `fieldConfig` / `nestedFields` / `tabs` /
`searchable` / `sortable` / `filters` / `enableDelete` 一并如此。照抄任一示例
即静默渲染不出东西 —— ObjectViewSchema 继承的 BaseSchema 带 `[key: string]: any`
索引签名,excess property 检查整体失效,而这些块又都没有类型标注,连「必填
`objectName` 缺失」这唯一有牙的断言也不触发。
13 个块按声明面重写,每个键落笔前都对渲染器实测过读点:列表类型用
`defaultViewType`(以及 `listViews` / `defaultListView`),原「form view」/
「detail view」两种叙事的真身是 `layout` 的 drawer/modal/page 单一记录面,
网格与表单配置分别落 `table` / `form`,`onCreate` / `onUpdate` / `onDelete` /
`onSubmit` 回调族的真身是 `operations` 布尔开关加 `onNavigate`,工具栏用
`show*` 开关族。示例一律带 `ObjectViewSchema` 标注,使「缺 `objectName`」在
全部 15 个示例上成为编译错误。
三条结构事实直接写明:`dataSource` 是 `ObjectViewProps` 的必填 prop 而非
schema 键;create/edit/read 是同一记录面的内部状态而非可授权的 mode(故
`ObjectViewSchema['form']` omit 掉 `mode`);`ObjectView` 从 `table` / `form`
只转发固定的一组键而非整体透传,README 逐一列出,并写明本路径上的分页键是
`table.pageSize`。
ViewSwitcher / FilterUI / SortUI 三节未动 —— 其键面已逐条比对注册 `inputs`,
本就吻合。
Fixes#5077
Co-authored-by: Claude <noreply@anthropic.com>
@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

正文末尾提到的第二张卡已立:#5102 —— ObjectViewSchematable / form 子配置类型零声明成员(OmitBaseSchema 的索引签名塌掉),且 ObjectView 的转发白名单钉在 ObjectGridSchema 的 legacy 键上,规范键 pagination / selection / filter / sort 一个都不读。

本 PR 里 table.pageSize 而非 table.pagination 的取舍,依据就是那张卡的第二节实测;卡已按纪律未打标签交 PM 分诊,本 PR 不引用其任何未来方向。


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)25.3 KB350 KB
Entry fileindex-D86TVFgC.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.56KB3.59KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)8.92KB3.41KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)25.13KB5.40KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)40.21KB10.79KB
auth (createAuthenticatedFetch.js)6.34KB2.43KB
auth (index.js)2.71KB1.22KB
auth (invitation-status.js)1.22KB0.70KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)5.02KB0.88KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)502.20KB112.21KB
core (index.js)4.11KB1.62KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)159.03KB44.08KB
fields (index.js)234.25KB58.48KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.35KB1.38KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.12KB7.62KB
i18n (useDisplayLocale.js)2.84KB1.45KB
i18n (useObjectLabel.js)27.59KB6.63KB
i18n (useSafeTranslation.js)7.77KB3.13KB
layout (index.js)39.16KB10.97KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)9.35KB3.31KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)4.42KB1.42KB
permissions (evaluator.js)5.12KB1.74KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.81KB0.83KB
plugin-ai (index.js)15.75KB3.80KB
plugin-calendar (index.js)46.62KB12.83KB
plugin-charts (index.js)64.75KB18.37KB
plugin-chatbot (index.js)181.21KB43.14KB
plugin-dashboard (index.js)127.85KB32.73KB
plugin-designer (index.js)212.39KB42.83KB
plugin-detail (index.js)241.12KB60.43KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)123.21KB29.85KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)197.61KB53.03KB
plugin-kanban (index.js)52.72KB14.54KB
plugin-list (index.js)111.17KB26.99KB
plugin-map (index.js)18.72KB6.09KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)41.97KB11.33KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)83.81KB20.49KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.66KB3.50KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.62KB2.34KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)27.53KB9.41KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.28KB0.68KB
react (schema-input.js)1.45KB0.83KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)5.41KB2.34KB
sdui-parser (index.js)4.77KB2.16KB
sdui-parser (input-type.js)2.84KB1.40KB
sdui-parser (parse.js)10.76KB3.17KB
sdui-parser (provenance.js)3.66KB1.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)6.92KB2.40KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (dashboard-filter-alias.js)6.23KB2.74KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)3.05KB1.52KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@yinlianghuiClaude

Copy link
Copy Markdown
CollaboratorAuthor

PM 验收:ACCEPT(session_01GTRjn8xBqp75dk7kFupVRt,objectui 分片)

实物核验:merge-base 671c0d320 = 复活派发基线;head 96ef7318d;2 files, +317/−131,文件面仅 packages/plugin-view/README.md + changeset,content/docs/releases/** 零触碰 ✅;标识 grep msg/diff 双零,trailer 唯一正确 ✅;:153/:172/:193 三节零改动 ✅。CI 亲读:19/19 check 全 completed,17 success + 2 skipped,零失败 ✅。

验收要点:

  1. 裁定字面被正当推翻,PM 认账:裁定 A 指定 paginationtable.pagination,依据是探针 E 的 rc=0 —— 这个依据是 PM 的错误:ObjectViewSchema['table']Partial< Omit< ObjectGridSchema, … > > 被 BaseSchema 索引签名塌成纯索引签名(实测 getPropertiesOfType = 0,本体 61),rc=0 在这样的类型上零信息量,正是案头铁律「探针的绿不是键面证据」—— PM 自己在裁定里犯了这条。PM 已亲读 origin/main 的 ObjectView.tsx:833-848 证实:gridSchema 是逐键白名单,分页唯一读点是 :846table.pageSize,table.pagination 不在其中。照裁定字面写会教一个不被读的键 —— 恰是本卡要修的缺陷。席位对裁定意图(只教真读键、逃逸口不进 README)的执行忠实且正确,这个形(字面与实测冲突时,以实测修正字面并公开写明)完全符合停止条款的精神。更正已同步发在裁定原位(plugin-view README 整片 schema 键面渲染器一个都不读 —— object / viewMode / fields / mode / recordId / fieldConfig 全非声明成员,照抄即空视图 #5077)。
  2. 15/15 TS2741 负控证明类型标注在每一个示例上都有牙,与改前探针 D/H 合读界定了「标注能钉住什么」;名集合核对首跑 2 FAIL 经查是提取器把 adapter 参数误当 schema 键 —— 工具缺陷如实记录后收紧复跑,不粉饰。
  3. legacy 落差如实教学 + ObjectViewSchematable / form 子配置类型零声明成员(Omit 被索引签名塌掉),且 ObjectView 的转发白名单钉在 ObjectGridSchema 的 legacy 键上 —— 规范键 pagination/selection/filter/sort 全部不读 #5102 立卡:README 教 pageSize/defaultFilters/defaultSort/selectable 是因为它们是 ObjectView 实际转发的唯一拼法,规范继任者一个都不读 —— 落差写进 README 并立卡,不假装规范键可用。PM 即将分诊 ObjectViewSchematable / form 子配置类型零声明成员(Omit 被索引签名塌掉),且 ObjectView 的转发白名单钉在 ObjectGridSchema 的 legacy 键上 —— 规范键 pagination/selection/filter/sort 全部不读 #5102(与 ObjectView 用 (schema as any) 从 object-view 节点读 31 个键转发给 renderListView,其中 27 个不是 ObjectViewSchema 声明成员 —— #5091 在 ObjectView 上的同形实例 #5097/手写 FieldValidationRules 在唯一读点既不校验也不归一:pattern.value 写成 string(类型明确允许)被 react-hook-form 静默忽略,未识别的规则名同样静默丢弃 #5099/finding(plugin-grid): ObjectGrid 在 ObjectGridSchema.columns 上容忍未声明的 accessorKey / header 拼写 —— 声明类型是 strict 的 ListColumn,#3104 的列身份门禁结构上看不见这条支路 #5068/ObjectGrid 用 (schema as any) 读的 4 个键不在 GRID_QUERY_INPUTS 里 —— #4648 要消除的「渲染器读得到、声明面否认」在这些键上仍然存在 #5091 同族)。
  4. content/docs/plugins/plugin-view.mdx 整片示例的 object / viewMode / fields 键面在 ObjectViewSchema 上一个都不成立(#5077 的文档站镜像) #5088pagination 同格证据复用注记已留,接手席位不必重复调查。

三件套照常:本评论 → undraft → auto-merge(SQUASH)。


Generated by Claude Code

@yinlianghui
yinlianghui marked this pull request as ready for review August 18, 2026 00:12
@yinlianghui
yinlianghui added this pull request to the merge queueAug 18, 2026
Merged via the queue into main with commit 405d54eAug 18, 2026
20 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-5077-view-readme-keys branch August 18, 2026 00:12
os-support-ai pushed a commit that referenced this pull request Aug 19, 2026
…anded
Fixes#5271
objectui#5102 (PR #5274, merged) made ObjectView forward the canonical
`table.pagination` / `.selection` / `.filter` / `.sort` on every rendering
path, keeping `pageSize` / `selectable` / `defaultFilters` / `defaultSort` as
working aliases. The two docs pages PR #5101 (README) and PR #5109 (docs-site
mirror) wrote against the pre-#5102 reality — legacy-only — and now teach a
stale caveat. Re-teach the canonical spellings as the recommended form
without implying the legacy ones stopped working, and state the precedence
read directly off the landed `ObjectView.tsx` / `ObjectGrid.tsx`: canonical
wins when both are written; an active named view's own filter/sort still
outranks anything on `table`; `table.columns` stays out of scope (#5269,
still open, grid-path only).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RV6yuVCxymHYE16PL9vQkE
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationplugin

Projects

None yet

2 participants

@yinlianghui@claude