Skip to content
Merged
9 changes: 5 additions & 4 deletions .changeset/8934-chatter-feed-affordance-only.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,11 @@ reaches:
no-filter.

**Not closed by this change**, and not claimed to be: `filterMode` and
`enableMentions` are also members of the declared shape and are still unread on
this path — `RecordActivityTimeline` takes `filterMode` as a component prop
rather than off `config`, and the chatter path's mentions come from the host
context. Tracked as objectui#8968. The host fallback panel described above was
`enableMentions` are also members of the declared shape and were still unread on
this path when this change landed — `RecordActivityTimeline` takes `filterMode`
as a component prop rather than off `config`, and the chatter path's mentions
come from the host context. Tracked as objectui#8968, and closed by it in this
same release — see that entry. The host fallback panel described above was
tracked as objectui#8983, since closed — see the note above it.

Marked `minor` rather than `patch`: this repository never declares `major` (the
Expand Down
32 changes: 32 additions & 0 deletions .changeset/8968-chatter-filtermode-enablementions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
---
'@object-ui/plugin-detail': minor
---

`record:chatter` / `record:discussion` now read `feed.filterMode` and
`feed.enableMentions` (objectui#8968).

`@objectstack/spec` declares `RecordChatterProps.feed` as `RecordActivityProps`,
bound to both block names, so every member of the activity shape is authorable
inside `feed`. objectui#8934 made the four filter members live by running
`applyFeedConfig` on this path; two members sit outside that pipeline and stayed
unread. Both are wired now, with `record:activity`'s own reading rather than a
second local one:

- **`feed.filterMode`** seeds which slice the panel opens on, normalized through
the same function `record:activity` uses (an unrecognised value opens on `all`
rather than on a filter nothing matches). It seeds component STATE, so the
dropdown stays usable instead of being frozen on the authored value.
- **`feed.enableMentions`** gates the composer's @-autocomplete. `false`
withholds the host discussion context's suggestion list, which is the
behaviour the `record:activity` registration publishes for this key. The
protocol's default is on, so an unauthored member keeps the affordance.

**Behaviour change for existing schemas.** An authored `feed.filterMode` other
than `all` now actually narrows the chatter feed, and an authored
`feed.enableMentions: false` now actually removes the @-autocomplete. Both were
accepted and discarded before. Schemas that authored neither key are unaffected.

`filterMode` and `showFilterToggle` are independent: with the dropdown gated off,
an authored `filterMode` becomes the author's fixed slice rather than becoming
inert. The reasoning is in the renderer's docblock and pinned by
`recordChatterFilterModeMentions-8968.test.tsx`.
Original file line number Diff line number Diff line change
Expand Up @@ -2858,9 +2858,10 @@ const NEWLY_JUDGED_UNPINNED_MEMBERS = [
* `RecordChatterProps.feed` as `RecordActivityProps` (`component.zod.ts:1366`),
* so objectui#8934 closed the gap in `renderers/record-chatter.tsx` rather than
* narrowing the declaration, and the four filter members are live on that path
* now. (`filterMode` and `enableMentions` are still unread there —
* objectui#8968.) This block's own row is unaffected either way: nothing in
* this file asserts on that description string.
* now. (`filterMode` and `enableMentions` were the remainder; objectui#8968
* closed them too, so every member of the declared shape is read there now.)
* This block's own row is unaffected either way: nothing in this file asserts
* on that description string.
*
* ## 41 -> 37, the seventh slice, and the LAST four one-key blocks closed
*
Expand Down
16 changes: 14 additions & 2 deletions content/docs/plugins/plugin-detail.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -333,8 +333,20 @@ decision as a defect is how a warning channel gets ignored:
asked for, and an unauthored `limit` is `20`, so a longer feed pages with
**Load more** rather than rendering whole.

Two members of the shape are **not** read on this path and authoring them
does nothing here: `filterMode` and `enableMentions` (objectui#8968).
Since objectui#8968 the remaining two members are read here too.
`filterMode` seeds which slice the panel opens on, normalized by the same
function `record:activity` uses, so an unrecognised value opens on `all`
rather than on a filter nothing matches; it seeds component **state**, so the
dropdown stays usable instead of freezing on the authored value.
`enableMentions: false` withholds the composer's @-autocomplete; the
protocol's default is on, so an unauthored member keeps the affordance.
Both values were accepted and discarded before, so a schema that already
authored either one changes behaviour on upgrade — unless what it authored
is what this path already did: `filterMode: 'all'` and
`enableMentions: true` both land on the same feed as before. The case worth
auditing is `showFilterToggle: false` alongside a `filterMode` other than
`all` — that slice is now **pinned** where the panel used to show
everything, and the dropdown that would widen it is not on screen.

There is no third path left to disagree with: the host used to auto-append a
panel below any page that omitted a discussion block, and objectui#7298
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,11 +64,18 @@
* IMPLEMENTATION GAP, and it was closed in the renderer rather than written
* into the contract.
*
* ⚠️ Two members of the declared shape are still unread on this path and are
* NOT closed by that pipeline: `filterMode` (taken by the timeline as a
* component prop, `:187` / `:212`, never off `config`) and `enableMentions`
* (whose only reads are on the `record:activity` path). Tracked as
* objectui#8968; ⛔ neither is pinned here, in either direction.
* ⚠️ Two members of the declared shape are NOT closed by that pipeline, and
* ⛔ neither is pinned here, in either direction: `filterMode` (which the
* timeline takes as a component PROP — it destructures `filterMode:
* controlledFilter` and resolves `controlledFilter ?? internalFilter`, never
* reading it off `config`) and `enableMentions`.
*
* ⭐ Both were UNREAD on this path when that sentence was first written, and
* that half is no longer true: objectui#8968 wired them into
* `renderers/record-chatter.tsx`, with its own pin in
* `recordChatterFilterModeMentions-8968.test.tsx`. The correction is left in
* place of the old claim rather than removed, because this docblock is the
* record of what each pin does and does not cover.
*
* ## Resolution
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,17 @@
* `showSubscription && subscription` and `RecordChatterRenderer` passes no
* `subscription`, so the component is where its live subject is.
*
* ⚠️ NOT covered here, and not claimed: `filterMode` and `enableMentions` are
* also members of the declared shape and are still unread on this path
* (`applyFeedConfig` covers the four filter members only). That gap is
* objectui#8968, and pinning it either way is that card's business.
* ⚠️ NOT covered here, and still not claimed here: `filterMode` and
* `enableMentions` are also members of the declared shape, and `applyFeedConfig`
* covers the four filter members only — so this file asserts nothing about
* either of them, in either direction.
*
* ⭐ What this paragraph used to add, and no longer may: that the two are
* "still unread on this path". They are read now. objectui#8968 wired both into
* `renderers/record-chatter.tsx` and pinned them in
* `recordChatterFilterModeMentions-8968.test.tsx`. The SCOPE sentence above
* survives that card; the claim about the implementation did not, and is
* corrected rather than deleted so the next reader can see which half moved.
*
* ## Resolution
*
Expand Down
Loading
Loading