feat(types)!: showFilters is retired on object-grid, refused by name with the list view's userActions.filter named (objectui#11068) - #11306
Conversation
…ame with `userActions.filter` named (objectui#11068) An `object-grid` has no filter UI and never read `showFilters`; the one filter surface is the `list-view` toolbar's builder, switched by `userActions.filter`. The key is now `?: never` on the `ObjectGridSchema` interface and a `retirementTombstone()` on its Zod twin, so both authoring faces refuse it by name. An `object-view`'s and a `list-view`'s own `showFilters` are untouched. The root README's `object-grid` example and the 9729 byte-ruler corpus stop authoring the key; the schema reference and the plugin-grid guide name the retirement. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
…wFilters` is still declared The retirement in the previous commit made that sentence false; `keyboardNavigation` is the one key it still describes. Claude-Session: https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZ Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: PR objectui#11306 ( ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
Part of #11068
Clause-②: yes
The
showFiltershalf of the card, as triage's retriage answer (comment 5896596687) ruled it: RETIRE, with a named tombstone that points at the list view'suserActions.filter.keyboardNavigationis not in this PR. It waits until objectstack-ai/objectstack#20694's row is installable (PR objectstack-ai/objectstack#20882 is not in@objectstack/spec17.5.0), so the card stays open.What changed
@object-ui/types, zod twin (ObjectGridSchemainzod/objectql.zod.ts):showFilters: z.boolean().optional()is nowretirementTombstone(OBJECT_GRID_SHOW_FILTERS_RETIRED), next to therowSpecActions/bulkSpecActions/name/placeholdertombstones. The one string goes into both.describe()and the parse message. It names the card, says the grid has no filter UI, sends the author to alist-viewand itsuserActions.filter, and namesfilterfor narrowing the grid's own rows.@object-ui/types, TypeScript twin (ObjectGridSchemainobjectql.ts):showFilters?: boolean(the deprecated "legacy filters toggle") is nowshowFilters?: neverwith a RETIRED docblock. It is not deleted, because the key would then fall back toBaseSchema's index signature and type-check again. That is the same conventionrowSpecActionsuses.ObjectViewSchema.showFilters(both faces), whichObjectViewreads. The list view'sshowFilters(zodListViewSchema), whichListViewfolds ontouserActions.filter.NamedListView.showFilters, already?: neversince objectui#7924.DashboardConfig.showFilters. Theobject-viewtableslot's existing by-name refusal.README.mdobject-gridexample, and the objectui#9729 byte-ruler corpus inObjectGrid.operatorsInert-9729.test.tsx. That corpus's "filter surface on" document carriedshowFilters: true, which never drew anything. It now measures with the grid's search box (searchableFields), and the test is renamed to match.schema-reference.mdgets a retired callout underObjectGridSchemaand an updated history sentence.plugin-grid.mdxgets a paragraph next to the four earlier retirements.packages/types/src/__tests__/object-grid-show-filters-retired-11068.test.tscovers both authoring faces, the metadata channel, member-not-deletion, the upstream half and the TS twin.ObjectGrid.declaredKeys-11068.test.tsxaddsshowFilters(true and false) to the byte ruler. Comment-only count updates (four to five) inobject-view-slot-key-lists.test.tsand the two slot docblocks..changeset/11068-object-grid-show-filters.mdis@object-ui/typesminor, with a BREAKING (authoring) line. The pending.changeset/11068-grid-declared-keys.md(from PR objectui#11130, not yet released) said "showFiltersandkeyboardNavigationare still declared and still not read". This PR makes that false, so it now names onlykeyboardNavigation.Dispatch assumptions, measured
1563d3e10b, the new pin read 5 failed / 13 passed.{ type: 'object-grid', objectName, showFilters: true }parsed green onsafeValidateSchemaand onStrictAnyComponentSchema("showFilters: true parsed green: expected true to be false"). The 13 that passed are the controls. The renderer half is a byte ruler: the same grid drawn with and withoutshowFilters(true and false) gives identical bytes, and the lit controldescriptionmoves them.packages/plugin-grid/srcis not edited, so the ruler reads base behaviour.objectql.tsdeclaresshowFilterson three interfaces. These areObjectGridSchema(retired here),ObjectViewSchema(its own key, read byObjectViewas the fallback behinduserActions.filter) andNamedListView(already a tombstone). The zod side declares it onObjectGridSchema(retired),ObjectViewSchema,ListViewSchema,DashboardConfigSchema, and in the table-slot withheld set.object-viewtable slot: holds, and nothing changes there. The slot isObjectGridSchema.omit(type, objectName).extend(OBJECT_VIEW_TABLE_WITHHELD). The withheld set already refusedshowFiltersby name (objectui#10976), and.extendoverrides the grid's tombstone, so the slot's message is byte-for-byte the same. No live read goes through the slot.ObjectViewreads only the node-levelschema.showFilters, andOBJECT_VIEW_TABLE_RELAY_KEYSdoes not carry it.@objectstack/spec17.5.0,ComponentPropsMap['object-grid']isObjectGridPropsSchema, which does not declareshowFilters. It refuses{ objectName, showFilters: true }withunrecognized_keys, while{ objectName }alone parses green.ListViewSchema.userActionsdeclaresfilter. The pin re-derives both facts.schema-reference.mdtable row that namesshowFilters(theshowSearch/showFilters/showCreaterow) is in theObjectViewSchematable, not the grid's, so it stays. TheObjectGridSchematable never listed the key. The card said its only producer was the doc example, which PR objectui#11130 removed. Two more in-repo producers turned up: the rootREADME.mdobject-gridexample and the 9729 ruler corpus. Both now omit the key. Theplugin-view.mdxandpackages/plugin-view/README.mdmentions are about the object view's own key and the table slot, and stay.Tests (head
b87cbca042, after mergingmainat1ccb5ba7de, which brought in PR objectui#11292)pnpm --filter @object-ui/types build && pnpm --filter @object-ui/types type-check && pnpm --filter @object-ui/plugin-grid type-check && pnpm --filter @object-ui/plugin-view type-checkgivesVERDICT command-exit 0. The types type-check runs three legs:tsc --noEmit,tsconfig.examples.jsonandtsconfig.test.json.pnpm exec vitest run packages/types/ examples/schema-catalog/givesTest Files 338 passed (338),Tests 9836 passed (9836).pnpm exec vitest run packages/plugin-grid/plus the ten other suites thatgit grep -l showFiltersfinds (app-shell ×3, core ×3, plugin-list ×1, plugin-view ×3) givesTest Files 187 passed (187),Tests 1959 passed (1959).@object-ui/plugin-viewdependency closure (turbo run build --filter='@object-ui/plugin-view^...' --concurrency=2: 15/15 tasks).Ablations ran on committed code (
181b9b615a) through objectstack'sscripts/ablation-replace.mjs, in WRAP mode. Each anchor went from x1 to x0, the blob changed, and the restore was proven (blob equals HEAD,git diff HEADempty). The tests readsrc, so there is nodistleg.objectql.ts,showFilters?: neverchanged toboolean.tsc -p tsconfig.test.jsonthen exits 2 withTS2578 Unused '@ts-expect-error'in the new pin, plusTS2322in thezod-mirror-paritytype ratchet.z.boolean().optional(). The new pin then reads5 failed / 13 passed, the same red as at base.Repo checks (at
b87cbca042):check-control-bytes: OK.new-cross-file-line-citations:VERDICT … 0 new citation(s).check-changeset-presence: "6 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)".changeset:check: nomajor.check:doc-types,check:doc-fences,check:doc-example-ids,docs:check-links,check:doc-example-readersandcheck:test-path-roots: all OK.check:component-surface-parity: report-only, and the report is identical before and after (noobject-gridrow either way).check:changeset-claims: report-only. The one falsified pending sentence is repaired as described above.check-governed-queue-guard --teston the 11 paths: NOT GOVERNED.NOT MEASURED:
check:doc-snippetsandcheck:doc-examplesexit 2 ("THE GATE COULD NOT RUN"): about 20 packages they import are unbuilt. This diff adds or changes nots/tsxfence line (counted: 0), and the only fenced edit is one line removed from ajsonfence inREADME.md. These are left to CI.pnpm lintis CI's to run.ObjectGridSchemaimporters (core, plugin-calendar, plugin-dashboard, plugin-designer, plugin-gantt, plugin-kanban, plugin-list, plugin-map, plugin-tree, console) is left to CI. A grep finds no typed writer ofshowFilterson anObjectGridSchemavalue. Every other writer targets anobject-view, alist-viewor a dashboard.Acceptance notes
object-viewtable slot refusestable.showFilterswith "ObjectGridhas no read of it". An author who wrote it probably meant the object view's ownshowFilters, whichObjectViewreads, and the message does not name it. This is polish to the wording of a refusal that is already loud. Carrier: none. Left as is, because the dispatch rules out widening or reworking that slot.operatorstombstone's comment inobjectql.zod.tsstill describes the objectui#9729 reading as "with the filter surface off AND on". That is a historical description of a measurement taken when the corpus carriedshowFilters, and it is left as written.keyboardNavigationis still declared onObjectGridSchemaand still unread. It is the card's remaining half.Session:
https://claude.ai/code/session_0122Knsowci76D2rBWReCzzZGenerated by Claude Code