diff --git a/apps/client/src/features/base/components/base-view.tsx b/apps/client/src/features/base/components/base-view.tsx index 69d5f774e..9e1773a2d 100644 --- a/apps/client/src/features/base/components/base-view.tsx +++ b/apps/client/src/features/base/components/base-view.tsx @@ -267,6 +267,13 @@ export function BaseView({ pageId, embedded }: BaseViewProps) { updateViewMutation, ]); + const handleCardClick = useCallback((rowId: string) => { + // Phase 5 wires this to the URL-driven row detail modal. + // Until then, noop — the click still registers and the focus ring + // appears, but nothing opens. + void rowId; + }, []); + const handleRowReorder = useCallback( (rowId: string, targetRowId: string, dropPosition: "above" | "below") => { const remainingRows = rows.filter((r) => r.id !== rowId); @@ -358,6 +365,7 @@ export function BaseView({ pageId, embedded }: BaseViewProps) { onColumnReorder={handleColumnReorder} onResizeEnd={handleResizeEnd} onRowReorder={handleRowReorder} + onCardClick={handleCardClick} persistViewConfig={persistViewConfig} scrollportRef={scrollportRef} stickyBandPrelude={ @@ -395,6 +403,7 @@ export function BaseView({ pageId, embedded }: BaseViewProps) { onColumnReorder={handleColumnReorder} onResizeEnd={handleResizeEnd} onRowReorder={handleRowReorder} + onCardClick={handleCardClick} persistViewConfig={persistViewConfig} scrollportRef={scrollportRef} /> diff --git a/apps/client/src/features/base/components/views/view-renderer.tsx b/apps/client/src/features/base/components/views/view-renderer.tsx index f2a164f54..47e1dab21 100644 --- a/apps/client/src/features/base/components/views/view-renderer.tsx +++ b/apps/client/src/features/base/components/views/view-renderer.tsx @@ -5,6 +5,7 @@ import { IBaseView, } from "@/features/base/types/base.types"; import { BaseTable } from "@/features/base/components/base-table"; +import { BaseKanban } from "@/features/base/components/views/kanban/base-kanban"; type ViewRendererProps = { base: IBase; @@ -25,6 +26,7 @@ type ViewRendererProps = { targetRowId: string, dropPosition: "above" | "below", ) => void; + onCardClick: (rowId: string) => void; persistViewConfig: () => void; scrollportRef: React.RefObject; stickyBandPrelude?: React.ReactNode; @@ -33,11 +35,16 @@ type ViewRendererProps = { export function ViewRenderer(props: ViewRendererProps) { const viewType = props.effectiveView?.type ?? "table"; - if (viewType === "table") { - return ; + if (viewType === "kanban") { + return ( + + ); } - // Kanban added in a later task; until then, fall back to the table so - // selecting a kanban view never produces a blank page. return ; }