You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit a4ca69a
Browse filesBrowse the repository at this point in the historyBrowse files
fix(spec): one row bound per view — retire the unpublished per-kind view limit (#19809)
Part of #19228
Clause-②: no
Rewritten short by the dispatching seat (2026-09-23T08:08Z). The
developer's measurements are in its report on #19228; the at-tier review
record is `5791323483` on this PR.
## What changes
Ruling D (#19228, `5789634193`): a view carries one row bound,
`pagination.pageSize`. The per-kind view `limit` added for #17393 was
never published (npm `latest` is 17.4.0; the key is absent from its
tarball), so it is removed before a release carries it.
- `GalleryConfigSchema` / `KanbanConfigSchema` / `TimelineConfigSchema`
lose `limit`; `rowLimitKey`, `DEFAULT_VIEW_ROW_LIMIT` and
`KanbanConfigParsed` go with it (Kanban has one shape again, re-pinned
per ADR-0122).
- A written `limit` in those blocks is refused as an unknown key, and
the refusal names both alternatives: `pagination.pageSize` on a view, or
the flat `limit` on a page component node.
- `pagination.pageSize`'s description carries the truncation obligation
that `limit`'s description carried.
- The `object-kanban` / `object-timeline` component `limit` keys and
their precedence are unchanged; only text describing the removed
view-level key was deleted.
- The pending release note `.changeset/17393-view-row-ceiling.md` is
deleted, and the pending
`.changeset/19228-view-row-limit-route-record.md` loses its section
about the view-level `limit`, so no release announces a key that does
not ship. A `patch` changeset covers the description change.
Net: 16 files, +86 / −528.
## ⚠️ `Check Changeset` is red on purpose
This PR corrects two PENDING release notes instead of adding one, which
`check-empty-changeset.mjs` names the DELIBERATE CORRECTION class. The
workflow (`pr-automation.yml`, route 0) says to leave the check red and
get the correction confirmed in writing on the PR; `Check Changeset` is
not a required context. The two notes and what changed under them are
listed above. **Maintainer confirmation requested on this PR.**
## Not in this PR
objectui still spreads a view's kanban / gallery / timeline block onto
the rendered node; reading `pagination.pageSize` as the fetch ceiling
and showing the truncation signal there is objectui work. objectui#7390
is closed, so that work has no open card; triage is asked to route it
(#19228).
## 维护者速读
- 看板、画廊、时间线视图原来各有一个「最多显示多少条」的 `limit`,从没发布过;按您的裁决 D,改为每个视图只用
`pagination.pageSize` 一个上限。
- 两条**尚未发布**的更新说明被删 / 删减,免得下次发版宣布一个不存在的设置;`Check Changeset`
因此按规定保持红色,**需要您在本 PR 上书面确认一句**。
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01Sfe5YjBLwB9J3y8fvm2xq1
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/references/ui/component.mdx
+1-2Lines changed: 1 addition & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -813,7 +813,7 @@ View filter rule
813
813
| Property | Type | Required | Description |
814
814
| :--- | :--- | :--- | :--- |
815
815
|**objectName**|`string`| optional | Object this timeline binds to. Optional because the component-level `dataSource` binding can supply the object instead — this block registers through `ElementDataSourceGate`, which lowers the binding onto this key before the renderer sees the node |
816
-
|**timeline**|`{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }`| optional | Timeline configuration, the author face — the same block `ListViewSchema.timeline` declares: `{ startDateField, endDateField, titleField, groupByField, colorField, scale, limit }`. The flat top-level spellings beside it are the runtime handoff, not a second authoring spelling. ⚠️ `limit` is the one member of this block NO renderer reads on any route: the rail is capped by the FLAT `limit` beside this key, which is also the only one a bound `dataSource` lowers into. A `limit` written inside this block is accepted, defaulted to 100, and never read|
816
+
|**timeline**|`{ startDateField: string; endDateField?: string; titleField: string; groupByField?: string; … }`| optional | Timeline configuration, the author face — the same block `ListViewSchema.timeline` declares: `{ startDateField, endDateField, titleField, groupByField, colorField, scale}`. The flat top-level spellings beside it are the runtime handoff, not a second authoring spelling |
817
817
|**filter**|`{ field: string; operator: Enum<'equals' \| 'not_equals' \| 'contains' \| 'not_contains' \| 'icontains' \| …>; value?: string \| number \| boolean \| null \| (string \| number)[] }[]`| optional | Base query filter — the ViewFilterRule array form `[{ field, operator, value }, ...]`, the one filter orthography every `filter` door in this map shares; lowered to the wire `$filter`. The MongoDB-style record form is refused — see migration `element-data-source-and-object-block-filter-rule-array`|
818
818
|**sort**|`{ field: string; order: Enum<'asc' \| 'desc'> }[]`| optional | Row order for the fetched entries — the SortItem array form `[{ field, order }, ...]`, the one sort orthography every declared `sort` door on this platform shares; lowered to the wire `$orderby`. The legacy string clause (`name desc`) is refused — see migration `object-block-sort-item-array`|
819
819
|**limit**|`integer`| optional | Maximum number of records loaded onto the rail (row cap); lowered to the query's top-level `$top` (renderer default 100). A timeline renders one rail with no pagination control, so this is the author's window rather than a page size |
@@ -838,7 +838,6 @@ View filter rule
838
838
|**groupByField**|`string`| optional | Field to group timeline rows. NO leading or trailing whitespace: the renderer reads this name off every row verbatim, so a padded spelling drops every row into one ungrouped band. |
839
839
|**colorField**|`string`| optional | Field to derive each item color from (it names a field, not a color): the option color declared on that field for the record value, else the value itself when it already is a color literal (hex, rgb() or hsl()), else the timeline default marker color |
|**limit**|`integer`| optional (default: `100`) | Row ceiling — the most rows the timeline fetches onto its rail; default 100 when the key is absent. The renderer owes two things: bound its fetch at this number, and, when the ceiling APPLIES (the filtered set is larger than it), show a visible truncation signal saying what is on screen is not the whole set — a bounded view that looks complete is worse than an unbounded one. ⚠️ Not every view kind has a renderer that reads this key yet; which do is recorded on the declaration. |
0 commit comments