[Dashboards] Rich text editor frontend (#16437)

closes https://github.com/twentyhq/core-team-issues/issues/1894
This commit is contained in:
nitin
2025-12-12 23:06:59 +05:30
committed by GitHub
parent afcca283c4
commit 44f0cfdd9e
42 changed files with 2054 additions and 143 deletions
@@ -7,6 +7,7 @@ import { FileWidget } from '@/page-layout/widgets/files/components/FileWidget';
import { GraphWidgetRenderer } from '@/page-layout/widgets/graph/components/GraphWidgetRenderer';
import { IframeWidget } from '@/page-layout/widgets/iframe/components/IframeWidget';
import { NoteWidget } from '@/page-layout/widgets/notes/components/NoteWidget';
import { StandaloneRichTextWidget } from '@/page-layout/widgets/standalone-rich-text/components/StandaloneRichTextWidget';
import { TaskWidget } from '@/page-layout/widgets/tasks/components/TaskWidget';
import { TimelineWidget } from '@/page-layout/widgets/timeline/components/TimelineWidget';
import { WorkflowRunWidget } from '@/page-layout/widgets/workflow/components/WorkflowRunWidget';
@@ -61,6 +62,9 @@ export const WidgetContentRenderer = ({
case WidgetType.WORKFLOW_RUN:
return <WorkflowRunWidget />;
case WidgetType.STANDALONE_RICH_TEXT:
return <StandaloneRichTextWidget widget={widget} />;
default:
return null;
}
@@ -21,6 +21,7 @@ import { useSetRecoilComponentFamilyState } from '@/ui/utilities/state/component
import { useTheme } from '@emotion/react';
import { type MouseEvent } from 'react';
import { IconLock } from 'twenty-ui/display';
import { WidgetType } from '~/generated/graphql';
type WidgetRendererProps = {
widget: PageLayoutWidget;
@@ -60,7 +61,13 @@ export const WidgetRenderer = ({ widget }: WidgetRendererProps) => {
const { currentPageLayout } = useCurrentPageLayoutOrThrow();
const showHeader = layoutMode !== 'canvas' && !isInPinnedTab;
// TODO: when we have more widgets without headers, we should use a more generic approach to hide the header
// each widget type could have metadata (e.g., hasHeader: boolean or headerMode: 'always' | 'editOnly' | 'never')
const isRichTextWidget = widget.type === WidgetType.STANDALONE_RICH_TEXT;
const hideRichTextHeader = isRichTextWidget && !isPageLayoutInEditMode;
const showHeader =
layoutMode !== 'canvas' && !isInPinnedTab && !hideRichTextHeader;
const handleClick = () => {
handleEditWidget({
@@ -95,6 +102,7 @@ export const WidgetRenderer = ({ widget }: WidgetRendererProps) => {
return (
<WidgetCard
headerLess={!showHeader}
variant={variant}
isEditable={isPageLayoutInEditMode}
onClick={isPageLayoutInEditMode ? handleClick : undefined}