= {};
+ for (const r of reactions) {
+ reactionsMap[r.emoji] = r.reacted
+ ? [currentUser.id, ...Array(r.count - 1).fill('other')]
+ : Array(r.count).fill('other');
+ }
+ dataSource.update('sys_comment', String(itemId), { reactions: reactionsMap }).catch(() => {});
}
return updated;
}));
@@ -186,19 +253,20 @@ export function RecordDetailView({ dataSource, objects, onEdit }: RecordDetailVi
{/* Comments & Discussion */}
-
-
- Comments & Discussion
-
-
From c196e4f01bfadfd6d5ce58492e902f6caac2a140 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 22 Feb 2026 16:02:01 +0000
Subject: [PATCH 4/7] Task 6: Update ROADMAP test count (5,618+) and mark
Feed/Chatter tests + Console integration complete
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
ROADMAP.md | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/ROADMAP.md b/ROADMAP.md
index 4f10e6e47..df1fa50e4 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -13,7 +13,7 @@
ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind + Shadcn. It renders JSON metadata from the @objectstack/spec protocol into pixel-perfect, accessible, and interactive enterprise interfaces.
-**Where We Are:** Foundation is **solid and shipping** β 35 packages, 99+ components, 5,177+ tests, 78 Storybook stories, 42/42 builds passing, ~85% protocol alignment. SpecBridge, Expression Engine, Action Engine, data binding, all view plugins (Grid/Kanban/Calendar/Gantt/Timeline/Map/Gallery), Record components, Report engine, Dashboard BI features, mobile UX, i18n (11 locales), WCAG AA accessibility, Designer Phase 1 (ViewDesigner drag-to-reorder β
), Console through Phase 20 (L3), **AppShell Navigation Renderer** (P0.1), **Flow Designer** (P2.4), and **Feed/Chatter UI** (P1.5) β all β
complete.
+**Where We Are:** Foundation is **solid and shipping** β 35 packages, 99+ components, 5,618+ tests, 78 Storybook stories, 42/42 builds passing, ~85% protocol alignment. SpecBridge, Expression Engine, Action Engine, data binding, all view plugins (Grid/Kanban/Calendar/Gantt/Timeline/Map/Gallery), Record components, Report engine, Dashboard BI features, mobile UX, i18n (11 locales), WCAG AA accessibility, Designer Phase 1 (ViewDesigner drag-to-reorder β
), Console through Phase 20 (L3), **AppShell Navigation Renderer** (P0.1), **Flow Designer** (P2.4), and **Feed/Chatter UI** (P1.5) β all β
complete.
**What Remains:** The gap to **Airtable-level UX** is primarily in:
1. ~~**AppShell** β No dynamic navigation renderer from spec JSON (last P0 blocker)~~ β
Complete
@@ -140,6 +140,8 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
- [x] `SubscriptionToggle` β bell notification toggle
- [x] `ReactionPicker` β emoji reaction selector
- [x] `ThreadedReplies` β collapsible comment reply threading
+ - [x] Comprehensive unit tests for all 6 core Feed/Chatter components (96 tests)
+ - [x] Console `RecordDetailView` integration: `CommentThread` β `RecordChatterPanel` with `FeedItem[]` data model
### P1.6 Console β Automation
@@ -496,7 +498,7 @@ The `FlowDesigner` is a canvas-based flow editor that bridges the gap between th
| **AppShell Renderer** | β
Complete | Sidebar + nav tree from `AppSchema` JSON | Console renders from spec JSON |
| **Designer Interaction** | Phase 2 (most complete) | ViewDesigner + DataModelDesigner drag/undo | Manual UX testing |
| **Build Status** | 42/42 pass | 42/42 pass | `pnpm build` |
-| **Test Count** | 5,070+ | 5,500+ | `pnpm test` summary |
+| **Test Count** | 5,070+ | 5,618+ | `pnpm test` summary |
| **Test Coverage** | 90%+ | 90%+ | `pnpm test:coverage` |
| **Storybook Stories** | 78 | 91+ (1 per component) | Story file count |
| **Console i18n** | 100% | 100% | No hardcoded strings |
From 26b83d1cbb640302820ef836cdcc65bcde817c39 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sun, 22 Feb 2026 16:04:46 +0000
Subject: [PATCH 5/7] Fix code review: replace placeholder userIds with atomic
toggle operation for reaction persistence
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
---
apps/console/src/components/RecordDetailView.tsx | 12 ++++--------
1 file changed, 4 insertions(+), 8 deletions(-)
diff --git a/apps/console/src/components/RecordDetailView.tsx b/apps/console/src/components/RecordDetailView.tsx
index 131306960..50c827106 100644
--- a/apps/console/src/components/RecordDetailView.tsx
+++ b/apps/console/src/components/RecordDetailView.tsx
@@ -159,15 +159,11 @@ export function RecordDetailView({ dataSource, objects, onEdit }: RecordDetailVi
reactions.push({ emoji, count: 1, reacted: true });
}
const updated = { ...item, reactions };
- // Persist reaction update
+ // Persist reaction toggle to backend
if (dataSource) {
- const reactionsMap: Record = {};
- for (const r of reactions) {
- reactionsMap[r.emoji] = r.reacted
- ? [currentUser.id, ...Array(r.count - 1).fill('other')]
- : Array(r.count).fill('other');
- }
- dataSource.update('sys_comment', String(itemId), { reactions: reactionsMap }).catch(() => {});
+ dataSource.update('sys_comment', String(itemId), {
+ $toggleReaction: { emoji, userId: currentUser.id },
+ }).catch(() => {});
}
return updated;
}));
From c7257ca1b491853b3227681732932d89db698f5c Mon Sep 17 00:00:00 2001
From: Jack Zhuang <50353452+hotlong@users.noreply.github.com>
Date: Mon, 23 Feb 2026 00:37:31 +0800
Subject: [PATCH 6/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20RecordDetailView.tsx?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
apps/console/src/components/RecordDetailView.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apps/console/src/components/RecordDetailView.tsx b/apps/console/src/components/RecordDetailView.tsx
index 50c827106..9227b74b4 100644
--- a/apps/console/src/components/RecordDetailView.tsx
+++ b/apps/console/src/components/RecordDetailView.tsx
@@ -72,7 +72,7 @@ export function RecordDetailView({ dataSource, objects, onEdit }: RecordDetailVi
}
})
.catch(() => {});
- }, [dataSource, objectName, recordId]);
+ }, [dataSource, objectName, recordId, currentUser]);
const handleAddComment = useCallback(
async (text: string) => {
From 54f42c4daddb1c3062877eacd8e7958b516a5f5a Mon Sep 17 00:00:00 2001
From: Jack Zhuang <50353452+hotlong@users.noreply.github.com>
Date: Mon, 23 Feb 2026 00:37:42 +0800
Subject: [PATCH 7/7] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20ROADMAP.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---
ROADMAP.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ROADMAP.md b/ROADMAP.md
index df1fa50e4..4b9a812dd 100644
--- a/ROADMAP.md
+++ b/ROADMAP.md
@@ -142,7 +142,7 @@ ObjectUI is a universal Server-Driven UI (SDUI) engine built on React + Tailwind
- [x] `ThreadedReplies` β collapsible comment reply threading
- [x] Comprehensive unit tests for all 6 core Feed/Chatter components (96 tests)
- [x] Console `RecordDetailView` integration: `CommentThread` β `RecordChatterPanel` with `FeedItem[]` data model
-
+ - [ ] Documentation for Feed/Chatter plugin in `content/docs/plugins/plugin-detail.mdx` (purpose/use cases, JSON schema, props, and Console integration for `RecordChatterPanel`, `RecordActivityTimeline`, and related components)
### P1.6 Console β Automation
> **Spec v3.0.9** significantly expanded the automation/workflow protocol. New node types, BPMN interop, execution tracking, and wait/timer executors are now available in the spec.