diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderConfigPane.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderConfigPane.tsx index 2e9f39cfec6..033bc021c76 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderConfigPane.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderConfigPane.tsx @@ -4,7 +4,7 @@ import { Flex, Text } from '@nvidia/foundations-react-core'; import { ColumnConfigPanel } from '@studio/components/ColumnConfigPanel'; import { ModelConfigPanel } from '@studio/components/ModelConfigPanel'; -import type { FC } from 'react'; +import { type FC, memo } from 'react'; export interface BuilderConfigPaneProps { selectedColumnId: string | null; @@ -16,7 +16,7 @@ export interface BuilderConfigPaneProps { onModelClose: () => void; } -export const BuilderConfigPane: FC = ({ +export const BuilderConfigPane: FC = memo(function BuilderConfigPane({ selectedColumnId, selectedModelId, workspace, @@ -24,27 +24,29 @@ export const BuilderConfigPane: FC = ({ onColumnClose, onModelRemove, onModelClose, -}) => ( -
- {selectedColumnId ? ( - - ) : selectedModelId ? ( - - ) : ( - - - Select a column or model to configure it, or add one from the left. - - - )} -
-); +}) { + return ( +
+ {selectedColumnId ? ( + + ) : selectedModelId ? ( + + ) : ( + + + Select a column or model to configure it, or add one from the left. + + + )} +
+ ); +}); diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderDetailsPanel.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderDetailsPanel.tsx index 6b196e98275..c351478eaf3 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderDetailsPanel.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderDetailsPanel.tsx @@ -5,7 +5,7 @@ import { useStickToBottom } from '@nemo/common/src/hooks/useStickToBottom'; import { Banner, Button, CodeSnippet, Flex, Stack } from '@nvidia/foundations-react-core'; import { formatPreviewLogsForDisplay } from '@studio/components/NewDataDesignerJobForm/previewApi'; import { ChevronDown, ChevronRight } from 'lucide-react'; -import type { FC } from 'react'; +import { type FC, memo } from 'react'; export interface BuilderDetailsPanelProps { validationErrors: string[]; @@ -14,13 +14,13 @@ export interface BuilderDetailsPanelProps { isOpen: boolean; onToggle: () => void; } -export const BuilderDetailsPanel: FC = ({ +export const BuilderDetailsPanel: FC = memo(function BuilderDetailsPanel({ validationErrors, submitError, previewLogs, isOpen, onToggle, -}) => { +}) { const { ref: logsScrollRef } = useStickToBottom({ enabled: isOpen && !!previewLogs, }); @@ -80,4 +80,4 @@ export const BuilderDetailsPanel: FC = ({ )} ); -}; +}); diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderPalette.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderPalette.tsx index f6b2ecda494..4925b8f56d9 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderPalette.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderPalette.tsx @@ -10,7 +10,7 @@ import type { JobBuilderFormValues, PaletteTab, } from '@studio/routes/DataDesignerJobBuildRoute/useJobBuilder'; -import type { FC } from 'react'; +import { type FC, memo } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; export interface BuilderPaletteProps { @@ -24,7 +24,7 @@ export interface BuilderPaletteProps { } // Tabs only swap what you're adding — column and model configs both open in the right pane. -export const BuilderPalette: FC = ({ +export const BuilderPalette: FC = memo(function BuilderPalette({ tab, onTabChange, selectedModelId, @@ -32,7 +32,7 @@ export const BuilderPalette: FC = ({ onAddColumn, onAddModel, onSelectModel, -}) => { +}) { const { control, getValues } = useFormContext(); const models = useWatch({ control, name: 'models' }); const hasSeedColumn = getValues('columns').some( @@ -69,4 +69,4 @@ export const BuilderPalette: FC = ({ ); -}; +}); diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderToolbar.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderToolbar.tsx index 0e49fcd9d26..9da454a99f7 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderToolbar.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/BuilderToolbar.tsx @@ -7,7 +7,7 @@ import { Button, Flex, SegmentedControl, Tag, Text } from '@nvidia/foundations-r import type { StartOptionTag } from '@studio/components/CreateFilesetStart/types'; import type { JobBuilderFormValues } from '@studio/routes/DataDesignerJobBuildRoute/useJobBuilder'; import { FileJson, ListTree, Pencil, SplinePointer } from 'lucide-react'; -import { type FC, useState } from 'react'; +import { type FC, memo, useState } from 'react'; import { useFormContext, useWatch } from 'react-hook-form'; /** Which renderer the center pane shows: the flat schema list or the DAG canvas. */ @@ -26,7 +26,7 @@ export interface BuilderToolbarProps { isSubmitting: boolean; } -export const BuilderToolbar: FC = ({ +export const BuilderToolbar: FC = memo(function BuilderToolbar({ templateTag, columnCount, viewMode, @@ -35,7 +35,7 @@ export const BuilderToolbar: FC = ({ isPreviewing, onSubmit, isSubmitting, -}) => { +}) { const [isEditingName, setIsEditingName] = useState(false); const { control } = useFormContext(); const name = useWatch({ control, name: 'name' }) ?? ''; @@ -126,4 +126,4 @@ export const BuilderToolbar: FC = ({ ); -}; +}); diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaList.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaList.tsx index 36e1fa398d8..39ac9661b50 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaList.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaList.tsx @@ -13,7 +13,7 @@ import { useFormContext, useWatch } from 'react-hook-form'; export interface SchemaListProps { selectedId: string | null; - onSelect: (id: string | null) => void; + onSelect: (id: string) => void; onDelete: (id: string) => void; } @@ -63,8 +63,8 @@ export const SchemaList: FC = ({ selectedId, onSelect, onDelete column={column} references={referencesById.get(column.id) ?? []} selected={column.id === selectedId} - onSelect={() => onSelect(column.id)} - onDelete={() => onDelete(column.id)} + onSelect={onSelect} + onDelete={onDelete} /> ))} diff --git a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaRow.tsx b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaRow.tsx index 91b9ba32b64..5337bf89450 100644 --- a/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaRow.tsx +++ b/web/packages/studio/src/routes/DataDesignerJobBuildRoute/SchemaRow.tsx @@ -6,7 +6,7 @@ import { CardIconBadge } from '@studio/components/common/SelectableCard'; import type { BuilderColumn } from '@studio/routes/DataDesignerJobBuildRoute/columns'; import { describeColumn } from '@studio/routes/DataDesignerJobBuildRoute/describeColumn'; import { Box, Trash2 } from 'lucide-react'; -import type { FC } from 'react'; +import { type FC, memo } from 'react'; /** Accent color → NVIDIA Foundations text token, matching the DAG node icon styling. */ const ACCENT_ICON_CLASS: Record = { @@ -24,8 +24,8 @@ export interface SchemaRowProps { /** Names of columns this one references, shown inline as `{{ name }}` relationship tags. */ references: string[]; selected: boolean; - onSelect: () => void; - onDelete: () => void; + onSelect: (id: string) => void; + onDelete: (id: string) => void; } /** @@ -33,13 +33,13 @@ export interface SchemaRowProps { * the column name, a type badge, a one-line summary, and its relationship tags. Selecting the * row opens the same config pane the DAG canvas uses; the trailing button deletes the column. */ -export const SchemaRow: FC = ({ +export const SchemaRow: FC = memo(function SchemaRow({ column, references, selected, onSelect, onDelete, -}) => { +}) { const { option } = column; const { typeLabel, detail } = describeColumn(column); const Icon = option.icon ?? Box; @@ -54,7 +54,7 @@ export const SchemaRow: FC = ({