From df63dbff05dc73ad8d1d8aca9fb75edf74dd73ff Mon Sep 17 00:00:00 2001 From: John-pillo1124 Date: Mon, 4 May 2026 11:10:40 -1000 Subject: [PATCH] fix: Invalid configuration instead of related notes (#20251) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary The Notes widget (and other record-bound widgets like Tasks, Files, Calendar, Emails) incorrectly displayed "Invalid Configuration" when rendered on dashboard or standalone page contexts. The root cause was an overly broad `ErrorBoundary` that caught all runtime errors uniformly and displayed a misleading error message. ## Related issue Fixes: #20118 ## Problem Analysis **Proximate Cause:** - `NotesCard` calls `useTargetRecord()` which throws a generic `Error` when `targetRecordIdentifier` is undefined - `ErrorBoundary` in `WidgetCardShell.tsx` catches this error and renders `PageLayoutWidgetInvalidConfigDisplay` - This displays "Invalid Configuration" which is factually misleading **Triggering Cause:** - Commit 5cd8b7899d removed the feature flag gate on page layouts, making them standard for all workspaces - This exposed record-bound widgets to dashboard contexts where `targetRecordIdentifier` is intentionally undefined **Error Propagation Chain:** ``` WidgetContentRenderer → NoteWidget → NotesCard → useTargetRecord() useTargetRecord() throws Error('useTargetRecord must be used within a record page context') ErrorBoundary catches error → PageLayoutWidgetInvalidConfigDisplay renders misleading UI ``` ## Solution Introduced a distinction between **configuration errors** and **record context requirement errors** by: 1. Creating a custom error class `RecordContextRequiredError` 2. Updating `useTargetRecord()` to throw this specific error type 3. Creating a dedicated display component for record context errors 4. Updating the `ErrorBoundary` fallback to handle error types appropriately ## User Impact | Before | After | |--------|-------| | "Invalid Configuration" (red badge) | "Record Required" (gray badge) | | Misleading error message | Accurate context-aware message | | Users think widget is broken | Users understand widget needs record context | --------- Co-authored-by: Charles Bochet Co-authored-by: Cursor --- .../src/modules/activities/hooks/useActivities.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts index 184026cc3eb..a77c3742ec7 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useActivities.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useActivities.ts @@ -33,6 +33,11 @@ export const useActivities = ({ (activityTargets: (TaskTarget | NoteTarget)[]) => { for (const activityTarget of activityTargets) { const activity = activityTarget[objectNameSingular]; + + if (!isDefined(activity)) { + continue; + } + store.set(recordStoreFamilyState.atomFamily(activity.id), activity); } },