Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
fb631d9
feat(plugin-detail): fold consecutive same-actor update entries in th…
claude Oct 26, 2026
7a6756b
test(plugin-detail): pin the activity timeline fold; changeset
claude Oct 26, 2026
03f749a
refactor(plugin-detail): move the activity fold into the feed's pure …
claude Oct 26, 2026
a9d3183
fix(plugin-detail): join the folded row's field list with the pack's …
claude Oct 26, 2026
d91b6dd
chore(sdui): re-record the manifest record for the activity fold
claude Oct 26, 2026
e75a90e
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
1c8752a
chore(sdui): re-record the manifest record after merging main
claude Oct 26, 2026
15e8210
fix(plugin-detail): name the fold's entry type ActivityTimelineEntry
claude Oct 26, 2026
ed63e3c
chore(sdui): re-record the manifest record after the rename
claude Oct 26, 2026
4e88d38
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
65612da
chore(sdui): re-record the manifest record after merging main
claude Oct 26, 2026
d899633
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
f0e8d84
chore(sdui): re-record the plugin-detail, i18n and types source recor…
claude Oct 26, 2026
68c9bc8
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
7b3dc29
chore(sdui): re-record the i18n and types source records after mergin…
claude Oct 26, 2026
f95f137
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
86a7402
Merge remote-tracking branch 'origin/main' into claude/project-thread…
claude Oct 26, 2026
e7a0e42
chore(sdui): re-record the source records after merging main
claude Oct 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions .changeset/25959-activity-fold.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
---
'@object-ui/types': patch
'@object-ui/plugin-detail': patch
'@object-ui/i18n': patch
---

feat(plugin-detail): the record activity timeline folds consecutive updates by one actor into one row with a count

Clause-②: yes
Metadata-protocol: none

- **Before.** Every `sys_activity` update was its own feed row. When a flow, a rollup or a seed updated a record repeatedly, the system's rows buried the people's comments: a demo campaign showed thirteen consecutive "System · Updated Campaign …" rows in its discussion feed.
- **Now.** `RecordActivityTimeline` folds a run of adjacent `updated` entries by the same actor (`actor_id`, `null` for the system, and the same display name), each no more than 10 minutes after the one before it, into one row. The row shows the actor, the time of the latest entry, the entry count and the union of the changed fields, by their field labels where the page has the object schema and by machine name otherwise (`Updated Number Sent, Leads, Responses · 13 updates`). A toggle (`aria-expanded`) expands it to every entry.
- **Rendering only.** No entry is dropped or merged in the data, and the panel heading still counts every entry. Create, delete, assign, share, comment, completed and milestone rows never fold, and any of them between two updates ends the run. An entry without a summary still folds and still counts. Field names come from `sys_activity.changed_fields`, never from the recorded values.
- **`FeedItem` (`@object-ui/types`).** Four new optional members, set by `activityRowToFeedItem`: `activityType` (the row's own `sys_activity.type`), `activityKind` (`metadata.kind`, e.g. `'milestone'`), `actorId` and `changedFields`. A host item without them renders as before and never folds.
- **Strings.** `detail.foldedUpdates`, `detail.foldedUpdateCount`, `detail.foldedMoreFields`, `detail.expandFolded` and `detail.collapseFolded`, in all ten packs.
2 changes: 1 addition & 1 deletion scripts/sdui-manifest.sources/i18n.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"package":"ui/packages/i18n","sources":31,"sha256":"4bcb36ff124e98b8405929277c2acd9afdeb73347b814df67cf26a80727996af","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
{"package":"ui/packages/i18n","sources":31,"sha256":"a5459185e0836b6ae5f87ff81d0e75d2be96455c5f18661c47c12c8f49d81871","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
2 changes: 1 addition & 1 deletion scripts/sdui-manifest.sources/plugin-detail.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"package":"ui/packages/plugin-detail","sources":54,"sha256":"e22491dc392ede00c47cdea1d193d7c03c9c01751e65ee851adb17f2038b7ad2","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
{"package":"ui/packages/plugin-detail","sources":54,"sha256":"3a6fffd41940e71d2402028d44c078cf9cdb7e9428120b180af072491ecfa2a9","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
2 changes: 1 addition & 1 deletion scripts/sdui-manifest.sources/types.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"package":"ui/packages/types","sources":81,"sha256":"d7928a68db8d76df5f05933d139f9d3d46e2fd87f74945f69c74e079f1a8eda2","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
{"package":"ui/packages/types","sources":81,"sha256":"0373b9f45d8be39821641918e2e8058b8016ad24232b39111193116732fdf00f","manifestSha256":"1f6e1ccb925a678eaa393f9091dfc7d0285e4e3626e0a5c61a5474687debabb7"}
18 changes: 18 additions & 0 deletions ui/packages/i18n/src/locales/ar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1343,6 +1343,24 @@ const ar = {
edited: "(معدل)",
via: "عبر {{source}}",
viewSource: "عرض المصدر",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "تم تحديث {{fields}}",
foldedUpdateCount: "{{count}} تحديث",
foldedUpdateCount_zero: "{{count}} تحديث",
foldedUpdateCount_one: "{{count}} تحديث",
foldedUpdateCount_two: "تحديثان ({{count}})",
foldedUpdateCount_few: "{{count}} تحديثات",
foldedUpdateCount_many: "{{count}} تحديثًا",
foldedUpdateCount_other: "{{count}} تحديث",
foldedMoreFields: "{{count}} أخرى",
foldedMoreFields_zero: "{{count}} أخرى",
foldedMoreFields_one: "{{count}} أخرى",
foldedMoreFields_two: "{{count}} أخريان",
foldedMoreFields_few: "{{count}} أخرى",
foldedMoreFields_many: "{{count}} أخرى",
foldedMoreFields_other: "{{count}} أخرى",
expandFolded: "عرض كل تحديث",
collapseFolded: "إخفاء التحديثات",
replyCount: "{{count}} رد",
replyCount_zero: "{{count}} رد",
replyCount_one: "{{count}} رد",
Expand Down
10 changes: 10 additions & 0 deletions ui/packages/i18n/src/locales/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,16 @@ const de = {
edited: "(bearbeitet)",
via: "über {{source}}",
viewSource: "Quelle anzeigen",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "{{fields}} aktualisiert",
foldedUpdateCount: "{{count}} Aktualisierung",
foldedUpdateCount_one: "{{count}} Aktualisierung",
foldedUpdateCount_other: "{{count}} Aktualisierungen",
foldedMoreFields: "{{count}} weiteres",
foldedMoreFields_one: "{{count}} weiteres",
foldedMoreFields_other: "{{count}} weitere",
expandFolded: "Jede Aktualisierung anzeigen",
collapseFolded: "Aktualisierungen ausblenden",
replyCount: "{{count}} Antwort",
replyCount_one: "{{count}} Antwort",
replyCount_other: "{{count}} Antworten",
Expand Down
10 changes: 10 additions & 0 deletions ui/packages/i18n/src/locales/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1581,6 +1581,16 @@ const en = {
edited: '(edited)',
via: 'via {{source}}',
viewSource: 'View source',
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: 'Updated {{fields}}',
foldedUpdateCount: '{{count}} updates',
foldedUpdateCount_one: '{{count}} update',
foldedUpdateCount_other: '{{count}} updates',
foldedMoreFields: '{{count}} more',
foldedMoreFields_one: '{{count}} more',
foldedMoreFields_other: '{{count}} more',
expandFolded: 'Show each update',
collapseFolded: 'Hide updates',
// Replies
replyCount: '{{count}} reply',
replyCount_one: '{{count}} reply',
Expand Down
12 changes: 12 additions & 0 deletions ui/packages/i18n/src/locales/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1241,6 +1241,18 @@ const es = {
edited: "(editado)",
via: "vía {{source}}",
viewSource: "Ver origen",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "Actualizó {{fields}}",
foldedUpdateCount: "{{count}} actualización",
foldedUpdateCount_one: "{{count}} actualización",
foldedUpdateCount_many: "{{count}} de actualizaciones",
foldedUpdateCount_other: "{{count}} actualizaciones",
foldedMoreFields: "{{count}} más",
foldedMoreFields_one: "{{count}} más",
foldedMoreFields_many: "{{count}} más",
foldedMoreFields_other: "{{count}} más",
expandFolded: "Mostrar cada actualización",
collapseFolded: "Ocultar actualizaciones",
replyCount: "{{count}} respuesta",
replyCount_one: "{{count}} respuesta",
replyCount_many: "{{count}} de respuestas",
Expand Down
12 changes: 12 additions & 0 deletions ui/packages/i18n/src/locales/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1238,6 +1238,18 @@ const fr = {
edited: "(modifié)",
via: "via {{source}}",
viewSource: "Voir la source",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "A mis à jour {{fields}}",
foldedUpdateCount: "{{count}} mise à jour",
foldedUpdateCount_one: "{{count}} mise à jour",
foldedUpdateCount_many: "{{count}} de mises à jour",
foldedUpdateCount_other: "{{count}} mises à jour",
foldedMoreFields: "{{count}} autre",
foldedMoreFields_one: "{{count}} autre",
foldedMoreFields_many: "{{count}} d’autres",
foldedMoreFields_other: "{{count}} autres",
expandFolded: "Afficher chaque mise à jour",
collapseFolded: "Masquer les mises à jour",
replyCount: "{{count}} réponse",
replyCount_one: "{{count}} réponse",
replyCount_many: "{{count}} de réponses",
Expand Down
10 changes: 10 additions & 0 deletions ui/packages/i18n/src/locales/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1217,6 +1217,16 @@ const ja = {
edited: "(編集済み)",
via: "{{source}} 経由",
viewSource: "ソースを表示",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "{{fields}} を更新",
foldedUpdateCount: "{{count}} 回",
foldedUpdateCount_one: "{{count}} 回",
foldedUpdateCount_other: "{{count}} 回",
foldedMoreFields: "他 {{count}} 件",
foldedMoreFields_one: "他 {{count}} 件",
foldedMoreFields_other: "他 {{count}} 件",
expandFolded: "各更新を表示",
collapseFolded: "更新を隠す",
replyCount: "{{count}} 件の返信",
replyCount_one: "{{count}} 件の返信",
replyCount_other: "{{count}} 件の返信",
Expand Down
10 changes: 10 additions & 0 deletions ui/packages/i18n/src/locales/ko.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1205,6 +1205,16 @@ const ko = {
edited: "(수정됨)",
via: "{{source}} 통해",
viewSource: "원본 보기",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "{{fields}} 업데이트",
foldedUpdateCount: "{{count}}회",
foldedUpdateCount_one: "{{count}}회",
foldedUpdateCount_other: "{{count}}회",
foldedMoreFields: "외 {{count}}개",
foldedMoreFields_one: "외 {{count}}개",
foldedMoreFields_other: "외 {{count}}개",
expandFolded: "각 업데이트 보기",
collapseFolded: "업데이트 숨기기",
replyCount: "답글 {{count}}개",
replyCount_one: "답글 {{count}}개",
replyCount_other: "답글 {{count}}개",
Expand Down
12 changes: 12 additions & 0 deletions ui/packages/i18n/src/locales/pt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1238,6 +1238,18 @@ const pt = {
edited: "(editado)",
via: "via {{source}}",
viewSource: "Ver origem",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "Atualizou {{fields}}",
foldedUpdateCount: "{{count}} atualização",
foldedUpdateCount_one: "{{count}} atualização",
foldedUpdateCount_many: "{{count}} de atualizações",
foldedUpdateCount_other: "{{count}} atualizações",
foldedMoreFields: "mais {{count}}",
foldedMoreFields_one: "mais {{count}}",
foldedMoreFields_many: "mais {{count}}",
foldedMoreFields_other: "mais {{count}}",
expandFolded: "Mostrar cada atualização",
collapseFolded: "Ocultar atualizações",
replyCount: "{{count}} resposta",
replyCount_one: "{{count}} resposta",
replyCount_many: "{{count}} de respostas",
Expand Down
14 changes: 14 additions & 0 deletions ui/packages/i18n/src/locales/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1290,6 +1290,20 @@ const ru = {
edited: "(изменено)",
via: "через {{source}}",
viewSource: "Показать источник",
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: "Обновлено: {{fields}}",
foldedUpdateCount: "{{count}} обновление",
foldedUpdateCount_one: "{{count}} обновление",
foldedUpdateCount_few: "{{count}} обновления",
foldedUpdateCount_many: "{{count}} обновлений",
foldedUpdateCount_other: "{{count}} обновления",
foldedMoreFields: "ещё {{count}}",
foldedMoreFields_one: "ещё {{count}}",
foldedMoreFields_few: "ещё {{count}}",
foldedMoreFields_many: "ещё {{count}}",
foldedMoreFields_other: "ещё {{count}}",
expandFolded: "Показать каждое обновление",
collapseFolded: "Скрыть обновления",
replyCount: "{{count}} ответ",
replyCount_one: "{{count}} ответ",
replyCount_few: "{{count}} ответа",
Expand Down
10 changes: 10 additions & 0 deletions ui/packages/i18n/src/locales/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1318,6 +1318,16 @@ const zh = {
edited: '(已编辑)',
via: '通过 {{source}}',
viewSource: '查看来源',
// objectstack#25959 — a run of consecutive updates folded into one feed row.
foldedUpdates: '更新了 {{fields}}',
foldedUpdateCount: '{{count}} 次',
foldedUpdateCount_one: '{{count}} 次',
foldedUpdateCount_other: '{{count}} 次',
foldedMoreFields: '其他 {{count}} 项',
foldedMoreFields_one: '其他 {{count}} 项',
foldedMoreFields_other: '其他 {{count}} 项',
expandFolded: '展开每次更新',
collapseFolded: '收起更新',
// Replies
replyCount: '{{count}} 条回复',
replyCount_one: '{{count}} 条回复',
Expand Down
Loading
Loading