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 && (