From 342ae995d983889226e823f246171422219b62fe Mon Sep 17 00:00:00 2001
From: nitin <142569587+ehconitin@users.noreply.github.com>
Date: Mon, 12 Jan 2026 17:32:58 +0530
Subject: [PATCH] Add error boundary on widget renderer and minor widget seed
fix (#17058)
closes https://github.com/twentyhq/twenty/issues/16896 and
https://github.com/twentyhq/core-team-issues/issues/2050
should error be Invalid Configuration or something else?
---
.../PageLayoutWidgetInvalidConfigDisplay.tsx | 31 +++++++++++++++++++
.../PageLayoutWidgetNoDataDisplay.tsx | 10 ++++--
.../widgets/components/WidgetRenderer.tsx | 10 +++++-
...t-page-layout-widget-data-seeds-v2.util.ts | 1 +
4 files changed, 49 insertions(+), 3 deletions(-)
create mode 100644 packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetInvalidConfigDisplay.tsx
diff --git a/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetInvalidConfigDisplay.tsx b/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetInvalidConfigDisplay.tsx
new file mode 100644
index 0000000000..dbc8efcd2c
--- /dev/null
+++ b/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetInvalidConfigDisplay.tsx
@@ -0,0 +1,31 @@
+import { useCurrentWidget } from '@/page-layout/widgets/hooks/useCurrentWidget';
+import styled from '@emotion/styled';
+import { t } from '@lingui/core/macro';
+import { AppTooltip, Status } from 'twenty-ui/display';
+
+const StyledInvalidConfigContainer = styled.div`
+ align-items: center;
+ display: flex;
+ justify-content: center;
+`;
+
+export const PageLayoutWidgetInvalidConfigDisplay = () => {
+ const widget = useCurrentWidget();
+ const tooltipId = `widget-invalid-config-tooltip-${widget.id}`;
+
+ const text = t`Invalid Configuration`;
+ const tooltipContent = t`Invalid configuration. Click edit to configure this widget.`;
+
+ return (
+
+
+
+
+
+
+ );
+};
diff --git a/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetNoDataDisplay.tsx b/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetNoDataDisplay.tsx
index e12582d0f5..e8d23c7532 100644
--- a/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetNoDataDisplay.tsx
+++ b/packages/twenty-front/src/modules/page-layout/widgets/components/PageLayoutWidgetNoDataDisplay.tsx
@@ -1,8 +1,14 @@
import { useCurrentWidget } from '@/page-layout/widgets/hooks/useCurrentWidget';
+import styled from '@emotion/styled';
import { t } from '@lingui/core/macro';
import { AppTooltip, Status } from 'twenty-ui/display';
import { WidgetType } from '~/generated/graphql';
+const StyledNoDataContainer = styled.div`
+ align-items: center;
+ display: flex;
+ justify-content: center;
+`;
export const PageLayoutWidgetNoDataDisplay = () => {
const widget = useCurrentWidget();
const tooltipId = `widget-incomplete-tooltip-${widget.id}`;
@@ -14,7 +20,7 @@ export const PageLayoutWidgetNoDataDisplay = () => {
: t`No data available. Click edit to configure this widget.`;
return (
- <>
+
@@ -23,6 +29,6 @@ export const PageLayoutWidgetNoDataDisplay = () => {
content={tooltipContent}
place="top"
/>
- >
+
);
};
diff --git a/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetRenderer.tsx b/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetRenderer.tsx
index 0e155d8aa9..d71485bb4b 100644
--- a/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetRenderer.tsx
+++ b/packages/twenty-front/src/modules/page-layout/widgets/components/WidgetRenderer.tsx
@@ -8,6 +8,7 @@ import { pageLayoutEditingWidgetIdComponentState } from '@/page-layout/states/pa
import { pageLayoutResizingWidgetIdComponentState } from '@/page-layout/states/pageLayoutResizingWidgetIdComponentState';
import { type PageLayoutWidget } from '@/page-layout/types/PageLayoutWidget';
import { PageLayoutWidgetForbiddenDisplay } from '@/page-layout/widgets/components/PageLayoutWidgetForbiddenDisplay';
+import { PageLayoutWidgetInvalidConfigDisplay } from '@/page-layout/widgets/components/PageLayoutWidgetInvalidConfigDisplay';
import { WidgetContentRenderer } from '@/page-layout/widgets/components/WidgetContentRenderer';
import { useIsCurrentWidgetLastOfTab } from '@/page-layout/widgets/hooks/useIsCurrentWidgetLastOfTab';
import { useIsInPinnedTab } from '@/page-layout/widgets/hooks/useIsInPinnedTab';
@@ -26,6 +27,7 @@ import { useSetRecoilComponentFamilyState } from '@/ui/utilities/state/component
import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { type MouseEvent } from 'react';
+import { ErrorBoundary } from 'react-error-boundary';
import { IconLock } from 'twenty-ui/display';
import { WidgetType } from '~/generated/graphql';
@@ -155,7 +157,13 @@ export const WidgetRenderer = ({ widget }: WidgetRendererProps) => {
)}
- {hasAccess && }
+ {hasAccess && (
+
+
+
+ )}
{!hasAccess && (