Skip to content

docs(plugin-view): re-teach the canonical table keys now that #5102 landed - #5289

Merged
os-support-ai merged 1 commit into
mainfrom
claude/issue-5271-plugin-view-docs-canonical-keys
Aug 19, 2026
Merged

docs(plugin-view): re-teach the canonical table keys now that #5102 landed#5289
os-support-ai merged 1 commit into
mainfrom
claude/issue-5271-plugin-view-docs-canonical-keys

Conversation

@os-support-ai

@os-support-aios-support-ai commented Aug 19, 2026

Copy link
Copy Markdown
Collaborator

Fixes#5271

Which pages, and how I found them

The card and the dispatch order both say "the pages PR #5101 wrote." I read PR #5101's actual diff (changed_files: 2) rather than trusting that description: it touched only packages/plugin-view/README.md + a changeset — not anything under content/docs/**. The dispatch order's Hard Limits line ("File surface: the content/docs/** pages PR #5101 touched") is therefore not literally true of any file; it conflated PR #5101 with its docs-site sibling.

That sibling exists and has the identical defect: content/docs/plugins/plugin-view.mdx was written by PR #5109 (issue #5088, "文档站页面整片示例按 ObjectView 真读的键面重写") as the docs-site mirror of PR #5101's README rewrite, same key-face investigation, same era, same legacy-only teaching + the same now-stale caveat ("page size is table.pageSize and nottable.pagination"). Leaving it untouched while fixing the README would have left the two pages disagreeing.

Fixed both, under one bounded scope — same defect class (docs teaching the deprecated spelling exclusively, now stale since #5102 landed), same evidence (the landed ObjectView.tsx / ObjectGrid.tsx), same gate family, no new verification surface:

Confirmed via git log --oneline -- content/docs/plugins/plugin-view.mdx that no OTHER PR has touched it since #5109, and via search_pull_requests that no open PR currently touches either file.

What changed

Both pages taught only table.pageSize / .selectable / .defaultFilters / .defaultSort and stated that the canonical .pagination / .selection / .filter / .sort had no effect. As of #5102 (PR #5274, merged) all four canonical keys take effect on every forwarding path; the legacy spellings stay working aliases. Both pages now teach the canonical spelling as the recommended form, without stating or implying the legacy ones stopped working — the forwarding table and every explanatory paragraph list both, and three rewritten examples show the canonical spelling in place (grid sort, read/list filter+pagination, ObjectQL-integration pagination), one of them (sort: 'created_at desc') deliberately using the string arity defaultSort cannot reach.

Precedence, quoted from the landed code (not guessed)

When a key is written both ways, canonical wins — ObjectGrid.tsx's own pre-existing resolution, which ObjectView defers to by forwarding both slots rather than re-resolving:

schema.pagination?.pageSize || schema.pageSize ObjectGrid.tsx:2647
if (schema.selection?.type) … else if (schema.selectable !== undefined) ObjectGrid.tsx:2354
schemaFilter !== undefined ? … : schema.defaultFilters ObjectGrid.tsx:1098
schemaSort ?? (schema.defaultSort ? [schema.defaultSort] : undefined) ObjectGrid.tsx:2701

One caveat I did not overclaim (the precision note in the dispatch): on the grid path the canonical filter/sort slots forwarded from table carry the table segment only —

filter: viewFilter ? undefined : schema.table?.filter,sort: viewSort ? undefined : schema.table?.sort,

(ObjectView.tsx, gridSchema, around :1041-1078) — so an active named/saved list view's own filter/sort keeps outranking table.filter/table.sort, exactly as it already outranked table.defaultFilters/table.defaultSort. Both pages state the full three-tier order (active named view, then table.filter/.sort, then table.defaultFilters/.defaultSort) rather than the wrong "table.filter always wins" simplification the card explicitly warned against. pagination/selection have no such tier (no view-level pagination/selection to defer to) and no effect outside the grid — verified by reading ObjectView.tsx's non-grid baseProps builder (around :840-843), which forwards fields only, never pagination/selection.

table.columns is untouched and not taught as working on non-grid views: the forwarding-table row still marks it as the one non-canonical/legacy key with its own open gap (#5269, grid-path only), per the card's explicit ⛔.

Gate awareness — measured, not carried from another card (per the PM's follow-up message)

file```typescript fence countin UNGATED_DOCS (scripts/check-doc-snippet-types.mjs)?gate live for this file?
packages/plugin-view/README.md20 (grep -c '^```typescript')yes, line 294 — reason on file: "14 parse diagnostic(s) … 14 undefined-name diagnostic(s)"declared, not verified by this gate
content/docs/plugins/plugin-view.mdx14no — absent from the tableyes, compiled against built dist/*.d.ts

Because the .mdx page is gated, I built the gate's own --build-filter package set (cli, core, data-objectstack, plugin-charts, plugin-editor, plugin-grid, plugin-markdown, plugin-timeline, plugin-view, react, types — via pnpm exec turbo run build --concurrency=2 under the shared /tmp/os-heavy-verify.lock) and then ran the gate for real, in the foreground, and watched it finish (it does not read the README's snippets at all — they are declared-ungated, not silently passing):

Controls:
resolution Module name '@object-ui/types' was successfully resolved to '.../packages/types/dist/index.d.ts'
sentinel importing 'ThisNameIsDefinitelyNotExported' produced 1 diagnostic(s) (TS2305)
positive importing 'ComponentSchema' produced 0 diagnostic(s)
Scanned 182 document(s): 138 covered (13 of them hold a ts/tsx block), 44 ungated
Covered blocks: 73 — 68 to compile, 5 declared fragment(s)
Semantic phase: 68 of 68 block(s) judged, 0 failed
Every covered documentation snippet compiles against the built types.

(An earlier attempt at this same build auto-backgrounded past the tool's 120s foreground window and I stopped the turn waiting on a Monitor notification that, per the PM's follow-up, was not going to arrive in this container. Resumed in the foreground per that message; the build had in fact already finished, exit 0, 20/20 tasks — reported here rather than claimed sight-unseen.)

Verification, on final commit ce711b6ff

  • node scripts/check-doc-snippet-types.mjs → ran to completion above, 68/68 semantic pass — this is the one that needed the build, and I watched it finish.
  • node scripts/check-doc-component-types.mjsScanned 143 mdx file(s) … ✅ Every documented component type is registered. (no build needed; unaffected by this change — I add no new type: literals).
  • node scripts/check-doc-links.mjsLinks are valid across 13 scan roots.
  • node scripts/check-control-bytes.mjsOK (scanned 4682 tracked text file(s)); manual self-scan of both changed files with grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' — no hits.
  • node scripts/check-changeset-presence.mjs0 file(s) … under the src/ of a package the release covers … No source of a released package changed in this range, so no changeset is owed. Both changed files are docs (a package README and a content/docs/** page), neither under a package's src/**. This repo has no skip-changeset label mechanism (unlike objectstack), so nothing to apply.

All five gates in the verification bar ran and finished; none skipped, none guessed.

Generated by Claude Code

…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
@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation plugin labels Aug 19, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

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

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)9.83KB3.70KB
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)29.33KB7.05KB
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)506.27KB113.31KB
core (index.js)4.11KB1.62KB
create-plugin (index.js)10.08KB3.26KB
data-objectstack (index.js)159.80KB44.34KB
fields (index.js)237.07KB59.46KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.28KB1.75KB
i18n (index.js)3.42KB1.39KB
i18n (pickLocalized.js)3.69KB1.73KB
i18n (provider.js)23.13KB7.63KB
i18n (useDisplayLocale.js)2.85KB1.45KB
i18n (useObjectLabel.js)29.43KB7.15KB
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)128.04KB32.75KB
plugin-designer (index.js)212.39KB42.83KB
plugin-detail (index.js)241.46KB60.56KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)123.77KB30.07KB
plugin-gantt (index.js)164.10KB39.87KB
plugin-grid (index.js)198.22KB53.27KB
plugin-kanban (index.js)52.93KB14.60KB
plugin-list (index.js)111.66KB27.13KB
plugin-map (index.js)19.96KB6.56KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)42.84KB11.77KB
plugin-timeline (index.js)26.68KB7.66KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.34KB20.61KB
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)36.10KB12.26KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.33KB0.69KB
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.08KB1.53KB
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

@os-support-ai
os-support-ai marked this pull request as ready for review August 19, 2026 07:10
@os-support-ai
os-support-ai added this pull request to the merge queueAug 19, 2026
Merged via the queue into main with commit 95cf241Aug 19, 2026
20 checks passed
@os-support-ai
os-support-ai deleted the claude/issue-5271-plugin-view-docs-canonical-keys branch August 19, 2026 07:10
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

@os-support-ai@claude