@datarecce/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../recce-source/js/src/components/ui/color-mode.tsx","../recce-source/js/src/components/ui/theme.ts","../recce-source/js/src/components/ui/provider.tsx","../recce-source/js/src/components/ui/toaster.tsx","../recce-source/js/src/components/ui/tooltip.tsx","../recce-source/js/src/components/lineage/graph.ts","../recce-source/js/src/components/lineage/lineage.ts","../recce-source/js/src/lib/const.ts","../recce-source/js/src/lib/api/axiosClient.ts","../recce-source/js/src/lib/api/cll.ts","../recce-source/js/src/lib/api/lineagecheck.ts","../recce-source/js/src/lib/api/schemacheck.ts","../recce-source/js/src/lib/api/select.ts","../recce-source/js/src/lib/api/track.ts","../recce-source/js/src/lib/api/types.ts","../recce-source/js/src/constants/urls.ts","../recce-source/js/src/lib/api/cacheKeys.ts","../recce-source/js/src/lib/api/instanceInfo.ts","../recce-source/js/src/lib/hooks/RecceInstanceContext.tsx","../recce-source/js/src/lib/api/flag.ts","../recce-source/js/src/lib/api/info.ts","../recce-source/js/src/lib/api/runs.ts","../recce-source/js/src/lib/hooks/IdleTimeoutContext.tsx","../recce-source/js/src/lib/hooks/useRecceServerFlag.tsx","../recce-source/js/src/lib/hooks/LineageGraphContext.tsx","../recce-source/js/src/components/icons/index.tsx","../recce-source/js/src/components/run/RunModal.tsx","../recce-source/js/src/lib/hooks/useModelColumns.tsx","../recce-source/js/src/components/histogram/HistogramDiffForm.tsx","../recce-source/js/src/utils/formatters.tsx","../recce-source/js/src/components/charts/SquareIcon.tsx","../recce-source/js/src/components/charts/HistogramChart.tsx","../recce-source/js/src/components/screenshot/ScreenshotBox.tsx","../recce-source/js/src/components/histogram/HistogramDiffResultView.tsx","../recce-source/js/src/components/profile/ProfileDiffForm.tsx","../recce-source/js/src/utils/transforms.ts","../recce-source/js/src/lib/dataGrid/shared/columnBuilders.ts","../recce-source/js/src/components/valuediff/shared.ts","../recce-source/js/src/components/ui/dataGrid/DataFrameColumnGroupHeader.tsx","../recce-source/js/src/components/ui/dataGrid/DataFrameColumnHeader.tsx","../recce-source/js/src/lib/mergeKeys.ts","../recce-source/js/src/lib/dataGrid/shared/gridUtils.ts","../recce-source/js/src/components/ui/dataGrid/defaultRenderCell.tsx","../recce-source/js/src/components/query/DiffText.tsx","../recce-source/js/src/components/ui/dataGrid/inlineRenderCell.tsx","../recce-source/js/src/lib/dataGrid/shared/toDiffColumn.tsx","../recce-source/js/src/lib/dataGrid/shared/diffColumnBuilder.tsx","../recce-source/js/src/lib/dataGrid/shared/rowBuilders.ts","../recce-source/js/src/lib/dataGrid/shared/simpleColumnBuilder.tsx","../recce-source/js/src/lib/dataGrid/shared/validation.ts","../recce-source/js/src/lib/dataGrid/generators/toDataDiffGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toDataGrid.ts","../recce-source/js/src/components/rowcount/delta.ts","../recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts","../recce-source/js/src/lib/dataGrid/generators/toRowCountDataGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toRowCountDiffDataGrid.ts","../recce-source/js/src/components/lineage/LineageViewContext.tsx","../recce-source/js/src/components/schema/ColumnNameCell.tsx","../recce-source/js/src/components/ui/dataGrid/schemaCells.tsx","../recce-source/js/src/lib/dataGrid/generators/toSchemaDataGrid.ts","../recce-source/js/src/components/ui/dataGrid/valueDiffCells.tsx","../recce-source/js/src/lib/dataGrid/generators/toValueDataGrid.ts","../recce-source/js/src/lib/dataGrid/generators/toValueDiffGrid.ts","../recce-source/js/src/lib/dataGrid/dataGridFactory.ts","../recce-source/js/src/components/data-grid/ScreenshotDataGrid.tsx","../recce-source/js/src/components/query/ToggleSwitch.tsx","../recce-source/js/src/components/run/RunToolbar.tsx","../recce-source/js/src/components/profile/ProfileDiffResultView.tsx","../recce-source/js/src/components/query/ChangedOnlyCheckbox.tsx","../recce-source/js/src/components/query/QueryDiffResultView.tsx","../recce-source/js/src/components/query/QueryResultView.tsx","../recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx","../recce-source/js/src/components/top-k/TopKDiffForm.tsx","../recce-source/js/src/components/charts/TopKSummaryList.tsx","../recce-source/js/src/components/top-k/TopKDiffResultView.tsx","../recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx","../recce-source/js/src/components/valuediff/ValueDiffForm.tsx","../recce-source/js/src/components/valuediff/ValueDiffResultView.tsx","../recce-source/js/src/components/run/registry.ts","../recce-source/js/src/lib/hooks/useAppRouter.ts","../recce-source/js/src/lib/hooks/RecceActionContext.tsx","../recce-source/js/src/lib/hooks/useClipBoardToast.tsx","../recce-source/js/src/lib/hooks/ScreenShot.tsx","../recce-source/js/src/lib/hooks/useRun.tsx","../recce-source/js/src/components/split/Split.tsx","../recce-source/js/src/components/lineage/ActionControl.tsx","../recce-source/js/src/components/lineage/styles.tsx","../recce-source/js/src/components/lineage/ChangeStatusLegend.tsx","../recce-source/js/src/components/lineage/ColumnLevelLineageControl.tsx","../recce-source/js/src/components/lineage/GraphColumnNode.tsx","../recce-source/js/src/components/lineage/ColumnLevelLineageLegend.tsx","../recce-source/js/src/components/lineage/GraphEdge.tsx","../recce-source/js/src/components/schema/schemaDiff.ts","../recce-source/js/src/components/app/SetupConnectionPopover.tsx","../recce-source/js/src/components/lineage/NodeTag.tsx","../recce-source/js/src/components/lineage/ActionTag.tsx","../recce-source/js/src/components/lineage/GraphNode.tsx","../recce-source/js/src/lib/formatSelect.ts","../recce-source/js/src/lib/hooks/RecceQueryContext.tsx","../recce-source/js/src/components/lineage/LineageViewContextMenu.tsx","../recce-source/js/src/lib/api/sessionStorageKeys.ts","../recce-source/js/src/components/lineage/LineageViewNotification.tsx","../recce-source/js/src/components/shared/HistoryToggle.tsx","../recce-source/js/src/components/lineage/LineageViewTopBar.tsx","../recce-source/js/src/constants/tooltipMessage.ts","../recce-source/js/src/components/onboarding-guide/Notification.tsx","../recce-source/js/src/components/schema/SchemaView.tsx","../recce-source/js/src/components/app/EnvInfo.tsx","../recce-source/js/src/components/query/SqlEditor.tsx","../recce-source/js/src/components/lineage/NodeSqlView.tsx","../recce-source/js/src/lib/api/adhocQuery.ts","../recce-source/js/src/lib/api/localStorageKeys.ts","../recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx","../recce-source/js/src/lib/hooks/useGuideToast.tsx","../recce-source/js/src/utils/DropdownValuesInput.tsx","../recce-source/js/src/components/query/QueryForm.tsx","../recce-source/js/src/lib/api/connectToCloud.ts","../recce-source/js/src/components/AuthModal/AuthModal.tsx","../recce-source/js/src/lib/api/checks.ts","../recce-source/js/src/lib/hooks/RecceShareStateContext.tsx","../recce-source/js/src/components/run/RunStatusAndDate.tsx","../recce-source/js/src/components/errorboundary/ErrorBoundary.tsx","../recce-source/js/src/lib/result/ResultErrorFallback.tsx","../recce-source/js/src/components/run/RunView.tsx","../recce-source/js/src/components/run/RunResultPane.tsx","../recce-source/js/src/components/lineage/SandboxView.tsx","../recce-source/js/src/components/lineage/NodeView.tsx","../recce-source/js/src/lib/utils/urls.ts","../recce-source/js/src/components/lineage/SetupConnectionBanner.tsx","../recce-source/js/src/components/lineage/SingleEnvironmentQueryView.tsx","../recce-source/js/src/components/lineage/useMultiNodesAction.ts","../recce-source/js/src/components/lineage/useValueDiffAlertDialog.tsx","../recce-source/js/src/components/lineage/LineageView.tsx","../recce-source/js/src/components/lineage/LineagePage.tsx","../recce-source/js/src/components/query/SetupConnectionGuide.tsx","../recce-source/js/src/components/query/QueryPage.tsx","../recce-source/js/src/components/check/utils.ts","../recce-source/js/src/lib/hooks/useCheckToast.tsx","../recce-source/js/src/components/check/CheckList.tsx","../recce-source/js/src/lib/api/user.ts","../recce-source/js/src/lib/api/checkEvents.ts","../recce-source/js/src/lib/hooks/useCheckEvents.ts","../recce-source/js/src/components/check/timeline/CommentInput.tsx","../recce-source/js/src/components/ui/markdown/ExternalLinkConfirmDialog.tsx","../recce-source/js/src/components/ui/markdown/MarkdownContent.tsx","../recce-source/js/src/components/check/timeline/TimelineEvent.tsx","../recce-source/js/src/components/check/timeline/CheckTimeline.tsx","../recce-source/js/src/lib/hooks/RecceCheckContext.tsx","../recce-source/js/src/components/check/CheckBreadcrumb.tsx","../recce-source/js/src/components/check/CheckDescription.tsx","../recce-source/js/src/components/check/check.ts","../recce-source/js/src/components/check/LineageDiffView.tsx","../recce-source/js/src/components/check/PresetCheckTemplateView.tsx","../recce-source/js/src/components/check/SchemaDiffView.tsx","../recce-source/js/src/components/check/CheckDetail.tsx","../recce-source/js/src/components/run/RunPage.tsx","../recce-source/js/src/components/run/RunList.tsx","../recce-source/js/src/components/summary/ChangeSummary.tsx","../recce-source/js/src/components/summary/SchemaSummary.tsx","../recce-source/js/src/components/summary/SummaryView.tsx"],"names":["ThemeProvider","useTheme","jsx","LuMoon","LuSun","React","ColorModeButton","ClientOnly","Skeleton","IconButton","LightMode","Span","DarkMode","createSystem","defaultConfig","ChakraProvider","createToaster","Portal","ChakraToaster","Toast","Spinner","Stack","React2","Tooltip","jsxs","ChakraTooltip","maybeCurrent","parentMap","Position","dagre","axios","QueryClient","trk","createContext","useContext","useQuery","useState","useRef","Dialog","Popover","Icon","Link","CloseButton","Box","Flex","Button","union","_","useMemo","useCallback","error","useEffect","Field","NativeSelect","ChartJS","BarElement","TimeSeriesScale","LinearScale","CategoryScale","Title","Legend","Chart","prefix","forwardRef","HStack","Spacer","VStack","Input","Checkbox","Select","Fragment","VscKey","VscClose","VscPinned","VscPin","Menu","VscKebabVertical","PiDotsThreeVertical","Text","useCopyToClipboard","PiCopy","renderTextEditor","createIndexColumn","createPrimaryKeyColumn","isPrimaryKey","Center","createColumnNameRenderer","DataGrid","ButtonGroup","PiWarning","pinnedColumns","displayMode","primaryKeys","changedOnly","Separator","Bar","Heading","TbBrandStackshare","MdSchema","TbSql","MdFormatListNumberedRtl","TbEyeSearch","TbAlignBoxLeftStretch","LuChartBarBig","TbChartHistogram","TbEyeEdit","useRouter","usePathname","html2canvas","toCanvas","useDisclosure","format","saveAs","PiInfo","Image","ReactSplit","StackSeparator","VscDiffAdded","VscDiffRemoved","VscDiffModified","FaCube","FaChartSimple","FaDatabase","FaGauge","FaCircleNodes","FaSeedling","FaCamera","Code","FaRegDotCircle","PiX","Tag","useStore","Handle","getBezierPath","BaseEdge","FiArrowRight","RiSwapLine","RiArrowUpSFill","RiArrowDownSFill","FiFrown","SkeletonText","PiRepeat","ProgressCircle","FaCheckSquare","FaRegSquare","query","columns","BiArrowFromBottom","BiArrowToBottom","isHistogramDiffRun","isTopKDiffRun","isValueDiffRun","node","VscHistory","viewMode","PiCaretDown","FiPackage","FiInfo","LuExternalLink","Alert","parseISO","formatDistance","value","editor","FaPlay","Editor","DiffEditor","FaExpandArrowsAlt","InputGroup","Wrap","WrapItem","Cookies","SentryErrorBoundary","YAML","TbCloudUpload","Tabs","useQueryClient","PiCheck","AiOutlineExperiment","formatDistanceToNow","useMutation","Badge","VscFeedback","Grid","RiTerminalBoxLine","List","RiMindMap","nodes","nodeCount","useReactFlow","useNodesState","useEdgesState","useImperativeHandle","useLayoutEffect","filteredNodeIds","cll","AxiosError","edges","nodeColumnSetMap","selectedNodes","ReactFlow","getNodesBounds","Background","Controls","ControlButton","FiCopy","Panel","MiniMap","ReactFlowProvider","PiInfoFill","Switch","type","check","DragDropContext","Droppable","Draggable","provided","Textarea","SyntaxHighlighter","oneDark","Markdown","remarkGfm","PiPlusCircle","PiChatText","PiCheckCircle","PiCircle","PiNotePencil","PiBookmarkSimple","Avatar","Activity","PiPencilSimple","PiTrashSimple","createComment","updateComment","deleteComment","Breadcrumb","stripIndent","changedNodes","GridItem","CiBookmark","IoBookmarksOutline","IoMdCodeWorking","MenuSeparator","PiTrashFill","VscCircleLarge","Highlight","stripIndents","FaCheckCircle","FaRegCheckCircle","SimpleBar","runId","getIconForChangeStatus","Card","isSchemaChanged","SimpleGrid"],"mappings":"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","file":"components.js","sourcesContent":["\"use client\";\n\nimport type { IconButtonProps, SpanProps } from \"@chakra-ui/react\";\nimport { ClientOnly, IconButton, Skeleton, Span } from \"@chakra-ui/react\";\nimport type { ThemeProviderProps } from \"next-themes\";\nimport { ThemeProvider, useTheme } from \"next-themes\";\nimport * as React from \"react\";\nimport { LuMoon, LuSun } from \"react-icons/lu\";\n\nexport type ColorModeProviderProps = ThemeProviderProps;\n\nexport function ColorModeProvider(props: ColorModeProviderProps) {\n return (\n <ThemeProvider attribute=\"class\" disableTransitionOnChange {...props} />\n );\n}\n\nexport type ColorMode = \"light\" | \"dark\";\n\nexport interface UseColorModeReturn {\n colorMode: ColorMode;\n setColorMode: (colorMode: ColorMode) => void;\n toggleColorMode: () => void;\n}\n\nexport function useColorMode(): UseColorModeReturn {\n const { resolvedTheme, setTheme, forcedTheme } = useTheme();\n const colorMode = forcedTheme ?? resolvedTheme;\n const toggleColorMode = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n return {\n colorMode: colorMode as ColorMode,\n setColorMode: setTheme,\n toggleColorMode,\n };\n}\n\nexport function useColorModeValue<T>(light: T, dark: T) {\n const { colorMode } = useColorMode();\n return colorMode === \"dark\" ? dark : light;\n}\n\nexport function ColorModeIcon() {\n const { colorMode } = useColorMode();\n return colorMode === \"dark\" ? <LuMoon /> : <LuSun />;\n}\n\ntype ColorModeButtonProps = Omit<IconButtonProps, \"aria-label\">;\n\nexport const ColorModeButton = React.forwardRef<\n HTMLButtonElement,\n ColorModeButtonProps\n>(function ColorModeButton(props, ref) {\n const { toggleColorMode } = useColorMode();\n return (\n <ClientOnly fallback={<Skeleton boxSize=\"8\" />}>\n <IconButton\n onClick={toggleColorMode}\n variant=\"ghost\"\n aria-label=\"Toggle color mode\"\n size=\"sm\"\n ref={ref}\n {...props}\n css={{\n _icon: {\n width: \"5\",\n height: \"5\",\n },\n }}\n >\n <ColorModeIcon />\n </IconButton>\n </ClientOnly>\n );\n});\n\nexport const LightMode = React.forwardRef<HTMLSpanElement, SpanProps>(\n function LightMode(props, ref) {\n return (\n <Span\n color=\"fg\"\n display=\"contents\"\n className=\"chakra-theme light\"\n colorPalette=\"gray\"\n colorScheme=\"light\"\n ref={ref}\n {...props}\n />\n );\n },\n);\n\nexport const DarkMode = React.forwardRef<HTMLSpanElement, SpanProps>(\n function DarkMode(props, ref) {\n return (\n <Span\n color=\"fg\"\n display=\"contents\"\n className=\"chakra-theme dark\"\n colorPalette=\"gray\"\n colorScheme=\"dark\"\n ref={ref}\n {...props}\n />\n );\n },\n);\n","import { createSystem, defaultConfig } from \"@chakra-ui/react\";\n\nexport const system = createSystem(defaultConfig, {\n preflight: {\n scope: \".chakra-style-reset\",\n },\n theme: {\n tokens: {\n colors: {\n iochmara: {\n 50: { value: \"#EAF3FB\" },\n 100: { value: \"#C4DDF3\" },\n 200: { value: \"#9EC6EB\" },\n 300: { value: \"#79B0E2\" },\n 400: { value: \"#5599D8\" },\n DEFAULT: { value: \"#3182CE\" },\n 500: { value: \"#3182CE\" },\n 600: { value: \"#2A6CA7\" },\n 700: { value: \"#225581\" },\n 800: { value: \"#193E5C\" },\n 900: { value: \"#102638\" },\n 950: { value: \"#060E14\" },\n },\n cyan: {\n 50: { value: \"#ECFEFF\" },\n 100: { value: \"#CFFAFE\" },\n 200: { value: \"#A5F3FC\" },\n 300: { value: \"#67E8F9\" },\n 400: { value: \"#22D3EE\" },\n DEFAULT: { value: \"#06B6D4\" },\n 500: { value: \"#06B6D4\" },\n 600: { value: \"#0891B2\" },\n 700: { value: \"#0E7490\" },\n 800: { value: \"#155E75\" },\n 900: { value: \"#164E63\" },\n 950: { value: \"#083344\" },\n },\n neutral: {\n 50: { value: \"#FAFAFA\" },\n 100: { value: \"#F5F5F5\" },\n 200: { value: \"#E5E5E5\" },\n 300: { value: \"#D4D4D4\" },\n 400: { value: \"#A3A3A3\" },\n DEFAULT: { value: \"#737373\" },\n 500: { value: \"#737373\" },\n 600: { value: \"#525252\" },\n 700: { value: \"#404040\" },\n 800: { value: \"#262626\" },\n 900: { value: \"#171717\" },\n 950: { value: \"#0A0A0A\" },\n },\n amber: {\n 50: { value: \"#FFFBEB\" },\n 100: { value: \"#FEF3C7\" },\n 200: { value: \"#FDE68A\" },\n 300: { value: \"#FCD34D\" },\n 400: { value: \"#FBBF24\" },\n DEFAULT: { value: \"#F59E0B\" },\n 500: { value: \"#F59E0B\" },\n 600: { value: \"#D97706\" },\n 700: { value: \"#B45309\" },\n 800: { value: \"#92400E\" },\n 900: { value: \"#78350F\" },\n 950: { value: \"#431407\" },\n },\n green: {\n 50: { value: \"#F0FDF4\" },\n 100: { value: \"#DCFCE7\" },\n 200: { value: \"#BBF7D0\" },\n 300: { value: \"#86EFAC\" },\n 400: { value: \"#4ADE80\" },\n DEFAULT: { value: \"#22C55E\" },\n 500: { value: \"#22C55E\" },\n 600: { value: \"#16A34A\" },\n 700: { value: \"#15803D\" },\n 800: { value: \"#166534\" },\n 900: { value: \"#14532D\" },\n 950: { value: \"#052E16\" },\n },\n red: {\n 50: { value: \"#FEF2F2\" },\n 100: { value: \"#FEE2E2\" },\n 200: { value: \"#FECACA\" },\n 300: { value: \"#FCA5A5\" },\n 400: { value: \"#F87171\" },\n DEFAULT: { value: \"#EF4444\" },\n 500: { value: \"#EF4444\" },\n 600: { value: \"#DC2626\" },\n 700: { value: \"#B91C1C\" },\n 800: { value: \"#991B1B\" },\n 900: { value: \"#7F1D1D\" },\n 950: { value: \"#450A0A\" },\n },\n rose: {\n 50: { value: \"#FFF1F2\" },\n 100: { value: \"#FFE4E6\" },\n 200: { value: \"#FECDD3\" },\n 300: { value: \"#FDA4AF\" },\n 400: { value: \"#FB7185\" },\n DEFAULT: { value: \"#F43F5E\" },\n 500: { value: \"#F43F5E\" },\n 600: { value: \"#E11D48\" },\n 700: { value: \"#BE123C\" },\n 800: { value: \"#9F1239\" },\n 900: { value: \"#881337\" },\n 950: { value: \"#4C0519\" },\n },\n brand: {\n 50: { value: \"#FFDED5\" },\n 100: { value: \"#FFC1B0\" },\n 200: { value: \"#FFA58C\" },\n 300: { value: \"#FF8967\" },\n 400: { value: \"#FF6E42\" },\n DEFAULT: { value: \"#FD541E\" },\n 500: { value: \"#FD541E\" },\n 600: { value: \"#F04104\" },\n 700: { value: \"#C93A06\" },\n 800: { value: \"#A23206\" },\n 900: { value: \"#7C2906\" },\n 950: { value: \"#571E05\" },\n },\n },\n },\n semanticTokens: {\n colors: {\n iochmara: {\n solid: { value: \"{colors.iochmara.500}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.iochmara.700}\" },\n subtle: { value: \"{colors.iochmara.100}\" },\n muted: { value: \"{colors.iochmara.200}\" },\n emphasized: { value: \"{colors.iochmara.300}\" },\n focusRing: { value: \"{colors.iochmara.400}\" },\n },\n cyan: {\n solid: { value: \"{colors.cyan.600}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.cyan.700}\" },\n subtle: { value: \"{colors.cyan.100}\" },\n muted: { value: \"{colors.cyan.200}\" },\n emphasized: { value: \"{colors.cyan.300}\" },\n focusRing: { value: \"{colors.cyan.500}\" },\n },\n neutral: {\n solid: { value: \"{colors.neutral.900}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.neutral.800}\" },\n subtle: { value: \"{colors.neutral.100}\" },\n muted: { value: \"{colors.neutral.200}\" },\n emphasized: { value: \"{colors.neutral.300}\" },\n focusRing: { value: \"{colors.neutral.400}\" },\n },\n green: {\n solid: { value: \"{colors.green.600}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.green.700}\" },\n subtle: { value: \"{colors.green.100}\" },\n muted: { value: \"{colors.green.200}\" },\n emphasized: { value: \"{colors.green.300}\" },\n focusRing: { value: \"{colors.green.500}\" },\n },\n amber: {\n solid: { value: \"{colors.amber.500}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.amber.700}\" },\n subtle: { value: \"{colors.amber.100}\" },\n muted: { value: \"{colors.amber.200}\" },\n emphasized: { value: \"{colors.amber.300}\" },\n focusRing: { value: \"{colors.amber.400}\" },\n },\n red: {\n solid: { value: \"{colors.red.600}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.red.700}\" },\n subtle: { value: \"{colors.red.100}\" },\n muted: { value: \"{colors.red.200}\" },\n emphasized: { value: \"{colors.red.300}\" },\n focusRing: { value: \"{colors.red.500}\" },\n },\n rose: {\n solid: { value: \"{colors.rose.500}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.rose.700}\" },\n subtle: { value: \"{colors.rose.100}\" },\n muted: { value: \"{colors.rose.200}\" },\n emphasized: { value: \"{colors.rose.300}\" },\n focusRing: { value: \"{colors.rose.400}\" },\n },\n brand: {\n solid: { value: \"{colors.brand.500}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.brand.700}\" },\n subtle: { value: \"{colors.brand.100}\" },\n muted: { value: \"{colors.brand.200}\" },\n emphasized: { value: \"{colors.brand.300}\" },\n focusRing: { value: \"{colors.brand.500}\" },\n },\n blue: {\n solid: { value: \"{colors.iochmara.500}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.iochmara.700}\" },\n subtle: { value: \"{colors.iochmara.100}\" },\n muted: { value: \"{colors.iochmara.200}\" },\n emphasized: { value: \"{colors.iochmara.300}\" },\n focusRing: { value: \"{colors.iochmara.400}\" },\n },\n gray: {\n solid: { value: \"{colors.neutral.900}\" },\n contrast: { value: \"{colors.white}\" },\n fg: { value: \"{colors.neutral.800}\" },\n subtle: { value: \"{colors.neutral.100}\" },\n muted: { value: \"{colors.neutral.200}\" },\n emphasized: { value: \"{colors.neutral.300}\" },\n focusRing: { value: \"{colors.neutral.400}\" },\n },\n success: { value: \"{colors.green}\" },\n warning: { value: \"{colors.amber}\" },\n danger: { value: \"{colors.red}\" },\n envBase: { value: \"{colors.amber.500}\" },\n envCurrent: { value: \"{colors.iochmara.500}\" },\n },\n },\n },\n});\n","\"use client\";\n\nimport { ChakraProvider } from \"@chakra-ui/react\";\nimport {\n ColorModeProvider,\n type ColorModeProviderProps,\n} from \"@/components/ui/color-mode\";\nimport { system } from \"@/components/ui/theme\";\n\nexport function Provider(props: ColorModeProviderProps) {\n return (\n <ChakraProvider value={system}>\n <ColorModeProvider {...props} />\n </ChakraProvider>\n );\n}\n","\"use client\";\n\nimport type { CreateToasterReturn } from \"@chakra-ui/react\";\nimport {\n Toaster as ChakraToaster,\n createToaster,\n Portal,\n Spinner,\n Stack,\n Toast,\n} from \"@chakra-ui/react\";\n\nexport const toaster: CreateToasterReturn = createToaster({\n placement: \"bottom-end\",\n pauseOnPageIdle: true,\n});\n\nexport const Toaster = () => {\n return (\n <Portal>\n <ChakraToaster toaster={toaster} insetInline={{ mdDown: \"4\" }}>\n {(toast) => (\n <Toast.Root width={{ md: \"sm\" }}>\n {toast.type === \"loading\" ? (\n <Spinner size=\"sm\" color=\"blue.solid\" />\n ) : (\n <Toast.Indicator />\n )}\n <Stack gap=\"1\" flex=\"1\" maxWidth=\"100%\">\n {toast.title && <Toast.Title>{toast.title}</Toast.Title>}\n {toast.description && (\n <Toast.Description>{toast.description}</Toast.Description>\n )}\n </Stack>\n {toast.action && (\n <Toast.ActionTrigger>{toast.action.label}</Toast.ActionTrigger>\n )}\n {toast.closable && <Toast.CloseTrigger />}\n </Toast.Root>\n )}\n </ChakraToaster>\n </Portal>\n );\n};\n","import { Tooltip as ChakraTooltip, Portal } from \"@chakra-ui/react\";\nimport * as React from \"react\";\n\nexport interface TooltipProps extends ChakraTooltip.RootProps {\n showArrow?: boolean;\n portalled?: boolean;\n portalRef?: React.RefObject<HTMLElement | null>;\n content: React.ReactNode;\n contentProps?: ChakraTooltip.ContentProps;\n disabled?: boolean;\n}\n\nexport const Tooltip = React.forwardRef<HTMLDivElement, TooltipProps>(\n function Tooltip(props, ref) {\n const {\n showArrow,\n children,\n disabled,\n portalled = true,\n content,\n contentProps,\n portalRef,\n ...rest\n } = props;\n\n if (disabled) return children;\n\n return (\n <ChakraTooltip.Root {...rest}>\n <ChakraTooltip.Trigger asChild>{children}</ChakraTooltip.Trigger>\n <Portal disabled={!portalled} container={portalRef}>\n <ChakraTooltip.Positioner>\n <ChakraTooltip.Content ref={ref} {...contentProps}>\n {showArrow && (\n <ChakraTooltip.Arrow>\n <ChakraTooltip.ArrowTip />\n </ChakraTooltip.Arrow>\n )}\n {content}\n </ChakraTooltip.Content>\n </ChakraTooltip.Positioner>\n </Portal>\n </ChakraTooltip.Root>\n );\n },\n);\n","export function getNeighborSet(\n nodeIds: string[],\n getNeighbors: (id: string) => string[],\n degree = 1000,\n) {\n const neighborSet = new Set<string>();\n const visited: Record<string, number | undefined> = {};\n\n const dfs = (id: string, currentDegree: number) => {\n if (currentDegree < 0) {\n return;\n }\n if (visited[id] != null && visited[id] >= currentDegree) {\n return;\n }\n visited[id] = currentDegree;\n\n const neighbors = getNeighbors(id);\n\n for (const neighborId of neighbors) {\n dfs(neighborId, currentDegree - 1);\n }\n\n neighborSet.add(id);\n };\n\n for (const nodeId of nodeIds) {\n dfs(nodeId, degree);\n }\n\n return neighborSet;\n}\n\nexport function union<T>(...sets: Set<T>[]) {\n const unionSet = new Set<T>();\n\n sets.forEach((set) => {\n set.forEach((key) => {\n unionSet.add(key);\n });\n });\n\n return unionSet;\n}\n\nexport function intersect<T>(...sets: Set<T>[]) {\n if (sets.length === 0) {\n return new Set<T>();\n }\n\n let intersection = new Set<T>(sets[0]);\n\n for (const set of sets) {\n intersection = new Set([...intersection].filter((x) => set.has(x)));\n }\n\n return intersection;\n}\n","import dagre from \"@dagrejs/dagre\";\nimport { Edge, Node, Position } from \"@xyflow/react\";\nimport { ColumnLineageData } from \"@/lib/api/cll\";\nimport {\n CatalogMetadata,\n LineageData,\n LineageDataFromMetadata,\n LineageDiffData,\n ManifestMetadata,\n NodeData,\n} from \"@/lib/api/info\";\nimport { getNeighborSet } from \"./graph\";\n\nexport const COLUMN_HEIGHT = 20;\n/**\n * The types for internal data structures.\n */\n\ntype LineageFrom = \"both\" | \"base\" | \"current\";\n\nexport type LineageGraphNode = Node<\n {\n id: string;\n name: string;\n from: LineageFrom;\n data: {\n base?: NodeData;\n current?: NodeData;\n };\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n change?: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns: Record<string, \"added\" | \"removed\" | \"modified\"> | null;\n };\n resourceType?: string;\n packageName?: string;\n parents: Record<string, LineageGraphEdge>;\n children: Record<string, LineageGraphEdge>;\n },\n \"lineageGraphNode\"\n>;\n\nexport type LineageGraphColumnNode = Node<\n {\n node: LineageGraphNode[\"data\"];\n column: string;\n type: string;\n transformationType?: string;\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n },\n \"lineageGraphColumnNode\"\n>;\n\nexport type LineageGraphEdge = Edge<\n {\n from: LineageFrom;\n changeStatus?: \"added\" | \"removed\";\n },\n \"lineageGraphEdge\"\n>;\n\nexport type LineageGraphNodes = LineageGraphNode | LineageGraphColumnNode;\n\nexport interface LineageGraph {\n nodes: Record<string, LineageGraphNode>;\n\n edges: Record<string, LineageGraphEdge>;\n modifiedSet: string[];\n\n manifestMetadata: {\n base?: ManifestMetadata;\n current?: ManifestMetadata;\n };\n catalogMetadata: {\n base?: CatalogMetadata;\n current?: CatalogMetadata;\n };\n}\n\nexport function isLineageGraphNode(\n node: LineageGraphNodes,\n): node is LineageGraphNode {\n return node.type === \"lineageGraphNode\";\n}\n\nexport function isLineageGraphColumnNode(\n node: LineageGraphNodes,\n): node is LineageGraphColumnNode {\n return node.type === \"lineageGraphColumnNode\";\n}\n\nexport type NodeColumnSetMap = Record<string, Set<string>>;\n\nexport function buildLineageGraph(\n base: LineageDataFromMetadata,\n current: LineageDataFromMetadata,\n diff?: LineageDiffData,\n): LineageGraph {\n const nodes: Record<string, LineageGraphNode> = {};\n const edges: Record<string, LineageGraphEdge> = {};\n const buildNode = (\n key: string,\n from: \"base\" | \"current\",\n ): LineageGraphNode => {\n return {\n id: key,\n data: {\n id: key,\n name: key,\n from,\n data: {\n base: undefined,\n current: undefined,\n },\n parents: {},\n children: {},\n },\n type: \"lineageGraphNode\",\n // Return as LineageGraphNode for now\n } as LineageGraphNode;\n };\n\n for (const [key, nodeData] of Object.entries(base.nodes)) {\n nodes[key] = buildNode(key, \"base\");\n if (nodeData) {\n nodes[key].data.data.base = nodeData;\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n for (const [key, nodeData] of Object.entries(current.nodes)) {\n if (nodes[key] as LineageGraphNode | undefined) {\n nodes[key].data.from = \"both\";\n } else {\n nodes[key] = buildNode(key, \"current\");\n }\n if (nodeData) {\n nodes[key].data.data.current = current.nodes[key];\n nodes[key].data.name = nodeData.name;\n nodes[key].data.resourceType = nodeData.resource_type;\n nodes[key].data.packageName = nodeData.package_name;\n }\n }\n\n for (const [child, parents] of Object.entries(base.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n // Skip the edge if the node is not found\n continue;\n }\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"base\",\n },\n };\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n for (const [child, parents] of Object.entries(current.parent_map)) {\n for (const parent of parents) {\n const childNode = nodes[child] as LineageGraphNode | undefined;\n const parentNode = nodes[parent] as LineageGraphNode | undefined;\n const id = `${parent}_${child}`;\n\n if (!childNode || !parentNode) {\n // Skip the edge if the node is not found\n continue;\n }\n const existingEdge = edges[id] as LineageGraphEdge | undefined;\n if (existingEdge?.data && edges[id].data) {\n edges[id].data.from = \"both\";\n } else {\n edges[id] = {\n id,\n source: parentNode.id,\n target: childNode.id,\n data: {\n from: \"current\",\n },\n };\n }\n const edge = edges[id];\n\n childNode.data.parents[parent] = edge;\n parentNode.data.children[child] = edge;\n }\n }\n\n const modifiedSet: string[] = [];\n\n for (const [key, node] of Object.entries(nodes)) {\n const diffNode = diff?.[key];\n if (diffNode) {\n node.data.changeStatus = diffNode.change_status;\n if (diffNode.change) {\n node.data.change = {\n category: diffNode.change.category,\n columns: diffNode.change.columns,\n };\n }\n modifiedSet.push(key);\n } else if (node.data.from === \"base\") {\n node.data.changeStatus = \"removed\";\n modifiedSet.push(node.id);\n } else if (node.data.from === \"current\") {\n node.data.changeStatus = \"added\";\n modifiedSet.push(node.id);\n } else {\n const checksum1 = node.data.data.base?.checksum?.checksum;\n const checksum2 = node.data.data.current?.checksum?.checksum;\n\n if (checksum1 && checksum2 && checksum1 !== checksum2) {\n node.data.changeStatus = \"modified\";\n modifiedSet.push(node.id);\n }\n }\n }\n\n for (const [, edge] of Object.entries(edges)) {\n if (edge.data) {\n if (edge.data.from === \"base\") {\n edge.data.changeStatus = \"removed\";\n } else if (edge.data.from === \"current\") {\n edge.data.changeStatus = \"added\";\n }\n }\n }\n\n return {\n nodes,\n edges,\n modifiedSet,\n manifestMetadata: {\n base: base.manifest_metadata ?? undefined,\n current: current.manifest_metadata ?? undefined,\n },\n catalogMetadata: {\n base: base.catalog_metadata ?? undefined,\n current: current.catalog_metadata ?? undefined,\n },\n };\n}\n\nexport function selectUpstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n) {\n return getNeighborSet(\n nodeIds,\n (key) => {\n const maybeNodes = lineageGraph.nodes as unknown as Record<\n string,\n LineageGraphNode | undefined\n >;\n if (maybeNodes[key] === undefined) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.parents);\n },\n degree,\n );\n}\n\nexport function selectDownstream(\n lineageGraph: LineageGraph,\n nodeIds: string[],\n degree = 1000,\n) {\n return getNeighborSet(\n nodeIds,\n (key) => {\n if (\n (lineageGraph.nodes[key] as LineageGraphNode | undefined) === undefined\n ) {\n return [];\n }\n return Object.keys(lineageGraph.nodes[key].data.children);\n },\n degree,\n );\n}\n\nexport function toReactFlow(\n lineageGraph: LineageGraph,\n options?: {\n selectedNodes?: string[];\n cll?: ColumnLineageData;\n },\n): [LineageGraphNodes[], LineageGraphEdge[], NodeColumnSetMap] {\n const nodes: LineageGraphNodes[] = [];\n const edges: LineageGraphEdge[] = [];\n const { selectedNodes, cll } = options ?? {};\n\n const nodeColumnSetMap: NodeColumnSetMap = {};\n\n function getWeight(from?: string) {\n if (from === \"base\") {\n return 0;\n } else if (from === \"current\") {\n return 2;\n } else {\n return 1;\n }\n }\n\n function compareFn(\n a: LineageGraphNode | LineageGraphEdge,\n b: LineageGraphNode | LineageGraphEdge,\n ) {\n const weightA = getWeight(a.data?.from);\n const weightB = getWeight(b.data?.from);\n\n if (weightA < weightB) {\n return -1;\n } else if (weightA > weightB) {\n return 1;\n }\n return 0;\n }\n\n const filterSet =\n selectedNodes !== undefined ? new Set(selectedNodes) : undefined;\n const sortedNodes = Object.values(lineageGraph.nodes).sort(compareFn);\n for (const node of sortedNodes) {\n if (filterSet && !filterSet.has(node.id)) {\n continue;\n }\n\n // add column nodes\n const nodeColumnSet = new Set<string>();\n let columnIndex = 0;\n if (cll) {\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const parentMap = maybeCurrent?.parent_map[node.id] ?? new Set<string>();\n\n for (const parentKey of parentMap) {\n const source = parentKey;\n const target = node.id;\n\n edges.push({\n id: `m2c_${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n for (const columnName of Object.keys(\n node.data.data.current?.columns ?? {},\n )) {\n const columnKey = `${node.id}_${columnName}`;\n const maybeCurrent = cll.current as unknown as\n | ColumnLineageData[\"current\"]\n | undefined;\n const column = maybeCurrent?.columns[columnKey];\n const parentMap =\n maybeCurrent?.parent_map[columnKey] ?? new Set<string>();\n\n if (column == null) {\n continue;\n }\n\n nodes.push({\n id: columnKey,\n position: { x: 10, y: 70 + columnIndex * COLUMN_HEIGHT },\n parentId: node.id,\n extent: \"parent\",\n draggable: false,\n className: \"no-track-pii-safe\",\n data: {\n node: node.data,\n column: column.name,\n type: column.type,\n transformationType: column.transformation_type,\n changeStatus: column.change_status,\n },\n style: {\n zIndex: 9999,\n },\n type: \"lineageGraphColumnNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n } as LineageGraphColumnNode);\n\n for (const parentColumn of parentMap) {\n const source = parentColumn;\n const target = columnKey;\n\n edges.push({\n id: `${source}_${target}`,\n source,\n target,\n style: {\n zIndex: 9999,\n },\n });\n }\n\n columnIndex++;\n nodeColumnSet.add(column.name);\n }\n }\n\n nodeColumnSetMap[node.id] = nodeColumnSet;\n\n let height = 60;\n if (columnIndex > 0) {\n height += 20 + columnIndex * COLUMN_HEIGHT;\n }\n\n nodes.unshift({\n id: node.id,\n position: { x: 0, y: 0 },\n width: 300,\n height: height,\n className: \"no-track-pii-safe\",\n data: {\n ...node.data,\n },\n type: \"lineageGraphNode\",\n targetPosition: Position.Left,\n sourcePosition: Position.Right,\n style: {\n width: 300,\n height: height,\n },\n } as LineageGraphNode);\n }\n\n const sortedEdges = Object.values(lineageGraph.edges).sort(compareFn);\n for (const edge of sortedEdges) {\n if (\n filterSet &&\n (!filterSet.has(edge.source) || !filterSet.has(edge.target))\n ) {\n continue;\n }\n\n edges.push({\n id: edge.id,\n type: \"lineageGraphEdge\",\n source: edge.source,\n target: edge.target,\n data: {\n ...edge.data,\n },\n } as LineageGraphEdge);\n }\n\n layout(nodes, edges);\n\n return [nodes, edges, nodeColumnSetMap];\n}\n\nexport const layout = (\n nodes: LineageGraphNodes[],\n edges: LineageGraphEdge[],\n direction = \"LR\",\n) => {\n const dagreGraph = new dagre.graphlib.Graph();\n dagreGraph.setDefaultEdgeLabel(() => ({}));\n\n dagreGraph.setGraph({ rankdir: direction, ranksep: 50, nodesep: 30 });\n\n nodes.forEach((node) => {\n if (!isLineageGraphNode(node)) {\n return;\n }\n let width = 300;\n let height = 60;\n if (node.style?.height && node.style.width) {\n width = parseInt(String(node.style.width), 10);\n height = parseInt(String(node.style.height), 10);\n }\n dagreGraph.setNode(node.id, { width, height });\n });\n\n edges.forEach((edge) => {\n dagreGraph.setEdge(edge.source, edge.target);\n });\n\n dagre.layout(dagreGraph);\n\n nodes.forEach((node) => {\n if (!isLineageGraphNode(node)) {\n return;\n }\n\n const nodeWidth = node.style?.width ?? 300;\n const nodeHeight = node.style?.height ?? 60;\n\n const nodeWithPosition = dagreGraph.node(node.id);\n\n // We are shifting the dagre node position (anchor=center center) to the top left\n // so it matches the React Flow node anchor point (top left).\n node.position = {\n x: nodeWithPosition.x - Number(nodeWidth) / 2,\n y: nodeWithPosition.y - Number(nodeHeight) / 2,\n };\n\n return node;\n });\n};\n","let apiUrl = process.env.NEXT_PUBLIC_API_URL;\napiUrl ??= typeof window !== \"undefined\" ? window.location.origin : \"\";\n\nexport const PUBLIC_API_URL = apiUrl;\n\nlet cloudWebUrl = process.env.NEXT_PUBLIC_CLOUD_WEB_URL;\ncloudWebUrl ??= \"https://cloud.datarecce.io\";\n\nexport const PUBLIC_CLOUD_WEB_URL = cloudWebUrl;\n","import { QueryClient } from \"@tanstack/react-query\";\nimport axios from \"axios\";\nimport { PUBLIC_API_URL } from \"@/lib/const\";\n\nexport const axiosClient = axios.create({\n baseURL: PUBLIC_API_URL,\n});\n\nexport const reactQueryClient = new QueryClient();\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\nimport { NodeColumnData } from \"./info\";\n\nexport interface CllInput {\n node_id?: string;\n column?: string;\n change_analysis?: boolean;\n no_cll?: boolean;\n no_upstream?: boolean;\n no_downstream?: boolean;\n}\n\nexport interface ImpactRadiusParams {\n node_id: string;\n}\n\nexport interface CllNodeData {\n id: string;\n name: string;\n source_name: string;\n resource_type: string;\n raw_code?: string;\n change_status?: \"added\" | \"removed\" | \"modified\";\n change_category?:\n | \"breaking\"\n | \"non_breaking\"\n | \"partial_breaking\"\n | \"unknown\";\n impacted?: boolean;\n columns?: Record<string, NodeColumnData>;\n}\n\nexport interface ColumnLineageData {\n current: {\n nodes: Record<string, CllNodeData>;\n columns: Record<string, NodeColumnData>;\n parent_map: Record<string, Set<string>>;\n child_map: Record<string, Set<string>>;\n };\n}\n\nexport async function getCll(input: CllInput): Promise<ColumnLineageData> {\n const response = await axiosClient.post<\n CllInput,\n AxiosResponse<ColumnLineageData>\n >(\"/api/cll\", input);\n\n return response.data;\n}\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\nimport { Check } from \"./checks\";\nimport { CllInput } from \"./cll\";\n\nexport interface LineageDiffViewOptions {\n view_mode?: \"changed_models\" | \"all\";\n node_ids?: string[];\n packages?: string[];\n select?: string;\n exclude?: string;\n column_level_lineage?: CllInput;\n}\n\ninterface CreateLineageDiffCheckBody {\n type: string;\n params: Record<string, string | boolean | number>;\n view_options: LineageDiffViewOptions;\n}\n\nexport async function createLineageDiffCheck(\n viewOptions: LineageDiffViewOptions,\n): Promise<Check> {\n const response = await axiosClient.post<\n CreateLineageDiffCheckBody,\n AxiosResponse<Check>\n >(\"/api/checks\", {\n type: \"lineage_diff\",\n params: {},\n view_options: viewOptions,\n });\n\n return response.data;\n}\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\nimport { Check } from \"./checks\";\n\nexport interface SchemaDiffViewParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n view_mode?: \"all\" | \"changed_models\";\n packages?: string[];\n}\n\ninterface CreateSchemaDiffCheckBody {\n type: string;\n params: SchemaDiffViewParams;\n}\n\nexport async function createSchemaDiffCheck(\n params: SchemaDiffViewParams,\n): Promise<Check> {\n const response = await axiosClient.post<\n CreateSchemaDiffCheckBody,\n AxiosResponse<Check>\n >(\"/api/checks\", {\n type: \"schema_diff\",\n params: params,\n });\n\n return response.data;\n}\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface SelectInput {\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\nexport interface SelectOutput {\n nodes: string[];\n}\n\nexport async function select(input: SelectInput): Promise<SelectOutput> {\n return (\n await axiosClient.post<SelectInput, AxiosResponse<SelectOutput>>(\n `/api/select`,\n input,\n )\n ).data;\n}\n","import {\n AmplitudeReturn,\n BaseEvent,\n EventOptions,\n Result,\n} from \"@amplitude/analytics-core\";\nimport { initAll, track as trk } from \"@amplitude/unified\";\n\nfunction track(\n eventInput: string | BaseEvent,\n // biome-ignore lint/suspicious/noExplicitAny: Amplitude library uses any for event properties\n eventProperties?: Record<string, any> | undefined,\n eventOptions?: EventOptions | undefined,\n): AmplitudeReturn<Result> {\n // If Amplitude isn't initialized, log to console instead\n if (!amplitudeInitialized) {\n console.log(\"[Tracking]\", eventInput, eventProperties, eventOptions);\n }\n return trk(eventInput, eventProperties, eventOptions);\n}\n\nlet amplitudeInitialized = false;\n\nexport function trackInit() {\n function getCookie(key: string) {\n const b = document.cookie.match(\"(^|;)\\\\s*\" + key + \"\\\\s*=\\\\s*([^;]+)\");\n return b ? b.pop() : \"\";\n }\n\n const userId =\n process.env.NODE_ENV === \"development\"\n ? \"web_dev\"\n : getCookie(\"recce_user_id\");\n const apiKey = process.env.AMPLITUDE_API_KEY;\n if (userId && apiKey) {\n try {\n void initAll(apiKey, {\n analytics: {\n userId,\n autocapture: true,\n },\n sessionReplay: {\n sampleRate: 1,\n },\n });\n amplitudeInitialized = true;\n } catch (e) {\n console.error(e);\n }\n }\n\n // Log when Amplitude is not initialized (for development/debugging)\n if (!amplitudeInitialized) {\n console.log(\n \"[Tracking] Amplitude not initialized (missing API key or user ID). Events will be logged to console instead.\",\n );\n }\n}\n\ninterface MultiNodeActionProps {\n type:\n | \"row_count\"\n | \"row_count_diff\"\n | \"value_diff\"\n | \"schema_diff\"\n | \"lineage_diff\";\n selected: \"single\" | \"multi\" | \"none\";\n}\n\nexport function trackMultiNodesAction(props: MultiNodeActionProps) {\n track(\"[Web] multi_nodes_action\", props);\n}\n\ninterface HistoryActionProps {\n name: \"show\" | \"hide\" | \"click_run\" | \"add_to_checklist\" | \"go_to_check\";\n}\n\nexport function trackHistoryAction(props: HistoryActionProps) {\n track(\"[Web] history_action\", props);\n}\n\ninterface PreviewChangeProps {\n action: \"explore\" | \"run\" | \"close\";\n node?: string;\n status?: \"success\" | \"failure\";\n}\n\nexport function trackPreviewChange(props: PreviewChangeProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface PreviewChangeFeedbackProps {\n feedback: \"like\" | \"dislike\" | \"form\";\n node?: string;\n}\n\nexport function trackPreviewChangeFeedback(props: PreviewChangeFeedbackProps) {\n track(\"[Experiment] preview_change\", props);\n}\n\ninterface SingleEnvironmentProps {\n action:\n | \"onboarding\"\n | \"external_link\"\n | \"preview_changes\"\n | `target_base_added`;\n from?: \"onboarding\" | \"preview_changes\";\n node?: string;\n}\n\nexport function trackSingleEnvironment(props: SingleEnvironmentProps) {\n track(\"[Experiment] single_environment\", props);\n}\n\nexport function getExperimentTrackingBreakingChangeEnabled() {\n return false;\n}\n\ninterface ColumnLevelLineageProps {\n action: \"view\";\n source: \"schema_column\" | \"changed_column\" | \"cll_column\";\n}\n\nexport function trackColumnLevelLineage(props: ColumnLevelLineageProps) {\n track(\"[Web] column_level_lineage\", props);\n}\n\ninterface ShareStateProps {\n name: \"enable\" | \"create\" | \"copy\";\n}\n\nexport function trackShareState(props: ShareStateProps) {\n track(\"[Web] share_state\", props);\n}\n\ninterface StateActionProps {\n name: \"import\" | \"export\";\n}\n\nexport function trackStateAction(props: StateActionProps) {\n track(\"[Web] state_action\", props);\n}\n\ninterface CopyToClipboardProps {\n from: \"run\" | \"check\" | \"lineage_view\";\n type: string;\n}\n\nexport function trackCopyToClipboard(props: CopyToClipboardProps) {\n track(\"[Click] copy_to_clipboard\", props);\n}\n\ninterface TrackNavProps {\n from: string;\n to: string;\n}\n\nexport function trackNavigation(props: TrackNavProps) {\n track(\"[Web] navigation_change\", props);\n}\n\nexport interface LineageViewRenderProps {\n node_count: number;\n view_mode: string;\n impact_radius_enabled: boolean;\n cll_column_active?: boolean;\n right_sidebar_open: boolean;\n [status: string]: number | string | boolean | undefined;\n}\n\nexport function trackLineageViewRender(props: LineageViewRenderProps) {\n track(\"[Web] lineage_view_render\", props);\n}\n\nexport interface EnvironmentConfigProps {\n review_mode: boolean;\n adapter_type: string | null;\n has_git_info: boolean;\n has_pr_info: boolean;\n // Adapter-specific (shape varies by adapter_type)\n base?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n current?: {\n schema_count?: number;\n dbt_version?: string | null;\n timestamp?: string | null;\n has_env?: boolean;\n };\n schemas_match?: boolean;\n}\n\nexport function trackEnvironmentConfig(props: EnvironmentConfigProps) {\n track(\"[Web] environment_config\", props);\n}\n\n// Explore action types\nexport const EXPLORE_ACTION = {\n ROW_COUNT: \"row_count\",\n ROW_COUNT_DIFF: \"row_count_diff\",\n PROFILE: \"profile\",\n PROFILE_DIFF: \"profile_diff\",\n VALUE_DIFF: \"value_diff\",\n SCHEMA_DIFF: \"schema_diff\",\n LINEAGE_DIFF: \"lineage_diff\",\n QUERY: \"query\",\n HISTOGRAM_DIFF: \"histogram_diff\",\n TOP_K_DIFF: \"top_k_diff\",\n} as const;\n\n// Explore action sources\nexport const EXPLORE_SOURCE = {\n LINEAGE_VIEW_TOP_BAR: \"lineage_view_top_bar\",\n LINEAGE_VIEW_CONTEXT_MENU: \"lineage_view_context_menu\",\n NODE_KEBAB_MENU: \"node_kebab_menu\",\n NODE_SIDEBAR_SINGLE_ENV: \"node_sidebar_single_env\",\n NODE_SIDEBAR_MULTI_ENV: \"node_sidebar_multi_env\",\n SCHEMA_ROW_COUNT_BUTTON: \"schema_row_count_button\",\n SCHEMA_COLUMN_MENU: \"schema_column_menu\",\n} as const;\n\nexport type ExploreActionType =\n (typeof EXPLORE_ACTION)[keyof typeof EXPLORE_ACTION];\nexport type ExploreSourceType =\n (typeof EXPLORE_SOURCE)[keyof typeof EXPLORE_SOURCE];\n\ninterface ExploreActionProps {\n action: ExploreActionType;\n source: ExploreSourceType;\n node_count?: number;\n}\n\nexport function trackExploreAction(props: ExploreActionProps) {\n track(\"[Web] explore_action\", props);\n}\n\n// Explore action form events\nexport const EXPLORE_FORM_EVENT = {\n EXECUTE: \"execute\",\n CANCEL: \"cancel\",\n} as const;\n\nexport type ExploreFormEventType =\n (typeof EXPLORE_FORM_EVENT)[keyof typeof EXPLORE_FORM_EVENT];\n\ninterface ExploreActionFormProps {\n action: ExploreActionType;\n event: ExploreFormEventType;\n}\n\nexport function trackExploreActionForm(props: ExploreActionFormProps) {\n track(\"[Web] explore_action_form\", props);\n}\n\n// Helper to check if a run type is an explore action\nexport function isExploreAction(type: string): type is ExploreActionType {\n return Object.values(EXPLORE_ACTION).includes(type as ExploreActionType);\n}\n\n// Lineage selection action types\nexport const LINEAGE_SELECTION_ACTION = {\n SELECT_PARENT_NODES: \"select_parent_nodes\",\n SELECT_CHILD_NODES: \"select_child_nodes\",\n SELECT_ALL_UPSTREAM: \"select_all_upstream\",\n SELECT_ALL_DOWNSTREAM: \"select_all_downstream\",\n} as const;\n\nexport type LineageSelectionActionType =\n (typeof LINEAGE_SELECTION_ACTION)[keyof typeof LINEAGE_SELECTION_ACTION];\n\ninterface LineageSelectionProps {\n action: LineageSelectionActionType;\n node_count?: number;\n}\n\nexport function trackLineageSelection(props: LineageSelectionProps) {\n track(\"[Web] lineage_selection\", props);\n}\n","// ============================================================================\n// Base Types\n// ============================================================================\n\nexport type AxiosQueryParams = Record<\n string,\n string | string[] | number | number[] | undefined\n>;\n\nexport type RowDataTypes = number | string | boolean | null | undefined;\nexport type RowData = RowDataTypes[];\n\nexport type RowObjectType = Record<string, RowDataTypes> & {\n __status: \"added\" | \"removed\" | \"modified\" | undefined;\n _index?: number;\n};\n\nexport type ColumnType =\n | \"number\"\n | \"integer\"\n | \"text\"\n | \"boolean\"\n | \"date\"\n | \"datetime\"\n | \"timedelta\"\n | \"unknown\";\n\nexport type ColumnRenderMode =\n | \"raw\"\n | \"percent\"\n | 0\n | 1\n | 2\n | 3\n | 4\n | 5\n | 6\n | 7\n | 8\n | 9;\n\nexport interface DataFrame {\n columns: {\n key: string;\n name: string;\n type: ColumnType;\n }[];\n data: RowData[];\n limit?: number;\n more?: boolean;\n}\n\n// ============================================================================\n// Run Types - Strict enum without string union\n// ============================================================================\n\n// ============================================================================\n// Inline Param Definitions (defined here to avoid circular dependencies)\n// ============================================================================\n\n// Import types that are defined in other files\nimport { RunType } from \"@/components/run/registry\";\nimport type {\n QueryDiffParams,\n QueryDiffResult,\n QueryResult,\n QueryRunParams,\n} from \"./adhocQuery\";\nimport type { LineageDiffResult } from \"./info\";\nimport type {\n HistogramDiffParams,\n HistogramDiffResult,\n ProfileDiffParams,\n ProfileDiffResult,\n TopKDiffParams,\n TopKDiffResult,\n} from \"./profile\";\nimport type {\n RowCountDiffParams,\n RowCountDiffResult,\n RowCountParams,\n RowCountResult,\n} from \"./rowcount\";\nimport type {\n ValueDiffDetailParams,\n ValueDiffDetailResult,\n ValueDiffParams,\n ValueDiffResult,\n} from \"./valuediff\";\n\n// Define params that don't have their own files yet\nexport interface SchemaDiffParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\nexport interface LineageDiffParams {\n select?: string;\n exclude?: string;\n packages?: string[];\n view_mode?: \"all\" | \"changed_models\";\n}\n\n// ============================================================================\n// Run - Discriminated Union Type\n// ============================================================================\n\nexport type RunParamTypes =\n | QueryRunParams\n | QueryDiffParams\n | ValueDiffParams\n | SchemaDiffParams\n | ProfileDiffParams\n | RowCountParams\n | RowCountDiffParams\n | LineageDiffParams\n | TopKDiffParams\n | HistogramDiffParams\n | undefined;\n\ninterface BaseRun {\n type: RunType;\n run_id: string;\n run_at: string;\n name?: string;\n check_id?: string;\n progress?: {\n message?: string;\n percentage?: number;\n };\n error?: string;\n status?: \"finished\" | \"failed\" | \"cancelled\" | \"running\";\n}\n\nexport type Run =\n | (BaseRun & {\n type: \"simple\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"sandbox\";\n params?: undefined;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"query\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_base\";\n params?: QueryRunParams;\n result?: QueryResult;\n })\n | (BaseRun & {\n type: \"query_diff\";\n params?: QueryDiffParams;\n result?: QueryDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff\";\n params?: ValueDiffParams;\n result?: ValueDiffResult;\n })\n | (BaseRun & {\n type: \"value_diff_detail\";\n params?: ValueDiffDetailParams;\n result?: ValueDiffDetailResult;\n })\n | (BaseRun & {\n type: \"schema_diff\";\n params?: SchemaDiffParams;\n result?: undefined;\n })\n | (BaseRun & {\n type: \"profile\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"profile_diff\";\n params?: ProfileDiffParams;\n result?: ProfileDiffResult;\n })\n | (BaseRun & {\n type: \"row_count\";\n params?: RowCountParams;\n result?: RowCountResult;\n })\n | (BaseRun & {\n type: \"row_count_diff\";\n params?: RowCountDiffParams;\n result?: RowCountDiffResult;\n })\n | (BaseRun & {\n type: \"lineage_diff\";\n params?: LineageDiffParams;\n result?: LineageDiffResult;\n })\n | (BaseRun & {\n type: \"top_k_diff\";\n params?: TopKDiffParams;\n result?: TopKDiffResult;\n })\n | (BaseRun & {\n type: \"histogram_diff\";\n params?: HistogramDiffParams;\n result?: HistogramDiffResult;\n });\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isSimpleRun(run: Run): run is Extract<Run, { type: \"simple\" }> {\n return run.type === \"simple\";\n}\n\nexport function isQueryRun(run: Run): run is Extract<Run, { type: \"query\" }> {\n return run.type === \"query\";\n}\n\nexport function isQueryBaseRun(\n run: Run,\n): run is Extract<Run, { type: \"query_base\" }> {\n return run.type === \"query_base\";\n}\n\nexport function isQueryDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"query_diff\" }> {\n return run.type === \"query_diff\";\n}\n\nexport function isValueDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"value_diff\" }> {\n return run.type === \"value_diff\";\n}\n\nexport function isValueDiffDetailRun(\n run: Run,\n): run is Extract<Run, { type: \"value_diff_detail\" }> {\n return run.type === \"value_diff_detail\";\n}\n\nexport function isSchemaDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"schema_diff\" }> {\n return run.type === \"schema_diff\";\n}\n\nexport function isProfileRun(\n run: Run,\n): run is Extract<Run, { type: \"profile\" }> {\n return run.type === \"profile\";\n}\n\nexport function isProfileDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"profile_diff\" }> {\n return run.type === \"profile_diff\";\n}\n\nexport function isRowCountRun(\n run: Run,\n): run is Extract<Run, { type: \"row_count\" }> {\n return run.type === \"row_count\";\n}\n\nexport function isRowCountDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"row_count_diff\" }> {\n return run.type === \"row_count_diff\";\n}\n\nexport function isLineageDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"lineage_diff\" }> {\n return run.type === \"lineage_diff\";\n}\n\nexport function isTopKDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"top_k_diff\" }> {\n return run.type === \"top_k_diff\";\n}\n\nexport function isHistogramDiffRun(\n run: Run,\n): run is Extract<Run, { type: \"histogram_diff\" }> {\n return run.type === \"histogram_diff\";\n}\n","export const RECCE_SUPPORT_CALENDAR_URL = \"https://cal.com/team/recce/chat\";\n","export const cacheKeys = {\n rowCount: (model: string) => [\"row_count\", model],\n lineage: () => [\"lineage\"],\n checks: () => [\"checks\", \"list\"],\n check: (checkId: string) => [\"checks\", checkId],\n checkEvents: (checkId: string) => [\"checks\", checkId, \"events\"],\n runs: () => [\"runs\"],\n run: (runId: string) => [\"runs\", runId],\n runsAggregated: () => [\"runs_aggregated\"],\n flag: () => [\"flag\"],\n instanceInfo: () => [\"instance_info\"],\n user: () => [\"user\"],\n};\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface RecceInstanceInfo {\n server_mode: \"server\" | \"preview\" | \"read-only\";\n single_env: boolean;\n authed: boolean;\n cloud_instance: boolean;\n lifetime_expired_at?: Date;\n idle_timeout?: number;\n share_url?: string;\n session_id?: string;\n organization_name?: string;\n web_url?: string;\n}\n\nexport async function getRecceInstanceInfo(): Promise<RecceInstanceInfo> {\n return (\n await axiosClient.get<never, AxiosResponse<RecceInstanceInfo>>(\n \"/api/instance-info\",\n )\n ).data;\n}\n","import { createContext, useContext, useState } from \"react\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\nexport type RecceFeatureMode = \"read only\" | \"metadata only\" | null;\n\ninterface RecceFeatureToggles {\n mode: RecceFeatureMode;\n disableSaveToFile: boolean;\n disableExportStateFile: boolean;\n disableImportStateFile: boolean;\n disableUpdateChecklist: boolean;\n disableDatabaseQuery: boolean;\n disableViewActionDropdown: boolean;\n disableNodeActionDropdown: boolean;\n disableShare: boolean;\n}\n\nconst defaultFeatureToggles: RecceFeatureToggles = {\n mode: null,\n disableSaveToFile: false,\n disableExportStateFile: false,\n disableImportStateFile: false,\n disableUpdateChecklist: false,\n disableDatabaseQuery: false,\n disableViewActionDropdown: false,\n disableNodeActionDropdown: false,\n disableShare: false,\n};\n\ninterface InstanceInfoType {\n singleEnv: boolean;\n authed: boolean;\n featureToggles: RecceFeatureToggles;\n lifetimeExpiredAt?: Date;\n shareUrl?: string;\n sessionId?: string;\n}\n\nconst defaultValue: InstanceInfoType = {\n singleEnv: false,\n authed: false,\n lifetimeExpiredAt: undefined,\n featureToggles: defaultFeatureToggles,\n shareUrl: undefined,\n sessionId: undefined,\n};\n\nconst InstanceInfo = createContext<InstanceInfoType>(defaultValue);\n\nexport function RecceInstanceInfoProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const { data: instanceInfo, isLoading } = useRecceInstanceInfo();\n const [featureToggles, setFeatureToggles] = useState<RecceFeatureToggles>(\n defaultFeatureToggles,\n );\n const [singleEnv, setSingleEnv] = useState<boolean>(false);\n const [authed, setAuthed] = useState<boolean>(false);\n const [lifetimeExpiredAt, setLifetimeExpiredAt] = useState<Date>();\n const [shareUrl, setShareUrl] = useState<string>();\n const [sessionId, setSessionId] = useState<string>();\n const [prevInstanceInfo, setPrevInstanceInfo] = useState(instanceInfo);\n\n // Adjust state during render when instanceInfo changes\n if (!isLoading && instanceInfo && instanceInfo !== prevInstanceInfo) {\n setPrevInstanceInfo(instanceInfo);\n\n setSingleEnv(instanceInfo.single_env);\n setAuthed(instanceInfo.authed);\n setShareUrl(instanceInfo.share_url);\n setSessionId(instanceInfo.session_id);\n\n if (instanceInfo.lifetime_expired_at) {\n setLifetimeExpiredAt(new Date(instanceInfo.lifetime_expired_at));\n console.log(\"lifetime expired at\", instanceInfo.lifetime_expired_at);\n }\n\n // Set feature toggles based on instanceInfo\n const toggles = { ...defaultFeatureToggles };\n if (instanceInfo.server_mode === \"read-only\") {\n toggles.mode = \"read only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = true;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = true;\n toggles.disableNodeActionDropdown = true;\n toggles.disableShare = true;\n } else if (instanceInfo.server_mode === \"preview\") {\n toggles.mode = \"metadata only\";\n toggles.disableSaveToFile = true;\n toggles.disableExportStateFile = true;\n toggles.disableImportStateFile = true;\n toggles.disableUpdateChecklist = false;\n toggles.disableDatabaseQuery = true;\n toggles.disableViewActionDropdown = false;\n toggles.disableNodeActionDropdown = false;\n toggles.disableShare = true;\n }\n if (instanceInfo.single_env) {\n toggles.disableUpdateChecklist = true;\n toggles.disableShare = true;\n }\n if (instanceInfo.cloud_instance) {\n toggles.disableShare = true;\n }\n setFeatureToggles(toggles);\n }\n\n return (\n <InstanceInfo.Provider\n value={{\n featureToggles,\n singleEnv,\n authed,\n lifetimeExpiredAt,\n shareUrl,\n sessionId,\n }}\n >\n {children}\n </InstanceInfo.Provider>\n );\n}\n\nexport const useRecceInstanceContext = () => useContext(InstanceInfo);\n","import { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface RecceServerFlags {\n single_env_onboarding: boolean;\n show_relaunch_hint: boolean;\n}\n\nexport async function getServerFlag(): Promise<RecceServerFlags> {\n return (\n await axiosClient.get<never, AxiosResponse<RecceServerFlags>>(\"/api/flag\")\n ).data;\n}\n\n// This was used for showing onboarding guide. Check DRC-1320 for more detials\nexport async function markOnboardingCompleted(): Promise<void> {\n try {\n await axiosClient.post<never, AxiosResponse<never>>(\n \"/api/onboarding/completed\",\n );\n } catch (_error) {\n // skip any errors\n }\n}\n\nexport async function markRelaunchHintCompleted(): Promise<void> {\n try {\n await axiosClient.post<never, AxiosResponse<never>>(\n \"/api/relaunch-hint/completed\",\n );\n } catch (_error) {\n // skip any errors\n }\n}\n","import { AxiosError, AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\n/**\n * The data from the API\n */\nexport interface NodeColumnData {\n name: string;\n type: string;\n transformation_type?: string;\n change_status?: \"added\" | \"removed\" | \"modified\";\n not_null?: boolean;\n unique?: boolean;\n}\nexport interface NodeData {\n id: string;\n unique_id: string;\n name: string;\n schema?: string;\n checksum?: {\n name: string;\n checksum: string;\n };\n raw_code?: string;\n resource_type?: string;\n package_name?: string;\n columns?: Record<string, NodeColumnData | undefined>;\n primary_key?: string;\n}\n\n// https://docs.getdbt.com/reference/artifacts/dbt-artifacts#common-metadata\ninterface ArtifactMetadata {\n dbt_version: string;\n dbt_schema_version: string;\n generated_at: string;\n adapter_type: string;\n env: Record<string, string>;\n invocation_id: string;\n}\nexport interface ManifestMetadata extends ArtifactMetadata {\n project_id?: string;\n project_name?: string;\n user_id?: string;\n}\nexport interface SQLMeshInfo {\n base_env: string;\n current_env: string;\n}\n\nexport type CatalogMetadata = ArtifactMetadata;\n\nexport interface LineageData {\n metadata: {\n pr_url: string;\n git_branch?: string;\n };\n nodes: Record<string, NodeData>;\n parent_map: Record<string, string[]>;\n manifest_metadata?: ManifestMetadata | null;\n catalog_metadata?: CatalogMetadata | null;\n}\n\nexport interface LineageDataFromMetadata extends Omit<LineageData, \"nodes\"> {\n nodes: Record<string, NodeData | undefined>;\n}\n\nexport type LineageDiffData = Record<\n string,\n {\n change_status: \"added\" | \"removed\" | \"modified\";\n change: {\n category: \"breaking\" | \"non_breaking\" | \"partial_breaking\" | \"unknown\";\n columns: Record<string, \"added\" | \"removed\" | \"modified\"> | null;\n } | null;\n }\n>;\n\ninterface LineageOutput {\n error?: string;\n data?: LineageData;\n}\n\nexport async function getLineage(base = false): Promise<LineageData> {\n const response = await axiosClient.get<LineageData>(\n `/api/lineage?base=${base}`,\n );\n return response.data;\n}\n\nexport async function getLineageWithError(\n base = false,\n): Promise<LineageOutput> {\n try {\n const data = await getLineage(base);\n return { data };\n } catch (err: unknown) {\n if (err instanceof AxiosError) {\n const data = err.response?.data as Record<string, unknown> | undefined;\n const detail = data?.detail as string | undefined;\n if (detail) {\n return { error: detail };\n } else {\n return { error: err.message };\n }\n } else if (err instanceof Error) {\n return { error: err.message };\n } else {\n return { error: \"An unknown error occurred\" };\n }\n }\n}\n\nexport interface LineageDiffResult {\n base?: LineageData;\n current?: LineageData;\n base_error?: string;\n current_error?: string;\n}\n\nexport async function getLineageDiff(): Promise<LineageDiffResult> {\n const [base, current] = await Promise.all([\n getLineageWithError(true),\n getLineageWithError(false),\n ]);\n\n return {\n base: base.data,\n current: current.data,\n base_error: base.error,\n current_error: current.error,\n };\n}\n\nexport interface stateMetadata {\n schema_version: string;\n recce_version: string;\n generated_at: string;\n}\n\nexport interface gitInfo {\n branch?: string;\n}\n\nexport interface pullRequestInfo {\n id?: string | number;\n title?: string;\n url?: string;\n branch?: string;\n base_branch?: string;\n}\n\nexport interface ServerInfoResult {\n state_metadata: stateMetadata;\n adapter_type: string;\n review_mode: boolean;\n cloud_mode: boolean;\n file_mode: boolean;\n filename?: string;\n git?: gitInfo;\n pull_request?: pullRequestInfo;\n sqlmesh?: SQLMeshInfo;\n lineage: {\n base: LineageData;\n current: LineageData;\n diff: LineageDiffData;\n };\n demo: boolean;\n codespace: boolean;\n support_tasks: Record<string, boolean>;\n}\n\nexport async function getServerInfo(): Promise<ServerInfoResult> {\n return (\n await axiosClient.get<never, AxiosResponse<ServerInfoResult>>(`/api/info`)\n ).data;\n}\n\nexport interface ModelInfoResult {\n model: {\n base: {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n };\n current: {\n columns?: Record<string, NodeColumnData>;\n primary_key?: string;\n };\n };\n}\n\nexport async function getModelInfo(model: string): Promise<ModelInfoResult> {\n return (\n await axiosClient.get<never, AxiosResponse<ModelInfoResult>>(\n `/api/model/${model}`,\n )\n ).data;\n}\n","import { AxiosResponse } from \"axios\";\nimport { RunType } from \"@/components/run/registry\";\nimport { axiosClient } from \"./axiosClient\";\nimport { getExperimentTrackingBreakingChangeEnabled } from \"./track\";\nimport { AxiosQueryParams, isQueryRun, Run, RunParamTypes } from \"./types\";\n\nexport interface SubmitRunTrackProps {\n breaking_change_analysis?: boolean;\n source?: \"lineage_model_node\" | \"lineage_column_node\";\n [key: string]: unknown;\n}\n\nexport interface SubmitOptions {\n nowait?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\ninterface SubmitRunBody {\n type: RunType;\n params?: Record<string, unknown>;\n nowait?: boolean;\n track_props: SubmitRunTrackProps;\n}\n\nfunction mutateAddKey(run: Run): Run {\n if (run.result == null) {\n // no result, don't do anything\n return run;\n }\n if (isQueryRun(run)) {\n run.result.columns = run.result.columns.map((c) => {\n if (c.key) {\n return c;\n }\n c.key = c.name;\n return c;\n });\n }\n return run;\n}\n\nexport async function submitRun(\n type: RunType,\n params?: RunParamTypes,\n options?: SubmitOptions,\n) {\n const track_props = options?.trackProps ? { ...options.trackProps } : {};\n if (getExperimentTrackingBreakingChangeEnabled()) {\n track_props.breaking_change_analysis = true;\n }\n\n const response = await axiosClient.post<\n SubmitRunBody,\n AxiosResponse<Run | Pick<Run, \"run_id\">>\n >(\"/api/runs\", {\n type,\n params,\n nowait: options?.nowait,\n track_props,\n });\n\n return response.data;\n}\n\nexport async function getRun(runId: string) {\n const response = await axiosClient.get<never, AxiosResponse<Run>>(\n `/api/runs/${runId}`,\n );\n return response.data;\n}\n\ninterface WaitRunBody {\n params: {\n timeout?: number;\n };\n}\n\nexport async function waitRun(runId: string, timeout?: number) {\n const response = await axiosClient.get<WaitRunBody, AxiosResponse<Run>>(\n `/api/runs/${runId}/wait`,\n {\n params: {\n timeout,\n },\n },\n );\n\n return mutateAddKey(response.data);\n}\n\nexport async function cancelRun(runId: string) {\n return await axiosClient.post<never, AxiosResponse<never>>(\n `/api/runs/${runId}/cancel`,\n );\n}\n\nexport async function submitRunFromCheck(\n checkId: string,\n options?: SubmitOptions,\n) {\n const response = await axiosClient.post<\n { nowait?: boolean },\n AxiosResponse<Run | Pick<Run, \"run_id\">>\n >(`/api/checks/${checkId}/run`, {\n nowait: options?.nowait,\n });\n\n return response.data;\n}\n\ninterface SearchRunsBody {\n type: string;\n params: Record<string, unknown>;\n limit?: number;\n}\n\nexport async function searchRuns(\n type: string,\n params?: AxiosQueryParams,\n limit?: number,\n) {\n const response = await axiosClient.post<SearchRunsBody, AxiosResponse<Run[]>>(\n `/api/runs/search`,\n {\n type,\n params,\n limit,\n },\n );\n\n return response.data;\n}\n\nexport async function listRuns(): Promise<Run[]> {\n const response = await axiosClient.get<never, AxiosResponse<Run[]>>(\n \"/api/runs\",\n );\n return response.data;\n}\n\nexport type RunsAggregated = Record<\n string,\n Record<\n \"row_count_diff\" | \"value_diff\" | \"row_count\",\n {\n run_id: string;\n result: unknown;\n }\n >\n>;\nexport async function aggregateRuns(): Promise<RunsAggregated> {\n // input should be AggregateRunsIn\n const response = await axiosClient.post<\n unknown,\n AxiosResponse<RunsAggregated>\n >(`/api/runs/aggregate`, {});\n\n return response.data;\n}\n","\"use client\";\n\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n getLastKeepAliveTime,\n setKeepAliveCallback,\n} from \"@/lib/api/keepAlive\";\nimport { useIdleDetection } from \"./useIdleDetection\";\nimport { useRecceInstanceInfo } from \"./useRecceInstanceInfo\";\n\n/**\n * Context for sharing idle timeout state across components\n *\n * IMPORTANT: The countdown is based on the last SUCCESSFUL keep-alive API call,\n * NOT on user activity. This ensures the countdown accurately reflects the\n * server's idle timeout state.\n */\ninterface IdleTimeoutContextType {\n /** Remaining seconds until timeout (null if idle timeout not enabled) */\n remainingSeconds: number | null;\n /** Idle timeout value from server in seconds (null if not configured) */\n idleTimeout: number | null;\n /** Whether idle timeout is enabled */\n isEnabled: boolean;\n /** Mark as disconnected - stops countdown and keep-alive */\n setDisconnected: () => void;\n /** Reset connection state - restarts countdown and keep-alive after successful reconnect */\n resetConnection: () => void;\n /** Whether the connection is disconnected */\n isDisconnected: boolean;\n}\n\nconst IdleTimeoutContext = createContext<IdleTimeoutContextType | undefined>(\n undefined,\n);\n\n/**\n * Provider for idle timeout state\n *\n * The countdown is based on lastServerSyncTime (when keep-alive API was last\n * successfully sent), not on user activity. This provides accurate server state.\n */\nexport function IdleTimeoutProvider({ children }: { children: ReactNode }) {\n const { data: instanceInfo } = useRecceInstanceInfo();\n // Track the last time we successfully synced with server (keep-alive sent)\n const lastServerSyncRef = useRef<number>(Date.now());\n const [remainingSeconds, setRemainingSeconds] = useState<number | null>(null);\n const [isDisconnected, setIsDisconnected] = useState(false);\n\n const idleTimeout = instanceInfo?.idle_timeout ?? null;\n const isEnabled = idleTimeout !== null && idleTimeout > 0;\n\n // Register callback to receive keep-alive success notifications\n // Use ref to track enabled state to avoid race condition in callback\n const isEnabledRef = useRef(isEnabled);\n useEffect(() => {\n isEnabledRef.current = isEnabled;\n }, [isEnabled]);\n\n useEffect(() => {\n if (!isEnabled) {\n setKeepAliveCallback(null);\n return;\n }\n\n setKeepAliveCallback((timestamp: number) => {\n // Check current enabled state to avoid updating after disabled\n if (isEnabledRef.current) {\n lastServerSyncRef.current = timestamp;\n }\n });\n\n // Initialize with current keep-alive time if available\n const currentTime = getLastKeepAliveTime();\n if (currentTime > 0) {\n lastServerSyncRef.current = currentTime;\n }\n\n return () => {\n setKeepAliveCallback(null);\n };\n }, [isEnabled]);\n\n const setDisconnected = useCallback(() => {\n setIsDisconnected(true);\n }, []);\n\n const resetConnection = useCallback(() => {\n // Reset disconnected state\n setIsDisconnected(false);\n // Reset server sync time to now (server just restarted, timer reset)\n lastServerSyncRef.current = Date.now();\n }, []);\n\n // Update remaining seconds every second based on server sync time\n useEffect(() => {\n if (!isEnabled || idleTimeout === null) {\n setRemainingSeconds(null);\n return;\n }\n\n // Stop updating countdown if disconnected\n if (isDisconnected) {\n return;\n }\n\n const updateCountdown = () => {\n const now = Date.now();\n const elapsedSeconds = (now - lastServerSyncRef.current) / 1000;\n const remaining = Math.max(0, idleTimeout - elapsedSeconds);\n setRemainingSeconds(remaining);\n };\n\n // Initial update\n updateCountdown();\n\n // Set up interval for updates\n const intervalId = setInterval(updateCountdown, 1000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [isEnabled, idleTimeout, isDisconnected]);\n\n return (\n <IdleTimeoutContext.Provider\n value={{\n remainingSeconds,\n idleTimeout,\n isEnabled,\n setDisconnected,\n resetConnection,\n isDisconnected,\n }}\n >\n <IdleDetector />\n {children}\n </IdleTimeoutContext.Provider>\n );\n}\n\n/**\n * Internal component that activates idle detection\n * Placed inside provider so it has access to context\n */\nfunction IdleDetector() {\n useIdleDetection();\n return null;\n}\n\n/**\n * Hook to access idle timeout context\n * @throws Error if used outside IdleTimeoutProvider\n */\nexport function useIdleTimeout() {\n const context = useContext(IdleTimeoutContext);\n if (!context) {\n throw new Error(\"useIdleTimeout must be used within IdleTimeoutProvider\");\n }\n return context;\n}\n\n/**\n * Hook to access idle timeout context, returns null if outside provider\n * Used internally by useIdleDetection to avoid circular dependency\n */\nexport function useIdleTimeoutSafe(): IdleTimeoutContextType | null {\n return useContext(IdleTimeoutContext) ?? null;\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { getServerFlag, RecceServerFlags } from \"../api/flag\";\n\nexport const useRecceServerFlag = () => {\n return useQuery<RecceServerFlags>({\n queryKey: cacheKeys.flag(),\n queryFn: getServerFlag,\n });\n};\n","import {\n Button,\n CloseButton,\n Dialog,\n Portal,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport path from \"path\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { buildLineageGraph, LineageGraph } from \"@/components/lineage/lineage\";\nimport {\n RecceInstanceDisconnectedModalContent,\n ServerDisconnectedModalContent,\n} from \"@/components/lineage/ServerDisconnectedModalContent\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { markRelaunchHintCompleted } from \"../api/flag\";\nimport {\n getServerInfo,\n gitInfo,\n ManifestMetadata,\n pullRequestInfo,\n SQLMeshInfo,\n stateMetadata,\n} from \"../api/info\";\nimport { aggregateRuns, RunsAggregated } from \"../api/runs\";\nimport { trackSingleEnvironment } from \"../api/track\";\nimport { PUBLIC_API_URL } from \"../const\";\nimport { useIdleTimeout } from \"./IdleTimeoutContext\";\nimport { useRecceServerFlag } from \"./useRecceServerFlag\";\n\nexport interface EnvInfo {\n stateMetadata?: stateMetadata;\n adapterType?: string;\n git?: gitInfo;\n pullRequest?: pullRequestInfo;\n dbt?: {\n base: ManifestMetadata | undefined | null;\n current: ManifestMetadata | undefined | null;\n };\n sqlmesh?: SQLMeshInfo | null;\n}\n\nexport interface LineageGraphContextType {\n lineageGraph?: LineageGraph;\n envInfo?: EnvInfo;\n reviewMode?: boolean;\n cloudMode?: boolean;\n fileMode?: boolean;\n fileName?: string;\n isDemoSite: boolean;\n isCodespace?: boolean;\n isLoading?: boolean;\n error?: string;\n supportTasks?: Record<string, boolean>;\n retchLineageGraph?: () => void;\n isActionAvailable: (actionName: string) => boolean;\n\n runsAggregated?: RunsAggregated;\n refetchRunsAggregated?: () => void;\n}\n\nconst defaultLineageGraphsContext: LineageGraphContextType = {\n isActionAvailable: () => true,\n isDemoSite: false,\n};\n\nconst LineageGraphContext = createContext(defaultLineageGraphsContext);\n\ntype LineageWatcherStatus = \"pending\" | \"connected\" | \"disconnected\";\ntype EnvWatcherStatus = undefined | \"relaunch\";\n\ninterface WebSocketRefreshEvent {\n eventType: \"created\" | \"updated\" | \"deleted\";\n srcPath: string;\n}\n\ninterface WebSocketBroadcastEvent {\n id: string;\n title?: string;\n description: string;\n status?: \"info\" | \"warning\" | \"success\" | \"error\";\n position?:\n | \"top\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom\"\n | \"bottom-right\"\n | \"bottom-left\";\n duration?: number;\n}\n\ntype WebSocketPayload =\n | {\n command: \"refresh\";\n event: WebSocketRefreshEvent;\n }\n | {\n command: \"relaunch\";\n }\n | {\n command: \"broadcast\";\n event: WebSocketBroadcastEvent;\n };\n\nfunction useLineageWatcher() {\n const [artifactsUpdatedToastId, setArtifactsUpdatedToastId] = useState<\n string | undefined\n >(undefined);\n\n // use ref so that the callbacks can access the latest values\n const ref = useRef<{\n ws: WebSocket | undefined;\n status: LineageWatcherStatus;\n artifactsUpdatedToastId: string | undefined;\n }>({\n ws: undefined,\n status: \"pending\",\n artifactsUpdatedToastId: undefined,\n });\n\n const [status, setStatus] = useState<LineageWatcherStatus>(\"pending\");\n const [envStatus, setEnvStatus] = useState<EnvWatcherStatus>(undefined);\n\n // Update ref in useEffect to avoid updating during render\n useEffect(() => {\n ref.current.status = status;\n }, [status]);\n\n // Keep artifactsUpdatedToastId in sync with ref\n useEffect(() => {\n ref.current.artifactsUpdatedToastId = artifactsUpdatedToastId;\n }, [artifactsUpdatedToastId]);\n\n const queryClient = useQueryClient();\n\n const invalidateCaches = useCallback(() => {\n void queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n void queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n void queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n }, [queryClient]);\n\n const connect = useCallback(() => {\n function httpUrlToWebSocketUrl(url: string): string {\n return url.replace(/(http)(s)?:\\/\\//, \"ws$2://\");\n }\n\n const ws = new WebSocket(`${httpUrlToWebSocketUrl(PUBLIC_API_URL)}/api/ws`);\n ref.current.ws = ws;\n\n ws.onopen = () => {\n ws.send(\"ping\"); // server will respond with 'pong'\n };\n\n // Handling websocket messages from the server\n ws.onmessage = (event) => {\n if (event.data === \"pong\") {\n if (ref.current.status === \"disconnected\") {\n invalidateCaches();\n }\n setStatus(\"connected\");\n return;\n }\n try {\n const data = JSON.parse(event.data as string) as WebSocketPayload;\n if (data.command === \"refresh\") {\n const { eventType, srcPath } = data.event;\n const [targetName, fileName] = srcPath.split(\"/\").slice(-2);\n const name = path.parse(fileName).name;\n const eventId = `${targetName}-${name}-${eventType}`;\n if (ref.current.artifactsUpdatedToastId == null) {\n setArtifactsUpdatedToastId(\n toaster.create({\n id: eventId,\n description: `Detected ${targetName} ${name} ${eventType}`,\n type: \"info\",\n duration: 5000,\n closable: true,\n }),\n );\n }\n invalidateCaches();\n } else if (data.command === \"relaunch\") {\n setEnvStatus(\"relaunch\");\n } else {\n // Handle broadcast events\n const { id, title, description, status, duration } = data.event;\n setArtifactsUpdatedToastId(\n toaster.create({\n id: id || \"broadcast\",\n title,\n description,\n type: status ?? \"info\",\n duration: duration ?? 5000,\n closable: true,\n }),\n );\n }\n } catch (err) {\n console.error(err);\n }\n };\n ws.onerror = (err) => {\n console.error(\"An error occurred during Handling WebSockets\", err);\n };\n ws.onclose = () => {\n setStatus((status) => {\n if (status === \"connected\") {\n return \"disconnected\";\n }\n return status;\n });\n\n ref.current.ws = undefined;\n };\n }, [invalidateCaches]);\n\n useEffect(() => {\n const refObj = ref.current;\n connect();\n return () => {\n if (refObj.ws) {\n refObj.ws.close();\n }\n };\n }, [connect]);\n\n return {\n connectionStatus: status,\n connect,\n envStatus: envStatus,\n };\n}\n\ninterface LineageGraphProps {\n children: React.ReactNode;\n}\n\nexport function LineageGraphContextProvider({ children }: LineageGraphProps) {\n const {\n idleTimeout,\n remainingSeconds,\n isEnabled,\n setDisconnected,\n resetConnection,\n } = useIdleTimeout();\n\n const queryServerInfo = useQuery({\n queryKey: cacheKeys.lineage(),\n queryFn: getServerInfo,\n });\n\n const queryRunAggregated = useQuery({\n queryKey: cacheKeys.runsAggregated(),\n queryFn: aggregateRuns,\n });\n\n const lineageGraph = useMemo(() => {\n const lineage = queryServerInfo.data?.lineage;\n if (!lineage?.base) {\n return undefined;\n }\n\n return buildLineageGraph(lineage.base, lineage.current, lineage.diff);\n }, [queryServerInfo.data]);\n\n const errorMessage = queryServerInfo.error?.message;\n const {\n state_metadata: stateMetadata,\n lineage,\n sqlmesh,\n demo: isDemoSite,\n codespace: isCodespace,\n review_mode: reviewMode,\n cloud_mode: cloudMode,\n file_mode: fileMode,\n filename: fileName,\n adapter_type: adapterType,\n git,\n pull_request: pullRequest,\n support_tasks: supportTasks,\n } = queryServerInfo.data ?? {\n demo: false,\n };\n\n const dbtBase = lineage?.base.manifest_metadata;\n const dbtCurrent = lineage?.current.manifest_metadata;\n\n const envInfo: EnvInfo = {\n stateMetadata,\n adapterType,\n git,\n pullRequest,\n dbt: {\n base: dbtBase,\n current: dbtCurrent,\n },\n sqlmesh,\n };\n\n const { connectionStatus, connect, envStatus } = useLineageWatcher();\n\n // Handle connection status changes for idle timeout\n useEffect(() => {\n if (connectionStatus === \"disconnected\") {\n // Stop countdown and keep-alive when disconnected\n setDisconnected();\n } else if (connectionStatus === \"connected\") {\n // Reset countdown when reconnected (e.g., after Retry)\n resetConnection();\n }\n }, [connectionStatus, setDisconnected, resetConnection]);\n\n const { data: flags, isLoading } = useRecceServerFlag();\n const { featureToggles, shareUrl } = useRecceInstanceContext();\n const { onClose } = useDisclosure();\n const [relaunchHintOpen, setRelaunchHintOpen] = useState<boolean>(false);\n const [prevRelaunchCondition, setPrevRelaunchCondition] =\n useState<boolean>(false);\n const queryClient = useQueryClient();\n\n const isActionAvailable = useCallback(\n (name: string) => {\n if (supportTasks) {\n return supportTasks[name] ?? true; // default to true if action not found in supportTasks\n }\n // If the supportTasks does not be provided, all actions are available\n return true;\n },\n [supportTasks],\n );\n\n // Calculate if modal should be open (during render)\n const shouldShowRelaunch =\n !isLoading &&\n envStatus === \"relaunch\" &&\n flags?.single_env_onboarding === true &&\n flags.show_relaunch_hint;\n\n // Adjust state during render when condition changes\n if (shouldShowRelaunch !== prevRelaunchCondition) {\n setPrevRelaunchCondition(shouldShowRelaunch);\n setRelaunchHintOpen(shouldShowRelaunch);\n }\n\n // Track side effect only when modal opens (remains in effect)\n useEffect(() => {\n if (shouldShowRelaunch && relaunchHintOpen) {\n trackSingleEnvironment({ action: \"target_base_added\" });\n }\n }, [shouldShowRelaunch, relaunchHintOpen]);\n\n return (\n <>\n <LineageGraphContext.Provider\n value={{\n lineageGraph,\n retchLineageGraph: () => {\n void queryRunAggregated.refetch();\n },\n envInfo,\n reviewMode,\n cloudMode,\n fileMode,\n fileName,\n isDemoSite,\n isCodespace,\n error: errorMessage,\n supportTasks,\n isActionAvailable,\n isLoading: queryServerInfo.isLoading,\n runsAggregated: queryRunAggregated.data,\n refetchRunsAggregated: () => {\n void queryRunAggregated.refetch();\n },\n }}\n >\n {children}\n </LineageGraphContext.Provider>\n\n <Dialog.Root\n open={connectionStatus === \"disconnected\"}\n onOpenChange={() => {\n return void 0;\n }}\n placement=\"center\"\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n {shareUrl && featureToggles.mode !== null ? (\n <RecceInstanceDisconnectedModalContent\n shareUrl={shareUrl}\n mode={featureToggles.mode}\n />\n ) : (\n <ServerDisconnectedModalContent\n connect={connect}\n idleSeconds={\n // Only show idle time if disconnected due to idle timeout\n // (idle timeout enabled AND remaining time was near zero)\n isEnabled &&\n idleTimeout !== null &&\n remainingSeconds !== null &&\n remainingSeconds <= 5\n ? idleTimeout - Math.max(0, remainingSeconds)\n : undefined\n }\n />\n )}\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n\n {flags?.single_env_onboarding && (\n <Dialog.Root\n open={relaunchHintOpen}\n onOpenChange={() => {\n onClose();\n void markRelaunchHintCompleted();\n void queryClient.invalidateQueries({ queryKey: cacheKeys.flag() });\n }}\n placement=\"center\"\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Target-base Added</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Text>Please restart the Recce server.</Text>\n </Dialog.Body>\n <Dialog.Footer>\n <Button\n colorPalette=\"blue\"\n onClick={() => {\n onClose();\n void markRelaunchHintCompleted();\n void queryClient.invalidateQueries({\n queryKey: cacheKeys.flag(),\n });\n }}\n >\n Got it!\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n )}\n </>\n );\n}\n\nexport const useLineageGraphContext = () => useContext(LineageGraphContext);\n\nexport const useRunsAggregated = () => {\n const { runsAggregated, refetchRunsAggregated } = useLineageGraphContext();\n return [runsAggregated, refetchRunsAggregated] as [\n RunsAggregated | undefined,\n () => void,\n ];\n};\n","import type { SVGProps } from \"react\";\n\nexport const IconSync = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <g clipPath=\"url(#clip0_1479_25070)\">\n <path\n d=\"M15.625 0.25H14.759C14.5484 0.25 14.3791 0.423375 14.3841 0.633937L14.4575 3.71441C13.0691 1.62634 10.6955 0.25 8 0.25C4.21291 0.25 1.06041 2.96638 0.38425 6.557C0.340875 6.78728 0.518875 7 0.753219 7H1.64622C1.82353 7 1.97566 6.87556 2.013 6.70222C2.60753 3.9415 5.05991 1.875 8 1.875C10.4858 1.875 12.6232 3.35256 13.5836 5.47819L9.63394 5.38416C9.42341 5.37916 9.25 5.54844 9.25 5.75906V6.625C9.25 6.83209 9.41791 7 9.625 7H15.625C15.8321 7 16 6.83209 16 6.625V0.625C16 0.417906 15.8321 0.25 15.625 0.25ZM15.2468 9H14.3538C14.1765 9 14.0243 9.12444 13.987 9.29778C13.3925 12.0585 10.9401 14.125 8 14.125C5.51419 14.125 3.37681 12.6474 2.41637 10.5218L6.36606 10.6158C6.57659 10.6208 6.75 10.4516 6.75 10.2409V9.375C6.75 9.16791 6.58209 9 6.375 9H0.375C0.167906 9 0 9.16791 0 9.375V15.375C0 15.5821 0.167906 15.75 0.375 15.75H1.24097C1.45156 15.75 1.62088 15.5766 1.61588 15.3661L1.54253 12.2856C2.93087 14.3737 5.3045 15.75 8 15.75C11.7871 15.75 14.9396 13.0336 15.6158 9.443C15.6591 9.21272 15.4811 9 15.2468 9Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1479_25070\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\nexport const IconExport = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <g clipPath=\"url(#clip0_1479_25102)\">\n <path\n d=\"M-1.88399 8.72062L0.358816 6.46094C0.594752 6.22344 1.00006 6.39031 1.00006 6.725V8.2525H4.00005V4.12438C4.00005 3.7275 4.16161 3.34313 4.44286 3.06219L7.06441 0.440625C7.34566 0.159375 7.72691 0 8.12347 0H14.5003C15.3281 0.003125 16 0.675 16 1.50281V14.5003C16 15.3281 15.3281 16 14.5003 16H5.50223C4.67411 16 4.00005 15.3281 4.00005 14.5003V11.2522H5.50005V14.5003H14.5003V1.50281H9.50128V4.75219C9.50128 5.16781 9.1669 5.50187 8.75128 5.50187H5.50005V8.25219H10.625C10.8322 8.25219 11 8.42 11 8.62719V9.37719C11 9.58438 10.8322 9.75219 10.625 9.75219H1.00006V11.2797C1.00006 11.6144 0.594752 11.7813 0.358816 11.5438L-1.88399 9.28406C-2.03867 9.12813 -2.03867 8.87656 -1.88399 8.72062ZM8.0016 4.00219V1.62469L5.62379 4.00219H8.0016Z\"\n fill=\"currentColor\"\n />\n </g>\n <g clipPath=\"url(#clip1_1479_25102)\">\n <path\n d=\"M0.103056 8.72062L2.09667 6.46094C2.30639 6.22344 2.66667 6.39031 2.66667 6.725V8.2525H5.33333V4.12438C5.33333 3.7275 5.47694 3.34313 5.72694 3.06219L8.05722 0.440625C8.30722 0.159375 8.64611 0 8.99861 0H14.6669C15.4028 0.003125 16 0.675 16 1.50281V14.5003C16 15.3281 15.4028 16 14.6669 16H6.66861C5.9325 16 5.33333 15.3281 5.33333 14.5003V11.2522H6.66667V14.5003H14.6669V1.50281H10.2233V4.75219C10.2233 5.16781 9.92611 5.50187 9.55667 5.50187H6.66667V8.25219H11.2222C11.4064 8.25219 11.5556 8.42 11.5556 8.62719V9.37719C11.5556 9.58438 11.4064 9.75219 11.2222 9.75219H2.66667V11.2797C2.66667 11.6144 2.30639 11.7813 2.09667 11.5438L0.103056 9.28406C-0.0344448 9.12813 -0.0344448 8.87656 0.103056 8.72062ZM8.89028 4.00219V1.62469L6.77666 4.00219H8.89028Z\"\n fill=\"currentColor\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1479_25102\">\n <rect\n width=\"13\"\n height=\"16\"\n fill=\"white\"\n transform=\"matrix(-1 0 0 1 16 0)\"\n />\n </clipPath>\n <clipPath id=\"clip1_1479_25102\">\n <rect width=\"3\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const IconImport = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <g clipPath=\"url(#clip0_1426_8619)\">\n <path\n d=\"M15.5572 3.06188L12.9356 0.440625C12.6544 0.159375 12.2731 0 11.8766 0H5.49969C4.67188 0.003125 4 0.675 4 1.50281V8.25219H0.375C0.167812 8.25219 0 8.42 0 8.62719V9.37719C0 9.58438 0.167812 9.75219 0.375 9.75219H9V11.2797C9 11.6144 9.40531 11.7812 9.64125 11.5437L11.8841 9.28406C12.0388 9.12813 12.0388 8.87656 11.8841 8.72062L9.64125 6.46094C9.40531 6.22344 9 6.39031 9 6.725V8.2525H5.49969V1.50281H10.4987V4.75219C10.4987 5.16781 10.8331 5.50187 11.2487 5.50187H14.5V14.5003H5.49969V11.2522H4V14.5003C4 15.3281 4.67188 16 5.49969 16H14.4978C15.3259 16 16 15.3281 16 14.5003V4.12406C16 3.7275 15.8384 3.34313 15.5572 3.06188ZM11.9984 4.00219V1.62469L14.3763 4.00219H11.9984Z\"\n fill=\"black\"\n />\n </g>\n <defs>\n <clipPath id=\"clip0_1426_8619\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n );\n};\n\nexport const IconSave = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <path\n d=\"M14.5607 4.06066L11.9393 1.43934C11.658 1.15804 11.2765 1 10.8787 1H2.5C1.67156 1 1 1.67156 1 2.5V13.5C1 14.3284 1.67156 15 2.5 15H13.5C14.3284 15 15 14.3284 15 13.5V5.12131C15 4.72349 14.842 4.34196 14.5607 4.06066ZM9.5 2.5V5H5.5V2.5H9.5ZM13.3125 13.5H2.6875C2.63777 13.5 2.59008 13.4802 2.55492 13.4451C2.51975 13.4099 2.5 13.3622 2.5 13.3125V2.6875C2.5 2.63777 2.51975 2.59008 2.55492 2.55492C2.59008 2.51975 2.63777 2.5 2.6875 2.5H4V5.75C4 6.16422 4.33578 6.5 4.75 6.5H10.25C10.6642 6.5 11 6.16422 11 5.75V2.62131L13.4451 5.06641C13.4625 5.08382 13.4763 5.10449 13.4857 5.12724C13.4952 5.14999 13.5 5.17438 13.5 5.199V13.3125C13.5 13.3622 13.4802 13.4099 13.4451 13.4451C13.4099 13.4802 13.3622 13.5 13.3125 13.5ZM8 7.25C6.48366 7.25 5.25 8.48366 5.25 10C5.25 11.5163 6.48366 12.75 8 12.75C9.51634 12.75 10.75 11.5163 10.75 10C10.75 8.48366 9.51634 7.25 8 7.25ZM8 11.25C7.31075 11.25 6.75 10.6892 6.75 10C6.75 9.31075 7.31075 8.75 8 8.75C8.68925 8.75 9.25 9.31075 9.25 10C9.25 10.6892 8.68925 11.25 8 11.25Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\nexport const IconEdit = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"17\"\n height=\"16\"\n viewBox=\"0 0 17 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <path\n d=\"M15.9143 1.75812L14.7422 0.585938C14.3515 0.195312 13.8397 0 13.3278 0C12.8159 0 12.304 0.195312 11.9137 0.585625L9.58593 2.91344L8.5 3.99938L0.901592 11.5975L0.504719 15.1669C0.454719 15.6163 0.80878 16 1.24847 16C1.27628 16 1.3044 15.9984 1.33253 15.9953L4.89939 15.6012L12.5006 8L13.5862 6.91437L15.914 4.58656C16.6953 3.80531 16.6953 2.53906 15.9143 1.75812ZM4.21095 14.1684L2.09909 14.4016L2.3344 12.2863L9.56062 5.06L10.53 4.09062L12.4094 5.97L11.44 6.93937L4.21095 14.1684ZM14.8534 3.52562L13.4697 4.90938L11.5906 3.03L12.9744 1.64625C13.1019 1.51875 13.2506 1.49969 13.3278 1.49969C13.405 1.49969 13.554 1.51875 13.6812 1.64625L14.8534 2.81844C15.0484 3.01375 15.0484 3.33094 14.8534 3.52562Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n\nexport const IconInfo = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <path\n d=\"M7.26326 6.5462H8.71794V12.3642H7.26326V6.5462ZM7.9906 3.1102C7.43278 3.1102 6.97888 3.5641 6.97888 4.12192C6.97888 4.67974 7.43278 5.13364 7.9906 5.13364C8.54842 5.13364 9.00232 4.67974 9.00232 4.12192C9.00232 3.5641 8.54842 3.1102 7.9906 3.1102ZM16 8C16 12.411 12.411 16 8 16C3.589 16 0 12.411 0 8C0 3.589 3.589 0 8 0C12.411 0 16 3.589 16 8ZM14.5453 8C14.5453 4.3906 11.6093 1.4546 7.99992 1.4546C4.39052 1.4546 1.45452 4.3914 1.45452 8.0006C1.45452 11.6098 4.39052 14.546 7.99992 14.546C11.6093 14.546 14.5453 11.6092 14.5453 8.0006V8Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n};\n","import {\n Box,\n Button,\n CloseButton,\n Dialog,\n Flex,\n Icon,\n IconButton,\n Link,\n Popover,\n Portal,\n} from \"@chakra-ui/react\";\nimport { ComponentType, useRef, useState } from \"react\";\nimport { IconInfo } from \"@/components/icons\";\nimport { RunFormParamTypes, RunType } from \"@/components/run/registry\";\nimport {\n EXPLORE_FORM_EVENT,\n isExploreAction,\n trackExploreActionForm,\n} from \"@/lib/api/track\";\nimport { Run } from \"@/lib/api/types\";\nimport { RunFormProps } from \"./types\";\n\ninterface RunModalProps {\n isOpen: boolean;\n onClose: () => void;\n onExecute: (type: RunType, params: RunFormParamTypes) => void;\n title: string;\n type: RunType;\n params?: RunFormParamTypes;\n initialRun?: Run;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\nconst getDocumentationUrl = (type: RunType): string | null => {\n const urlMap: Record<string, string> = {\n value_diff: \"https://docs.datarecce.io/features/lineage/#value-diff\",\n profile_diff: \"https://docs.datarecce.io/features/lineage/#profile-diff\",\n histogram_diff:\n \"https://docs.datarecce.io/features/lineage/#histogram-diff\",\n top_k_diff: \"https://docs.datarecce.io/features/lineage/#top-k-diff\",\n };\n return urlMap[type] || null;\n};\n\nexport const RunModal = ({\n isOpen,\n onClose,\n onExecute,\n type,\n title,\n params: defaultParams,\n RunForm,\n}: RunModalProps) => {\n const [params, setParams] = useState<Partial<RunFormParamTypes>>(\n defaultParams ?? {},\n );\n const [hovered, setHovered] = useState(false);\n const [isReadyToExecute, setIsReadyToExecute] = useState(false);\n const documentationUrl = getDocumentationUrl(type);\n const executeClicked = useRef(false);\n\n const handleClose = () => {\n if (!executeClicked.current && isExploreAction(type)) {\n trackExploreActionForm({\n action: type,\n event: EXPLORE_FORM_EVENT.CANCEL,\n });\n }\n executeClicked.current = false; // Reset for next open\n onClose();\n };\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={handleClose}\n size=\"xl\"\n scrollBehavior=\"inside\"\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content overflowY=\"auto\" height=\"75%\" minHeight={\"400px\"}>\n <Dialog.Header>\n <Dialog.Title display=\"flex\" alignItems=\"center\">\n {title}{\" \"}\n {documentationUrl && (\n <Popover.Root\n positioning={{ placement: \"bottom-end\" }}\n open={hovered}\n onFocusOutside={() => {\n setHovered(false);\n }}\n >\n <Popover.Trigger asChild>\n <IconButton\n display=\"flex\"\n size=\"sm\"\n variant=\"plain\"\n aria-label=\"Click this button to learn more about the SQL behind\"\n onMouseEnter={() => {\n setHovered(true);\n }}\n onClick={() => window.open(documentationUrl, \"_blank\")}\n onFocus={(e) => {\n e.preventDefault();\n }}\n >\n <Icon\n verticalAlign=\"middle\"\n as={IconInfo}\n boxSize={\"16px\"}\n />\n </IconButton>\n </Popover.Trigger>\n <Popover.Positioner>\n <Popover.Content bg=\"black\" color=\"white\">\n <Popover.Body fontSize=\"sm\" p={2}>\n Click{\" \"}\n <Link\n href={documentationUrl}\n target=\"_blank\"\n textDecoration=\"underline\"\n color=\"white\"\n _hover={{ color: \"blue.300\" }}\n >\n here\n </Link>{\" \"}\n to learn more about the SQL behind\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Popover.Root>\n )}\n </Dialog.Title>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Header>\n <Dialog.Body\n p=\"0px\"\n h=\"100%\"\n overflow=\"auto\"\n borderY=\"1px solid lightgray\"\n >\n <Box style={{ contain: \"layout\" }}>\n {RunForm && (\n <RunForm\n params={params}\n onParamsChanged={setParams}\n setIsReadyToExecute={setIsReadyToExecute}\n />\n )}\n </Box>\n </Dialog.Body>\n <Dialog.Footer>\n <Flex gap=\"10px\">\n <Button\n disabled={!isReadyToExecute}\n colorPalette=\"blue\"\n onClick={() => {\n executeClicked.current = true;\n if (isExploreAction(type)) {\n trackExploreActionForm({\n action: type,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n });\n }\n onExecute(type, params as RunFormParamTypes);\n }}\n >\n Execute\n </Button>\n </Flex>\n </Dialog.Footer>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n};\n","import _ from \"lodash\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { LineageGraphNode } from \"@/components/lineage/lineage\";\nimport { getModelInfo, NodeColumnData, NodeData } from \"../api/info\";\nimport { useLineageGraphContext } from \"./LineageGraphContext\";\n\nexport function extractColumns(node: LineageGraphNode) {\n function getColumns(nodeData: NodeData | undefined) {\n return nodeData?.columns\n ? Object.values(nodeData.columns).filter((c) => c != null)\n : [];\n }\n\n const baseColumns = getColumns(node.data.data.base);\n const currentColumns = getColumns(node.data.data.current);\n\n return unionColumns(baseColumns, currentColumns);\n}\n\nexport function unionColumns(\n baseColumns: NodeColumnData[],\n currentColumns: NodeColumnData[],\n) {\n const union: NodeColumnData[] = [];\n baseColumns.forEach((column) => {\n if (!union.some((c) => c.name === column.name)) {\n union.push(column);\n }\n });\n currentColumns.forEach((column) => {\n if (!union.some((c) => c.name === column.name)) {\n union.push(column);\n }\n });\n\n return union;\n}\n\nconst useModelColumns = (model: string | undefined) => {\n const { lineageGraph } = useLineageGraphContext();\n\n const node = _.find(lineageGraph?.nodes, {\n data: {\n name: model,\n },\n });\n\n const nodeColumns = useMemo(() => {\n return node ? extractColumns(node) : [];\n }, [node]);\n\n const [columns, setColumns] = useState<NodeColumnData[]>([]);\n const [primaryKey, setPrimaryKey] = useState<string>();\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [error, setError] = useState<Error | null>(null);\n const [prevNodeColumns, setPrevNodeColumns] = useState<NodeColumnData[]>([]);\n const [prevNodeId, setPrevNodeId] = useState(node?.id);\n\n const nodePrimaryKey = node ? node.data.data.current?.primary_key : undefined;\n\n const fetchData = useCallback(async () => {\n if (!node) {\n return;\n }\n try {\n const data = await getModelInfo(node.id);\n const modelInfo = data.model;\n if (!modelInfo.base.columns || !modelInfo.current.columns) {\n setColumns([]);\n return;\n }\n setPrimaryKey(modelInfo.current.primary_key);\n const baseColumns = Object.values(modelInfo.base.columns);\n const currentColumns = Object.values(modelInfo.current.columns);\n setColumns(unionColumns(baseColumns, currentColumns));\n } catch (error) {\n setError(error as Error);\n }\n }, [node]);\n\n // Adjust state during render when node changes\n if (nodeColumns !== prevNodeColumns || node?.id !== prevNodeId) {\n setPrevNodeColumns(nodeColumns);\n setPrevNodeId(node?.id);\n\n if (nodeColumns.length > 0) {\n setColumns(nodeColumns);\n setPrimaryKey(nodePrimaryKey);\n setIsLoading(false);\n } else if (node?.id === undefined) {\n setColumns([]);\n setIsLoading(false);\n }\n // Note: fetchData case is handled separately in effect below\n }\n\n // Fetch data effect - only runs when we need to fetch\n useEffect(() => {\n if (nodeColumns.length === 0 && node?.id !== undefined) {\n // fetchData() is a legitimate side effect, leaving\n // eslint-disable-next-line react-hooks/set-state-in-effect\n fetchData().catch((e: unknown) => {\n // error is already handled in fetchData()\n console.error(e);\n });\n setIsLoading(false);\n }\n }, [fetchData, node?.id, nodeColumns]);\n\n return { columns, primaryKey, isLoading, error };\n};\n\nexport default useModelColumns;\n","import { Box, Field, NativeSelect } from \"@chakra-ui/react\";\nimport { HistogramDiffParams } from \"@/lib/api/profile\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\nfunction isStringDataType(columnType: string) {\n const stringDataTypes = [\n \"CHAR\",\n \"VARCHAR\",\n \"TINYTEXT\",\n \"TEXT\",\n \"MEDIUMTEXT\",\n \"LONGTEXT\",\n \"NCHAR\",\n \"NVARCHAR\",\n \"VARCHAR2\",\n \"NVARCHAR2\",\n \"CLOB\",\n \"NCLOB\",\n \"VARCHAR(MAX)\",\n \"XML\",\n \"JSON\",\n ];\n // Normalize columnType by removing spaces and converting to uppercase\n const normalizedType = columnType.trim().toUpperCase();\n\n // Check if columnType is in the predefined list\n if (stringDataTypes.includes(normalizedType)) {\n return true;\n }\n\n // Match types that have a length specification (e.g., VARCHAR(255))\n const regex = /^(VARCHAR|NVARCHAR|VARCHAR2|NVARCHAR2|CHAR|NCHAR)\\(\\d+\\)$/;\n return regex.test(normalizedType);\n}\n\nfunction isBooleanDataType(columnType: string) {\n const booleanDataTypes = [\n \"BOOLEAN\", // PostgreSQL, SQLite, and others with native boolean support\n \"TINYINT(1)\", // MySQL/MariaDB uses TINYINT(1) to represent boolean values\n \"BIT\", // SQL Server and others use BIT to represent boolean values, where 1 is true and 0 is false\n \"NUMBER(1)\", // Oracle uses NUMBER(1) where 1 is true and 0 is false, as it does not have a native BOOLEAN type\n \"BOOL\", // Snowflake and PostgreSQL also support BOOL as an alias for BOOLEAN\n ];\n return booleanDataTypes.includes(columnType.toUpperCase());\n}\n\nfunction isDateTimeType(columnType: string) {\n const sql_datetime_types = [\n \"DATE\",\n \"DATETIME\",\n \"TIMESTAMP\",\n \"TIME\",\n \"YEAR\", // Specific to MySQL/MariaDB\n \"DATETIME2\",\n \"SMALLDATETIME\",\n \"DATETIMEOFFSET\", // Specific to SQL Server\n \"INTERVAL\", // Common in PostgreSQL and Oracle\n \"TIMESTAMPTZ\",\n \"TIMETZ\", // Specific to PostgreSQL\n \"TIMESTAMP WITH TIME ZONE\",\n \"TIMESTAMP WITH LOCAL TIME ZONE\", // Oracle\n \"TIMESTAMP_LTZ\",\n \"TIMESTAMP_NTZ\",\n \"TIMESTAMP_TZ\", // Specific to Snowflake\n ];\n return sql_datetime_types.includes(columnType.toUpperCase());\n}\n\ntype HistogramDiffEditProps = RunFormProps<HistogramDiffParams>;\n\nexport function supportsHistogramDiff(columnType: string) {\n return (\n !isStringDataType(columnType) &&\n !isBooleanDataType(columnType) &&\n !isDateTimeType(columnType)\n );\n}\n\nexport function HistogramDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: HistogramDiffEditProps) {\n const {\n columns: allColumns,\n isLoading,\n error,\n } = useModelColumns(params.model);\n const columns = allColumns.filter(\n (c) =>\n !isStringDataType(c.type) &&\n !isBooleanDataType(c.type) &&\n !isDateTimeType(c.type),\n );\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (allColumns.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Box m=\"16px\">\n <Field.Root>\n <Field.Label>Pick a column to show Histogram Diff</Field.Label>\n <NativeSelect.Root disabled={columns.length === 0}>\n <NativeSelect.Field\n value={params.column_name}\n onChange={(e) => {\n const columnName = e.target.value;\n setIsReadyToExecute(!!columnName);\n const columnType =\n columns.find((c) => c.name === columnName)?.type ?? \"\";\n onParamsChanged({\n ...params,\n column_name: columnName,\n column_type: columnType,\n });\n }}\n placeholder={\n columns.length !== 0\n ? \"Select column\"\n : \"No numeric column is available\"\n }\n >\n {columns.map((c) => (\n <option key={c.name} value={c.name} className=\"no-track-pii-safe\">\n {c.name} : {c.type}\n </option>\n ))}\n </NativeSelect.Field>\n <NativeSelect.Indicator />\n </NativeSelect.Root>\n </Field.Root>\n </Box>\n );\n}\n","import { formatInTimeZone } from \"@jeromefitz/date-fns-tz\";\nimport { TopKResult } from \"@/lib/api/profile\";\n\nconst NO_VALUE = \"-\";\n\n/**\n * \"Formatters\" -- these are your data formatting that returns a formatted value for UI presentation (e.g. number, string, falsey)\n */\n\n/**\n * Source: https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript\n * @param bytes\n * @param decimals\n * @returns a string that matches nearest byte unit (e.g. kb, mb, gb, etc)\n */\nexport function formatBytes(bytes?: number, decimals = 2) {\n if (bytes === undefined) return;\n if (!bytes) return \"0 Bytes\";\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return `${parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} ${sizes[i]}`;\n}\n/**\n * @param dateStr ISO date string\n * @returns a formatted date string in 'yyyy/MM/dd HH:mm:ss'\n */\nexport function formatReportTime(dateStr?: string) {\n if (!dateStr) return;\n const date = new Date(dateStr);\n const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\n return formatInTimeZone(date, userTimezone, \"yyyy-MM-dd HH:mm:ss zzz\");\n}\n\n/**\n *\n * @param num number type input\n * @param locales locale string\n * @param options\n * @returns a formatted string number, based on locale & options\n */\nexport function formatNumber(\n num: number | string | undefined,\n locales = \"en-US\",\n options?: Intl.NumberFormatOptions,\n) {\n if (typeof num !== \"number\") return num;\n return new Intl.NumberFormat(locales, options).format(num);\n}\n\n/**\n * @param num fractional number type input\n * @returns a formatted percentage string, based on its percentage proximity to either ends (<0.1% and >99.9%)\n */\nexport function formatIntervalMinMax(num: number) {\n // * should show <0.1 % if the value is between (0%, 0.1%]\n const isLowerBound = num > 0 && num <= 0.001;\n // * should show >99.9% if the value is between [99.9%, 100%) .\n const isUpperBound = num < 1 && num >= 0.999;\n\n const formatter = (newArg = num) =>\n formatNumber(newArg, \"en-US\", {\n style: \"percent\",\n minimumFractionDigits: 1,\n });\n\n if (isLowerBound) {\n const result = formatter(0.001);\n return `<${result}`;\n } else if (isUpperBound) {\n const result = formatter(0.999);\n return `>${result}`;\n }\n return formatter();\n}\n\n// SR side: No need for object record handling\n// CR side: needs record handling\nexport function formatTestExpectedOrActual(value?: unknown): unknown {\n if (!value) {\n return NO_VALUE;\n }\n\n // Needed due to comparison's get assertions DS\n if (typeof value === \"object\") {\n return JSON.stringify(value);\n // return Object.keys(value).map((key) =>\n // typeof value[key] === 'string' ? value[key] : JSON.stringify(value[key]),\n // );\n }\n\n return value;\n}\n\n/**\n show the most common values (aka Mode)\n * give null if type invalids\n * skip null value\n * show top 2 if the values share the same counting, examples:\n (more than 2) a:100, b:100, c:100 => a, b, ...\n (2) a:100, b:100 => a\n (2) null:100, a:100, b:100 => a, b\n (2) null:101, a:100, b:100 => a, b\n (2) a:100, b:100 => a, b\n (1) a:100 => a\n (1) a:100, b:99, c:99 => a\n */\nexport function formatTopKMetrics(topK?: TopKResult): {\n topValues?: string;\n topCounts?: string;\n} {\n if (!topK) return {};\n const { counts, values } = topK;\n const topValues = `${values[0]}`;\n const topCounts = `${counts[0]}`;\n\n return {\n topValues,\n topCounts,\n };\n}\n\n/**\n * A method to handle falsey non-numbers (relevant for comparison reports with column shifts, where base/target values can be undefined)\n * @param value {string | number} any value that will be checked as number\n * @param fn {function} any function to format the valid number\n * @param emptyLabel {string} the return value if falsey value\n */\nexport function formatColumnValueWith(\n value: string | number,\n fn: (input: number) => string,\n emptyLabel: string = NO_VALUE,\n): string {\n if (typeof value === \"string\") return value;\n return isNaN(value) ? emptyLabel : fn(value);\n}\n\n/**\n *\n * @param input string to check for truncation with '...'\n * @param end position at which to truncate\n * @returns original or tooltip-wrapped truncated string\n */\nexport function formatTruncateString(input: string, end: number) {\n const shouldTruncate = input.length >= end;\n return shouldTruncate ? input.slice(0, end) + \"...\" : input;\n}\n/**\n * base < -2 => 2dp, scientific (small decimals)\n * base < 0 => 3dp (big decimals)\n * base < 3 => 2dp (ones, tens, hundreds)\n * base < 6 => 1dp, K (thousands)\n * base < 9 => 1dp, M (millions)\n * base < 12 => 1dp, T (trillions)\n * base < 15 => 1dp, B (billions)\n * base >= 15 => 0dp, B (billions)\n * @param input\n * @returns a formatted number by abbreviation, based on its order of magnitude\n */\nexport function formatAsAbbreviatedNumber(input: number | string) {\n // type guard for numbers (e.g. datetime strings)\n if (typeof input !== \"number\") return input;\n else {\n // convert negatives\n const inputAsPositive = Math.abs(input);\n\n const twoDecimal = 10 ** -2;\n const thousand = 10 ** 3;\n const million = 10 ** 6;\n const billion = 10 ** 9;\n const trillion = 10 ** 12;\n const trillionPlus = 10 ** 15;\n\n const isLargeFractionals = inputAsPositive >= twoDecimal;\n const isOnesTensHundreds = inputAsPositive >= 1;\n const isThousands = inputAsPositive >= thousand;\n const isMillions = inputAsPositive >= million;\n const isBillions = inputAsPositive >= billion;\n const isSmallTrillions = inputAsPositive >= trillion;\n const isLargeTrillions = inputAsPositive >= trillionPlus;\n\n // format as 'T' and beyond (trillions+)\n if (isLargeTrillions || isSmallTrillions)\n return new Intl.NumberFormat(\"en-US\", {\n style: \"unit\",\n unit: \"liter\", //just a placeholder\n unitDisplay: \"narrow\",\n maximumFractionDigits: isLargeTrillions ? 0 : 2,\n })\n .format(input / 1.0e12)\n .replace(\"L\", \"T\");\n // format as 'B', 'M', 'K' (billions to thousands)\n else if (isBillions || isMillions || isThousands) {\n const lookup = {\n base: isBillions ? billion : isMillions ? million : thousand,\n unit: isBillions ? \"B\" : isMillions ? \"M\" : \"K\",\n };\n return new Intl.NumberFormat(\"en-US\", {\n style: \"unit\",\n unit: \"liter\", //just a placeholder\n unitDisplay: \"narrow\",\n maximumFractionDigits: 1,\n })\n .format(input / lookup.base)\n .replace(\"L\", lookup.unit);\n }\n // format as unlabeled (1 to 999)\n else if (isOnesTensHundreds)\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: 2,\n }).format(input);\n // format as fractionals (< 1)\n else\n return new Intl.NumberFormat(\"en-US\", {\n maximumFractionDigits: isLargeFractionals ? 3 : 2,\n notation:\n isLargeFractionals || inputAsPositive === 0\n ? \"standard\"\n : \"scientific\",\n }).format(input);\n }\n}\n\n/**\n * formats as 'Category' instead of 'category' or 'CATEGORY'\n */\nexport function formatTitleCase(input?: string) {\n if (!input) return NO_VALUE;\n const start = input.slice(0, 1).toUpperCase();\n const rest = input.slice(1).toLowerCase();\n return `${start}${rest}`;\n}\n","import { Box } from \"@chakra-ui/react\";\n\nexport const CURRENT_BAR_COLOR = \"#63B3ED\";\nexport const BASE_BAR_COLOR = \"#F6AD55\";\nexport const CURRENT_BAR_COLOR_WITH_ALPHA = `${CURRENT_BAR_COLOR}A5`;\nexport const BASE_BAR_COLOR_WITH_ALPHA = `${BASE_BAR_COLOR}A5`;\n\nexport function SquareIcon({ color }: { color: string }) {\n return (\n <Box\n display=\"inline-block\"\n w=\"10px\"\n h=\"10px\"\n bgColor={color}\n mr=\"2\"\n borderRadius=\"sm\"\n ></Box>\n );\n}\n","import {\n AnimationOptions,\n BarElement,\n CategoryScale,\n ChartData,\n Chart as ChartJS,\n ChartOptions,\n Legend,\n LinearScale,\n ScaleOptions,\n TimeSeriesScale,\n Title,\n Tooltip,\n} from \"chart.js\";\nimport { Chart } from \"react-chartjs-2\";\nimport { HistogramResult } from \"@/lib/api/profile\";\nimport {\n formatAsAbbreviatedNumber,\n formatIntervalMinMax,\n} from \"@/utils/formatters\";\nimport {\n BASE_BAR_COLOR_WITH_ALPHA,\n CURRENT_BAR_COLOR_WITH_ALPHA,\n} from \"./SquareIcon\";\n\nexport const INFO_VAL_COLOR = \"#63B3ED\";\nexport const DATE_RANGE = \"Date Range\";\nexport const TEXTLENGTH = \"Text Length\";\nexport const VALUE_RANGE = \"Value Range\";\n\n/**\n * Histogram Chart that can display generic data types such as Numeric, Datetime, Integer\n * X: The Min/Max of the labels range is the scaled width of charting area\n * Y: The Min/Max of the counts range is the scaled height of charting area\n * Counts: Abbreviated based on K, Mn, Bn, Tr (see formatters)\n */\n\ninterface HistogramChartProps {\n data: {\n title: string;\n type: string;\n samples?: number;\n min?: string | number;\n max?: string | number;\n binEdges: number[];\n datasets: HistogramResult[];\n };\n animation?: AnimationOptions<\"bar\">[\"animation\"];\n hideAxis?: boolean;\n}\n\nexport function HistogramChart({\n data,\n hideAxis = false,\n animation = false,\n}: HistogramChartProps) {\n ChartJS.register(\n BarElement,\n TimeSeriesScale,\n LinearScale,\n CategoryScale,\n Title,\n Legend,\n Tooltip,\n );\n\n const chartOptions = getHistogramChartOptions(data, hideAxis, { animation });\n\n // Histograms are a mix between bar and scatter options (union)\n // uses cartesian x,y coordinates to plot and infer labels\n const chartData = getHistogramChartData(data);\n\n //infer `any` to allow for union data configurations & options\n return (\n <Chart type=\"bar\" options={chartOptions} data={chartData} plugins={[]} />\n );\n}\n\nfunction getHistogramChartDataset(\n type: string,\n binEdges: number[],\n label: string,\n color: string,\n data: HistogramResult,\n) {\n const isDatetime = type === \"datetime\";\n const { counts = [] } = data;\n const newData: (number | [number, number])[] = isDatetime\n ? counts.map((v, i) => [binEdges[i], v] as [number, number])\n : counts;\n return {\n label,\n data: newData,\n backgroundColor: color,\n borderColor: color,\n hoverBackgroundColor: color,\n borderWidth: 0,\n categoryPercentage: 1, // tells bar to fill \"bin area\"\n barPercentage: 1, //tells bar to fill \"bar area\"\n xAxisID: \"x\",\n };\n}\n\nexport function getHistogramChartData(\n data: HistogramChartProps[\"data\"],\n): ChartData<\"bar\"> {\n const { datasets, type, binEdges } = data;\n const [base, current] = datasets;\n const currentDataset = getHistogramChartDataset(\n type,\n binEdges,\n \"Current\",\n CURRENT_BAR_COLOR_WITH_ALPHA,\n current,\n );\n const baseDataset = getHistogramChartDataset(\n type,\n binEdges,\n \"Base\",\n BASE_BAR_COLOR_WITH_ALPHA,\n base,\n );\n\n const newLabels = binEdges\n .map((v, i) => formatDisplayedBinItem(binEdges, i))\n .slice(0, -1); // exclude last\n\n return {\n labels: newLabels,\n datasets: [currentDataset, baseDataset],\n };\n}\n\nexport function getHistogramChartOptions(\n data: HistogramChartProps[\"data\"],\n hideAxis = false,\n { ...configOverrides }: ChartOptions<\"bar\"> = {},\n): ChartOptions<\"bar\"> {\n const { title, datasets, type, samples = 0, binEdges } = data;\n const [base, current] = datasets;\n const isDatetime = type === \"datetime\";\n return {\n responsive: true,\n maintainAspectRatio: false,\n plugins: {\n legend: {\n reverse: true,\n },\n title: {\n display: true,\n text: title,\n font: {\n size: 20,\n },\n },\n tooltip: {\n mode: \"index\",\n // position: 'nearest',\n intersect: false,\n callbacks: {\n title([{ dataIndex, datasetIndex }]) {\n const result = formatDisplayedBinItem(binEdges, dataIndex);\n\n const prefix = isDatetime\n ? DATE_RANGE\n : type === \"string\"\n ? TEXTLENGTH\n : VALUE_RANGE;\n\n return `${prefix}\\n${result}`;\n },\n label({ datasetIndex, dataIndex, dataset: { label } }) {\n const counts = datasetIndex === 0 ? current.counts : base.counts;\n const percentOfTotal = formatIntervalMinMax(\n counts[dataIndex] / samples,\n );\n const count = counts[dataIndex];\n return `${label}: ${count} (${percentOfTotal})`;\n },\n },\n },\n },\n scales: getScales(data, hideAxis),\n ...configOverrides,\n };\n}\n/**\n * get x, y scales for histogram (dynamic based on datetime or not)\n */\nfunction getScales(\n { datasets, min = 0, max = 0, type, binEdges }: HistogramChartProps[\"data\"],\n hideAxis = false,\n) {\n const isDatetime = type === \"datetime\";\n const [base, current] = datasets;\n const maxCount = Math.max(...current.counts, ...base.counts);\n\n const newLabels = binEdges\n .map((v, i) => formatDisplayedBinItem(binEdges, i))\n .slice(0, -1); // exclude last\n\n //swap x-scale when histogram is datetime\n const xScaleDate: ScaleOptions = {\n display: !hideAxis,\n type: \"timeseries\", // each datum is spread w/ equal distance\n min,\n max,\n adapters: {\n date: {},\n },\n time: {\n minUnit: \"day\",\n },\n grid: { display: false },\n ticks: {\n minRotation: 30,\n maxRotation: 30,\n maxTicksLimit: 8,\n },\n };\n /**\n * NOTE: Category doesn't accept (min/max) -- will distort scales!\n */\n const xScaleCategory: ScaleOptions = {\n display: !hideAxis,\n type: \"category\", //Linear doesn't understand bins!\n grid: { display: false },\n ticks: {\n callback(val, index) {\n return newLabels[index];\n },\n },\n stacked: true,\n };\n const xScaleBase = isDatetime ? xScaleDate : xScaleCategory;\n\n const yScaleBase: ScaleOptions = {\n display: !hideAxis,\n type: \"linear\",\n max: maxCount, //NOTE: do not add `min` since if they are equal nothing gets displayed sometimes\n border: { dash: [2, 2] },\n grid: {\n color: \"lightgray\",\n },\n ticks: {\n maxTicksLimit: 8,\n callback: function (val) {\n //slow, but necessary since chart-data is a number and can be hard to display\n return formatAsAbbreviatedNumber(val);\n },\n },\n beginAtZero: true,\n };\n return { x: xScaleBase, y: yScaleBase };\n}\n/**\n * @returns a formatted, abbreviated, histogram bin display text\n */\nfunction formatDisplayedBinItem(binEdges: number[], currentIndex: number) {\n const startEdge = binEdges[currentIndex];\n const endEdge = binEdges[currentIndex + 1];\n\n const formattedStart = formatAsAbbreviatedNumber(startEdge);\n const formattedEnd = formatAsAbbreviatedNumber(endEdge);\n\n return `${formattedStart} - ${formattedEnd}`;\n}\n","import { Box, BoxProps } from \"@chakra-ui/react\";\nimport { forwardRef, Ref } from \"react\";\n\ninterface ScreenshotBoxProps extends BoxProps {\n backgroundColor?: string;\n blockSize?: string;\n children?: React.ReactNode;\n}\n\nexport const ScreenshotBox = forwardRef(\n (\n {\n backgroundColor = \"white\",\n blockSize,\n children,\n ...restProps\n }: ScreenshotBoxProps,\n ref: Ref<HTMLDivElement>,\n ) => {\n return (\n <Box ref={ref} {...restProps} overflowY=\"auto\" overflowX=\"hidden\">\n <Box\n backgroundColor={backgroundColor}\n height=\"100%\"\n blockSize={blockSize}\n >\n {children}\n </Box>\n </Box>\n );\n },\n);\n","import { Box, Flex, HStack, Spacer } from \"@chakra-ui/react\";\nimport { forwardRef, Ref } from \"react\";\nimport { HistogramDiffParams, HistogramDiffResult } from \"@/lib/api/profile\";\nimport { isHistogramDiffRun } from \"@/lib/api/types\";\nimport { HistogramChart } from \"../charts/HistogramChart\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ScreenshotBox } from \"../screenshot/ScreenshotBox\";\n\ntype HistogramDiffResultViewProp = RunResultViewProps;\n\nfunction _HistogramDiffResultView(\n { run }: HistogramDiffResultViewProp,\n ref: Ref<HTMLDivElement>,\n) {\n if (!isHistogramDiffRun(run)) {\n throw new Error(\"Run type must be histogram_diff\");\n }\n\n const params = run.params as HistogramDiffParams;\n const base = run.result?.base;\n const current = run.result?.current;\n const min = run.result?.min;\n const max = run.result?.max;\n const binEdges = run.result?.bin_edges ?? [];\n\n if (!base || !current) {\n return <div>Loading...</div>;\n }\n\n return (\n <Flex direction=\"column\" height=\"100%\">\n <ScreenshotBox ref={ref} height=\"100%\">\n <HStack>\n <Spacer />\n <Box w=\"80%\" h=\"35vh\" m=\"4\">\n <HistogramChart\n data={{\n title: `Model ${params.model}.${params.column_name}`,\n type: run.params?.column_type ?? \"\",\n datasets: [base, current],\n min: min,\n max: max,\n samples: base.total,\n binEdges: binEdges,\n }}\n />\n </Box>\n <Spacer />\n </HStack>\n </ScreenshotBox>\n </Flex>\n );\n}\n\nexport const HistogramDiffResultView = forwardRef(_HistogramDiffResultView);\n","import { Box, Checkbox, Field, Input, VStack } from \"@chakra-ui/react\";\nimport { Select } from \"chakra-react-select\";\nimport { useEffect, useState } from \"react\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\nexport interface ProfileDiffFormParams {\n model: string;\n primary_key?: string | (string | undefined)[];\n columns?: string[];\n}\n\ntype ProfileDiffFormProp = RunFormProps<ProfileDiffFormParams>;\n\nexport function ProfileDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: ProfileDiffFormProp) {\n const [allColumns, setAllColumns] = useState<boolean>(\n !params.columns || params.columns.length === 0,\n );\n\n const model = params.model;\n\n const { columns, isLoading, error } = useModelColumns(params.model);\n\n useEffect(() => {\n setIsReadyToExecute(!!model);\n }, [model, setIsReadyToExecute]);\n\n const columnNames = columns.map((c) => c.name);\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <VStack gap={5} m=\"8px 24px\" paddingBottom=\"200px\">\n <Field.Root>\n <Field.Label>Model</Field.Label>\n <Input readOnly value={params.model} />\n </Field.Root>\n <Field.Root>\n <Field.Label>Columns</Field.Label>\n <Checkbox.Root\n marginBottom=\"10px\"\n checked={allColumns}\n onCheckedChange={(e) => {\n setAllColumns(Boolean(e.checked));\n onParamsChanged({\n ...params,\n columns: undefined,\n });\n }}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>All columns</Checkbox.Label>\n </Checkbox.Root>\n {!allColumns && (\n <Select\n isMulti\n className=\"no-track-pii-safe\"\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(params.columns ?? []).map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(newValue) => {\n let cols: string[] | undefined;\n const newCols = newValue.map((v) => v.value);\n if (newCols.length === 0) {\n cols = undefined;\n } else {\n cols = newCols;\n }\n onParamsChanged({\n ...params,\n columns: cols,\n });\n }}\n ></Select>\n )}\n </Field.Root>\n </VStack>\n );\n}\n","import { DataFrame, RowDataTypes, RowObjectType } from \"@/lib/api/types\";\n\nexport function dataFrameToRowObjects(dataFrame: DataFrame): RowObjectType[] {\n return dataFrame.data.map((row, index) => ({\n ...dataFrame.columns.reduce<Record<string, RowDataTypes>>(\n (obj, column, colIndex) => {\n obj[column.key] = row[colIndex];\n return obj;\n },\n {},\n ),\n __status: undefined,\n _index: index + 1,\n }));\n}\n\nexport function keyToNumber(key: string): number {\n // Try to parse as a number first\n const parsed = Number(key);\n\n // Check if it's a valid number (not NaN, not Infinity)\n if (!isNaN(parsed) && isFinite(parsed)) {\n return parsed;\n }\n\n // If not a number, hash the string to a stable numeric value\n return hashStringToNumber(key);\n}\n\n/**\n * Hashes a string to a stable numeric value using a simple hash algorithm\n * Based on the Java String.hashCode() implementation\n */\nexport function hashStringToNumber(str: string): number {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n // Return absolute value to ensure positive numbers\n return Math.abs(hash);\n}\n\nexport function includesIgnoreCase(\n list: string[],\n searchString: string,\n): boolean {\n const lowerSearch = searchString.toLowerCase();\n return list.some((item) => item.toLowerCase() === lowerSearch);\n}\n\nexport function getCaseInsensitive<T extends RowObjectType>(\n obj: T,\n key: string,\n): T[keyof T] | undefined {\n const lowerKey = key.toLowerCase();\n\n // First try lowercase\n if (lowerKey in obj) {\n return obj[lowerKey as keyof T];\n }\n\n // Fall back to case-insensitive search\n const foundKey = Object.keys(obj).find((k) => k.toLowerCase() === lowerKey) as\n | keyof T\n | undefined;\n\n return foundKey ? obj[foundKey] : undefined;\n}\n\n// Get the value of an object at a given path, case-insensitively\nexport function getValueAtPath<T = RowDataTypes>(\n obj: Record<string, T | undefined>,\n path: string,\n): T | undefined {\n let col = obj[path.toLowerCase()];\n if (!col) {\n // try upper-case match\n col = obj[path.toUpperCase()];\n }\n if (!col) {\n // try fallback with strict casing match\n col = obj[path];\n }\n return col;\n}\n","/**\n * @file columnBuilders.ts\n * @description Column configuration utilities for data grids\n *\n * Provides helper functions for building column configurations.\n * Note: React components for headers are kept in diffColumnBuilder.tsx\n * to maintain separation between pure logic and React components.\n */\n\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\nimport { includesIgnoreCase } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnConfig {\n key: string;\n name: string;\n columnType: ColumnType;\n columnStatus?: string;\n columnRenderMode?: ColumnRenderMode;\n frozen?: boolean;\n isPrimaryKey?: boolean;\n}\n\nexport interface ColumnOrderConfig {\n primaryKeys: string[];\n pinnedColumns: string[];\n allColumns: string[];\n excludeColumns?: string[];\n caseInsensitive?: boolean;\n}\n\nexport interface GridColumnsConfig {\n columnMap: Record<\n string,\n { key: string; colType: ColumnType; status?: string }\n >;\n primaryKeys: string[];\n pinnedColumns: string[];\n columnsRenderMode: Record<string, ColumnRenderMode>;\n changedOnly?: boolean;\n rowStats?: { added: number; removed: number; modified: number };\n excludeColumns?: string[];\n caseInsensitive?: boolean;\n /**\n * When true, throws an error if a primary key or pinned column is not found\n * in the columnMap. When false (default), silently skips missing columns.\n *\n * - querydiff: uses false (lenient, handles schema differences)\n * - valuediff: uses true (strict, PKs must exist)\n */\n strictMode?: boolean;\n}\n\n// ============================================================================\n// Column Order Builder\n// ============================================================================\n\n/**\n * Determines the order of columns based on primary keys, pinned columns,\n * and remaining columns.\n *\n * @returns Array of column names in the correct display order\n */\nexport function buildColumnOrder(config: ColumnOrderConfig): string[] {\n const {\n primaryKeys,\n pinnedColumns,\n allColumns,\n excludeColumns = [],\n caseInsensitive = false,\n } = config;\n\n const order: string[] = [];\n const added = new Set<string>();\n\n const normalize = (s: string) => (caseInsensitive ? s.toLowerCase() : s);\n const isExcluded = (key: string) =>\n caseInsensitive\n ? includesIgnoreCase(excludeColumns, key)\n : excludeColumns.includes(key);\n\n // Add primary keys first\n primaryKeys.forEach((key) => {\n const normalizedKey = normalize(key);\n if (!added.has(normalizedKey) && !isExcluded(key)) {\n order.push(key);\n added.add(normalizedKey);\n }\n });\n\n // Add pinned columns\n pinnedColumns.forEach((key) => {\n const normalizedKey = normalize(key);\n if (!added.has(normalizedKey) && !isExcluded(key)) {\n order.push(key);\n added.add(normalizedKey);\n }\n });\n\n // Add remaining columns\n allColumns.forEach((key) => {\n const normalizedKey = normalize(key);\n if (!added.has(normalizedKey) && !isExcluded(key)) {\n order.push(key);\n added.add(normalizedKey);\n }\n });\n\n return order;\n}\n\n// ============================================================================\n// Column Filtering Helpers\n// ============================================================================\n\n/**\n * Checks if a column should be included based on changedOnly filter\n */\nexport function shouldIncludeColumn(\n columnStatus: string | undefined,\n changedOnly: boolean,\n hasModifiedRows: boolean,\n): boolean {\n if (!changedOnly || !hasModifiedRows) {\n return true;\n }\n\n return (\n columnStatus === \"added\" ||\n columnStatus === \"removed\" ||\n columnStatus === \"modified\"\n );\n}\n\n/**\n * Checks if a column is a primary key\n */\nexport function isPrimaryKeyColumn(\n columnName: string,\n primaryKeys: string[],\n caseInsensitive = false,\n): boolean {\n return caseInsensitive\n ? includesIgnoreCase(primaryKeys, columnName)\n : primaryKeys.includes(columnName);\n}\n\n/**\n * Checks if a column is pinned\n */\nexport function isPinnedColumn(\n columnName: string,\n pinnedColumns: string[],\n caseInsensitive = false,\n): boolean {\n return caseInsensitive\n ? includesIgnoreCase(pinnedColumns, columnName)\n : pinnedColumns.includes(columnName);\n}\n\n/**\n * Checks if a column should be excluded from display\n */\nexport function isExcludedColumn(\n columnName: string,\n excludeColumns: string[],\n caseInsensitive = false,\n): boolean {\n return caseInsensitive\n ? includesIgnoreCase(excludeColumns, columnName)\n : excludeColumns.includes(columnName);\n}\n\n// ============================================================================\n// Internal Helpers\n// ============================================================================\n\n/**\n * Finds a column in the columnMap, with optional case-insensitive matching\n */\nfunction findColumn(\n columnMap: GridColumnsConfig[\"columnMap\"],\n name: string,\n caseInsensitive: boolean,\n): { key: string; colType: ColumnType; status?: string } | undefined {\n if (caseInsensitive) {\n const entry = Object.entries(columnMap).find(\n ([k]) => k.toLowerCase() === name.toLowerCase(),\n );\n return entry?.[1];\n }\n return columnMap[name];\n}\n\n// ============================================================================\n// Column Configuration Helpers\n// ============================================================================\n\n/**\n * Gets the list of columns to display for a diff grid\n *\n * @description Builds an ordered list of column configurations:\n * 1. Primary key columns (frozen)\n * 2. Pinned columns\n * 3. Remaining columns (filtered by changedOnly if applicable)\n *\n * @throws {Error} When strictMode is true and a primary key or pinned column\n * is not found in the columnMap\n *\n * @example\n * ```typescript\n * // Lenient mode (querydiff) - skips missing columns\n * const columns = getDisplayColumns({\n * columnMap,\n * primaryKeys: [\"id\"],\n * pinnedColumns: [\"name\"],\n * columnsRenderMode: {},\n * strictMode: false, // default\n * });\n *\n * // Strict mode (valuediff) - throws on missing columns\n * const columns = getDisplayColumns({\n * columnMap,\n * primaryKeys: [\"id\"],\n * pinnedColumns: [\"name\"],\n * columnsRenderMode: {},\n * strictMode: true,\n * });\n * ```\n */\nexport function getDisplayColumns(config: GridColumnsConfig): ColumnConfig[] {\n const {\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly = false,\n rowStats,\n excludeColumns = [],\n caseInsensitive = false,\n strictMode = false,\n } = config;\n\n const hasModifiedRows = (rowStats?.modified ?? 0) > 0;\n const columns: ColumnConfig[] = [];\n\n // Add primary key columns first\n primaryKeys.forEach((name) => {\n const col = findColumn(columnMap, name, caseInsensitive);\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Primary key column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n isPrimaryKey: true,\n });\n });\n\n // Add pinned columns\n pinnedColumns.forEach((name) => {\n if (isPrimaryKeyColumn(name, primaryKeys, caseInsensitive)) return;\n if (isExcludedColumn(name, excludeColumns, caseInsensitive)) return;\n\n const col = findColumn(columnMap, name, caseInsensitive);\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Pinned column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n // Add remaining columns\n Object.entries(columnMap).forEach(([name, col]) => {\n if (isPrimaryKeyColumn(name, primaryKeys, caseInsensitive)) return;\n if (isPinnedColumn(name, pinnedColumns, caseInsensitive)) return;\n if (isExcludedColumn(name, excludeColumns, caseInsensitive)) return;\n\n if (!shouldIncludeColumn(col.status, changedOnly, hasModifiedRows)) {\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnStatus: col.status,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n return columns;\n}\n\n/**\n * Gets the list of columns for a simple (non-diff) grid\n */\nexport function getSimpleDisplayColumns(\n config: Omit<GridColumnsConfig, \"changedOnly\" | \"rowStats\">,\n): ColumnConfig[] {\n const {\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n excludeColumns = [],\n strictMode = false,\n } = config;\n\n const columns: ColumnConfig[] = [];\n\n // Add primary key columns first\n primaryKeys.forEach((name) => {\n const col = columnMap[name];\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Primary key column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: name,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n frozen: true,\n isPrimaryKey: true,\n });\n });\n\n // Add pinned columns\n pinnedColumns.forEach((name) => {\n if (primaryKeys.includes(name)) return;\n if (excludeColumns.includes(name)) return;\n\n const col = columnMap[name];\n\n if (!col) {\n if (strictMode) {\n throw new Error(`Pinned column \"${name}\" not found in columnMap`);\n }\n return;\n }\n\n columns.push({\n key: col.key,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n // Add remaining columns\n Object.entries(columnMap).forEach(([name, col]) => {\n if (primaryKeys.includes(name)) return;\n if (pinnedColumns.includes(name)) return;\n if (excludeColumns.includes(name)) return;\n\n columns.push({\n key: col.key,\n name,\n columnType: col.colType,\n columnRenderMode: columnsRenderMode[name],\n });\n });\n\n return columns;\n}\n","import { ColumnRenderMode } from \"../../lib/api/types\";\n\nexport function columnPrecisionSelectOptions(\n colName: string,\n onColumnsRenderModeChanged: (col: Record<string, ColumnRenderMode>) => void,\n): { value: string; onClick: () => void }[] {\n return [\n {\n value: \"Show raw value\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: \"raw\" });\n },\n },\n {\n value: \"Show 2 decimal points\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: 2 });\n },\n },\n {\n value: \"Show 4 decimal points\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: 4 });\n },\n },\n {\n value: \"Show 6 decimal points\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: 6 });\n },\n },\n {\n value: \"Show as percentage\",\n onClick: () => {\n onColumnsRenderModeChanged({ [colName]: \"percent\" });\n },\n },\n ];\n}\n","/**\n * @file DataFrameColumnGroupHeader.tsx\n * @description Column group header component for DataGrid with pin/primary key controls\n *\n * Provides interactive column header with:\n * - Primary key indicator and toggle\n * - Pin/unpin column functionality\n * - Number column precision options menu\n */\n\nimport { Box, Flex, Icon, IconButton, Menu, Portal } from \"@chakra-ui/react\";\nimport React from \"react\";\nimport {\n VscClose,\n VscKebabVertical,\n VscKey,\n VscPin,\n VscPinned,\n} from \"react-icons/vsc\";\nimport { columnPrecisionSelectOptions } from \"@/components/valuediff/shared\";\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\nimport { includesIgnoreCase } from \"@/utils/transforms\";\n\n/**\n * Props for the DataFrameColumnGroupHeader component\n */\nexport interface DataFrameColumnGroupHeaderProps {\n /** Column name to display */\n name: string;\n /** Column diff status: 'added', 'removed', 'modified', or empty string */\n columnStatus: string;\n /** Column data type for determining available options */\n columnType: ColumnType;\n /** List of current primary key column names */\n primaryKeys?: string[];\n /** Callback when primary keys change (enables PK toggle functionality) */\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n /** List of currently pinned column names */\n pinnedColumns?: string[];\n /** Callback when pinned columns change */\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n /** Callback when column render mode changes */\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n /** Use case-insensitive matching for primary keys and pinned columns */\n caseInsensitive?: boolean;\n}\n\n/**\n * Column group header with interactive controls\n *\n * @description Renders a column header with:\n * - Primary key icon (VscKey) when column is a primary key\n * - Primary key add/remove toggle (when onPrimaryKeyChange is provided and column can be a PK)\n * - Pin/unpin toggle (when onPinnedColumnsChange is provided and column is not a PK)\n * - Precision options menu for number columns\n *\n * The component supports two modes based on props:\n * 1. Query diff mode (querydiff.ts): Allows PK toggling, uses exact string matching\n * 2. Value diff mode (valuediff.ts): Display-only PK icon, uses case-insensitive matching\n *\n * @example\n * // Query diff mode with PK toggle\n * <DataFrameColumnGroupHeader\n * name=\"user_id\"\n * columnStatus=\"\"\n * columnType=\"number\"\n * primaryKeys={['id']}\n * onPrimaryKeyChange={setPrimaryKeys}\n * pinnedColumns={[]}\n * onPinnedColumnsChange={setPinnedColumns}\n * />\n *\n * @example\n * // Value diff mode with case-insensitive matching\n * <DataFrameColumnGroupHeader\n * name=\"User_ID\"\n * columnStatus=\"modified\"\n * columnType=\"number\"\n * primaryKeys={['user_id']}\n * pinnedColumns={[]}\n * onPinnedColumnsChange={setPinnedColumns}\n * caseInsensitive\n * />\n */\nexport function DataFrameColumnGroupHeader({\n name,\n columnStatus,\n columnType,\n primaryKeys = [],\n onPrimaryKeyChange,\n pinnedColumns = [],\n onPinnedColumnsChange,\n onColumnsRenderModeChanged,\n caseInsensitive = false,\n}: DataFrameColumnGroupHeaderProps) {\n // Skip rendering for index column\n if (name === \"index\") {\n return <></>;\n }\n\n // Determine if column is a primary key or pinned\n const isPK = caseInsensitive\n ? includesIgnoreCase(primaryKeys, name)\n : primaryKeys.includes(name);\n\n const isPinned = caseInsensitive\n ? includesIgnoreCase(pinnedColumns, name)\n : pinnedColumns.includes(name);\n\n // Column can be a PK only if it's not added/removed (for diff scenarios)\n const canBePk = columnStatus !== \"added\" && columnStatus !== \"removed\";\n\n // Build precision options for number columns\n let selectOptions: { value: string; onClick: () => void }[] = [];\n if (onColumnsRenderModeChanged) {\n selectOptions = columnPrecisionSelectOptions(\n name,\n onColumnsRenderModeChanged,\n );\n }\n\n // Primary key handlers\n const handleRemovePk = () => {\n if (!onPrimaryKeyChange) return;\n const newPrimaryKeys = caseInsensitive\n ? primaryKeys.filter((item) => item.toLowerCase() !== name.toLowerCase())\n : primaryKeys.filter((item) => item !== name);\n onPrimaryKeyChange(newPrimaryKeys);\n };\n\n const handleAddPk = () => {\n if (!onPrimaryKeyChange) return;\n const newPrimaryKeys = [\n ...primaryKeys.filter((item) => item !== \"index\"),\n name,\n ];\n onPrimaryKeyChange(newPrimaryKeys);\n };\n\n // Pin/unpin handlers\n const handleUnpin = () => {\n if (!onPinnedColumnsChange) return;\n const newPinnedColumns = caseInsensitive\n ? pinnedColumns.filter(\n (item) => item.toLowerCase() !== name.toLowerCase(),\n )\n : pinnedColumns.filter((item) => item !== name);\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n const handlePin = () => {\n if (!onPinnedColumnsChange) return;\n const newPinnedColumns = [...pinnedColumns, name];\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n return (\n <Flex alignItems=\"center\" gap=\"10px\" className=\"grid-header\">\n {/* Primary key icon */}\n {isPK && <Icon as={VscKey} />}\n\n {/* Column name */}\n <Box\n flex={1}\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n {name}\n </Box>\n\n {/* Primary key toggle (only when onPrimaryKeyChange is provided) */}\n {canBePk && onPrimaryKeyChange && (\n <Icon\n className={isPK ? \"close-icon\" : \"key-icon\"}\n display={isPK ? \"block\" : \"none\"}\n cursor=\"pointer\"\n as={isPK ? VscClose : VscKey}\n onClick={isPK ? handleRemovePk : handleAddPk}\n />\n )}\n\n {/* Pin/unpin toggle (only for non-PK columns when callback is provided) */}\n {!isPK && onPinnedColumnsChange && (\n <Icon\n className={isPinned ? \"unpin-icon\" : \"pin-icon\"}\n display={isPinned ? \"block\" : \"none\"}\n cursor=\"pointer\"\n as={isPinned ? VscPinned : VscPin}\n onClick={isPinned ? handleUnpin : handlePin}\n />\n )}\n\n {/* Precision menu for number columns (only for non-PK columns) */}\n {!isPK && columnType === \"number\" && selectOptions.length > 0 && (\n <Menu.Root>\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"Options\"\n variant=\"plain\"\n className=\"!size-4 !min-w-4\"\n >\n <VscKebabVertical />\n </IconButton>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {selectOptions.map((o) => (\n <Menu.Item key={o.value} value={o.value} onClick={o.onClick}>\n {o.value}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </Flex>\n );\n}\n","import { Box, Flex, Icon, IconButton, Menu, Portal } from \"@chakra-ui/react\";\nimport { PiDotsThreeVertical } from \"react-icons/pi\";\nimport { VscPin, VscPinned } from \"react-icons/vsc\";\nimport { columnPrecisionSelectOptions } from \"@/components/valuediff/shared\";\nimport { ColumnRenderMode, ColumnType } from \"@/lib/api/types\";\n\n/**\n * Props for the DataFrameColumnHeader component\n */\nexport interface DataFrameColumnHeaderProps {\n /** Column name to display */\n name: string;\n /** Column data type for determining available options */\n columnType: ColumnType;\n /** List of currently pinned column names */\n pinnedColumns?: string[];\n /** Callback when pinned columns change */\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n /** Callback when column render mode changes */\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n}\n\nexport function DataFrameColumnHeader({\n name,\n pinnedColumns = [],\n onPinnedColumnsChange = () => {\n return void 0;\n },\n columnType,\n onColumnsRenderModeChanged,\n}: DataFrameColumnHeaderProps) {\n let selectOptions: { value: string; onClick: () => void }[] = [];\n if (onColumnsRenderModeChanged) {\n selectOptions = columnPrecisionSelectOptions(\n name,\n onColumnsRenderModeChanged,\n );\n }\n\n const isPinned = pinnedColumns.includes(name);\n\n const handleUnpin = () => {\n const newPinnedColumns = pinnedColumns.filter((item) => item !== name);\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n const handlePin = () => {\n const newPinnedColumns = [...pinnedColumns, name];\n onPinnedColumnsChange(newPinnedColumns);\n };\n\n return (\n <Flex className=\"grid-header\" alignItems=\"center\">\n <Box flex={1}>{name}</Box>\n\n <Icon\n className={isPinned ? \"unpin-icon\" : \"pin-icon\"}\n display={isPinned ? \"block\" : \"none\"}\n cursor=\"pointer\"\n as={isPinned ? VscPinned : VscPin}\n onClick={isPinned ? handleUnpin : handlePin}\n />\n {columnType === \"number\" && (\n <Menu.Root>\n <Menu.Trigger asChild>\n <IconButton\n aria-label=\"Options\"\n variant=\"plain\"\n className=\"!size-4 !min-w-4\"\n >\n <PiDotsThreeVertical />\n </IconButton>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {selectOptions.map((o) => (\n <Menu.Item key={o.value} value={o.value} onClick={o.onClick}>\n {o.value}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </Flex>\n );\n}\n","export function mergeKeys(_base: string[], _curr: string[]) {\n // Merge keys from base, target tables. Unlike default union, it preserves the order for column rename, added, removed.\n const base = [..._base];\n const curr = [..._curr];\n\n const results: string[] = [];\n while (base.length > 0 && curr.length > 0) {\n if (results.includes(base[0])) {\n base.shift();\n } else if (results.includes(curr[0])) {\n curr.shift();\n } else if (base[0] === curr[0]) {\n results.push(base[0]);\n base.shift();\n curr.shift();\n } else if (curr.includes(base[0])) {\n const idx = curr.indexOf(base[0]);\n for (let i = 0; i < idx; i++) {\n if (!results.includes(curr[i])) {\n results.push(curr[i]);\n }\n }\n results.push(base[0]);\n base.shift();\n curr.splice(0, idx + 1);\n } else {\n results.push(base[0]);\n base.shift();\n }\n }\n\n base.forEach((key) => {\n if (!results.includes(key)) {\n results.push(key);\n }\n });\n\n curr.forEach((key) => {\n if (!results.includes(key)) {\n results.push(key);\n }\n });\n\n return results;\n}\n\ntype MergeStatus = \"added\" | \"removed\" | \"reordered\" | undefined;\n\nexport function mergeKeysWithStatus(\n _base: string[],\n _curr: string[],\n): Record<string, MergeStatus> {\n const merged = mergeKeys(_base, _curr);\n const result: ReturnType<typeof mergeKeysWithStatus> = {};\n\n for (const item of merged) {\n if (!_base.includes(item)) {\n result[item] = \"added\";\n } else if (!_curr.includes(item)) {\n result[item] = \"removed\";\n } else {\n result[item] = undefined;\n }\n }\n\n // reorder case\n const baseIndexMap: Record<string, number | undefined> = {};\n _base.forEach((item, index) => {\n baseIndexMap[item] = index;\n });\n let last = -1;\n for (const item of merged) {\n const curr = baseIndexMap[item];\n if (curr == null) {\n continue;\n }\n\n if (curr > last) {\n last = curr;\n } else {\n result[item] = \"reordered\";\n }\n }\n\n return result;\n}\n","/**\n * @file gridUtils.ts\n * @description Shared utilities for data grid generation\n *\n * This module contains common functions used across all grid generation methods.\n */\n\nimport _ from \"lodash\";\nimport {\n ColumnRenderMode,\n ColumnType,\n DataFrame,\n RowObjectType,\n} from \"@/lib/api/types\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\nimport { formatNumber } from \"@/utils/formatters\";\nimport { getCaseInsensitive, includesIgnoreCase } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ColumnMapEntry {\n key: string;\n colType: ColumnType;\n status?: string;\n index?: number;\n}\n\nexport interface MergeColumnMapEntry extends ColumnMapEntry {\n baseColumnKey: string;\n currentColumnKey: string;\n}\n\nexport interface RowStats {\n added: number;\n removed: number;\n modified: number;\n}\n\n// ============================================================================\n// Column Map Builders\n// ============================================================================\n\n/**\n * Builds a column map from a single DataFrame\n */\nexport function buildColumnMap(df: DataFrame): Record<string, ColumnMapEntry> {\n const result: Record<string, ColumnMapEntry> = {};\n df.columns.forEach((col, index) => {\n result[col.name] = {\n key: col.key,\n index,\n colType: col.type,\n };\n });\n return result;\n}\n\n/**\n * Builds a column map for joined data (with IN_A/IN_B columns)\n * Handles case-insensitivity for special columns\n */\nexport function buildJoinedColumnMap(\n df: DataFrame,\n): Record<string, ColumnMapEntry> {\n const result: Record<string, ColumnMapEntry> = {};\n df.columns.forEach((col, index) => {\n // Handle IN_A/IN_B specially for case-insensitive matching\n if (\n col.name.toLowerCase() === \"in_a\" ||\n col.name.toLowerCase() === \"in_b\"\n ) {\n result[col.name.toUpperCase()] = {\n key: col.key,\n index,\n colType: col.type,\n };\n result[col.name.toLowerCase()] = {\n key: col.key,\n index,\n colType: col.type,\n };\n } else {\n result[col.name] = { key: col.key, index, colType: col.type };\n }\n });\n return result;\n}\n\n/**\n * Builds a merged column map from two DataFrames\n * Tracks status (added/removed/unchanged) for each column\n */\nexport function buildMergedColumnMap(\n base: DataFrame,\n current: DataFrame,\n): Record<string, MergeColumnMapEntry> {\n const result: Record<string, MergeColumnMapEntry> = {};\n\n const mapStatus = mergeKeysWithStatus(\n base.columns.map((col) => col.key),\n current.columns.map((col) => col.key),\n ) as Record<string, string>;\n\n Object.entries(mapStatus).forEach(([key, status]) => {\n const baseColumn = base.columns.find((c) => c.key === key);\n const currentColumn = current.columns.find((c) => c.key === key);\n result[key] = {\n status,\n baseColumnKey: baseColumn?.key ?? \"unknown\",\n currentColumnKey: currentColumn?.key ?? \"unknown\",\n colType: baseColumn?.type ?? currentColumn?.type ?? \"unknown\",\n key: baseColumn?.key ?? currentColumn?.key ?? \"unknown\",\n };\n });\n\n return result;\n}\n\n// ============================================================================\n// Primary Key Utilities\n// ============================================================================\n\n/**\n * Validates that all primary keys exist in the columns\n */\nexport function validatePrimaryKeys(\n columns: DataFrame[\"columns\"],\n primaryKeys: string[],\n caseInsensitive = false,\n): string[] {\n const keys: string[] = [];\n for (const key of primaryKeys) {\n const found = caseInsensitive\n ? columns.find((col) => includesIgnoreCase([col.key], key))\n : columns.find((col) => col.key === key);\n\n if (!found) {\n throw new Error(`Column ${key} not found`);\n }\n keys.push(found.key);\n }\n return keys;\n}\n\n/**\n * Generates a unique key string from primary key values in a row\n */\nexport function getPrimaryKeyValue(\n columns: DataFrame[\"columns\"],\n primaryKeys: string[],\n row: RowObjectType,\n caseInsensitive = false,\n): string {\n if (primaryKeys.length === 0) {\n return String(row._index);\n }\n\n const result: string[] = [];\n for (const key of primaryKeys) {\n const col = caseInsensitive\n ? columns.find((c) => includesIgnoreCase([c.key], key))\n : columns.find((c) => c.key === key);\n\n if (!col) {\n throw new Error(`Primary Column ${key} not found`);\n }\n\n const value = caseInsensitive\n ? (getCaseInsensitive(row, key) ?? \"\")\n : row[key];\n\n result.push(`${col.name}=${value}`);\n }\n return result.join(\"|\");\n}\n\n// ============================================================================\n// Row Status Detection\n// ============================================================================\n\n/**\n * Determines the status of a row (added/removed/modified/unchanged)\n *\n * Supports two modes:\n * 1. Separate rows: baseRow and currentRow are different objects\n * 2. Merged rows: baseRow === currentRow, with values stored as base__key and current__key\n */\nexport function determineRowStatus(\n baseRow: RowObjectType | undefined,\n currentRow: RowObjectType | undefined,\n columnMap: Record<string, ColumnMapEntry>,\n primaryKeys: string[],\n caseInsensitive = false,\n): \"added\" | \"removed\" | \"modified\" | undefined {\n if (!baseRow) return \"added\";\n if (!currentRow) return \"removed\";\n\n // Check if this is a merged row (same object passed for both)\n const isMergedRow = baseRow === currentRow;\n\n // Check for modifications in non-PK columns\n for (const [name, column] of Object.entries(columnMap)) {\n if (name === \"index\") continue;\n\n const isPK = caseInsensitive\n ? includesIgnoreCase(primaryKeys, name)\n : primaryKeys.includes(name);\n\n if (isPK) continue;\n\n let baseVal: unknown;\n let currentVal: unknown;\n\n if (isMergedRow) {\n // Merged row: compare base__key vs current__key\n const baseKey = `base__${column.key}`;\n const currentKey = `current__${column.key}`;\n\n baseVal = caseInsensitive\n ? getCaseInsensitive(baseRow, baseKey)\n : baseRow[baseKey];\n currentVal = caseInsensitive\n ? getCaseInsensitive(currentRow, currentKey)\n : currentRow[currentKey];\n } else {\n // Separate rows: compare same key in different row objects\n baseVal = caseInsensitive\n ? getCaseInsensitive(baseRow, column.key)\n : baseRow[column.key];\n currentVal = caseInsensitive\n ? getCaseInsensitive(currentRow, column.key)\n : currentRow[column.key];\n }\n\n if (!_.isEqual(baseVal, currentVal)) {\n return \"modified\";\n }\n }\n\n return undefined;\n}\n\n// ============================================================================\n// Value Rendering Utilities\n// ============================================================================\n\n/**\n * Formats a numeric value based on render mode\n *\n * Handles special values:\n * - NaN: Returns \"NaN\" (no formatting applied)\n * - Infinity: Returns \"∞\" or \"-∞\" (no formatting applied)\n */\nexport function columnRenderedValue(\n value: number,\n renderMode: ColumnRenderMode,\n): string {\n // Handle special numeric values first\n if (Number.isNaN(value)) {\n return \"NaN\";\n }\n\n if (!Number.isFinite(value)) {\n return value > 0 ? \"∞\" : \"-∞\";\n }\n\n const locale = \"en-US\";\n\n if (typeof renderMode === \"number\") {\n return (\n formatNumber(value, locale, {\n maximumFractionDigits: renderMode,\n minimumFractionDigits: renderMode,\n }) ?? String(value)\n );\n }\n\n if (renderMode === \"percent\") {\n return (\n formatNumber(value, locale, {\n style: \"percent\",\n maximumFractionDigits: 2,\n }) ?? String(value)\n );\n }\n\n return String(value);\n}\n\n/**\n * Converts a row value to a rendered string with gray-out indicator\n */\nexport function toRenderedValue(\n row: RowObjectType,\n key: string,\n columnType?: ColumnType,\n columnRenderMode: ColumnRenderMode = \"raw\",\n): [string, boolean] {\n const value = getCaseInsensitive(row, key);\n\n if (value == null) {\n return [\"-\", true];\n }\n\n let renderedValue: string;\n let grayOut = false;\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof value === \"boolean\") {\n // workaround for https://github.com/adazzle/react-data-grid/issues/882\n renderedValue = value.toString();\n } else if (value === \"\") {\n renderedValue = \"(empty)\";\n grayOut = true;\n } else if (typeof value === \"number\") {\n renderedValue = columnRenderedValue(value, columnRenderMode);\n } else {\n if (columnType === \"number\") {\n renderedValue = columnRenderedValue(parseFloat(value), columnRenderMode);\n } else {\n renderedValue = String(value);\n }\n }\n\n return [renderedValue, grayOut];\n}\n\n// ============================================================================\n// Cell Class Utilities\n// ============================================================================\n\n/**\n * Gets the CSS class for a cell based on row and column status\n */\nexport function getCellClass(\n row: RowObjectType,\n columnStatus: string | undefined,\n columnKey: string,\n isBase: boolean,\n): string | undefined {\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\") return undefined;\n\n const baseKey = `base__${columnKey}`.toLowerCase();\n const currentKey = `current__${columnKey}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return isBase ? \"diff-cell-removed\" : \"diff-cell-added\";\n }\n\n return undefined;\n}\n\n/**\n * Gets the CSS class for a header cell based on column status\n */\nexport function getHeaderCellClass(\n columnStatus: string | undefined,\n): string | undefined {\n if (columnStatus === \"added\") return \"diff-header-added\";\n if (columnStatus === \"removed\") return \"diff-header-removed\";\n return undefined;\n}\n","/**\n * @file defaultRenderCell.tsx\n * @description Default cell renderer for DataGrid columns\n *\n * Renders a cell value with optional column type formatting and gray-out styling.\n * Used for standard (non-diff) cell rendering in data grids.\n *\n * NOTE: Imports directly from gridUtils.ts to avoid circular dependency\n * with toDiffColumn.tsx which imports this component.\n */\n\nimport { Text } from \"@chakra-ui/react\";\nimport { CalculatedColumn, RenderCellProps } from \"react-data-grid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\n// Import directly from gridUtils to avoid circular dependency\nimport { toRenderedValue } from \"@/lib/dataGrid/shared/gridUtils\";\n\n/**\n * Extended column type with optional type metadata\n */\ntype ColumnWithMetadata = CalculatedColumn<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Default cell renderer for data grid columns\n *\n * @description Extracts cell value from the row and renders it with appropriate\n * formatting based on the column type and render mode. Supports numeric\n * formatting (raw, integer, percent) and handles null/empty values with gray styling.\n *\n * @param props - React Data Grid render cell props containing row and column data\n * @returns Rendered cell content as a Text component\n */\nexport const defaultRenderCell = ({\n row,\n column,\n}: RenderCellProps<RowObjectType>) => {\n const { columnType, columnRenderMode } =\n column as unknown as ColumnWithMetadata;\n\n const [renderedValue, grayOut] = toRenderedValue(\n row,\n column.key,\n columnType,\n columnRenderMode,\n );\n\n return (\n <Text style={{ color: grayOut ? \"gray\" : \"inherit\" }}>{renderedValue}</Text>\n );\n};\n","import { Box, Flex, IconButton } from \"@chakra-ui/react\";\nimport { ReactNode, useState } from \"react\";\nimport { PiCopy } from \"react-icons/pi\";\nimport { useCopyToClipboard } from \"usehooks-ts\";\n\ninterface DiffTextProps {\n value: string;\n colorPalette: string;\n grayOut?: boolean;\n noCopy?: boolean;\n fontSize?: string;\n}\n\nexport const DiffText = ({\n value,\n colorPalette,\n grayOut,\n noCopy,\n fontSize,\n}: DiffTextProps) => {\n const [isHovered, setIsHovered] = useState(false);\n\n return (\n <Flex\n p=\"2px 5px\"\n minWidth=\"30px\"\n maxWidth=\"200px\"\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n color={`${colorPalette}.800`}\n backgroundColor={`${colorPalette}.100`}\n alignItems=\"center\"\n gap=\"2px\"\n rounded=\"md\"\n fontSize={fontSize}\n flexShrink={noCopy ? \"0\" : \"inherit\"}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n <Box\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n color={grayOut ? \"gray\" : \"inherit\"}\n >\n {value}\n </Box>\n\n <CopyControl\n value={value}\n noCopy={noCopy}\n grayOut={grayOut}\n isHovered={isHovered}\n />\n </Flex>\n );\n};\n\ninterface CopyControlProps {\n value: string;\n grayOut?: boolean;\n noCopy?: boolean;\n isHovered: boolean;\n}\n\nfunction CopyControl({\n value,\n noCopy,\n grayOut,\n isHovered,\n}: CopyControlProps): ReactNode {\n const [copiedText, copyToClipboard] = useCopyToClipboard();\n const hasCopiedText = Boolean(copiedText);\n\n if (noCopy || grayOut) {\n return <></>;\n }\n\n if (hasCopiedText) {\n return <>Copied</>;\n }\n\n if (!isHovered) {\n return <></>;\n }\n\n return (\n <IconButton\n aria-label=\"Copy\"\n size=\"xs\"\n minW=\"10px\"\n h=\"10px\"\n variant=\"plain\"\n onClick={() => copyToClipboard(value)}\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <PiCopy size=\"10px\" />\n </IconButton>\n );\n}\n","/**\n * @file inlineRenderCell.tsx\n * @description Inline diff cell renderer for DataGrid columns\n *\n * Renders base and current values side-by-side when they differ,\n * or a single value when unchanged. Used for inline diff display mode.\n *\n * NOTE: Imports directly from gridUtils.ts to avoid circular dependency\n * with toDiffColumn.tsx which imports this component.\n */\n\nimport { Flex, Text } from \"@chakra-ui/react\";\nimport { CalculatedColumn, RenderCellProps } from \"react-data-grid\";\nimport { DiffText } from \"@/components/query/DiffText\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\n// Import directly from gridUtils to avoid circular dependency\nimport { toRenderedValue } from \"@/lib/dataGrid/shared/gridUtils\";\n\n/**\n * Extended column type with optional type metadata\n */\ntype ColumnWithMetadata = CalculatedColumn<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Inline diff cell renderer for comparing base and current values\n *\n * @description Renders cell values in inline diff mode:\n * - If base and current values are equal, shows single value\n * - If values differ, shows both with red (base/removed) and green (current/added) styling\n * - Handles missing values gracefully\n *\n * The component uses DiffText for styled diff display with copy functionality.\n *\n * @param props - React Data Grid render cell props containing row and column data\n * @returns Rendered cell content showing diff or single value\n */\nexport const inlineRenderCell = ({\n row,\n column,\n}: RenderCellProps<RowObjectType>) => {\n const { columnType, columnRenderMode } =\n column as unknown as ColumnWithMetadata;\n\n const baseKey = `base__${column.key}`.toLowerCase();\n const currentKey = `current__${column.key}`.toLowerCase();\n\n // Handle case where neither base nor current values exist\n if (!Object.hasOwn(row, baseKey) && !Object.hasOwn(row, currentKey)) {\n return \"-\";\n }\n\n const hasBase = Object.hasOwn(row, baseKey);\n const hasCurrent = Object.hasOwn(row, currentKey);\n\n const [baseValue, baseGrayOut] = toRenderedValue(\n row,\n `base__${column.key}`.toLowerCase(),\n columnType,\n columnRenderMode,\n );\n\n const [currentValue, currentGrayOut] = toRenderedValue(\n row,\n `current__${column.key}`.toLowerCase(),\n columnType,\n columnRenderMode,\n );\n\n // No change - render single value\n if (row[baseKey] === row[currentKey]) {\n return (\n <Text style={{ color: currentGrayOut ? \"gray\" : \"inherit\" }}>\n {currentValue}\n </Text>\n );\n }\n\n // Values differ - render inline diff with base (red) and current (green)\n return (\n <Flex gap=\"5px\" alignItems=\"center\" lineHeight=\"normal\" height=\"100%\">\n {hasBase && (\n <DiffText value={baseValue} colorPalette=\"red\" grayOut={baseGrayOut} />\n )}\n {hasCurrent && (\n <DiffText\n value={currentValue}\n colorPalette=\"green\"\n grayOut={currentGrayOut}\n />\n )}\n </Flex>\n );\n};\n","/**\n * @file toDiffColumn.tsx\n * @description Shared column builder for diff grids (querydiff and valuediff)\n *\n * Provides a unified function to create column definitions for data diff grids,\n * supporting both inline and side-by-side display modes.\n */\n\nimport _ from \"lodash\";\nimport React from \"react\";\nimport { ColumnOrColumnGroup, renderTextEditor } from \"react-data-grid\";\nimport {\n DataFrameColumnGroupHeader,\n DataFrameColumnGroupHeaderProps,\n defaultRenderCell,\n inlineRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { getHeaderCellClass } from \"./gridUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Configuration for building a diff column\n */\nexport interface DiffColumnConfig {\n /** Column name */\n name: string;\n /** Column diff status: 'added', 'removed', 'modified', or empty */\n columnStatus: string;\n /** Column data type */\n columnType: ColumnType;\n /** How to render numeric values */\n columnRenderMode?: ColumnRenderMode;\n /** Display mode: inline shows diff in single cell, side_by_side shows two columns */\n displayMode: \"inline\" | \"side_by_side\";\n /** Title for base column in side_by_side mode */\n baseTitle?: string;\n /** Title for current column in side_by_side mode */\n currentTitle?: string;\n /** Props to pass to DataFrameColumnGroupHeader */\n headerProps?: Partial<DataFrameColumnGroupHeaderProps>;\n}\n\n/**\n * Extended column type with metadata\n */\nexport type DiffColumnResult = ColumnOrColumnGroup<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n// ============================================================================\n// Cell Class Factories\n// ============================================================================\n\n/**\n * Creates a cell class function for base column cells\n *\n * @param columnName - The column name (used for value comparison)\n * @param columnStatus - The column's diff status\n * @returns Function that returns CSS class based on row status and value diff\n */\nexport function createCellClassBase(\n columnName: string,\n columnStatus: string,\n): (row: RowObjectType) => string | undefined {\n return (row: RowObjectType) => {\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\")\n return undefined;\n\n const baseKey = `base__${columnName}`.toLowerCase();\n const currentKey = `current__${columnName}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return \"diff-cell-removed\";\n }\n\n return undefined;\n };\n}\n\n/**\n * Creates a cell class function for current column cells\n *\n * @param columnName - The column name (used for value comparison)\n * @param columnStatus - The column's diff status\n * @returns Function that returns CSS class based on row status and value diff\n */\nexport function createCellClassCurrent(\n columnName: string,\n columnStatus: string,\n): (row: RowObjectType) => string | undefined {\n return (row: RowObjectType) => {\n const rowStatus = row.__status;\n\n if (rowStatus === \"removed\") return \"diff-cell-removed\";\n if (rowStatus === \"added\") return \"diff-cell-added\";\n if (columnStatus === \"added\" || columnStatus === \"removed\")\n return undefined;\n\n const baseKey = `base__${columnName}`.toLowerCase();\n const currentKey = `current__${columnName}`.toLowerCase();\n\n if (!_.isEqual(row[baseKey], row[currentKey])) {\n return \"diff-cell-added\";\n }\n\n return undefined;\n };\n}\n\n// ============================================================================\n// Main Column Builder\n// ============================================================================\n\n/**\n * Creates a diff column definition for use in data grids\n *\n * @description Builds a column configuration that supports both inline and\n * side-by-side diff display modes. In inline mode, differences are shown\n * within a single cell. In side-by-side mode, base and current values\n * appear in separate child columns.\n *\n * @param config - Column configuration options\n * @returns Column definition compatible with react-data-grid\n *\n * @example\n * // Inline mode for querydiff\n * const column = toDiffColumn({\n * name: 'price',\n * columnStatus: 'modified',\n * columnType: 'number',\n * displayMode: 'inline',\n * headerProps: {\n * primaryKeys: ['id'],\n * onPrimaryKeyChange: setPrimaryKeys,\n * }\n * });\n *\n * @example\n * // Side-by-side mode for valuediff with case-insensitive matching\n * const column = toDiffColumn({\n * name: 'Amount',\n * columnStatus: '',\n * columnType: 'number',\n * displayMode: 'side_by_side',\n * baseTitle: 'Before',\n * currentTitle: 'After',\n * headerProps: {\n * primaryKeys: ['id'],\n * caseInsensitive: true,\n * }\n * });\n */\nexport function toDiffColumn(config: DiffColumnConfig): DiffColumnResult {\n const {\n name,\n columnStatus,\n columnType,\n columnRenderMode = \"raw\",\n displayMode,\n baseTitle = \"Base\",\n currentTitle = \"Current\",\n headerProps = {},\n } = config;\n\n const headerCellClass = getHeaderCellClass(columnStatus);\n\n // Build the header component\n const headerElement = (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus={columnStatus}\n columnType={columnType}\n {...headerProps}\n />\n );\n\n if (displayMode === \"inline\") {\n return {\n headerCellClass,\n name: headerElement,\n key: name,\n renderCell: inlineRenderCell,\n columnType,\n columnRenderMode,\n };\n }\n\n // Side-by-side mode with base/current child columns\n const cellClassBase = createCellClassBase(name, columnStatus);\n const cellClassCurrent = createCellClassCurrent(name, columnStatus);\n\n return {\n headerCellClass,\n name: headerElement,\n children: [\n {\n key: `base__${name}`,\n name: baseTitle,\n renderEditCell: renderTextEditor,\n headerCellClass,\n cellClass: cellClassBase,\n renderCell: defaultRenderCell,\n // @ts-expect-error Unable to patch children type in react-data-grid\n columnType,\n columnRenderMode,\n },\n {\n key: `current__${name}`,\n name: currentTitle,\n renderEditCell: renderTextEditor,\n headerCellClass,\n cellClass: cellClassCurrent,\n renderCell: defaultRenderCell,\n // @ts-expect-error Unable to patch children type in react-data-grid\n columnType,\n columnRenderMode,\n },\n ],\n };\n}\n","/**\n * @file diffColumnBuilder.tsx\n * @description Builds react-data-grid column definitions from ColumnConfig[]\n *\n * This module transforms the pure data structures from columnBuilders.ts\n * into actual column definitions with React components for headers.\n */\n\nimport React from \"react\";\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport {\n DataFrameColumnGroupHeader,\n DataFrameColumnGroupHeaderProps,\n defaultRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { ColumnConfig } from \"./columnBuilders\";\nimport { toDiffColumn } from \"./toDiffColumn\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended column type with metadata (matches existing pattern)\n */\nexport type DiffColumnDefinition = ColumnOrColumnGroup<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Configuration for building diff column definitions\n */\nexport interface BuildDiffColumnDefinitionsConfig {\n /**\n * Column configurations from getDisplayColumns()\n */\n columns: ColumnConfig[];\n\n /**\n * Display mode for diff columns\n * - \"inline\": Single column with inline diff rendering\n * - \"side_by_side\": Column group with base/current sub-columns\n */\n displayMode: \"inline\" | \"side_by_side\";\n\n /**\n * Props to pass to DataFrameColumnGroupHeader for all columns\n */\n headerProps: Partial<DataFrameColumnGroupHeaderProps>;\n\n /**\n * Title for base column in side_by_side mode\n */\n baseTitle?: string;\n\n /**\n * Title for current column in side_by_side mode\n */\n currentTitle?: string;\n\n /**\n * Whether to add index column when no primary keys exist\n * Only applies when columns array has no isPrimaryKey entries\n * @default false\n */\n allowIndexFallback?: boolean;\n}\n\n/**\n * Result from building diff column definitions\n */\nexport interface BuildDiffColumnDefinitionsResult {\n /**\n * The generated column definitions ready for react-data-grid\n */\n columns: DiffColumnDefinition[];\n\n /**\n * Whether an index fallback column was added\n */\n usedIndexFallback: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Creates the index fallback column used when no primary keys are specified\n */\nfunction createIndexColumn(): DiffColumnDefinition {\n return {\n key: \"_index\",\n name: \"\",\n width: 50,\n maxWidth: 100,\n cellClass: \"index-column\",\n };\n}\n\n/**\n * Creates a primary key column definition\n *\n * Primary key columns are:\n * - Frozen (sticky left)\n * - Have a special cellClass based on row status\n * - Use defaultRenderCell (no base__/current__ prefixing)\n */\nfunction createPrimaryKeyColumn(\n config: ColumnConfig,\n headerProps: Partial<DataFrameColumnGroupHeaderProps>,\n): DiffColumnDefinition {\n const { key, name, columnType, columnStatus, columnRenderMode } = config;\n\n return {\n key,\n name: (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus={columnStatus ?? \"\"}\n columnType={columnType}\n {...headerProps}\n />\n ),\n frozen: true,\n cellClass: (row: RowObjectType) => {\n if (row.__status) {\n return `diff-header-${row.__status}`;\n }\n return undefined;\n },\n renderCell: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n/**\n * Creates a diff column definition (non-PK column)\n *\n * Uses toDiffColumn() to handle inline vs side_by_side modes\n */\nfunction createDiffColumn(\n config: ColumnConfig,\n displayMode: \"inline\" | \"side_by_side\",\n headerProps: Partial<DataFrameColumnGroupHeaderProps>,\n baseTitle?: string,\n currentTitle?: string,\n): DiffColumnDefinition {\n const { name, columnType, columnStatus, columnRenderMode } = config;\n\n return toDiffColumn({\n name,\n columnStatus: columnStatus ?? \"\",\n columnType,\n columnRenderMode,\n displayMode,\n baseTitle,\n currentTitle,\n headerProps,\n });\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds react-data-grid column definitions from ColumnConfig array\n *\n * @description Transforms pure column configuration objects into actual\n * column definitions with React JSX headers. Handles:\n *\n * - Primary key columns (frozen, special cellClass)\n * - Diff columns (via toDiffColumn for inline/side_by_side modes)\n * - Index fallback (when no PKs and allowIndexFallback is true)\n *\n * @example\n * ```tsx\n * // Get column configs from shared utility\n * const columnConfigs = getDisplayColumns({\n * columnMap,\n * primaryKeys,\n * pinnedColumns,\n * columnsRenderMode,\n * changedOnly,\n * rowStats,\n * excludeColumns: [\"IN_A\", \"IN_B\"],\n * caseInsensitive: true,\n * });\n *\n * // Build actual column definitions\n * const { columns } = buildDiffColumnDefinitions({\n * columns: columnConfigs,\n * displayMode: \"inline\",\n * headerProps: {\n * primaryKeys,\n * pinnedColumns,\n * onPinnedColumnsChange,\n * caseInsensitive: true,\n * },\n * });\n * ```\n *\n * @example\n * ```tsx\n * // With index fallback for querydiff when no PKs\n * const { columns, usedIndexFallback } = buildDiffColumnDefinitions({\n * columns: columnConfigs,\n * displayMode: \"side_by_side\",\n * allowIndexFallback: true,\n * headerProps: {\n * primaryKeys: [],\n * pinnedColumns,\n * onPrimaryKeyChange,\n * onPinnedColumnsChange,\n * },\n * });\n *\n * if (usedIndexFallback) {\n * // Index-based matching was used\n * }\n * ```\n */\nexport function buildDiffColumnDefinitions(\n config: BuildDiffColumnDefinitionsConfig,\n): BuildDiffColumnDefinitionsResult {\n const {\n columns: columnConfigs,\n displayMode,\n headerProps,\n baseTitle,\n currentTitle,\n allowIndexFallback = false,\n } = config;\n\n const columns: DiffColumnDefinition[] = [];\n let usedIndexFallback = false;\n\n // Check if we have any primary key columns\n const hasPrimaryKeys = columnConfigs.some((col) => col.isPrimaryKey);\n\n // Add index fallback if no PKs and allowed\n if (!hasPrimaryKeys && allowIndexFallback) {\n columns.push(createIndexColumn());\n usedIndexFallback = true;\n }\n\n // Build column definitions\n columnConfigs.forEach((colConfig) => {\n if (colConfig.isPrimaryKey) {\n // Primary key column - frozen with special cellClass\n columns.push(createPrimaryKeyColumn(colConfig, headerProps));\n } else {\n // Regular diff column - uses toDiffColumn for inline/side_by_side\n columns.push(\n createDiffColumn(\n colConfig,\n displayMode,\n headerProps,\n baseTitle,\n currentTitle,\n ),\n );\n }\n });\n\n return { columns, usedIndexFallback };\n}\n","/**\n * @file rowBuilders.ts\n * @description Shared row building utilities for diff grids\n *\n * Provides unified row generation logic for both querydiff (dual DataFrames)\n * and valuediff (joined DataFrame with IN_A/IN_B) scenarios.\n */\n\nimport _ from \"lodash\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\nimport { includesIgnoreCase, keyToNumber } from \"@/utils/transforms\";\nimport { ColumnMapEntry, MergeColumnMapEntry, RowStats } from \"./gridUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Union type for column map entries (supports both querydiff and valuediff)\n */\nexport type DiffColumnMapEntry = ColumnMapEntry | MergeColumnMapEntry;\n\n/**\n * Type guard to check if entry is a MergeColumnMapEntry (has separate base/current keys)\n */\nfunction isMergeColumnMapEntry(\n entry: DiffColumnMapEntry,\n): entry is MergeColumnMapEntry {\n return \"baseColumnKey\" in entry && \"currentColumnKey\" in entry;\n}\n\n/**\n * Configuration for building diff rows\n */\nexport interface BuildDiffRowsConfig {\n /**\n * Map of primary key values to base row data\n * Keys should already be normalized (e.g., lowercased if case-insensitive)\n */\n baseMap: Record<string, RowObjectType | undefined>;\n\n /**\n * Map of primary key values to current row data\n * Keys should already be normalized (e.g., lowercased if case-insensitive)\n */\n currentMap: Record<string, RowObjectType | undefined>;\n\n /**\n * Column definitions for base data\n * Used to iterate and extract values from base rows\n */\n baseColumns: DataFrame[\"columns\"];\n\n /**\n * Column definitions for current data\n * Used to iterate and extract values from current rows\n * For joined data (valuediff), this is the same as baseColumns\n */\n currentColumns: DataFrame[\"columns\"];\n\n /**\n * Column map for tracking column metadata and status\n * This object WILL BE MUTATED to update column.status when modifications are detected\n */\n columnMap: Record<string, DiffColumnMapEntry>;\n\n /**\n * List of primary key column names\n * These columns are stored directly on the row (not prefixed with base__/current__)\n */\n primaryKeys: string[];\n\n /**\n * Whether to use case-insensitive matching for column names and primary keys\n * - false (default): querydiff behavior (exact matching)\n * - true: valuediff behavior (case-insensitive)\n */\n caseInsensitive?: boolean;\n\n /**\n * Whether to filter out unchanged rows\n * When true, only rows with status \"added\", \"removed\", or \"modified\" are returned\n */\n changedOnly?: boolean;\n}\n\n/**\n * Result from building diff rows\n */\nexport interface BuildDiffRowsResult {\n /** The generated rows with __status and prefixed column values */\n rows: RowObjectType[];\n\n /** Statistics about row changes */\n rowStats: RowStats;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Checks if a column name is a primary key\n */\nfunction isPrimaryKey(\n columnName: string,\n primaryKeys: string[],\n caseInsensitive: boolean,\n): boolean {\n return caseInsensitive\n ? includesIgnoreCase(primaryKeys, columnName)\n : primaryKeys.includes(columnName);\n}\n\n/**\n * Gets the column key to use for value comparison\n * For MergeColumnMapEntry, uses baseColumnKey/currentColumnKey\n * For ColumnMapEntry, uses the single key\n */\nfunction getComparisonKeys(entry: DiffColumnMapEntry): {\n baseKey: string;\n currentKey: string;\n} {\n if (isMergeColumnMapEntry(entry)) {\n return {\n baseKey: entry.baseColumnKey,\n currentKey: entry.currentColumnKey,\n };\n }\n return {\n baseKey: entry.key,\n currentKey: entry.key,\n };\n}\n\n/**\n * Populates row values from a source row for the given columns\n *\n * @param targetRow - The row object to populate\n * @param sourceRow - The source row to extract values from\n * @param columns - Column definitions to iterate\n * @param prefix - Prefix to add to column keys (e.g., \"base__\" or \"current__\")\n * @param primaryKeys - Primary key column names (stored without prefix)\n * @param caseInsensitive - Whether to use case-insensitive matching\n */\nfunction populateRowValues(\n targetRow: RowObjectType,\n sourceRow: RowObjectType,\n columns: DataFrame[\"columns\"],\n prefix: string,\n primaryKeys: string[],\n caseInsensitive: boolean,\n): void {\n columns.forEach((col) => {\n const colKey = col.key;\n const isPK = isPrimaryKey(colKey, primaryKeys, caseInsensitive);\n\n if (isPK) {\n // Primary keys stored directly (not prefixed)\n targetRow[String(colKey).toLowerCase()] = sourceRow[colKey];\n } else {\n // Non-PK columns are prefixed\n targetRow[`${prefix}${colKey}`.toLowerCase()] = sourceRow[colKey];\n }\n });\n}\n\n/**\n * Detects if a row has been modified by comparing base and current values\n * Also mutates columnMap entries to mark modified columns\n *\n * @returns true if any non-PK column value differs\n */\nfunction detectModifications(\n baseRow: RowObjectType,\n currentRow: RowObjectType,\n columnMap: Record<string, DiffColumnMapEntry>,\n primaryKeys: string[],\n caseInsensitive: boolean,\n): boolean {\n let isModified = false;\n\n for (const [name, column] of Object.entries(columnMap)) {\n // Skip index column\n if (name === \"index\") continue;\n\n // Skip primary key columns\n if (isPrimaryKey(name, primaryKeys, caseInsensitive)) continue;\n\n const { baseKey, currentKey } = getComparisonKeys(column);\n\n // Skip if either key is unknown (column added/removed in schema)\n if (baseKey === \"unknown\" || currentKey === \"unknown\") continue;\n\n const baseValue = baseRow[baseKey];\n const currentValue = currentRow[currentKey];\n\n if (!_.isEqual(baseValue, currentValue)) {\n isModified = true;\n // Mutate column status to track which columns have modifications\n column.status = \"modified\";\n }\n }\n\n return isModified;\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds diff rows from base and current row maps\n *\n * @description This function unifies the row generation logic from both\n * `toDataDiffGrid` (querydiff) and `toValueDiffGrid` (valuediff).\n *\n * Key behaviors:\n * - Merges base and current row keys to determine all unique rows\n * - Creates row objects with `_index` and `__status` fields\n * - Prefixes non-PK columns with `base__` or `current__` (lowercased)\n * - Stores PK columns directly without prefix\n * - Detects added/removed/modified status\n * - Mutates columnMap to mark modified columns\n * - Optionally filters to changed rows only\n *\n * @example\n * ```typescript\n * // For querydiff (two separate DataFrames)\n * const result = buildDiffRows({\n * baseMap,\n * currentMap,\n * baseColumns: base.columns,\n * currentColumns: current.columns,\n * columnMap: mergedColumnMap,\n * primaryKeys: [\"id\"],\n * caseInsensitive: false,\n * changedOnly: false,\n * });\n *\n * // For valuediff (joined DataFrame)\n * const result = buildDiffRows({\n * baseMap,\n * currentMap,\n * baseColumns: df.columns,\n * currentColumns: df.columns, // Same columns for both\n * columnMap: joinedColumnMap,\n * primaryKeys: [\"id\"],\n * caseInsensitive: true,\n * changedOnly: true,\n * });\n * ```\n */\nexport function buildDiffRows(\n config: BuildDiffRowsConfig,\n): BuildDiffRowsResult {\n const {\n baseMap,\n currentMap,\n baseColumns,\n currentColumns,\n columnMap,\n primaryKeys,\n caseInsensitive = false,\n changedOnly = false,\n } = config;\n\n // Merge base and current keys to get all unique row identifiers\n const mergedMap = mergeKeysWithStatus(\n Object.keys(baseMap),\n Object.keys(currentMap),\n );\n\n const rowStats: RowStats = {\n added: 0,\n removed: 0,\n modified: 0,\n };\n\n // Build rows from merged keys\n let rows = Object.entries(mergedMap).map(([key]) => {\n const baseRow = baseMap[key];\n const currentRow = currentMap[key];\n\n // Initialize row with index and undefined status\n const row: RowObjectType = {\n _index: keyToNumber(key),\n __status: undefined,\n };\n\n // Populate base values\n if (baseRow) {\n populateRowValues(\n row,\n baseRow,\n baseColumns,\n \"base__\",\n primaryKeys,\n caseInsensitive,\n );\n }\n\n // Populate current values\n if (currentRow) {\n populateRowValues(\n row,\n currentRow,\n currentColumns,\n \"current__\",\n primaryKeys,\n caseInsensitive,\n );\n }\n\n // Determine row status\n if (!baseRow) {\n row.__status = \"added\";\n rowStats.added++;\n } else if (!currentRow) {\n row.__status = \"removed\";\n rowStats.removed++;\n } else {\n // Both rows exist - check for modifications\n const isModified = detectModifications(\n baseRow,\n currentRow,\n columnMap,\n primaryKeys,\n caseInsensitive,\n );\n\n if (isModified) {\n row.__status = \"modified\";\n rowStats.modified++;\n }\n }\n\n return row;\n });\n\n // Filter to changed rows if requested\n if (changedOnly) {\n rows = rows.filter(\n (row) =>\n row.__status === \"added\" ||\n row.__status === \"removed\" ||\n row.__status === \"modified\",\n );\n }\n\n return { rows, rowStats };\n}\n","/**\n * @file simpleColumnBuilder.tsx\n * @description Builds react-data-grid column definitions for simple (non-diff) grids\n *\n * This module transforms the pure data structures from columnBuilders.ts\n * into actual column definitions with React components for headers.\n *\n * Unlike diffColumnBuilder.tsx, this handles simple grids without:\n * - Base/current value comparison\n * - Inline vs side-by-side display modes\n * - Column status (added/removed/modified)\n */\n\nimport React from \"react\";\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport {\n DataFrameColumnGroupHeader,\n DataFrameColumnHeader,\n defaultRenderCell,\n} from \"@/components/ui/dataGrid\";\nimport { ColumnRenderMode, ColumnType, RowObjectType } from \"@/lib/api/types\";\nimport { ColumnConfig } from \"./columnBuilders\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended column type with metadata (matches existing pattern)\n */\nexport type SimpleColumnDefinition = ColumnOrColumnGroup<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n};\n\n/**\n * Configuration for building simple column definitions\n */\nexport interface BuildSimpleColumnDefinitionsConfig {\n /**\n * Column configurations from getSimpleDisplayColumns()\n */\n columns: ColumnConfig[];\n\n /**\n * Props to pass to column headers\n */\n headerProps: {\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n onColumnsRenderModeChanged?: (\n cols: Record<string, ColumnRenderMode>,\n ) => void;\n };\n\n /**\n * Whether to add index column when no primary keys exist\n * Only applies when columns array has no isPrimaryKey entries\n * @default true\n */\n allowIndexFallback?: boolean;\n}\n\n/**\n * Result from building simple column definitions\n */\nexport interface BuildSimpleColumnDefinitionsResult {\n /**\n * The generated column definitions ready for react-data-grid\n */\n columns: SimpleColumnDefinition[];\n\n /**\n * Whether an index fallback column was added\n */\n usedIndexFallback: boolean;\n}\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Creates the index fallback column used when no primary keys are specified\n */\nfunction createIndexColumn(): SimpleColumnDefinition {\n return {\n key: \"_index\",\n name: \"\",\n width: 50,\n cellClass: \"index-column\",\n };\n}\n\n/**\n * Creates a primary key column definition\n *\n * Primary key columns are:\n * - Frozen (sticky left)\n * - Use DataFrameColumnGroupHeader (with columnStatus=\"\")\n * - Use defaultRenderCell\n */\nfunction createPrimaryKeyColumn(\n config: ColumnConfig,\n headerProps: BuildSimpleColumnDefinitionsConfig[\"headerProps\"],\n): SimpleColumnDefinition {\n const { key, name, columnType, columnRenderMode } = config;\n\n return {\n key,\n name: (\n <DataFrameColumnGroupHeader\n name={name}\n columnStatus=\"\"\n columnType={columnType}\n pinnedColumns={headerProps.pinnedColumns}\n onPinnedColumnsChange={headerProps.onPinnedColumnsChange}\n onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}\n />\n ),\n width: \"auto\",\n frozen: true,\n renderCell: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n/**\n * Creates a regular (non-PK) column definition\n *\n * Regular columns use DataFrameColumnHeader (simpler, no PK toggle)\n */\nfunction createRegularColumn(\n config: ColumnConfig,\n headerProps: BuildSimpleColumnDefinitionsConfig[\"headerProps\"],\n): SimpleColumnDefinition {\n const { key, name, columnType, columnRenderMode } = config;\n\n return {\n key,\n name: (\n <DataFrameColumnHeader\n name={name}\n columnType={columnType}\n pinnedColumns={headerProps.pinnedColumns}\n onPinnedColumnsChange={headerProps.onPinnedColumnsChange}\n onColumnsRenderModeChanged={headerProps.onColumnsRenderModeChanged}\n />\n ),\n width: \"auto\",\n renderCell: defaultRenderCell,\n columnType,\n columnRenderMode,\n };\n}\n\n// ============================================================================\n// Main Function\n// ============================================================================\n\n/**\n * Builds react-data-grid column definitions from ColumnConfig array\n *\n * @description Transforms pure column configuration objects into actual\n * column definitions with React JSX headers. Handles:\n *\n * - Primary key columns (frozen, use DataFrameColumnGroupHeader)\n * - Regular columns (use DataFrameColumnHeader)\n * - Index fallback (when no PKs and allowIndexFallback is true)\n *\n * @example\n * ```tsx\n * // Get column configs from shared utility\n * const columnConfigs = getSimpleDisplayColumns({\n * columnMap,\n * primaryKeys,\n * pinnedColumns,\n * columnsRenderMode,\n * });\n *\n * // Build actual column definitions\n * const { columns } = buildSimpleColumnDefinitions({\n * columns: columnConfigs,\n * headerProps: {\n * pinnedColumns,\n * onPinnedColumnsChange,\n * onColumnsRenderModeChanged,\n * },\n * });\n * ```\n */\nexport function buildSimpleColumnDefinitions(\n config: BuildSimpleColumnDefinitionsConfig,\n): BuildSimpleColumnDefinitionsResult {\n const {\n columns: columnConfigs,\n headerProps,\n allowIndexFallback = true,\n } = config;\n\n const columns: SimpleColumnDefinition[] = [];\n let usedIndexFallback = false;\n\n // Check if we have any primary key columns\n const hasPrimaryKeys = columnConfigs.some((col) => col.isPrimaryKey);\n\n // Add index fallback if no PKs and allowed\n if (!hasPrimaryKeys && allowIndexFallback) {\n columns.push(createIndexColumn());\n usedIndexFallback = true;\n }\n\n // Build column definitions\n columnConfigs.forEach((colConfig) => {\n if (colConfig.isPrimaryKey) {\n columns.push(createPrimaryKeyColumn(colConfig, headerProps));\n } else {\n columns.push(createRegularColumn(colConfig, headerProps));\n }\n });\n\n return { columns, usedIndexFallback };\n}\n","/**\n * @file validation.ts\n * @description Input validation utilities for data grid generation\n *\n * Provides clear, actionable error messages for common issues:\n * - Malformed DataFrame structure\n * - Column-data misalignment\n * - Missing required fields\n *\n * These validations run at entry points (toDataGrid, toDataDiffGrid, toValueDiffGrid)\n * to fail fast with helpful messages rather than cryptic runtime errors.\n */\n\nimport { DataFrame } from \"@/lib/api/types\";\n\n// ============================================================================\n// Custom Error Class\n// ============================================================================\n\n/**\n * Custom error class for data grid validation failures.\n * Provides structured error information for debugging.\n */\nexport class DataGridValidationError extends Error {\n constructor(\n message: string,\n public readonly context?: string,\n public readonly details?: Record<string, unknown>,\n ) {\n super(context ? `[${context}] ${message}` : message);\n this.name = \"DataGridValidationError\";\n }\n}\n\n// ============================================================================\n// DataFrame Validation\n// ============================================================================\n\n/**\n * Validates that a DataFrame has the required structure.\n * Does NOT throw for undefined/null - those are valid (represent empty data).\n *\n * @param df - The DataFrame to validate\n * @param name - Name for error messages (e.g., \"base\", \"current\")\n * @throws DataGridValidationError if structure is invalid\n */\nexport function validateDataFrame(\n df: DataFrame | undefined | null,\n name = \"DataFrame\",\n): void {\n // undefined/null is valid - represents empty/missing data\n if (df === undefined || df === null) {\n return;\n }\n\n // Must be an object\n if (typeof df !== \"object\") {\n throw new DataGridValidationError(\n `Expected an object, got ${typeof df}`,\n name,\n );\n }\n\n // Must have columns array\n if (!(\"columns\" in df)) {\n throw new DataGridValidationError(\"Missing 'columns' property\", name, {\n receivedKeys: Object.keys(df),\n });\n }\n\n if (!Array.isArray(df.columns)) {\n throw new DataGridValidationError(\n `'columns' must be an array, got ${typeof df.columns}`,\n name,\n );\n }\n\n // Must have data array\n if (!(\"data\" in df)) {\n throw new DataGridValidationError(\"Missing 'data' property\", name, {\n receivedKeys: Object.keys(df),\n });\n }\n\n if (!Array.isArray(df.data)) {\n throw new DataGridValidationError(\n `'data' must be an array, got ${typeof df.data}`,\n name,\n );\n }\n\n // Validate column structure\n validateColumns(df.columns, name);\n\n // Validate column-data alignment (only if there's data)\n if (df.data.length > 0) {\n validateColumnDataAlignment(df, name);\n }\n}\n\n/**\n * Validates that columns have required properties.\n *\n * @param columns - Array of column definitions\n * @param context - Context for error messages\n * @throws DataGridValidationError if any column is malformed\n */\nexport function validateColumns(\n columns: DataFrame[\"columns\"],\n context = \"DataFrame\",\n): void {\n columns.forEach((col, index) => {\n if (!col || typeof col !== \"object\") {\n throw new DataGridValidationError(\n `Column at index ${index} is not an object`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.key !== \"string\" || col.key === \"\") {\n throw new DataGridValidationError(\n `Column at index ${index} has invalid 'key': expected non-empty string, got ${JSON.stringify(col.key)}`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.name !== \"string\") {\n throw new DataGridValidationError(\n `Column '${col.key}' has invalid 'name': expected string, got ${typeof col.name}`,\n context,\n { column: col },\n );\n }\n\n // noinspection SuspiciousTypeOfGuard\n if (typeof col.type !== \"string\") {\n throw new DataGridValidationError(\n `Column '${col.key}' has invalid 'type': expected string, got ${typeof col.type}`,\n context,\n { column: col },\n );\n }\n });\n}\n\n/**\n * Validates that data rows match column count.\n *\n * @param df - The DataFrame to validate\n * @param context - Context for error messages\n * @throws DataGridValidationError if misalignment detected\n */\nexport function validateColumnDataAlignment(\n df: DataFrame,\n context = \"DataFrame\",\n): void {\n const columnCount = df.columns.length;\n\n for (let i = 0; i < df.data.length; i++) {\n const row = df.data[i];\n\n if (!Array.isArray(row)) {\n throw new DataGridValidationError(\n `Row at index ${i} is not an array`,\n context,\n { row, rowType: typeof row },\n );\n }\n\n if (row.length !== columnCount) {\n throw new DataGridValidationError(\n `Row ${i} has ${row.length} values but expected ${columnCount} (column count)`,\n context,\n {\n rowIndex: i,\n rowLength: row.length,\n columnCount,\n columns: df.columns.map((c) => c.key),\n },\n );\n }\n }\n}\n\n// ============================================================================\n// Primary Key Validation\n// ============================================================================\n\n/**\n * Validates primary key configuration.\n *\n * @param primaryKeys - Array of primary key column names\n * @param columns - Available columns to check against\n * @param options - Validation options\n * @throws DataGridValidationError if validation fails\n */\nexport function validatePrimaryKeyConfig(\n primaryKeys: string[] | undefined,\n columns: DataFrame[\"columns\"],\n options: {\n required?: boolean;\n caseInsensitive?: boolean;\n context?: string;\n } = {},\n): void {\n const {\n required = false,\n caseInsensitive = false,\n context = \"primaryKeys\",\n } = options;\n\n // Check if required\n if (required && (!primaryKeys || primaryKeys.length === 0)) {\n throw new DataGridValidationError(\n \"Primary keys are required but none were provided\",\n context,\n );\n }\n\n // If no PKs provided and not required, that's fine\n if (!primaryKeys || primaryKeys.length === 0) {\n return;\n }\n\n // Validate each PK exists\n const columnKeys = columns.map((c) => c.key);\n const columnKeysLower = caseInsensitive\n ? columnKeys.map((k) => k.toLowerCase())\n : columnKeys;\n\n for (const pk of primaryKeys) {\n const pkToFind = caseInsensitive ? pk.toLowerCase() : pk;\n const found = caseInsensitive\n ? columnKeysLower.includes(pkToFind)\n : columnKeys.includes(pk);\n\n if (!found) {\n throw new DataGridValidationError(\n `Primary key column '${pk}' not found in columns`,\n context,\n {\n requestedKey: pk,\n availableColumns: columnKeys,\n caseInsensitive,\n },\n );\n }\n }\n\n // Check for duplicate PKs\n const seen = new Set<string>();\n for (const pk of primaryKeys) {\n const normalized = caseInsensitive ? pk.toLowerCase() : pk;\n if (seen.has(normalized)) {\n throw new DataGridValidationError(\n `Duplicate primary key: '${pk}'`,\n context,\n { primaryKeys },\n );\n }\n seen.add(normalized);\n }\n}\n\n// ============================================================================\n// Convenience Validators for Entry Points\n// ============================================================================\n\n/**\n * Validates inputs for toDataGrid (single DataFrame).\n */\nexport function validateToDataGridInputs(\n df: DataFrame | undefined,\n options?: { primaryKeys?: string[] },\n): void {\n validateDataFrame(df, \"dataframe\");\n\n if (df && options?.primaryKeys) {\n validatePrimaryKeyConfig(options.primaryKeys, df.columns, {\n context: \"toDataGrid\",\n });\n }\n}\n\n/**\n * Validates inputs for toDataDiffGrid (base + current DataFrames).\n */\nexport function validateToDataDiffGridInputs(\n base: DataFrame | undefined,\n current: DataFrame | undefined,\n options?: { primaryKeys?: string[] },\n): void {\n validateDataFrame(base, \"base\");\n validateDataFrame(current, \"current\");\n\n // If PKs provided, they should exist in at least one of the DataFrames\n if (options?.primaryKeys && options.primaryKeys.length > 0) {\n const baseColumns = base?.columns ?? [];\n const currentColumns = current?.columns ?? [];\n const allColumnKeys = new Set([\n ...baseColumns.map((c) => c.key),\n ...currentColumns.map((c) => c.key),\n ]);\n\n for (const pk of options.primaryKeys) {\n if (!allColumnKeys.has(pk)) {\n throw new DataGridValidationError(\n `Primary key column '${pk}' not found in either base or current DataFrame`,\n \"toDataDiffGrid\",\n {\n requestedKey: pk,\n baseColumns: baseColumns.map((c) => c.key),\n currentColumns: currentColumns.map((c) => c.key),\n },\n );\n }\n }\n }\n}\n\n/**\n * Validates inputs for toValueDiffGrid (joined DataFrame with IN_A/IN_B).\n */\nexport function validateToValueDiffGridInputs(\n df: DataFrame,\n primaryKeys: string[],\n): void {\n validateDataFrame(df, \"dataframe\");\n\n // Primary keys are required for value diff\n validatePrimaryKeyConfig(primaryKeys, df.columns, {\n required: true,\n caseInsensitive: true, // valuediff uses case-insensitive matching\n context: \"toValueDiffGrid\",\n });\n\n // Check for IN_A/IN_B columns (required for joined data)\n const columnKeysLower = df.columns.map((c) => c.key.toLowerCase());\n const hasInA = columnKeysLower.includes(\"in_a\");\n const hasInB = columnKeysLower.includes(\"in_b\");\n\n if (!hasInA || !hasInB) {\n throw new DataGridValidationError(\n \"Joined DataFrame must have IN_A and IN_B columns\",\n \"toValueDiffGrid\",\n {\n hasInA,\n hasInB,\n availableColumns: df.columns.map((c) => c.key),\n },\n );\n }\n}\n","/**\n * @file toDataDiffGrid.ts\n * @description Query diff grid generation and rendering components\n *\n * REFACTORED: Now uses shared utilities from @/lib/dataGrid/shared\n */\n\nimport \"src/components/query/styles.css\";\nimport { ColumnRenderMode, DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport {\n buildDiffColumnDefinitions,\n buildDiffRows,\n buildMergedColumnMap,\n getDisplayColumns,\n getPrimaryKeyValue,\n validatePrimaryKeys,\n validateToDataDiffGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryDataDiffGridOptions {\n primaryKeys?: string[];\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n changedOnly?: boolean;\n baseTitle?: string;\n currentTitle?: string;\n displayMode?: \"side_by_side\" | \"inline\";\n}\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toDataDiffGrid(\n _base?: DataFrame,\n _current?: DataFrame,\n options?: QueryDataDiffGridOptions,\n) {\n validateToDataDiffGridInputs(_base, _current, options);\n const base = _base ?? { columns: [], data: [] };\n const current = _current ?? { columns: [], data: [] };\n const primaryKeys = options?.primaryKeys ?? [];\n const pinnedColumns = options?.pinnedColumns ?? [];\n const changedOnly = options?.changedOnly ?? false;\n const displayMode = options?.displayMode ?? \"side_by_side\";\n const columnsRenderMode = options?.columnsRenderMode ?? {};\n\n const baseData = dataFrameToRowObjects(base);\n const currentData = dataFrameToRowObjects(current);\n\n // REFACTORED: Use shared utility\n const columnMap = buildMergedColumnMap(base, current);\n\n // Build row maps indexed by primary key\n const baseMap: Record<string, RowObjectType> = {};\n const currentMap: Record<string, RowObjectType> = {};\n let invalidPKeyBase = false;\n let invalidPKeyCurrent = false;\n\n if (primaryKeys.length === 0) {\n baseData.forEach((row) => {\n baseMap[String(row._index)] = row;\n });\n currentData.forEach((row) => {\n currentMap[String(row._index)] = row;\n });\n } else {\n // REFACTORED: Use shared utility\n const basePKKeys = validatePrimaryKeys(base.columns, primaryKeys, false);\n baseData.forEach((row) => {\n const key = getPrimaryKeyValue(base.columns, basePKKeys, row, false);\n if (key in baseMap) {\n invalidPKeyBase = true;\n }\n baseMap[key] = row;\n });\n\n const currentPKKeys = validatePrimaryKeys(\n current.columns,\n primaryKeys,\n false,\n );\n currentData.forEach((row) => {\n const key = getPrimaryKeyValue(\n current.columns,\n currentPKKeys,\n row,\n false,\n );\n if (key in currentMap) {\n invalidPKeyCurrent = true;\n }\n currentMap[key] = row;\n });\n }\n\n const { rows, rowStats } = buildDiffRows({\n baseMap,\n currentMap,\n baseColumns: base.columns,\n currentColumns: current.columns,\n columnMap,\n primaryKeys,\n caseInsensitive: false, // querydiff uses exact matching\n changedOnly,\n });\n\n // Get column configurations (pure data)\n const columnConfigs = getDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly,\n rowStats,\n excludeColumns: [\"index\"],\n caseInsensitive: false,\n strictMode: false, // querydiff is lenient with missing columns\n });\n\n // Build column definitions with JSX\n const { columns } = buildDiffColumnDefinitions({\n columns: columnConfigs,\n displayMode,\n allowIndexFallback: true, // querydiff adds _index when no PKs\n baseTitle: options?.baseTitle,\n currentTitle: options?.currentTitle,\n headerProps: {\n primaryKeys,\n pinnedColumns,\n onPrimaryKeyChange: options?.onPrimaryKeyChange,\n onPinnedColumnsChange: options?.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options?.onColumnsRenderModeChanged,\n caseInsensitive: false,\n },\n });\n\n return {\n columns,\n rows,\n invalidPKeyBase,\n invalidPKeyCurrent,\n };\n}\n","/**\n * @file toDataGrid.tsx\n * @description Simple data grid generation for single DataFrame display\n *\n * Unlike toDataDiffGrid and toValueDiffGrid, this handles non-diff scenarios\n * where we just display a single DataFrame without base/current comparison.\n *\n * REFACTORED: Now uses shared utilities from @/lib/dataGrid/shared\n */\n\nimport { ColumnRenderMode, DataFrame } from \"@/lib/api/types\";\nimport {\n buildColumnMap,\n buildSimpleColumnDefinitions,\n getSimpleDisplayColumns,\n validateToDataGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface QueryDataGridOptions {\n primaryKeys?: string[];\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n pinnedColumns?: string[];\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onColumnsRenderModeChanged?: (col: Record<string, ColumnRenderMode>) => void;\n}\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toDataGrid(result: DataFrame, options: QueryDataGridOptions) {\n validateToDataGridInputs(result, options);\n\n const primaryKeys = options.primaryKeys ?? [];\n const pinnedColumns = options.pinnedColumns ?? [];\n const columnsRenderMode = options.columnsRenderMode ?? {};\n\n // REFACTORED: Use shared utility for column map\n const columnMap = buildColumnMap(result);\n\n // REFACTORED: Use shared utility for column configuration\n const columnConfigs = getSimpleDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n });\n\n // REFACTORED: Use shared utility for column definitions with JSX\n const { columns } = buildSimpleColumnDefinitions({\n columns: columnConfigs,\n headerProps: {\n pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n },\n allowIndexFallback: true,\n });\n\n return { columns, rows: dataFrameToRowObjects(result) };\n}\n","export function deltaPercentageString(base: number, current: number) {\n if (base < current) {\n const p = ((current - base) / base) * 100;\n return `+${p >= 0.1 ? p.toFixed(1) : \" <0.1 \"}%`;\n } else if (base > current) {\n const p = ((base - current) / base) * 100;\n return `-${p >= 0.1 ? p.toFixed(1) : \" <0.1 \"}%`;\n } else {\n return \"0 %\";\n }\n}\n","/**\n * @file rowCountUtils.ts\n * @description Utilities for converting row count results to DataFrame format\n */\n\nimport { deltaPercentageString } from \"@/components/rowcount/delta\";\nimport { RowCountDiffResult, RowCountResult } from \"@/lib/api/rowcount\";\nimport { DataFrame } from \"@/lib/api/types\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Extended row data for row count diff grid\n */\nexport interface RowCountDiffRowData {\n name: string;\n base: number | null;\n current: number | null;\n delta: string;\n}\n\n/**\n * Extended row data for row count grid (single env)\n */\nexport interface RowCountRowData {\n name: string;\n current: number | null;\n}\n\n// ============================================================================\n// Delta Calculation\n// ============================================================================\n\n/**\n * Calculates the delta string for row count comparison\n */\nexport function calculateDelta(\n base: number | null,\n current: number | null,\n): string {\n if (base !== null && current !== null) {\n return base !== current ? deltaPercentageString(base, current) : \"=\";\n }\n\n if (base === current) return \"N/A\";\n if (base === null) return \"Added\";\n if (current === null) return \"Removed\";\n\n return \"N/A\";\n}\n\n// ============================================================================\n// Data Conversion\n// ============================================================================\n\n/**\n * Converts RowCountDiffResult to DataFrame format\n *\n * @param result - The row count diff result from the backend\n * @returns DataFrame with name, base, current, and delta columns\n */\nexport function rowCountDiffResultToDataFrame(\n result: RowCountDiffResult,\n): DataFrame {\n const entries = Object.entries(result);\n\n return {\n columns: [\n { key: \"name\", name: \"Name\", type: \"text\" },\n { key: \"base\", name: \"Base Rows\", type: \"number\" },\n { key: \"current\", name: \"Current Rows\", type: \"number\" },\n { key: \"delta\", name: \"Delta\", type: \"text\" },\n ],\n data: entries.map(([name, counts]) => {\n const base = typeof counts.base === \"number\" ? counts.base : null;\n const current = typeof counts.curr === \"number\" ? counts.curr : null;\n const delta = calculateDelta(base, current);\n\n return [name, base, current, delta];\n }),\n };\n}\n\n/**\n * Converts RowCountResult to DataFrame format\n *\n * @param result - The row count result from the backend\n * @returns DataFrame with name and current columns\n */\nexport function rowCountResultToDataFrame(result: RowCountResult): DataFrame {\n const entries = Object.entries(result);\n\n return {\n columns: [\n { key: \"name\", name: \"Name\", type: \"text\" },\n { key: \"current\", name: \"Row Count\", type: \"number\" },\n ],\n data: entries.map(([name, counts]) => {\n const current = typeof counts.curr === \"number\" ? counts.curr : null;\n return [name, current];\n }),\n };\n}\n\n// ============================================================================\n// Row Status Determination\n// ============================================================================\n\n/**\n * Determines the diff status for a row count entry\n *\n * @param base - Base row count (null if not present)\n * @param current - Current row count (null if not present)\n * @returns Status string: \"added\" | \"removed\" | \"modified\" | undefined\n */\nexport function getRowCountDiffStatus(\n base: number | null,\n current: number | null,\n): \"added\" | \"removed\" | \"modified\" | undefined {\n if (base === null && current !== null) return \"added\";\n if (base !== null && current === null) return \"removed\";\n if (base !== null && current !== null && base !== current) return \"modified\";\n return undefined;\n}\n","/**\n * @file toRowCountDataGrid.ts\n * @description Grid generator for Row Count view (single environment)\n *\n * Generates columns and rows for displaying row counts\n * in a single environment context.\n */\n\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport { RowCountResult } from \"@/lib/api/rowcount\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\nimport { rowCountResultToDataFrame } from \"./rowCountUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RowCountDataGridResult {\n columns: ColumnOrColumnGroup<RowObjectType>[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid data for Row Count view (single environment)\n *\n * @param result - The RowCountResult from the backend\n * @returns Grid columns and rows ready for ScreenshotDataGrid\n *\n * @example\n * ```tsx\n * const { columns, rows } = toRowCountDataGrid(run.result);\n * return <ScreenshotDataGrid columns={columns} rows={rows} />;\n * ```\n */\nexport function toRowCountDataGrid(\n result: RowCountResult,\n): RowCountDataGridResult {\n // Convert to DataFrame format\n const dataFrame = rowCountResultToDataFrame(result);\n\n // Convert DataFrame to row objects\n const rawRows = dataFrameToRowObjects(dataFrame);\n\n // Transform rows (display \"N/A\" for null values)\n const rows: RowObjectType[] = rawRows.map((row) => ({\n ...row,\n current: row.current ?? \"N/A\",\n __status: undefined,\n }));\n\n // Build columns (simple, no diff styling)\n const columns: ColumnOrColumnGroup<RowObjectType>[] = [\n {\n key: \"name\",\n name: \"Name\",\n resizable: true,\n },\n {\n key: \"current\",\n name: \"Row Count\",\n resizable: true,\n },\n ];\n\n return { columns, rows };\n}\n","/**\n * @file toRowCountDiffDataGrid.ts\n * @description Grid generator for Row Count Diff view\n *\n * Generates columns and rows for displaying row count comparisons\n * between base and current environments across multiple models.\n */\n\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport { RowCountDiffResult } from \"@/lib/api/rowcount\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\nimport {\n getRowCountDiffStatus,\n rowCountDiffResultToDataFrame,\n} from \"./rowCountUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RowCountDiffDataGridResult {\n columns: ColumnOrColumnGroup<RowObjectType>[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Cell Class Function\n// ============================================================================\n\n/**\n * Creates a cell class function for row count diff cells\n *\n * Returns appropriate diff-cell-* class based on row status\n */\nfunction createRowCountDiffCellClass(): (\n row: RowObjectType,\n) => string | undefined {\n return (row: RowObjectType) => {\n const base = row.base as number | string | null;\n const current = row.current as number | string | null;\n\n // Handle \"N/A\" string values\n const baseValue = base === \"N/A\" ? null : base;\n const currentValue = current === \"N/A\" ? null : current;\n\n // Both null or equal - no styling\n if (baseValue === currentValue) {\n return undefined;\n }\n\n // Current increased or newly added\n if (\n baseValue === null ||\n (typeof baseValue === \"number\" &&\n typeof currentValue === \"number\" &&\n baseValue < currentValue)\n ) {\n return \"diff-cell-added\";\n }\n\n // Current decreased or removed\n if (\n currentValue === null ||\n (typeof baseValue === \"number\" &&\n typeof currentValue === \"number\" &&\n baseValue > currentValue)\n ) {\n return \"diff-cell-removed\";\n }\n\n return undefined;\n };\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid data for Row Count Diff view\n *\n * @param result - The RowCountDiffResult from the backend\n * @returns Grid columns and rows ready for ScreenshotDataGrid\n *\n * @example\n * ```tsx\n * const { columns, rows } = toRowCountDiffDataGrid(run.result);\n * return <ScreenshotDataGrid columns={columns} rows={rows} />;\n * ```\n */\nexport function toRowCountDiffDataGrid(\n result: RowCountDiffResult,\n): RowCountDiffDataGridResult {\n // Convert to DataFrame format\n const dataFrame = rowCountDiffResultToDataFrame(result);\n\n // Convert DataFrame to row objects\n const rawRows = dataFrameToRowObjects(dataFrame);\n\n // Add __status to each row based on base/current comparison\n const rows: RowObjectType[] = rawRows.map((row) => {\n const base = row.base as number | null;\n const current = row.current as number | null;\n\n return {\n ...row,\n // Display \"N/A\" for null values\n base: base ?? \"N/A\",\n current: current ?? \"N/A\",\n __status: getRowCountDiffStatus(\n typeof base === \"number\" ? base : null,\n typeof current === \"number\" ? current : null,\n ),\n };\n });\n\n // Create cell class function\n const cellClass = createRowCountDiffCellClass();\n\n // Build columns\n const columns: ColumnOrColumnGroup<RowObjectType>[] = [\n {\n key: \"name\",\n name: \"Name\",\n resizable: true,\n cellClass,\n },\n {\n key: \"base\",\n name: \"Base Rows\",\n resizable: true,\n cellClass,\n },\n {\n key: \"current\",\n name: \"Current Rows\",\n resizable: true,\n cellClass,\n },\n {\n key: \"delta\",\n name: \"Delta\",\n resizable: true,\n cellClass,\n },\n ];\n\n return { columns, rows };\n}\n","import React, { createContext, useContext } from \"react\";\nimport { CllInput, ColumnLineageData } from \"@/lib/api/cll\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport { Run } from \"@/lib/api/types\";\nimport { LineageGraphNode, LineageGraphNodes } from \"./lineage\";\n\ntype NewType = LineageDiffViewOptions;\ntype ActionMode = \"per_node\" | \"multi_nodes\";\n\ninterface NodeAction {\n mode: ActionMode;\n status?: \"pending\" | \"running\" | \"success\" | \"failure\" | \"skipped\";\n skipReason?: string;\n run?: Run;\n}\n\nexport interface ActionState {\n mode: ActionMode;\n status: \"pending\" | \"running\" | \"canceling\" | \"canceled\" | \"completed\";\n currentRun?: Partial<Run>;\n completed: number;\n total: number;\n actions: Record<string, NodeAction>;\n}\n\nexport interface LineageViewContextType {\n interactive: boolean;\n nodes: LineageGraphNodes[];\n focusedNode?: LineageGraphNode;\n selectedNodes: LineageGraphNode[];\n cll: ColumnLineageData | undefined;\n\n // context menu\n showContextMenu: (event: React.MouseEvent, node: LineageGraphNodes) => void;\n\n // filter\n viewOptions: LineageDiffViewOptions;\n onViewOptionsChanged: (options: NewType) => void;\n\n // Multi nodes selection\n selectMode: \"selecting\" | \"action_result\" | undefined;\n selectNode: (nodeId: string) => void;\n selectParentNodes: (nodeId: string, degree?: number) => void;\n selectChildNodes: (nodeId: string, degree?: number) => void;\n deselect: () => void;\n\n // node state\n isNodeHighlighted: (nodeId: string) => boolean;\n isNodeSelected: (nodeId: string) => boolean;\n isEdgeHighlighted: (source: string, target: string) => boolean;\n getNodeAction: (nodeId: string) => NodeAction;\n getNodeColumnSet: (nodeId: string) => Set<string>;\n isNodeShowingChangeAnalysis: (nodeId: string) => boolean;\n\n //actions\n runRowCount: () => Promise<void>;\n runRowCountDiff: () => Promise<void>;\n runValueDiff: () => Promise<void>;\n addLineageDiffCheck: (viewMode?: string) => void;\n addSchemaDiffCheck: () => void;\n cancel: () => void;\n actionState: ActionState;\n\n // Column Level Lineage\n centerNode: (nodeId: string) => void;\n showColumnLevelLineage: (cll?: CllInput) => Promise<void>;\n resetColumnLevelLineage: (previous?: boolean) => Promise<void>;\n}\n\nexport const LineageViewContext = createContext<\n LineageViewContextType | undefined\n>(undefined);\n\nexport const useLineageViewContextSafe = (): LineageViewContextType => {\n const context = useContext(LineageViewContext);\n if (!context) {\n throw new Error(\n \"useLineageViewContext must be used within a LineageViewProvider\",\n );\n }\n return context;\n};\n\nexport const useLineageViewContext = (): LineageViewContextType | undefined => {\n return useContext(LineageViewContext);\n};\n","import {\n Box,\n Flex,\n Icon,\n IconButton,\n Menu,\n Portal,\n Spacer,\n Spinner,\n} from \"@chakra-ui/react\";\nimport { VscKebabVertical } from \"react-icons/vsc\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { NodeData } from \"@/lib/api/info\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n trackExploreAction,\n} from \"@/lib/api/track\";\nimport { SchemaDiffRow } from \"@/lib/dataGrid/generators/toSchemaDataGrid\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { supportsHistogramDiff } from \"../histogram/HistogramDiffForm\";\nimport { useLineageViewContext } from \"../lineage/LineageViewContext\";\n\nexport function ColumnNameCell({\n model,\n row,\n singleEnv,\n cllRunning,\n showMenu = true,\n}: {\n model: NodeData;\n row: SchemaDiffRow;\n singleEnv?: boolean;\n cllRunning?: boolean;\n showMenu?: boolean;\n}) {\n const lineageViewContext = useLineageViewContext();\n const { runAction } = useRecceActionContext();\n const { featureToggles } = useRecceInstanceContext();\n const { name, baseType, currentType, baseIndex, currentIndex } = row;\n const columnType = currentType ?? baseType;\n\n const handleProfileDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_COLUMN_MENU,\n node_count: 1,\n });\n runAction(\n \"profile_diff\",\n { model: model.name, columns: [name] },\n { showForm: false },\n );\n };\n\n const handleHistogramDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.HISTOGRAM_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_COLUMN_MENU,\n node_count: 1,\n });\n runAction(\n \"histogram_diff\",\n { model: model.name, column_name: name, column_type: columnType },\n { showForm: false },\n );\n };\n\n const handleTopkDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.TOP_K_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_COLUMN_MENU,\n node_count: 1,\n });\n runAction(\n \"top_k_diff\",\n { model: model.name, column_name: name, k: 50 },\n { showForm: false },\n );\n };\n\n const handleValueDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_COLUMN_MENU,\n node_count: 1,\n });\n runAction(\n \"value_diff\",\n { model: model.name, columns: [name] },\n { showForm: true },\n );\n };\n\n const addedOrRemoved = !baseType || !currentType;\n const isCllDisabled =\n lineageViewContext === undefined ||\n (baseIndex !== undefined && currentIndex === undefined);\n\n return (\n <Tooltip\n content=\"View column lineage\"\n positioning={{ placement: \"top\" }}\n showArrow\n disabled={isCllDisabled}\n >\n <Flex alignItems={\"center\"} gap=\"3px\">\n <Box overflow=\"hidden\" textOverflow=\"ellipsis\" whiteSpace=\"nowrap\">\n {name}\n </Box>\n <Spacer />\n {cllRunning && <Spinner size=\"xs\" color=\"gray.400\" />}\n {showMenu && !singleEnv && model.resource_type !== \"source\" && (\n <Menu.Root>\n <Menu.Trigger asChild>\n <IconButton\n display=\"flex\"\n className=\"row-context-menu\"\n variant=\"plain\"\n size={\"sm\"}\n color=\"gray\"\n _hover={{ color: \"black\" }}\n disabled={featureToggles.disableDatabaseQuery}\n onClick={(e) => {\n // prevent the click event from propagating to the Cell clicking\n e.stopPropagation();\n }}\n >\n <Icon as={VscKebabVertical} />\n </IconButton>\n </Menu.Trigger>\n\n <Portal>\n <Menu.Positioner>\n <Menu.Content lineHeight=\"20px\">\n {/* <MenuGroup title=\"Column\" m=\"0\" p=\"4px 12px\">\n <MenuItem fontSize=\"10pt\">Set Alias Name</MenuItem>\n </MenuGroup> */}\n <Menu.ItemGroup title=\"Diff\" m=\"0\" p=\"4px 12px\">\n <Menu.Item\n value=\"profile-diff\"\n fontSize=\"0.85rem\"\n onClick={handleProfileDiff}\n disabled={addedOrRemoved}\n >\n Profile Diff\n </Menu.Item>\n <Menu.Item\n value=\"histogram-diff\"\n fontSize=\"0.85rem\"\n onClick={handleHistogramDiff}\n disabled={\n addedOrRemoved ||\n (columnType ? !supportsHistogramDiff(columnType) : true)\n }\n >\n Histogram Diff\n </Menu.Item>\n <Menu.Item\n value=\"top-k-diff\"\n fontSize=\"0.85rem\"\n onClick={handleTopkDiff}\n disabled={addedOrRemoved}\n >\n Top-k Diff\n </Menu.Item>\n <Menu.Item\n value=\"value-diff\"\n fontSize=\"0.85rem\"\n onClick={handleValueDiff}\n disabled={addedOrRemoved}\n >\n Value Diff\n </Menu.Item>\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n )}\n </Flex>\n </Tooltip>\n );\n}\n","/**\n * @file schemaCells.tsx\n * @description Cell components and render functions for Schema grid views\n */\n\nimport React from \"react\";\nimport { RenderCellProps } from \"react-data-grid\";\nimport { ColumnNameCell } from \"@/components/schema/ColumnNameCell\";\nimport { NodeData } from \"@/lib/api/info\";\nimport type {\n SchemaDiffRow,\n SchemaRow,\n} from \"@/lib/dataGrid/generators/toSchemaDataGrid\";\n\n// ============================================================================\n// Render Functions for toSchemaDataGrid.ts\n// ============================================================================\n\n/**\n * Creates a renderCell function for schema diff column names\n */\nexport function createColumnNameRenderer(\n node: NodeData,\n cllRunningMap?: Map<string, boolean>,\n showMenu?: boolean,\n): (props: RenderCellProps<SchemaDiffRow>) => React.ReactNode {\n return ({ row }) => (\n <ColumnNameCell\n model={node}\n row={row}\n cllRunning={cllRunningMap?.get(row.name) ?? false}\n showMenu={showMenu}\n />\n );\n}\n\n/**\n * Creates a renderCell function for single-env schema column names\n */\nexport function createSingleEnvColumnNameRenderer(\n node: NodeData,\n cllRunningMap?: Map<string, boolean>,\n showMenu?: boolean,\n): (props: RenderCellProps<SchemaRow>) => React.ReactNode {\n return ({ row }) => (\n <ColumnNameCell\n model={node}\n row={row}\n cllRunning={cllRunningMap?.get(row.name) ?? false}\n singleEnv\n showMenu={showMenu}\n />\n );\n}\n","/**\n * @file toSchemaDataGrid.ts\n * @description Grid generator for schema diff and single-environment schema views\n *\n * This file is intentionally .ts (not .tsx) - all JSX rendering is delegated\n * to schemaCells.tsx via render functions.\n */\n\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport {\n createColumnNameRenderer,\n createSingleEnvColumnNameRenderer,\n} from \"@/components/ui/dataGrid/schemaCells\";\nimport { NodeColumnData, NodeData } from \"@/lib/api/info\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface SchemaDiffRow extends RowObjectType {\n name: string;\n reordered?: boolean;\n currentIndex?: number;\n baseIndex?: number;\n currentType?: string;\n baseType?: string;\n}\n\nexport interface SchemaRow extends RowObjectType {\n name: string;\n index: number;\n type?: string;\n}\n\ntype SchemaDiff = Record<string, SchemaDiffRow>;\n\nexport interface SchemaDataGridOptions {\n /** Node data for context menu actions */\n node?: NodeData;\n /** Map of column names to CLL loading state */\n cllRunningMap?: Map<string, boolean>;\n /** Whether to show the column action menu (default: true) */\n showMenu?: boolean;\n}\n\nexport interface SchemaDataGridResult {\n columns: ColumnOrColumnGroup<SchemaDiffRow>[];\n rows: SchemaDiffRow[];\n}\n\nexport interface SingleEnvSchemaDataGridResult {\n columns: ColumnOrColumnGroup<SchemaRow>[];\n rows: SchemaRow[];\n}\n\n// ============================================================================\n// Data Transformation\n// ============================================================================\n\n/**\n * Merges base and current column schemas into a diff structure\n */\nexport function mergeColumns(\n baseColumns: NodeData[\"columns\"] = {},\n currentColumns: NodeData[\"columns\"] = {},\n): SchemaDiff {\n const result: SchemaDiff = {};\n const mergedStatus = mergeKeysWithStatus(\n Object.keys(baseColumns),\n Object.keys(currentColumns),\n );\n\n Object.entries(mergedStatus).forEach(([name, status]) => {\n result[name] = {\n name,\n reordered: status === \"reordered\",\n __status: undefined,\n };\n });\n\n let filteredIndex = 0;\n Object.entries(baseColumns).forEach(([name, column]) => {\n if (column != null) {\n result[name].baseIndex = filteredIndex += 1;\n result[name].baseType = column.type;\n }\n });\n\n filteredIndex = 0;\n Object.entries(currentColumns).forEach(([name, column]) => {\n if (column != null) {\n result[name].currentIndex = filteredIndex += 1;\n result[name].currentType = column.type;\n }\n });\n\n return result;\n}\n\n// ============================================================================\n// Cell Class Functions\n// ============================================================================\n\nfunction getColumnIndexCellClass(row: SchemaDiffRow): string {\n if (\n row.baseIndex !== undefined &&\n row.currentIndex !== undefined &&\n row.reordered === true\n ) {\n return \"column-index-reordered schema-column schema-column-index\";\n }\n return \"schema-column schema-column-index\";\n}\n\nfunction getColumnNameCellClass(): string {\n return \"schema-column\";\n}\n\nfunction getColumnTypeCellClass(row: SchemaDiffRow): string {\n if (\n row.baseIndex !== undefined &&\n row.currentIndex !== undefined &&\n row.baseType !== row.currentType\n ) {\n return \"column-body-type-changed schema-column\";\n }\n return \"schema-column\";\n}\n\n// ============================================================================\n// Main Generator Functions\n// ============================================================================\n\n/**\n * Generates grid configuration for schema diff view\n */\nexport function toSchemaDataGrid(\n schemaDiff: SchemaDiff,\n options: SchemaDataGridOptions = {},\n): SchemaDataGridResult {\n const { node, cllRunningMap, showMenu } = options;\n\n const columns: ColumnOrColumnGroup<SchemaDiffRow>[] = [\n {\n key: \"baseIndex\",\n name: \"\",\n resizable: true,\n minWidth: 35,\n width: 35,\n cellClass: getColumnIndexCellClass,\n },\n {\n key: \"currentIndex\",\n name: \"\",\n resizable: true,\n minWidth: 35,\n width: 35,\n cellClass: getColumnIndexCellClass,\n },\n {\n key: \"name\",\n name: \"Name\",\n resizable: true,\n renderCell: node\n ? createColumnNameRenderer(node, cllRunningMap, showMenu)\n : undefined,\n cellClass: getColumnNameCellClass,\n },\n {\n key: \"baseType\",\n name: \"Base Type\",\n resizable: true,\n cellClass: getColumnTypeCellClass,\n },\n {\n key: \"currentType\",\n name: \"Current Type\",\n resizable: true,\n cellClass: getColumnTypeCellClass,\n },\n ];\n\n const rows = Object.values(schemaDiff);\n\n return { columns, rows };\n}\n\n/**\n * Generates grid configuration for single-environment schema view\n */\nexport function toSingleEnvDataGrid(\n nodeColumns: NodeData[\"columns\"] = {},\n options: SchemaDataGridOptions = {},\n): SingleEnvSchemaDataGridResult {\n const { node, cllRunningMap, showMenu } = options;\n\n const nodeColumnList = Object.entries(nodeColumns).filter(\n ([_, column]) => column != null,\n ) as [string, NodeColumnData][];\n\n const rows: SchemaRow[] = nodeColumnList.map(([name, column], index) => ({\n name,\n index: index + 1,\n type: column.type,\n __status: undefined,\n }));\n\n const columns: ColumnOrColumnGroup<SchemaRow>[] = [\n {\n key: \"index\",\n name: \"\",\n resizable: true,\n minWidth: 35,\n width: 35,\n cellClass: \"schema-column schema-column-index\",\n },\n {\n key: \"name\",\n name: \"Name\",\n resizable: true,\n renderCell: node\n ? createSingleEnvColumnNameRenderer(node, cllRunningMap, showMenu)\n : undefined,\n cellClass: \"schema-column\",\n },\n {\n key: \"type\",\n name: \"Type\",\n resizable: true,\n cellClass: \"schema-column\",\n },\n ];\n\n return { columns, rows };\n}\n","/**\n * @file valueDiffCells.tsx\n * @description Cell components and render functions for Value Diff summary grid\n *\n * Provides specialized cell renderers for the value diff summary view:\n * - PrimaryKeyIndicatorCell: Shows key icon for primary key columns\n * - ValueDiffColumnNameCell: Column name with context menu for drill-down\n * - MatchedPercentCell: Formatted percentage display\n *\n * Also exports render functions for use in toValueDataGrid.ts generator.\n */\n\nimport {\n Box,\n Center,\n Flex,\n Icon,\n IconButton,\n Menu,\n Portal,\n Spacer,\n} from \"@chakra-ui/react\";\nimport React from \"react\";\nimport { RenderCellProps } from \"react-data-grid\";\nimport { PiDotsThreeVertical } from \"react-icons/pi\";\nimport { VscKey } from \"react-icons/vsc\";\nimport { RowObjectType } from \"@/lib/api/types\";\nimport { ValueDiffParams } from \"@/lib/api/valuediff\";\nimport {\n RecceActionOptions,\n useRecceActionContext,\n} from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\n\n// ============================================================================\n// PrimaryKeyIndicatorCell\n// ============================================================================\n\nexport interface PrimaryKeyIndicatorCellProps {\n /** The column name to check */\n columnName: string;\n /** List of primary key column names */\n primaryKeys: string[];\n}\n\n/**\n * Cell component that displays a key icon for primary key columns\n *\n * @example\n * <PrimaryKeyIndicatorCell\n * columnName=\"user_id\"\n * primaryKeys={[\"user_id\", \"order_id\"]}\n * />\n */\nexport function PrimaryKeyIndicatorCell({\n columnName,\n primaryKeys,\n}: PrimaryKeyIndicatorCellProps) {\n const isPrimaryKey = primaryKeys.includes(columnName);\n\n return <Center height=\"100%\">{isPrimaryKey && <Icon as={VscKey} />}</Center>;\n}\n\n// ============================================================================\n// ValueDiffColumnNameCell\n// ============================================================================\n\nexport interface ValueDiffColumnNameCellProps {\n /** The column name to display */\n column: string;\n /** Parameters from the value_diff run */\n params: ValueDiffParams;\n}\n\n/**\n * Cell component for column names with context menu for drill-down actions\n *\n * @description Renders the column name with a context menu that provides:\n * - \"Show mismatched values...\" - Opens form to configure detail view\n * - \"Show mismatched values for '{column}'\" - Directly shows mismatches for this column\n *\n * @example\n * <ValueDiffColumnNameCell\n * column=\"email\"\n * params={{ model: \"users\", primary_key: \"id\" }}\n * />\n */\nexport function ValueDiffColumnNameCell({\n params,\n column,\n}: ValueDiffColumnNameCellProps) {\n const { runAction } = useRecceActionContext();\n const { featureToggles } = useRecceInstanceContext();\n\n const handleValueDiffDetail = (\n paramsOverride?: Partial<ValueDiffParams>,\n options?: RecceActionOptions,\n ) => {\n const newParams = {\n ...params,\n ...paramsOverride,\n };\n\n runAction(\"value_diff_detail\", newParams, options);\n };\n\n return (\n <Flex>\n <Box overflow=\"hidden\" textOverflow=\"ellipsis\" whiteSpace=\"nowrap\">\n {column}\n </Box>\n <Spacer />\n\n <Menu.Root lazyMount>\n <Menu.Trigger asChild>\n <IconButton\n className=\"row-context-menu\"\n variant=\"plain\"\n size=\"sm\"\n disabled={featureToggles.disableDatabaseQuery}\n >\n <PiDotsThreeVertical />\n </IconButton>\n </Menu.Trigger>\n\n <Portal>\n <Menu.Positioner>\n <Menu.Content lineHeight=\"20px\">\n <Menu.ItemGroup title=\"Action\" as={Box} fontSize=\"8pt\">\n <Menu.Item\n value=\"show-mismatched-values\"\n fontSize=\"10pt\"\n onClick={() => {\n handleValueDiffDetail({}, { showForm: true });\n }}\n >\n Show mismatched values...\n </Menu.Item>\n <Menu.Item\n value=\"show-mismatched-columns\"\n fontSize=\"10pt\"\n onClick={() => {\n handleValueDiffDetail(\n { columns: [column] },\n { showForm: false },\n );\n }}\n >\n Show mismatched values for &apos;{column}&apos;\n </Menu.Item>\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </Flex>\n );\n}\n\n// ============================================================================\n// MatchedPercentCell\n// ============================================================================\n\nexport interface MatchedPercentCellProps {\n /** The percentage value (0-1 scale) */\n value: number | undefined | null;\n}\n\n/**\n * Cell component for displaying match percentage with special formatting\n *\n * @description Formats the percentage value with special handling for edge cases:\n * - Values > 99.99% but < 100%: Shows \"~99.99 %\"\n * - Values > 0% but < 0.01%: Shows \"~0.01 %\"\n * - null/undefined: Shows \"N/A\"\n * - Other values: Shows \"XX.XX %\"\n *\n * @example\n * <MatchedPercentCell value={0.9542} /> // \"95.42 %\"\n * <MatchedPercentCell value={0.99999} /> // \"~99.99 %\"\n * <MatchedPercentCell value={null} /> // \"N/A\"\n */\nexport function MatchedPercentCell({ value }: MatchedPercentCellProps) {\n let displayValue = \"N/A\";\n\n if (value != null) {\n if (value > 0.9999 && value < 1) {\n displayValue = \"~99.99 %\";\n } else if (value < 0.0001 && value > 0) {\n displayValue = \"~0.01 %\";\n } else {\n displayValue = `${(value * 100).toFixed(2)} %`;\n }\n }\n\n return <Box textAlign=\"end\">{displayValue}</Box>;\n}\n\n// ============================================================================\n// Render Functions for toValueDataGrid.ts\n// ============================================================================\n\n/**\n * Creates a renderCell function for the primary key indicator column\n *\n * @param primaryKeys - List of primary key column names\n * @returns A renderCell function compatible with react-data-grid\n */\nexport function createPrimaryKeyIndicatorRenderer(\n primaryKeys: string[],\n): (props: RenderCellProps<RowObjectType>) => React.ReactNode {\n return ({ row }) => (\n <PrimaryKeyIndicatorCell\n columnName={String(row[\"0\"])}\n primaryKeys={primaryKeys}\n />\n );\n}\n\n/**\n * Creates a renderCell function for the column name column\n *\n * @param params - ValueDiffParams from the run\n * @returns A renderCell function compatible with react-data-grid\n */\nexport function createColumnNameRenderer(\n params: ValueDiffParams,\n): (props: RenderCellProps<RowObjectType>) => React.ReactNode {\n return ({ row, column }) => (\n <ValueDiffColumnNameCell column={String(row[column.key])} params={params} />\n );\n}\n\n/**\n * renderCell function for the matched percentage column\n *\n * @param props - RenderCellProps from react-data-grid\n * @returns React node displaying formatted percentage\n */\nexport function renderMatchedPercentCell({\n row,\n column,\n}: RenderCellProps<RowObjectType>): React.ReactNode {\n return <MatchedPercentCell value={row[column.key] as number} />;\n}\n","/**\n * @file toValueDataGrid.ts\n * @description Grid generator for Value Diff summary view\n *\n * Generates columns and rows for displaying column-level match statistics\n * from a value_diff run. This shows a summary table where each row\n * represents a column's match count and percentage.\n *\n * NOTE: This is different from toValueDiffGrid which handles row-level diffs.\n * This generator is for the summary view showing column match statistics.\n *\n * This file is intentionally .ts (not .tsx) - all JSX rendering is delegated\n * to valueDiffCells.tsx via render functions.\n */\n\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport {\n createColumnNameRenderer,\n createPrimaryKeyIndicatorRenderer,\n renderMatchedPercentCell,\n} from \"@/components/ui/dataGrid/valueDiffCells\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\nimport { dataFrameToRowObjects } from \"@/utils/transforms\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Options for generating the value data grid\n */\nexport interface ValueDataGridOptions {\n /** Parameters from the value_diff run */\n params: ValueDiffParams;\n}\n\n/**\n * Result structure for the value data grid\n */\nexport interface ValueDataGridResult {\n columns: ColumnOrColumnGroup<RowObjectType>[];\n rows: RowObjectType[];\n}\n\n// ============================================================================\n// Column Schema Definition\n// ============================================================================\n\n/**\n * Schema definition for the value diff summary DataFrame\n *\n * This defines the expected structure of the data from the backend.\n * Using explicit schema avoids the \"basicColumns\" type fix pattern.\n */\nconst VALUE_DIFF_SUMMARY_SCHEMA: DataFrame[\"columns\"] = [\n { key: \"0\", name: \"Column\", type: \"text\" },\n { key: \"1\", name: \"Matched\", type: \"number\" },\n { key: \"2\", name: \"Matched %\", type: \"number\" },\n];\n\n// ============================================================================\n// Cell Class Functions\n// ============================================================================\n\n/**\n * Cell class function for matched columns\n * Applies \"diff-cell-modified\" class when match percentage is less than 100%\n */\nfunction getMatchedCellClass(row: RowObjectType): string | undefined {\n const value = row[\"2\"] as unknown as number | undefined;\n return value != null && value < 1 ? \"diff-cell-modified\" : undefined;\n}\n\n// ============================================================================\n// Column Definitions\n// ============================================================================\n\n/**\n * Column keys used in the value diff summary grid\n */\nconst COLUMN_KEYS = {\n PRIMARY_KEY_INDICATOR: \"__is_pk__\",\n COLUMN_NAME: \"0\",\n MATCHED_COUNT: \"1\",\n MATCHED_PERCENT: \"2\",\n} as const;\n\n/**\n * Creates column definitions for the value diff summary grid\n *\n * @param primaryKeys - Array of primary key column names\n * @param params - ValueDiffParams from the run\n * @returns Array of column definitions\n */\nfunction createColumnDefinitions(\n primaryKeys: string[],\n params: ValueDiffParams,\n): ColumnOrColumnGroup<RowObjectType>[] {\n return [\n // Primary key indicator column\n {\n key: COLUMN_KEYS.PRIMARY_KEY_INDICATOR,\n name: \"\",\n width: 30,\n maxWidth: 30,\n renderCell: createPrimaryKeyIndicatorRenderer(primaryKeys),\n },\n // Column name column with context menu\n {\n key: COLUMN_KEYS.COLUMN_NAME,\n name: \"Column\",\n resizable: true,\n renderCell: createColumnNameRenderer(params),\n cellClass: \"cell-show-context-menu\",\n },\n // Matched count column\n {\n key: COLUMN_KEYS.MATCHED_COUNT,\n name: \"Matched\",\n resizable: true,\n cellClass: getMatchedCellClass,\n },\n // Matched percentage column\n {\n key: COLUMN_KEYS.MATCHED_PERCENT,\n name: \"Matched %\",\n resizable: true,\n renderCell: renderMatchedPercentCell,\n cellClass: getMatchedCellClass,\n },\n ];\n}\n\n// ============================================================================\n// Main Generator Function\n// ============================================================================\n\n/**\n * Generates grid configuration for value diff summary view\n *\n * @description Creates columns and rows for displaying column-level match\n * statistics. Each row represents a column from the compared data with\n * its match count and percentage.\n *\n * @param result - The value diff result containing summary data\n * @param options - Configuration options including params\n * @returns Grid columns and rows ready for ScreenshotDataGrid\n *\n * @example\n * const { columns, rows } = toValueDataGrid(result, {\n * params: run.params,\n * });\n */\nexport function toValueDataGrid(\n result: ValueDiffResult,\n options: ValueDataGridOptions,\n): ValueDataGridResult {\n const { params } = options;\n\n // Extract primary keys as array\n const primaryKeys = Array.isArray(params.primary_key)\n ? params.primary_key\n : [params.primary_key];\n\n // Apply schema to DataFrame for proper type handling\n // This ensures dataFrameToRowObjects has type information available\n const dataFrameWithSchema: DataFrame = {\n ...result.data,\n columns: VALUE_DIFF_SUMMARY_SCHEMA,\n };\n\n // Build columns using render functions from valueDiffCells\n const columns = createColumnDefinitions(primaryKeys, params);\n\n // Convert DataFrame to row objects\n const rows = dataFrameToRowObjects(dataFrameWithSchema);\n\n return { columns, rows };\n}\n","/**\n * @file toValueDiffGrid.ts\n * @description Value diff grid generation for joined data (with IN_A/IN_B columns)\n *\n * REFACTORED: Now uses shared utilities from @/lib/dataGrid/shared\n */\n\nimport \"src/components/query/styles.css\";\nimport { DataFrame, RowObjectType } from \"@/lib/api/types\";\nimport { QueryDataDiffGridOptions } from \"@/lib/dataGrid/generators/toDataDiffGrid\";\nimport {\n buildDiffColumnDefinitions,\n buildDiffRows,\n buildJoinedColumnMap,\n getDisplayColumns,\n getPrimaryKeyValue,\n validatePrimaryKeys,\n validateToValueDiffGridInputs,\n} from \"@/lib/dataGrid/shared\";\nimport { dataFrameToRowObjects, getCaseInsensitive } from \"@/utils/transforms\";\n\n// ============================================================================\n// Main Grid Generation Function\n// ============================================================================\n\nexport function toValueDiffGrid(\n df: DataFrame,\n primaryKeys: string[],\n options?: QueryDataDiffGridOptions,\n) {\n // Add validation at entry point\n validateToValueDiffGridInputs(df, primaryKeys);\n const pinnedColumns = options?.pinnedColumns ?? [];\n const changedOnly = options?.changedOnly ?? false;\n const displayMode = options?.displayMode ?? \"inline\";\n const columnsRenderMode = options?.columnsRenderMode ?? {};\n const transformedData = dataFrameToRowObjects(df);\n\n // REFACTORED: Use shared utility for column map\n const columnMap = buildJoinedColumnMap(df);\n\n // Build row maps based on IN_A/IN_B columns\n const baseMap: Record<string, RowObjectType | undefined> = {};\n const currentMap: Record<string, RowObjectType | undefined> = {};\n\n // REFACTORED: Use shared utility for PK validation\n const primaryKeyKeys = validatePrimaryKeys(df.columns, primaryKeys, true);\n const inBaseIndex = columnMap.IN_A.key;\n const inCurrentIndex = columnMap.IN_B.key;\n\n transformedData.forEach((row) => {\n // REFACTORED: Use shared utility for PK value generation\n const key = getPrimaryKeyValue(df.columns, primaryKeyKeys, row, true);\n\n if (getCaseInsensitive(row, inBaseIndex)) {\n baseMap[key.toLowerCase()] = row;\n }\n\n if (getCaseInsensitive(row, inCurrentIndex)) {\n currentMap[key.toLowerCase()] = row;\n }\n });\n\n const { rows, rowStats } = buildDiffRows({\n baseMap,\n currentMap,\n baseColumns: df.columns,\n currentColumns: df.columns, // Same columns for joined data\n columnMap,\n primaryKeys,\n caseInsensitive: true, // valuediff uses case-insensitive\n changedOnly,\n });\n\n // REFACTORED: Use getDisplayColumns for column selection\n const columnConfigs = getDisplayColumns({\n columnMap,\n primaryKeys,\n pinnedColumns,\n columnsRenderMode,\n changedOnly,\n rowStats,\n excludeColumns: [\"IN_A\", \"IN_B\", \"in_a\", \"in_b\"],\n caseInsensitive: true,\n strictMode: true, // valuediff requires columns to exist\n });\n\n // REFACTORED: Use buildDiffColumnDefinitions for JSX generation\n const { columns } = buildDiffColumnDefinitions({\n columns: columnConfigs,\n displayMode,\n allowIndexFallback: false, // valuediff requires PKs\n baseTitle: options?.baseTitle,\n currentTitle: options?.currentTitle,\n headerProps: {\n primaryKeys: primaryKeys.map((k) => k.toLowerCase()),\n pinnedColumns,\n onPinnedColumnsChange: options?.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options?.onColumnsRenderModeChanged,\n caseInsensitive: true,\n },\n });\n\n return {\n columns,\n rows,\n };\n}\n","/**\n * @file dataGridFactory.ts\n * @description Abstract factory for creating data grid configurations\n *\n * This file provides a unified interface for generating grid data\n * for different run types (query, query_diff, value_diff, value_diff_detail, profile, profile_diff)\n *\n * It wraps the existing implementations:\n * - toDataGrid for single DataFrame display\n * - toDataDiffGrid for comparing two DataFrames\n * - toValueDiffGrid for joined diff data (with IN_A/IN_B columns)\n * - toValueDataGrid for value_diff summary (column match statistics)\n */\n\nimport { ColumnOrColumnGroup } from \"react-data-grid\";\nimport { QueryDiffResult } from \"@/lib/api/adhocQuery\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { ProfileDiffResult } from \"@/lib/api/profile\";\nimport { RowCountDiffResult, RowCountResult } from \"@/lib/api/rowcount\";\nimport {\n ColumnRenderMode,\n ColumnType,\n DataFrame,\n isProfileDiffRun,\n isProfileRun,\n isQueryBaseRun,\n isQueryDiffRun,\n isQueryRun,\n isRowCountDiffRun,\n isRowCountRun,\n isValueDiffDetailRun,\n isValueDiffRun,\n RowObjectType,\n Run,\n} from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\n// Import existing implementations\nimport { toDataDiffGrid } from \"@/lib/dataGrid/generators/toDataDiffGrid\";\nimport { toDataGrid } from \"@/lib/dataGrid/generators/toDataGrid\";\nimport { toRowCountDataGrid } from \"@/lib/dataGrid/generators/toRowCountDataGrid\";\nimport { toRowCountDiffDataGrid } from \"@/lib/dataGrid/generators/toRowCountDiffDataGrid\";\nimport {\n mergeColumns,\n type SchemaDataGridOptions,\n type SchemaDataGridResult,\n type SingleEnvSchemaDataGridResult,\n toSchemaDataGrid,\n toSingleEnvDataGrid,\n} from \"@/lib/dataGrid/generators/toSchemaDataGrid\";\nimport { toValueDataGrid } from \"@/lib/dataGrid/generators/toValueDataGrid\";\nimport { toValueDiffGrid } from \"@/lib/dataGrid/generators/toValueDiffGrid\";\n\n// ============================================================================\n// Types & Interfaces\n// ============================================================================\n\n/**\n * Common options shared across all grid types\n */\nexport interface BaseGridOptions {\n primaryKeys?: string[];\n pinnedColumns?: string[];\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n onPrimaryKeyChange?: (primaryKeys: string[]) => void;\n onPinnedColumnsChange?: (pinnedColumns: string[]) => void;\n onColumnsRenderModeChanged?: (cols: Record<string, ColumnRenderMode>) => void;\n}\n\n/**\n * Additional options for diff grids\n */\nexport interface DiffGridOptions extends BaseGridOptions {\n changedOnly?: boolean;\n displayMode?: \"inline\" | \"side_by_side\";\n baseTitle?: string;\n currentTitle?: string;\n}\n\n/**\n * Standard output structure for all grid generation functions\n */\nexport interface DataGridResult {\n columns: (ColumnOrColumnGroup<RowObjectType> & {\n columnType?: ColumnType;\n columnRenderMode?: ColumnRenderMode;\n })[];\n rows: RowObjectType[];\n invalidPKeyBase?: boolean;\n invalidPKeyCurrent?: boolean;\n}\n\n/**\n * Discriminated union for run result data\n */\ntype RunResultData =\n | { kind: \"query\"; result: DataFrame }\n | { kind: \"query_diff_separate\"; result: QueryDiffResult }\n | {\n kind: \"query_diff_joined\";\n result: QueryDiffResult;\n primaryKeys: string[];\n }\n | { kind: \"value_diff\"; result: ValueDiffResult; params: ValueDiffParams }\n | { kind: \"value_diff_detail\"; result: DataFrame; primaryKeys: string[] }\n | { kind: \"profile\"; result: ProfileDiffResult }\n | { kind: \"profile_diff\"; result: ProfileDiffResult }\n // NEW: Add row count types\n | { kind: \"row_count\"; result: RowCountResult }\n | { kind: \"row_count_diff\"; result: RowCountDiffResult };\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Determines the appropriate grid generation strategy based on run type and data\n */\nfunction determineDataKind(run: Run): RunResultData | null {\n if (isQueryRun(run) || isQueryBaseRun(run)) {\n if (!run.result) return null;\n return { kind: \"query\", result: run.result };\n }\n\n if (isQueryDiffRun(run)) {\n if (!run.result) return null;\n // If the result has a `diff` field, it's pre-joined data\n if (run.result.diff && run.params?.primary_keys) {\n return {\n kind: \"query_diff_joined\",\n result: run.result,\n primaryKeys: run.params.primary_keys,\n };\n }\n // Otherwise, it's separate base/current DataFrames\n return { kind: \"query_diff_separate\", result: run.result };\n }\n\n if (isValueDiffRun(run)) {\n if (!run.result || !run.params) return null;\n return {\n kind: \"value_diff\",\n result: run.result,\n params: run.params,\n };\n }\n\n if (isValueDiffDetailRun(run)) {\n if (!run.result || !run.params?.primary_key) return null;\n const primaryKey = run.params.primary_key;\n const primaryKeys = Array.isArray(primaryKey) ? primaryKey : [primaryKey];\n return {\n kind: \"value_diff_detail\",\n result: run.result,\n primaryKeys,\n };\n }\n\n if (isProfileRun(run)) {\n if (!run.result?.current) return null;\n return { kind: \"profile\", result: run.result };\n }\n\n if (isProfileDiffRun(run)) {\n if (!run.result) return null;\n return { kind: \"profile_diff\", result: run.result };\n }\n\n if (isRowCountRun(run)) {\n if (!run.result) return null;\n return { kind: \"row_count\", result: run.result };\n }\n\n if (isRowCountDiffRun(run)) {\n if (!run.result) return null;\n return { kind: \"row_count_diff\", result: run.result };\n }\n\n return null;\n}\n\n/**\n * Extracts the primary key field name from profile data\n */\nfunction getProfilePrimaryKey(result: ProfileDiffResult): string {\n const field = result.current?.columns.find(\n (f) => f.name.toLowerCase() === \"column_name\",\n );\n return field?.name ?? \"column_name\";\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\n/**\n * Creates grid data from a Run object and options\n *\n * This is the main entry point that abstracts away the different\n * data transformations needed for different run types.\n *\n * @param run - The Run object containing result data\n * @param options - Grid configuration options\n * @returns DataGridResult with columns and rows, or null if invalid\n *\n * @example\n * ```tsx\n * const gridData = createDataGrid(run, {\n * primaryKeys: ['id'],\n * pinnedColumns: ['name'],\n * changedOnly: true,\n * displayMode: 'inline',\n * });\n *\n * if (gridData) {\n * return <ScreenshotDataGrid columns={gridData.columns} rows={gridData.rows} />;\n * }\n * ```\n */\nexport function createDataGrid(\n run: Run,\n options: DiffGridOptions = {},\n): DataGridResult | null {\n const dataKind = determineDataKind(run);\n if (!dataKind) return null;\n\n switch (dataKind.kind) {\n case \"query\":\n return toDataGrid(dataKind.result, {\n primaryKeys: options.primaryKeys,\n pinnedColumns: options.pinnedColumns,\n columnsRenderMode: options.columnsRenderMode,\n onPrimaryKeyChange: options.onPrimaryKeyChange,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"query_diff_separate\":\n return toDataDiffGrid(\n dataKind.result.base,\n dataKind.result.current,\n options,\n );\n\n case \"query_diff_joined\":\n if (!dataKind.result.diff) {\n return null;\n }\n return toValueDiffGrid(dataKind.result.diff, dataKind.primaryKeys, {\n changedOnly: options.changedOnly,\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n baseTitle: options.baseTitle,\n currentTitle: options.currentTitle,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"value_diff\":\n return toValueDataGrid(dataKind.result, { params: dataKind.params });\n\n case \"value_diff_detail\":\n return toValueDiffGrid(dataKind.result, dataKind.primaryKeys, {\n changedOnly: options.changedOnly,\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n\n case \"profile\": {\n if (!dataKind.result.current) {\n return null;\n }\n const primaryKey = getProfilePrimaryKey(dataKind.result);\n return toDataGrid(dataKind.result.current, {\n primaryKeys: [primaryKey],\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n }\n\n case \"profile_diff\": {\n const primaryKey = getProfilePrimaryKey(dataKind.result);\n return toDataDiffGrid(dataKind.result.base, dataKind.result.current, {\n primaryKeys: [primaryKey],\n pinnedColumns: options.pinnedColumns,\n onPinnedColumnsChange: options.onPinnedColumnsChange,\n displayMode: options.displayMode,\n columnsRenderMode: options.columnsRenderMode,\n onColumnsRenderModeChanged: options.onColumnsRenderModeChanged,\n });\n }\n\n case \"row_count\":\n return toRowCountDataGrid(dataKind.result);\n\n case \"row_count_diff\":\n return toRowCountDiffDataGrid(dataKind.result);\n\n default:\n return null;\n }\n}\n\n/**\n * Input types for the data-only factory function\n */\nexport type DataGridInput =\n | { type: \"single\"; dataframe: DataFrame }\n | { type: \"dual\"; base?: DataFrame; current?: DataFrame }\n | { type: \"joined\"; dataframe: DataFrame; primaryKeys: string[] }\n | {\n type: \"schema_diff\";\n base?: NodeData[\"columns\"];\n current?: NodeData[\"columns\"];\n }\n | { type: \"schema_single\"; columns?: NodeData[\"columns\"] };\n\n/**\n * Union of all possible grid results from createDataGridFromData\n */\nexport type DataGridFromDataResult =\n | DataGridResult\n | SchemaDataGridResult\n | SingleEnvSchemaDataGridResult;\n\n/**\n * Alternative factory that accepts raw data instead of Run objects\n * Useful for testing or when you have data outside the Run structure\n *\n * @overload For DataFrame inputs, returns DataGridResult\n * @overload For schema inputs, returns schema-specific result types\n */\nexport function createDataGridFromData(\n input:\n | { type: \"joined\"; dataframe: DataFrame; primaryKeys: string[] }\n | { type: \"dual\"; base?: DataFrame; current?: DataFrame }\n | { type: \"single\"; dataframe: DataFrame },\n options?: DiffGridOptions,\n): DataGridResult;\nexport function createDataGridFromData(\n input: {\n type: \"schema_diff\";\n base?: NodeData[\"columns\"];\n current?: NodeData[\"columns\"];\n },\n options?: SchemaDataGridOptions,\n): SchemaDataGridResult;\nexport function createDataGridFromData(\n input: { type: \"schema_single\"; columns?: NodeData[\"columns\"] },\n options?: SchemaDataGridOptions,\n): SingleEnvSchemaDataGridResult;\nexport function createDataGridFromData(\n input: DataGridInput,\n options?: DiffGridOptions | SchemaDataGridOptions,\n): DataGridFromDataResult {\n switch (input.type) {\n case \"single\":\n return toDataGrid(input.dataframe, (options ?? {}) as DiffGridOptions);\n\n case \"dual\":\n return toDataDiffGrid(\n input.base,\n input.current,\n (options ?? {}) as DiffGridOptions,\n );\n\n case \"joined\":\n return toValueDiffGrid(\n input.dataframe,\n input.primaryKeys,\n (options ?? {}) as DiffGridOptions,\n );\n\n case \"schema_diff\": {\n const schemaDiff = mergeColumns(input.base, input.current);\n return toSchemaDataGrid(\n schemaDiff,\n (options ?? {}) as SchemaDataGridOptions,\n );\n }\n\n case \"schema_single\":\n return toSingleEnvDataGrid(\n input.columns,\n (options ?? {}) as SchemaDataGridOptions,\n );\n }\n}\n\n// Re-export the underlying functions for backward compatibility\nexport { toDataGrid, toDataDiffGrid, toValueDiffGrid };\nexport { mergeColumns, toSchemaDataGrid, toSingleEnvDataGrid };\n","import \"react-data-grid/lib/styles.css\";\nimport { Flex, Text } from \"@chakra-ui/react\";\nimport React, { forwardRef } from \"react\";\nimport { DataGrid, DataGridHandle, DataGridProps } from \"react-data-grid\";\nimport { RowObjectType } from \"@/lib/api/types\";\n\nexport const ScreenshotDataGrid = forwardRef(\n <R = RowObjectType>(\n { ...props }: DataGridProps<R>,\n ref: React.Ref<DataGridHandle>,\n ) => {\n return (\n <DataGrid\n ref={\n ref as React.Ref<DataGridHandle> &\n ((instance: DataGridHandle | null) => void)\n }\n className={\n props.className\n ? props.className + \" no-track-pii-safe\"\n : \"no-track-pii-safe\"\n }\n rowClass={() => \"no-track-pii-safe\"}\n {...props}\n />\n );\n },\n) as <R = RowObjectType>(\n props: DataGridProps<R> & { ref?: React.Ref<DataGridHandle> },\n) => React.ReactElement;\n\ninterface EmptyRowsRendererProps {\n emptyMessage?: string;\n}\n\nexport function EmptyRowsRenderer({ emptyMessage }: EmptyRowsRendererProps) {\n return (\n <Flex\n h=\"35px\"\n alignItems=\"center\"\n justifyContent=\"center\"\n bg=\"gray.100\"\n style={{ textAlign: \"center\", gridColumn: \"1/-1\" }}\n >\n <Text fontWeight=\"600\"> {emptyMessage ?? \"No rows\"}</Text>\n </Flex>\n );\n}\n","import { Button, ButtonGroup } from \"@chakra-ui/react\";\nimport { DiffText } from \"./DiffText\";\n\ninterface ToggleSwitchProps {\n value: boolean;\n onChange: (value: boolean) => void;\n textOn?: string;\n textOff?: string;\n}\nexport const ToggleSwitch = ({\n value,\n onChange,\n textOn,\n textOff,\n}: ToggleSwitchProps) => {\n return (\n <ButtonGroup attached variant=\"outline\" borderRadius=\"full\" size=\"xs\">\n <Button\n onClick={() => {\n onChange(false);\n }}\n color={!value ? \"black\" : \"gray.400\"}\n bg={!value ? \"white\" : \"gray.50\"}\n >\n {textOff ?? \"Off\"}\n </Button>\n <Button\n onClick={() => {\n onChange(true);\n }}\n color={value ? \"black\" : \"gray.400\"}\n bg={value ? \"white\" : \"gray.50\"}\n >\n {textOn ?? \"On\"}\n </Button>\n </ButtonGroup>\n );\n};\n\ninterface DiffDislayModeSwitchProps {\n displayMode: \"inline\" | \"side_by_side\";\n onDisplayModeChanged: (displayMode: \"inline\" | \"side_by_side\") => void;\n}\n\nexport const DiffDisplayModeSwitch = ({\n displayMode,\n onDisplayModeChanged,\n}: DiffDislayModeSwitchProps) => {\n return (\n <>\n {displayMode === \"inline\" && (\n <>\n <DiffText\n value=\"Base\"\n colorPalette=\"red\"\n grayOut={false}\n fontSize=\"10pt\"\n noCopy\n />\n <DiffText\n value=\"Current\"\n colorPalette=\"green\"\n grayOut={false}\n fontSize=\"10pt\"\n noCopy\n />\n </>\n )}\n <ToggleSwitch\n value={displayMode === \"side_by_side\"}\n onChange={(value) => {\n onDisplayModeChanged(value ? \"side_by_side\" : \"inline\");\n }}\n textOff=\"Inline\"\n textOn=\"Side by side\"\n />\n </>\n );\n};\n","import { Box, Flex, Spacer, VStack } from \"@chakra-ui/react\";\nimport _ from \"lodash\";\nimport { ReactNode } from \"react\";\nimport { PiWarning } from \"react-icons/pi\";\nimport { RunResultViewProps } from \"./types\";\n\nexport interface DiffViewOptions {\n changed_only?: boolean;\n}\n\ninterface RunToolbarProps<VO> extends RunResultViewProps<VO> {\n warnings?: string[];\n children?: ReactNode;\n}\n\nexport const RunToolbar = ({\n warnings,\n children,\n}: RunToolbarProps<DiffViewOptions>) => {\n return (\n <Flex\n borderBottom=\"1px solid lightgray\"\n justifyContent=\"flex-end\"\n gap=\"5px\"\n alignItems=\"center\"\n px=\"10px\"\n bg={warnings && warnings.length > 0 ? \"orange.100\" : \"inherit\"}\n >\n <VStack alignItems=\"flex-start\" gap={0}>\n {warnings?.map((warning) => (\n <Box key={_.uniqueId(`-${warning}`)}>\n <PiWarning color=\"orange.600\" /> {warning}\n </Box>\n ))}\n </VStack>\n <Spacer minHeight=\"32px\" />\n {children}\n </Flex>\n );\n};\n","import { Center, Flex } from \"@chakra-ui/react\";\nimport { forwardRef, Ref, useMemo } from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { ProfileDiffViewOptions } from \"@/lib/api/profile\";\nimport {\n ColumnRenderMode,\n isProfileDiffRun,\n isProfileRun,\n} from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport { ScreenshotDataGrid } from \"../data-grid/ScreenshotDataGrid\";\nimport { DiffDisplayModeSwitch } from \"../query/ToggleSwitch\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\n\ntype ProfileDiffResultViewProp = RunResultViewProps<ProfileDiffViewOptions>;\n\nconst PrivateProfileDiffResultView = (\n { run, viewOptions, onViewOptionsChanged }: ProfileDiffResultViewProp,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isProfileDiffRun(run)) {\n throw new Error(\"Only run type profile_diff is supported\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n displayMode,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n displayMode,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar run={run}>\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\nconst PrivateProfileResultView = (\n { run, viewOptions, onViewOptionsChanged }: ProfileDiffResultViewProp,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isProfileRun(run)) {\n throw new Error(\"Only run type profile_diff is supported\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\nexport const ProfileDiffResultView = forwardRef(PrivateProfileDiffResultView);\nexport const ProfileResultView = forwardRef(PrivateProfileResultView);\n","import { Checkbox } from \"@chakra-ui/react\";\n\ninterface ChangedOnlyCheckboxProps {\n changedOnly?: boolean;\n onChange: () => void;\n}\nexport const ChangedOnlyCheckbox = ({\n changedOnly,\n onChange,\n}: ChangedOnlyCheckboxProps) => {\n return (\n <Checkbox.Root\n size=\"xs\"\n checked={changedOnly}\n onCheckedChange={() => {\n onChange();\n }}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>Changed only</Checkbox.Label>\n </Checkbox.Root>\n );\n};\n","import \"react-data-grid/lib/styles.css\";\n\nimport { Center, Flex } from \"@chakra-ui/react\";\nimport { ForwardedRef, forwardRef, Ref, useMemo } from \"react\";\nimport {\n QueryDiffViewOptions,\n QueryPreviewChangeParams,\n} from \"@/lib/api/adhocQuery\";\n\nimport \"./styles.css\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { ColumnRenderMode, Run } from \"@/lib/api/types\";\nimport {\n createDataGrid,\n DiffGridOptions,\n} from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ChangedOnlyCheckbox } from \"./ChangedOnlyCheckbox\";\nimport { DiffDisplayModeSwitch } from \"./ToggleSwitch\";\n\nexport interface QueryDiffResultViewProps\n extends RunResultViewProps<QueryDiffViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n baseTitle?: string;\n currentTitle?: string;\n}\n\nconst PrivateQueryDiffResultView = (\n {\n run,\n onAddToChecklist,\n viewOptions,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n }: QueryDiffResultViewProps,\n\n ref: Ref<DataGridHandle>,\n) => {\n const primaryKeys = useMemo(\n () => viewOptions?.primary_keys ?? [],\n [viewOptions],\n );\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n if (run.type !== \"query_diff\") {\n throw new Error(\"QueryDiffResult view should be rendered as query_diff\");\n }\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePrimaryKeyChanged = (primaryKeys: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n primary_keys: primaryKeys,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n const options: DiffGridOptions = {\n changedOnly,\n onPrimaryKeyChange: handlePrimaryKeyChanged,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n baseTitle,\n currentTitle,\n displayMode,\n };\n\n return createDataGrid(run, options) ?? { columns: [], rows: [] };\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n columnsRenderMode,\n ]);\n\n const warningPKey = useMemo(() => {\n const pkName = primaryKeys.join(\", \");\n\n if (gridData.invalidPKeyBase && gridData.invalidPKeyCurrent) {\n return `Warning: The primary key '${pkName}' is not unique in the base and current environments`;\n } else if (gridData.invalidPKeyBase) {\n return `Warning: The primary key '${pkName}' is not unique in the base environment`;\n } else if (gridData.invalidPKeyCurrent) {\n return `Warning: The primary key '${pkName}' is not unique in the current environment`;\n }\n }, [gridData.invalidPKeyBase, gridData.invalidPKeyCurrent, primaryKeys]);\n\n const limit = run.result?.current?.limit ?? 0;\n const warningLimit =\n limit > 0 && (run.result?.current?.more || run.result?.base?.more)\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warningPKey) {\n warnings.push(warningPKey);\n }\n if (warningLimit) {\n warnings.push(warningLimit);\n }\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\nconst PrivateQueryDiffJoinResultView = (\n {\n run,\n viewOptions,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n }: QueryDiffResultViewProps,\n ref: Ref<DataGridHandle>,\n) => {\n if (run.type !== \"query_diff\") {\n throw new Error(\"QueryDiffResult view should be rendered as query_diff\");\n }\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n changedOnly,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n baseTitle,\n currentTitle,\n displayMode,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n baseTitle,\n currentTitle,\n columnsRenderMode,\n ]);\n\n const limit = run.result?.diff?.limit ?? 0;\n const warningLimit =\n limit > 0 && run.result?.diff?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warningLimit) {\n warnings.push(warningLimit);\n }\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n if (changedOnly && gridData.rows.length === 0) {\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n />\n <Center height=\"100%\">No change</Center>\n </Flex>\n );\n }\n\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\n// Create the forwardRef components here, at module level\nconst QueryDiffResultViewWithRef = forwardRef(PrivateQueryDiffResultView);\nconst QueryDiffJoinResultViewWithRef = forwardRef(\n PrivateQueryDiffJoinResultView,\n);\n\nexport const QueryDiffResultView = forwardRef(\n (props: QueryDiffResultViewProps, ref: ForwardedRef<DataGridHandle>) => {\n let baseTitle;\n let currentTitle;\n if (\n props.run.params &&\n (props.run.params as QueryPreviewChangeParams).current_model\n ) {\n // Configure the base and current titles under Sandbox Editor\n baseTitle = \"Original\";\n currentTitle = \"Editor\";\n }\n if (\n props.run.result &&\n \"diff\" in props.run.result &&\n props.run.result.diff != null\n ) {\n return (\n <QueryDiffJoinResultViewWithRef\n {...props}\n ref={ref}\n baseTitle={baseTitle}\n currentTitle={currentTitle}\n />\n );\n } else {\n return (\n <QueryDiffResultViewWithRef\n {...props}\n ref={ref}\n baseTitle={baseTitle}\n currentTitle={currentTitle}\n />\n );\n }\n },\n);\n","import \"react-data-grid/lib/styles.css\";\nimport { Box, Button, Center, Flex, Spacer } from \"@chakra-ui/react\";\nimport React, { forwardRef, Ref, useMemo } from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { PiWarning } from \"react-icons/pi\";\nimport { QueryViewOptions } from \"@/lib/api/adhocQuery\";\nimport {\n ColumnRenderMode,\n isQueryBaseRun,\n isQueryRun,\n Run,\n} from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\ninterface QueryResultViewProp extends RunResultViewProps<QueryViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n}\n\nconst PrivateQueryResultView = (\n {\n run,\n viewOptions,\n onViewOptionsChanged,\n onAddToChecklist,\n }: QueryResultViewProp,\n ref: Ref<DataGridHandle>,\n) => {\n if (!(isQueryRun(run) || isQueryBaseRun(run))) {\n throw new Error(\"run type must be query\");\n }\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const dataframe = run.result;\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n return (\n createDataGrid(run, {\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n pinnedColumns,\n viewOptions,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n const limit = dataframe ? (dataframe.limit ?? 0) : 0;\n const warning =\n limit > 0 && dataframe?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n const showTopBar = onAddToChecklist ?? warning;\n\n return (\n <Flex direction=\"column\" backgroundColor=\"rgb(249, 249, 249)\" height=\"100%\">\n {showTopBar && (\n <Flex\n borderBottom=\"1px solid lightgray\"\n alignItems=\"center\"\n gap=\"5px\"\n px=\"10px\"\n bg={warning ? \"orange.100\" : \"inherit\"}\n >\n {warning && (\n <>\n <PiWarning color=\"orange.600\" className=\"self-center\" />{\" \"}\n <Box>{warning}</Box>\n </>\n )}\n\n <Spacer minHeight=\"32px\" />\n {onAddToChecklist && (\n <Button\n marginBlock=\"5px\"\n size=\"xs\"\n colorPalette=\"iochmara\"\n onClick={() => {\n onAddToChecklist(run);\n }}\n >\n Add to Checklist\n </Button>\n )}\n </Flex>\n )}\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n defaultColumnOptions={{\n resizable: true,\n maxWidth: 800,\n minWidth: 35,\n }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\nexport const QueryResultView = forwardRef(PrivateQueryResultView);\n","import { Center, Flex } from \"@chakra-ui/react\";\nimport { forwardRef, Ref, useMemo } from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { isRowCountDiffRun, isRowCountRun, Run } from \"@/lib/api/types\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\n// ============================================================================\n// Shared Component\n// ============================================================================\n\ninterface RowCountGridViewProps {\n run: Run;\n typeGuard: (run: Run) => boolean;\n expectedType: string;\n}\n\nfunction _RowCountGridView(\n { run, typeGuard, expectedType }: RowCountGridViewProps,\n ref: Ref<DataGridHandle>,\n) {\n if (!typeGuard(run)) {\n throw new Error(`Run type must be ${expectedType}`);\n }\n\n const gridData = useMemo(() => {\n return createDataGrid(run) ?? { columns: [], rows: [] };\n }, [run]);\n\n if (gridData.rows.length === 0) {\n return (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\">\n No nodes matched\n </Center>\n );\n }\n\n return (\n <Flex direction=\"column\">\n <ScreenshotDataGrid\n ref={ref}\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"0.875rem\",\n borderWidth: 1,\n }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n}\n\nconst RowCountGridView = forwardRef(_RowCountGridView);\n\n// ============================================================================\n// Exported Components\n// ============================================================================\n\nfunction _RowCountDiffResultView(\n { run }: RunResultViewProps,\n ref: Ref<DataGridHandle>,\n) {\n return (\n <RowCountGridView\n ref={ref}\n run={run}\n typeGuard={isRowCountDiffRun}\n expectedType=\"row_count_diff\"\n />\n );\n}\n\nfunction _RowCountResultView(\n { run }: RunResultViewProps,\n ref: Ref<DataGridHandle>,\n) {\n return (\n <RowCountGridView\n ref={ref}\n run={run}\n typeGuard={isRowCountRun}\n expectedType=\"row_count\"\n />\n );\n}\n\nexport const RowCountDiffResultView = forwardRef(_RowCountDiffResultView);\nexport const RowCountResultView = forwardRef(_RowCountResultView);\n","import { Box, Field, NativeSelect } from \"@chakra-ui/react\";\nimport { useEffect } from \"react\";\nimport { TopKDiffParams } from \"@/lib/api/profile\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\ntype TopKDiffFormProps = RunFormProps<TopKDiffParams>;\n\nexport function TopKDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: TopKDiffFormProps) {\n const { columns, isLoading, error } = useModelColumns(params.model);\n const columnNames = columns.map((c) => c.name);\n\n useEffect(() => {\n setIsReadyToExecute(!!params.column_name);\n }, [params, setIsReadyToExecute]);\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <Box m=\"16px\">\n <Field.Root>\n <Field.Label>Pick a column to show top-k</Field.Label>\n <NativeSelect.Root>\n <NativeSelect.Field\n placeholder=\"Select column\"\n value={params.column_name}\n onChange={(e) => {\n const column = e.target.value;\n onParamsChanged({ ...params, column_name: column });\n }}\n >\n {columnNames.map((c) => (\n <option key={c} value={c} className=\"no-track-pii-safe\">\n {c}\n </option>\n ))}\n </NativeSelect.Field>\n </NativeSelect.Root>\n </Field.Root>\n </Box>\n );\n}\n","import { Box, Flex, Separator, Spacer, Text } from \"@chakra-ui/react\";\nimport {\n AnimationOptions,\n BarElement,\n CategoryScale,\n ChartData,\n Chart as ChartJS,\n ChartOptions,\n LinearScale,\n} from \"chart.js\";\nimport { Fragment } from \"react\";\nimport { Bar } from \"react-chartjs-2\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { TopKDiffResult, TopKResult } from \"@/lib/api/profile\";\nimport {\n formatAsAbbreviatedNumber,\n formatIntervalMinMax,\n} from \"@/utils/formatters\";\nimport { BASE_BAR_COLOR, CURRENT_BAR_COLOR, SquareIcon } from \"./SquareIcon\";\n\nexport const INFO_VAL_COLOR = \"#63B3ED\";\n\ninterface BarChartProps {\n topKDiff: TopKDiffResult;\n valids: number;\n isDisplayTopTen: boolean;\n}\n\ninterface Summary {\n label: string;\n count: number;\n displayCount: string;\n displayRatio: string;\n isLastItemOthers: boolean;\n isSpecialLabel: boolean;\n}\n\nfunction prepareSummaryList(\n topK: TopKResult,\n isDisplayTopTen: boolean,\n): Summary[] {\n const endAtIndex = isDisplayTopTen ? 10 : topK.counts.length;\n const counts = topK.counts.slice(0, endAtIndex);\n const remainingSumCount =\n topK.valids - counts.reduce((accum, curr) => accum + curr, 0);\n const values = topK.values.slice(0, endAtIndex);\n\n return values.concat([remainingSumCount]).map((v, index) => {\n const isLastItemOthers = index === counts.length;\n const count = isLastItemOthers ? remainingSumCount : counts[index];\n\n let label: string;\n let isSpecialLabel = false;\n\n if (isLastItemOthers) {\n label = \"(others)\";\n isSpecialLabel = true;\n } else if (v == null) {\n label = \"(null)\";\n isSpecialLabel = true;\n } else if (typeof v === \"string\" && v.length === 0) {\n label = \"(empty)\";\n isSpecialLabel = true;\n } else {\n label = String(v);\n }\n\n return {\n isLastItemOthers,\n isSpecialLabel,\n label,\n count: count,\n displayCount: formatAsAbbreviatedNumber(count),\n displayRatio: formatIntervalMinMax(count / topK.valids) ?? \"N/A\",\n };\n });\n}\n\nfunction TopKChartTooltip({\n base,\n current,\n children,\n}: {\n base: Summary;\n current: Summary;\n children?: React.ReactNode;\n}) {\n return (\n <Tooltip\n content={\n <Box>\n <Text>\n <SquareIcon color={CURRENT_BAR_COLOR} />\n Current: {current.count} ({current.displayRatio})\n </Text>\n <Text>\n <SquareIcon color={BASE_BAR_COLOR} />\n Base: {base.count} ({base.displayRatio})\n </Text>\n </Box>\n }\n showArrow\n >\n {children}\n </Tooltip>\n );\n}\n\nexport function TopKSummaryBarChart({\n topKDiff,\n isDisplayTopTen,\n}: BarChartProps) {\n // const [isDisplayTopTen, setIsDisplayTopTen] = useState<boolean>(true);\n const currents = prepareSummaryList(topKDiff.current, isDisplayTopTen);\n const bases = prepareSummaryList(topKDiff.base, isDisplayTopTen);\n\n return (\n <Box w={\"100%\"} px={20} py={4}>\n <Flex alignItems={\"center\"} direction={\"row\"}>\n <Spacer />\n <Text as=\"h3\" fontSize=\"sm\" p=\"2\" color=\"gray\">\n <SquareIcon color={BASE_BAR_COLOR} /> Base\n </Text>\n <Text as=\"h3\" fontSize=\"sm\" p=\"2\" color=\"gray\">\n <SquareIcon color={CURRENT_BAR_COLOR} /> Current\n </Text>\n <Spacer />\n </Flex>\n {currents.map((current, index) => {\n const base = bases[index];\n if (\n current.isLastItemOthers &&\n current.count === 0 &&\n base.count === 0\n ) {\n // skip rendering the others if both are empty\n return <></>;\n }\n return (\n <Fragment key={current.label}>\n <TopKChartTooltip base={base} current={current}>\n <Flex\n alignItems={\"center\"}\n width={\"100%\"}\n _hover={{ bg: \"blackAlpha.300\" }}\n px={4}\n >\n <Text\n lineClamp={1}\n width={\"10em\"}\n fontSize={\"sm\"}\n color={current.isSpecialLabel ? \"gray.400\" : \"inherit\"}\n >\n {current.label}\n </Text>\n <Flex width={\"70%\"} direction={\"column\"}>\n {/* Current Top-K */}\n <Flex height={\"1em\"}>\n <CategoricalBarChart\n topkCount={current.count}\n topkLabel={current.label}\n valids={topKDiff.current.valids}\n color={CURRENT_BAR_COLOR}\n />\n <Text\n ml={5}\n mr={2}\n fontSize={\"sm\"}\n width={\"6em\"}\n // noOfLines={1}\n >\n {current.displayCount}\n </Text>\n <Text color={\"gray.400\"} fontSize={\"sm\"} width={\"4em\"}>\n {current.displayRatio}\n </Text>\n </Flex>\n {/* Base Top-K */}\n <Flex height={\"1em\"}>\n <CategoricalBarChart\n topkCount={base.count}\n topkLabel={base.label}\n valids={topKDiff.base.valids}\n color={BASE_BAR_COLOR}\n />\n <Text ml={5} mr={2} fontSize={\"sm\"} width={\"6em\"}>\n {base.displayCount}\n </Text>\n <Text color={\"gray.400\"} fontSize={\"sm\"} width={\"4em\"}>\n {base.displayRatio}\n </Text>\n </Flex>\n </Flex>\n </Flex>\n </TopKChartTooltip>\n <Separator />\n </Fragment>\n );\n })}\n </Box>\n );\n}\n\ninterface Props {\n topk: TopKResult;\n valids: number;\n isDisplayTopTen: boolean;\n}\n\n/**\n * A list of each topk summary item (categorical)\n * Last list item will show 'others' when there are leftover values, which is the count difference of valids and displayed topk items\n */\nexport function TopKSummaryList({ topk, valids, isDisplayTopTen }: Props) {\n const endAtIndex = isDisplayTopTen ? 10 : topk.counts.length;\n const displayList = topk.counts.slice(0, endAtIndex);\n const remainingSumCount =\n valids - displayList.reduce((accum, curr) => accum + curr, 0);\n\n return (\n <Box w={\"100%\"}>\n {displayList.concat([remainingSumCount]).map((v, index) => {\n const isLastItemOthers = index === displayList.length;\n const topkCount = isLastItemOthers ? remainingSumCount : v;\n const catName = String(topk.values[index]);\n const topkLabel = isLastItemOthers ? \"(others)\" : catName || \"(empty)\";\n const displayTopkCount = formatAsAbbreviatedNumber(topkCount);\n const displayTopkRatio = formatIntervalMinMax(topkCount / valids);\n return (\n <Fragment key={topkLabel}>\n {!isLastItemOthers || topkCount > 0 ? (\n <>\n <Flex\n alignItems={\"center\"}\n width={\"100%\"}\n _hover={{ bg: \"blackAlpha.300\" }}\n px={3}\n >\n <Tooltip\n content={topkLabel}\n positioning={{ placement: \"top-start\" }}\n >\n <Text\n lineClamp={1}\n width={\"14em\"}\n fontSize={\"sm\"}\n color={\n isLastItemOthers || catName.length === 0\n ? \"gray.400\"\n : \"inherit\"\n }\n >\n {topkLabel}\n </Text>\n </Tooltip>\n <Flex height={\"2em\"} width={\"10em\"}>\n <CategoricalBarChart\n topkCount={topkCount}\n topkLabel={topkLabel}\n valids={valids}\n />\n </Flex>\n <Tooltip\n content={displayTopkCount}\n positioning={{ placement: \"top-start\" }}\n >\n <Text\n ml={5}\n mr={2}\n fontSize={\"sm\"}\n width={\"4em\"}\n lineClamp={1}\n >\n {displayTopkCount}\n </Text>\n </Tooltip>\n <Tooltip\n content={displayTopkRatio}\n positioning={{ placement: \"top-start\" }}\n >\n <Text color={\"gray.400\"} fontSize={\"sm\"} width={\"4em\"}>\n {displayTopkRatio}\n </Text>\n </Tooltip>\n </Flex>\n <Separator />\n </>\n ) : (\n <></>\n )}\n </Fragment>\n );\n })}\n </Box>\n );\n}\n\n/**\n * Props for creating a CategoricalBarChart Component\n */\nexport interface CategoricalBarChartProps {\n topkCount: number;\n topkLabel: number | string;\n valids: number;\n animation?: AnimationOptions<\"bar\">[\"animation\"];\n color?: string;\n}\n/**\n * A Singular horizontal progress bar chart that visualizes categorical dataset, plotted 1:1 category group\n */\nexport function CategoricalBarChart({\n topkCount,\n topkLabel,\n valids,\n animation = false,\n color = INFO_VAL_COLOR,\n}: CategoricalBarChartProps) {\n ChartJS.register(CategoryScale, BarElement, LinearScale);\n const chartOptions = getCatBarChartOptions(topkCount, valids, { animation });\n const chartData = getCatBarChartData({\n topkCount,\n topkLabel,\n color,\n });\n\n return <Bar data={chartData} options={chartOptions} plugins={[]} />;\n}\n\n/**\n * @returns merged Chart.js option object for categorical 'bar'\n */\nexport function getCatBarChartOptions(\n count: CategoricalBarChartProps[\"topkCount\"],\n valids: number,\n { ...configOverrides }: ChartOptions<\"bar\"> = {},\n): ChartOptions<\"bar\"> {\n return {\n responsive: true,\n maintainAspectRatio: false,\n indexAxis: \"y\",\n scales: {\n x: {\n display: false,\n max: valids,\n grid: { display: false },\n },\n y: {\n display: false,\n },\n },\n plugins: {\n tooltip: {\n enabled: false,\n },\n },\n ...configOverrides,\n };\n}\n/**\n * @returns merged Chart.js data object for categorical 'bar'\n */\nexport function getCatBarChartData({\n topkLabel,\n topkCount,\n color = INFO_VAL_COLOR,\n}: Omit<CategoricalBarChartProps, \"animation\" | \"valids\">): ChartData<\"bar\"> {\n return {\n labels: [topkLabel], // showing top cats\n datasets: [\n {\n indexAxis: \"y\",\n data: [topkCount], // showing top cats\n backgroundColor: color,\n hoverBackgroundColor: color,\n borderWidth: 0,\n borderColor: color,\n barPercentage: 1,\n categoryPercentage: 0.6,\n },\n ],\n };\n}\n","import { Flex, Heading, HStack, Link, Spacer } from \"@chakra-ui/react\";\nimport { forwardRef, Ref, useState } from \"react\";\nimport { TopKDiffParams, TopKDiffResult } from \"@/lib/api/profile\";\nimport { TopKSummaryBarChart } from \"../charts/TopKSummaryList\";\nimport { RunResultViewProps } from \"../run/types\";\nimport { ScreenshotBox } from \"../screenshot/ScreenshotBox\";\n\ntype TopKDiffResultViewProp = RunResultViewProps;\n\nconst PrivateTopKDiffResultView = (\n { run }: TopKDiffResultViewProp,\n ref: Ref<HTMLDivElement>,\n) => {\n const [isDisplayTopTen, setIsDisplayTopTen] = useState<boolean>(true);\n // TODO: Implement TopKDiffResultView\n const result = run.result as TopKDiffResult;\n const params = run.params as TopKDiffParams;\n\n const baseTopK = result.base;\n const currentTopK = result.current;\n\n return (\n <Flex direction=\"column\" height={\"100%\"}>\n <ScreenshotBox ref={ref} blockSize={\"auto\"}>\n <Heading\n as=\"h1\"\n size=\"md\"\n paddingTop={4}\n textAlign=\"center\"\n color=\"gray.600\"\n >\n Model {params.model}.{params.column_name}\n </Heading>\n <HStack>\n <Spacer />\n <TopKSummaryBarChart\n topKDiff={result}\n valids={currentTopK.valids || 0}\n isDisplayTopTen={isDisplayTopTen}\n />\n <Spacer />\n </HStack>\n </ScreenshotBox>\n <Spacer />\n {(baseTopK.values.length > 10 || currentTopK.values.length > 10) && (\n <Flex p={5} justify={\"start\"}>\n <Link\n onClick={() => {\n setIsDisplayTopTen((prevState) => !prevState);\n }}\n colorPalette=\"blue\"\n >\n {isDisplayTopTen ? \"View More Items\" : \"View Only Top-10\"}\n </Link>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport const TopKDiffResultView = forwardRef(PrivateTopKDiffResultView);\n","import \"react-data-grid/lib/styles.css\";\n\nimport { Center, Flex } from \"@chakra-ui/react\";\nimport { forwardRef, Ref, useMemo } from \"react\";\n\nimport \"../query/styles.css\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { ColumnRenderMode, isValueDiffDetailRun, Run } from \"@/lib/api/types\";\nimport { ValueDiffDetailViewOptions } from \"@/lib/api/valuediff\";\nimport { createDataGrid } from \"@/lib/dataGrid/dataGridFactory\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { ChangedOnlyCheckbox } from \"../query/ChangedOnlyCheckbox\";\nimport { DiffDisplayModeSwitch } from \"../query/ToggleSwitch\";\nimport { RunToolbar } from \"../run/RunToolbar\";\nimport { RunResultViewProps } from \"../run/types\";\n\nexport interface ValueDiffDetailResultViewProps\n extends RunResultViewProps<ValueDiffDetailViewOptions> {\n onAddToChecklist?: (run: Run) => void;\n}\n\nconst PrivateValueDiffDetailResultView = (\n {\n run,\n onAddToChecklist,\n viewOptions,\n onViewOptionsChanged,\n }: ValueDiffDetailResultViewProps,\n\n ref: Ref<DataGridHandle>,\n) => {\n if (!isValueDiffDetailRun(run)) {\n throw new Error(\"run type must be value_diff_detail\");\n }\n const changedOnly = useMemo(\n () => viewOptions?.changed_only ?? false,\n [viewOptions],\n );\n const pinnedColumns = useMemo(\n () => viewOptions?.pinned_columns ?? [],\n [viewOptions],\n );\n const displayMode = useMemo(\n () => viewOptions?.display_mode ?? \"inline\",\n [viewOptions],\n );\n const columnsRenderMode = useMemo(\n () => viewOptions?.columnsRenderMode ?? {},\n [viewOptions],\n );\n\n const gridData = useMemo(() => {\n const onColumnsRenderModeChanged = (\n cols: Record<string, ColumnRenderMode>,\n ) => {\n const newRenderModes = {\n ...(viewOptions?.columnsRenderMode ?? {}),\n ...cols,\n };\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n columnsRenderMode: newRenderModes,\n });\n }\n };\n\n const handlePinnedColumnsChanged = (pinnedColumns: string[]) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n pinned_columns: pinnedColumns,\n });\n }\n };\n\n return (\n createDataGrid(run, {\n changedOnly,\n pinnedColumns,\n onPinnedColumnsChange: handlePinnedColumnsChanged,\n columnsRenderMode,\n onColumnsRenderModeChanged,\n displayMode,\n }) ?? { columns: [], rows: [] }\n );\n }, [\n run,\n viewOptions,\n changedOnly,\n pinnedColumns,\n displayMode,\n onViewOptionsChanged,\n columnsRenderMode,\n ]);\n\n const limit = run.result?.limit ?? 0;\n const warning =\n limit > 0 && run.result?.more\n ? `Warning: Displayed results are limited to ${limit.toLocaleString()} records. To ensure complete data retrieval, consider applying a LIMIT or WHERE clause to constrain the result set.`\n : null;\n\n const warnings: string[] = [];\n if (warning) {\n warnings.push(warning);\n }\n\n if (gridData.columns.length === 0) {\n return <Center height=\"100%\">No data</Center>;\n }\n\n if (changedOnly && gridData.rows.length === 0) {\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n />\n <Center height=\"100%\">No change</Center>;\n </Flex>\n );\n }\n\n return (\n <Flex\n direction=\"column\"\n backgroundColor=\"rgb(249, 249, 249)\"\n height={\"100%\"}\n >\n <RunToolbar\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n warnings={warnings}\n >\n <DiffDisplayModeSwitch\n displayMode={displayMode}\n onDisplayModeChanged={(displayMode) => {\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n display_mode: displayMode,\n });\n }\n }}\n />\n\n <ChangedOnlyCheckbox\n changedOnly={viewOptions?.changed_only}\n onChange={() => {\n const changedOnly = !viewOptions?.changed_only;\n if (onViewOptionsChanged) {\n onViewOptionsChanged({\n ...viewOptions,\n changed_only: changedOnly,\n });\n }\n }}\n />\n </RunToolbar>\n <ScreenshotDataGrid\n ref={ref}\n style={{ blockSize: \"auto\", maxHeight: \"100%\", overflow: \"auto\" }}\n columns={gridData.columns}\n rows={gridData.rows}\n renderers={{\n noRowsFallback: (\n <EmptyRowsRenderer emptyMessage=\"No mismatched rows\" />\n ),\n }}\n defaultColumnOptions={{ resizable: true, maxWidth: 800, minWidth: 35 }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n};\n\nexport const ValueDiffDetailResultView = forwardRef(\n PrivateValueDiffDetailResultView,\n);\n","import { Box, Checkbox, Field, Input, VStack } from \"@chakra-ui/react\";\nimport { Select } from \"chakra-react-select\";\nimport { useEffect, useState } from \"react\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { RunFormProps } from \"../run/types\";\n\nexport interface ValueDiffFormParams {\n model: string;\n primary_key?: string | (string | undefined)[];\n columns?: string[];\n}\n\ntype ValueDiffFormProp = RunFormProps<ValueDiffFormParams>;\n\nexport function ValueDiffForm({\n params,\n onParamsChanged,\n setIsReadyToExecute,\n}: ValueDiffFormProp) {\n const [allColumns, setAllColumns] = useState<boolean>(\n !params.columns || params.columns.length === 0,\n );\n\n const model = params.model;\n const primaryKey = params.primary_key;\n\n const {\n columns,\n primaryKey: nodePrimaryKey,\n isLoading,\n error,\n } = useModelColumns(params.model);\n\n useEffect(() => {\n if (!primaryKey && nodePrimaryKey) {\n onParamsChanged({\n ...params,\n primary_key: nodePrimaryKey,\n });\n }\n }, [primaryKey, nodePrimaryKey, params, onParamsChanged]);\n\n useEffect(() => {\n setIsReadyToExecute(!!(primaryKey && model));\n }, [primaryKey, model, setIsReadyToExecute]);\n\n const columnNames = columns.map((c) => c.name);\n\n // primaryKey can be an array or string, map to array\n const primaryKeys = Array.isArray(primaryKey)\n ? primaryKey\n : primaryKey\n ? [primaryKey]\n : undefined;\n\n if (isLoading) {\n return <Box>Loading...</Box>;\n }\n\n if (columnNames.length === 0 || error) {\n return (\n <Box>\n Error: Please provide the &apos;catalog.json&apos; to list column\n candidates\n </Box>\n );\n }\n\n return (\n <VStack gap={5} m=\"8px 24px\" paddingBottom=\"200px\">\n <Field.Root>\n <Field.Label>Model</Field.Label>\n <Input readOnly={true} value={params.model} />\n </Field.Root>\n <Field.Root>\n <Field.Label>Primary key</Field.Label>\n <Select\n placeholder=\"Select primary key\"\n className=\"no-track-pii-safe\"\n isMulti\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(primaryKeys ?? []).map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(options) => {\n onParamsChanged({\n ...params,\n primary_key:\n options.length == 1\n ? options[0].value\n : options.map((v) => v.value),\n });\n }}\n ></Select>\n </Field.Root>\n <Field.Root>\n <Field.Label>Columns</Field.Label>\n <Checkbox.Root\n marginBottom=\"10px\"\n size=\"xs\"\n checked={allColumns}\n onCheckedChange={(e) => {\n setAllColumns(Boolean(e.checked));\n onParamsChanged({\n ...params,\n columns: undefined,\n });\n }}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>All columns</Checkbox.Label>\n </Checkbox.Root>\n {!allColumns && (\n <Select\n isMulti\n className=\"no-track-pii-safe\"\n closeMenuOnSelect={false}\n options={columnNames.map((c) => ({ label: c, value: c }))}\n value={(params.columns ?? []).map((c) => ({\n label: c,\n value: c,\n }))}\n onChange={(newValue) => {\n let cols: string[] | undefined;\n const newCols = newValue.map((v) => v.value);\n if (newCols.length === 0) {\n cols = undefined;\n } else {\n cols = newCols;\n }\n onParamsChanged({\n ...params,\n columns: cols,\n });\n }}\n ></Select>\n )}\n </Field.Root>\n </VStack>\n );\n}\n","/**\n * @file ValueDiffResultView.tsx\n * @description View component for displaying value diff summary results\n *\n * Shows a summary table of column-level match statistics from a value_diff run.\n * Each row represents a column with its match count and percentage.\n */\n\nimport { Box, Flex } from \"@chakra-ui/react\";\nimport React, { forwardRef, Ref } from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { isValueDiffRun } from \"@/lib/api/types\";\nimport { ValueDiffParams, ValueDiffResult } from \"@/lib/api/valuediff\";\nimport { createDataGrid } from \"@/lib/dataGrid\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { RunResultViewProps } from \"../run/types\";\n\ntype ValueDiffResultViewProp = RunResultViewProps;\n\nfunction _ValueDiffResultView(\n { run }: ValueDiffResultViewProp,\n ref: Ref<DataGridHandle>,\n) {\n if (!isValueDiffRun(run)) {\n throw new Error(\"Run type must be value_diff\");\n }\n\n const result = run.result as ValueDiffResult;\n const params = run.params as ValueDiffParams;\n\n const gridData = createDataGrid(run);\n\n if (!gridData) {\n return null;\n }\n\n const { columns, rows } = gridData;\n\n return (\n <Flex direction=\"column\" gap=\"5px\" pt=\"5px\" height=\"100%\">\n <Box px=\"16px\">\n Model: {params.model}, {result.summary.total} total (\n {result.summary.total - result.summary.added - result.summary.removed}{\" \"}\n common, {result.summary.added} added, {result.summary.removed} removed)\n </Box>\n\n <ScreenshotDataGrid\n ref={ref}\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n borderBlock: \"1px solid lightgray\",\n }}\n columns={columns}\n rows={rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n defaultColumnOptions={{ resizable: true }}\n className=\"rdg-light\"\n />\n </Flex>\n );\n}\n\nexport const ValueDiffResultView = forwardRef(_ValueDiffResultView);\n","import React, {\n ComponentType,\n ForwardRefExoticComponent,\n RefAttributes,\n} from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { IconType } from \"react-icons\";\nimport { LuChartBarBig } from \"react-icons/lu\";\nimport { MdFormatListNumberedRtl, MdSchema } from \"react-icons/md\";\nimport {\n TbAlignBoxLeftStretch,\n TbBrandStackshare,\n TbChartHistogram,\n TbEyeEdit,\n TbEyeSearch,\n TbSql,\n} from \"react-icons/tb\";\nimport { DiffViewOptions } from \"@/components/run/RunToolbar\";\nimport { QueryDiffViewOptions, QueryViewOptions } from \"@/lib/api/adhocQuery\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport {\n HistogramDiffParams,\n ProfileDiffViewOptions,\n TopKDiffParams,\n} from \"@/lib/api/profile\";\nimport { AxiosQueryParams } from \"@/lib/api/types\";\nimport { ValueDiffDetailViewOptions } from \"@/lib/api/valuediff\";\nimport { HistogramDiffForm } from \"../histogram/HistogramDiffForm\";\nimport { HistogramDiffResultView } from \"../histogram/HistogramDiffResultView\";\nimport {\n ProfileDiffForm,\n ProfileDiffFormParams,\n} from \"../profile/ProfileDiffForm\";\nimport {\n ProfileDiffResultView,\n ProfileResultView,\n} from \"../profile/ProfileDiffResultView\";\nimport { QueryDiffResultView } from \"../query/QueryDiffResultView\";\nimport { QueryResultView } from \"../query/QueryResultView\";\nimport {\n RowCountDiffResultView,\n RowCountResultView,\n} from \"../rowcount/RowCountDiffResultView\";\nimport { TopKDiffForm } from \"../top-k/TopKDiffForm\";\nimport { TopKDiffResultView } from \"../top-k/TopKDiffResultView\";\nimport { ValueDiffDetailResultView } from \"../valuediff/ValueDiffDetailResultView\";\nimport { ValueDiffForm, ValueDiffFormParams } from \"../valuediff/ValueDiffForm\";\nimport { ValueDiffResultView } from \"../valuediff/ValueDiffResultView\";\nimport { RunFormProps, RunResultViewProps } from \"./types\";\n\nexport type ViewOptionTypes =\n | LineageDiffViewOptions\n | DiffViewOptions\n | QueryViewOptions\n | QueryDiffViewOptions\n | ProfileDiffViewOptions\n | ValueDiffDetailViewOptions;\n\nexport type RunType =\n | \"simple\"\n | \"query\"\n | \"query_base\"\n | \"query_diff\"\n | \"value_diff\"\n | \"value_diff_detail\"\n | \"schema_diff\"\n | \"profile\"\n | \"profile_diff\"\n | \"row_count\"\n | \"row_count_diff\"\n | \"lineage_diff\"\n | \"top_k_diff\"\n | \"histogram_diff\"\n | \"sandbox\";\n\nexport type RefTypes = React.Ref<DataGridHandle> | React.Ref<HTMLDivElement>;\nexport type RunFormParamTypes =\n | ProfileDiffFormParams\n | ValueDiffFormParams\n | TopKDiffParams\n | HistogramDiffParams\n | AxiosQueryParams;\n\nexport interface RegistryEntry<PT = RefTypes, VO = ViewOptionTypes> {\n title: string;\n icon: IconType;\n RunResultView?: ForwardRefExoticComponent<\n RunResultViewProps<VO> & RefAttributes<PT>\n >;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\ninterface RunRegistry {\n query: RegistryEntry<DataGridHandle, QueryViewOptions>;\n query_base: RegistryEntry<DataGridHandle, QueryViewOptions>;\n query_diff: RegistryEntry<DataGridHandle, QueryDiffViewOptions>;\n row_count: RegistryEntry<DataGridHandle>;\n row_count_diff: RegistryEntry<DataGridHandle>;\n profile: RegistryEntry<DataGridHandle, ProfileDiffViewOptions>;\n profile_diff: RegistryEntry<DataGridHandle, ProfileDiffViewOptions>;\n value_diff: RegistryEntry<DataGridHandle>;\n value_diff_detail: RegistryEntry<DataGridHandle, ValueDiffDetailViewOptions>;\n top_k_diff: RegistryEntry<HTMLDivElement>;\n histogram_diff: RegistryEntry<HTMLDivElement>;\n lineage_diff: RegistryEntry<never>; // No RunResultView\n schema_diff: RegistryEntry<never>; // No RunResultView\n sandbox: RegistryEntry<never>; // No RunResultView\n simple: RegistryEntry<never>; // No RunResultView\n}\n\nexport function runTypeHasRef(runType: RunType) {\n const typeHasRef = [\n \"query\",\n \"query_base\",\n \"query_diff\",\n \"row_count\",\n \"row_count_diff\",\n \"profile\",\n \"profile_diff\",\n \"value_diff\",\n \"value_diff_detail\",\n \"top_k_diff\",\n \"histogram_diff\",\n ];\n return typeHasRef.includes(runType);\n}\n\nconst registry: RunRegistry = {\n lineage_diff: {\n title: \"Lineage Diff\",\n icon: TbBrandStackshare,\n },\n schema_diff: {\n title: \"Schema Diff\",\n icon: MdSchema,\n },\n query: {\n title: \"Query\",\n icon: TbSql,\n RunResultView: QueryResultView,\n },\n query_base: {\n title: \"Query Base\",\n icon: TbSql,\n RunResultView: QueryResultView,\n },\n query_diff: {\n title: \"Query Diff\",\n icon: TbSql,\n RunResultView: QueryDiffResultView,\n },\n row_count: {\n title: \"Row Count\",\n icon: MdFormatListNumberedRtl,\n RunResultView: RowCountResultView,\n },\n row_count_diff: {\n title: \"Row Count Diff\",\n icon: MdFormatListNumberedRtl,\n RunResultView: RowCountDiffResultView,\n },\n profile: {\n title: \"Profile\",\n icon: TbEyeSearch,\n RunResultView: ProfileResultView,\n RunForm: ProfileDiffForm,\n },\n profile_diff: {\n title: \"Profile Diff\",\n icon: TbEyeSearch,\n RunResultView: ProfileDiffResultView,\n RunForm: ProfileDiffForm,\n },\n value_diff: {\n title: \"Value Diff\",\n icon: TbAlignBoxLeftStretch,\n RunResultView: ValueDiffResultView,\n RunForm: ValueDiffForm,\n },\n value_diff_detail: {\n title: \"Value Diff Detail\",\n icon: TbAlignBoxLeftStretch,\n RunResultView: ValueDiffDetailResultView,\n RunForm: ValueDiffForm,\n },\n top_k_diff: {\n title: \"Top-K Diff\",\n icon: LuChartBarBig,\n RunResultView: TopKDiffResultView,\n RunForm: TopKDiffForm,\n },\n histogram_diff: {\n title: \"Histogram Diff\",\n icon: TbChartHistogram,\n RunResultView: HistogramDiffResultView,\n RunForm: HistogramDiffForm,\n },\n sandbox: {\n title: \"Sandbox\",\n icon: TbEyeEdit,\n // No specific RunResultView for sandbox, use QueryDiffResultView\n },\n simple: {\n title: \"Simple\",\n icon: TbEyeEdit,\n // No specific RunResultView for simple, use undefined\n },\n};\n\nexport const findByRunType = <T extends RunType>(\n runType: T,\n): RunRegistry[T] => {\n return registry[runType];\n};\n","/**\n * useAppRouter - Navigation utilities for Next.js App Router\n *\n * Provides a similar API to Wouter's useLocation for easier migration.\n * This hook combines Next.js's useRouter, usePathname, useParams,\n * and useSearchParams into a unified interface.\n *\n * IMPORTANT: useSearchParams() triggers Suspense boundaries in Next.js.\n * To avoid full-page loading states, useAppLocation() only returns the\n * pathname by default. Use useAppLocationWithSearch() if you need\n * search params included in the location string.\n */\n\n\"use client\";\n\nimport {\n useParams,\n usePathname,\n useRouter,\n useSearchParams,\n} from \"next/navigation\";\nimport { useCallback, useMemo } from \"react\";\n\ninterface NavigateOptions {\n replace?: boolean;\n scroll?: boolean;\n}\n\n/**\n * Hook that provides Wouter-compatible location API using Next.js App Router\n *\n * NOTE: This returns only the pathname (not search params) to avoid\n * triggering Suspense boundaries on every navigation.\n *\n * @returns [pathname, setLocation] tuple similar to Wouter's useLocation\n *\n * @example\n * const [location, setLocation] = useAppLocation();\n * setLocation(\"/checks?id=123\"); // Navigate to new path with query\n * setLocation(\"/checks\", { replace: true }); // Replace current history entry\n */\nexport function useAppLocation(): [\n string,\n (to: string, options?: NavigateOptions) => void,\n] {\n const router = useRouter();\n const pathname = usePathname();\n\n // Navigation function compatible with Wouter's setLocation\n const setLocation = useCallback(\n (to: string, options?: NavigateOptions) => {\n if (options?.replace) {\n router.replace(to, { scroll: options?.scroll ?? true });\n } else {\n router.push(to, { scroll: options?.scroll ?? true });\n }\n },\n [router],\n );\n\n return [pathname, setLocation];\n}\n\n/**\n * Hook that includes search params in the location string.\n *\n * WARNING: This hook uses useSearchParams() which triggers Suspense.\n * Only use this in components that are wrapped in a <Suspense> boundary,\n * or in leaf components where suspension is acceptable.\n *\n * @returns [fullLocation, setLocation] tuple with search params included\n */\nexport function useAppLocationWithSearch(): [\n string,\n (to: string, options?: NavigateOptions) => void,\n] {\n const router = useRouter();\n const pathname = usePathname();\n const searchParams = useSearchParams();\n\n // Construct full location string including search params\n const location = useMemo(() => {\n const search = searchParams?.toString();\n return search ? `${pathname}?${search}` : pathname;\n }, [pathname, searchParams]);\n\n // Navigation function compatible with Wouter's setLocation\n const setLocation = useCallback(\n (to: string, options?: NavigateOptions) => {\n if (options?.replace) {\n router.replace(to, { scroll: options?.scroll ?? true });\n } else {\n router.push(to, { scroll: options?.scroll ?? true });\n }\n },\n [router],\n );\n\n return [location, setLocation];\n}\n\n/**\n * Hook to check if current path matches a pattern\n * Similar to Wouter's useRoute\n *\n * @param pattern - The route pattern to match (e.g., \"/checks/:checkId\")\n * @returns [isMatch, params] tuple\n *\n * @example\n * const [isMatch, params] = useAppRoute(\"/checks/:checkId\");\n * if (isMatch) {\n * console.log(params.checkId); // \"abc-123\"\n * }\n */\nexport function useAppRoute(\n pattern: string,\n): [boolean, Record<string, string>] {\n const pathname = usePathname();\n const params = useParams();\n\n const isMatch = useMemo(() => {\n // Convert Next.js dynamic route pattern to regex\n // /checks/[checkId] -> /checks/:checkId -> /checks/([^/]+)\n const regexPattern = pattern\n .replace(/:\\w+/g, \"([^/]+)\") // :param -> capture group\n .replace(/\\*/g, \".*\"); // * -> wildcard\n\n const regex = new RegExp(`^${regexPattern}$`);\n return regex.test(pathname);\n }, [pattern, pathname]);\n\n // Convert Next.js params to plain object\n const paramsObj = useMemo(() => {\n if (!params) return {};\n return Object.fromEntries(\n Object.entries(params).map(([key, value]) => [\n key,\n Array.isArray(value) ? value.join(\"/\") : value,\n ]),\n );\n }, [params]);\n\n return [isMatch, paramsObj as Record<string, string>];\n}\n\n/**\n * Imperative navigation function for use outside React components\n * Use sparingly - prefer useAppLocation hook in components\n *\n * @example\n * // In an event handler or utility function\n * import { navigateTo } from \"@/lib/hooks/useAppRouter\";\n * navigateTo(\"/checks?id=123\");\n */\nexport function navigateTo(path: string, replace = false): void {\n if (typeof window !== \"undefined\") {\n if (replace) {\n window.history.replaceState(null, \"\", path);\n } else {\n window.history.pushState(null, \"\", path);\n }\n // Trigger Next.js to recognize the navigation\n window.dispatchEvent(new PopStateEvent(\"popstate\"));\n }\n}\n\n/**\n * Hook for programmatic navigation with more options\n * Provides direct access to Next.js router methods\n *\n * NOTE: Does not include searchParams to avoid Suspense.\n * Use useSearchParams() directly in components that need it.\n */\nexport function useAppNavigation() {\n const router = useRouter();\n const pathname = usePathname();\n const params = useParams();\n\n return {\n /** Current pathname */\n pathname,\n /** Current route params */\n params: params as Record<string, string>,\n /** Navigate to a new path */\n push: router.push,\n /** Replace current history entry */\n replace: router.replace,\n /** Go back in history */\n back: router.back,\n /** Go forward in history */\n forward: router.forward,\n /** Refresh the current route */\n refresh: router.refresh,\n /** Prefetch a route for faster navigation */\n prefetch: router.prefetch,\n };\n}\n\n// Re-export Next.js hooks for convenience\nexport { useRouter, usePathname, useParams, useSearchParams };\n","import { useDisclosure } from \"@chakra-ui/react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { usePathname } from \"next/navigation\";\nimport React, {\n ComponentType,\n createContext,\n Dispatch,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from \"react\";\nimport { RunModal } from \"@/components/run/RunModal\";\nimport {\n findByRunType,\n RegistryEntry,\n RunFormParamTypes,\n RunType,\n} from \"@/components/run/registry\";\nimport { RunFormProps } from \"@/components/run/types\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { cacheKeys } from \"../api/cacheKeys\";\nimport { SubmitRunTrackProps, searchRuns, submitRun } from \"../api/runs\";\nimport { AxiosQueryParams, Run, RunParamTypes } from \"../api/types\";\n\nexport interface RecceActionOptions {\n showForm: boolean;\n showLast?: boolean;\n trackProps?: SubmitRunTrackProps;\n}\n\nexport interface RecceActionContextType {\n runAction: (\n type: RunType,\n params?: AxiosQueryParams,\n actionOptions?: RecceActionOptions,\n ) => void;\n runId?: string;\n showRunId: (runId: string, refreshHistory?: boolean) => void;\n isRunResultOpen: boolean;\n closeRunResult: () => void;\n isHistoryOpen: boolean;\n closeHistory: () => void;\n showHistory: () => void;\n setHistoryOpen: Dispatch<SetStateAction<boolean>>;\n clearRunResult: () => void;\n}\n\nexport const RecceActionContext = createContext<RecceActionContextType>({\n runAction: () => {\n return void 0;\n },\n showRunId: (runId: string) => {\n return void 0;\n },\n isRunResultOpen: false,\n closeRunResult: () => {\n return void 0;\n },\n isHistoryOpen: false,\n closeHistory: () => {\n return void 0;\n },\n showHistory: () => {\n return void 0;\n },\n setHistoryOpen: (v) => {\n return void 0;\n },\n clearRunResult: () => {\n return void 0;\n },\n});\n\ninterface RecceActionContextProviderProps {\n children: React.ReactNode;\n}\n\nconst useCloseModalEffect = (onClose: () => void) => {\n const pathname = usePathname();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Specifically run in location changes\n useEffect(() => {\n onClose();\n }, [onClose, pathname]);\n};\n\ninterface RunActionInternal {\n session: string;\n title: string;\n type: RunType;\n params?: RunFormParamTypes;\n lastRun?: Run;\n options?: RecceActionOptions;\n RunForm?: ComponentType<RunFormProps<RunFormParamTypes>>;\n}\n\nexport function RecceActionContextProvider({\n children,\n}: RecceActionContextProviderProps) {\n const [action, setAction] = useState<RunActionInternal>();\n const {\n open: isModalOpen,\n onOpen: onModalOpen,\n onClose: onModalClose,\n } = useDisclosure();\n const {\n open: isRunResultOpen,\n onOpen: onResultPaneOpen,\n onClose: closeRunResult,\n } = useDisclosure();\n const {\n open: isHistoryOpen,\n onOpen: showHistory,\n onClose: closeHistory,\n setOpen: setHistoryOpen,\n } = useDisclosure();\n const [runId, setRunId] = useState<string>();\n const [location, setLocation] = useAppLocation();\n const queryClient = useQueryClient();\n\n const showRunId = useCallback(\n async (runId: string, refreshHistory?: boolean) => {\n setRunId(runId);\n onResultPaneOpen();\n\n if (refreshHistory !== false) {\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n }\n },\n [onResultPaneOpen, queryClient],\n );\n\n const clearRunResult = useCallback(() => {\n setRunId(undefined);\n closeRunResult();\n }, [closeRunResult]);\n\n const runAction = useCallback(\n async (\n type: RunType,\n params?: AxiosQueryParams,\n options?: RecceActionOptions,\n ) => {\n try {\n const session = new Date().getTime().toString();\n let lastRun = undefined;\n if (options?.showLast) {\n const runs = await searchRuns(type, params, 1);\n if (runs.length === 1) {\n lastRun = runs[0];\n }\n }\n\n const run = findByRunType(type);\n const RunResultView = run.RunResultView as\n | RegistryEntry[\"RunResultView\"]\n | undefined;\n const { title, RunForm } = run;\n if (RunResultView === undefined) {\n throw new Error(`Run type ${type} does not have a result view`);\n }\n\n if (RunForm == undefined || !options?.showForm) {\n const { run_id } = await submitRun(type, params, {\n nowait: true,\n trackProps: options?.trackProps,\n });\n await showRunId(run_id);\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n if (location.startsWith(\"/lineage\")) {\n setLocation(\"/lineage\");\n }\n } else {\n setAction({\n session,\n title,\n type,\n params,\n lastRun,\n options,\n RunForm,\n });\n onModalOpen();\n }\n } catch (e: unknown) {\n toaster.create({\n title: \"Failed to submit a run\",\n description: e instanceof Error ? e.message : undefined,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n },\n [onModalOpen, showRunId, location, setLocation, queryClient],\n );\n useCloseModalEffect(onModalClose);\n\n const handleExecute = async (type: RunType, params: RunParamTypes) => {\n try {\n onModalClose();\n const { run_id } = await submitRun(type, params, {\n nowait: true,\n trackProps: action?.options?.trackProps,\n });\n await showRunId(run_id);\n } catch (e: unknown) {\n toaster.create({\n title: \"Failed to submit a run\",\n description: e instanceof Error ? e.message : undefined,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n };\n\n return (\n <RecceActionContext.Provider\n value={{\n runAction,\n runId,\n showRunId,\n isRunResultOpen,\n closeRunResult,\n isHistoryOpen,\n closeHistory,\n showHistory,\n setHistoryOpen,\n clearRunResult,\n }}\n >\n {action && (\n <RunModal\n key={action.session}\n isOpen={isModalOpen}\n onClose={onModalClose}\n onExecute={handleExecute}\n title={action.title}\n type={action.type}\n params={action.params}\n initialRun={action.lastRun}\n RunForm={\n action.options?.showForm && action.RunForm\n ? action.RunForm\n : undefined\n }\n />\n )}\n {children}\n </RecceActionContext.Provider>\n );\n}\n\nexport const useRecceActionContext = () => useContext(RecceActionContext);\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useClipBoardToast() {\n function successToast(message: string) {\n toaster.create({\n description: message,\n type: \"info\",\n duration: 5000,\n closable: true,\n });\n }\n\n function failToast(title: string, error: unknown) {\n toaster.create({\n title: title,\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n\n return {\n successToast,\n failToast,\n };\n}\n","import {\n Button,\n CloseButton,\n Dialog,\n Flex,\n Image,\n Portal,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\nimport saveAs from \"file-saver\";\nimport { toCanvas } from \"html-to-image\";\nimport html2canvas from \"html2canvas-pro\";\nimport React, {\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { PiCopy, PiInfo } from \"react-icons/pi\";\nimport { useClipBoardToast } from \"./useClipBoardToast\";\n\n// Type to represent DataGridHandle which may have an element property\ntype DataGridRefType = DataGridHandle & { element?: HTMLElement };\n\n// Helper function to safely extract HTMLElement from DataGridHandle\nconst getHTMLElementFromRef = (refCurrent: DataGridRefType): HTMLElement => {\n // DataGridHandle might have an 'element' property containing the actual HTMLElement\n if (\"element\" in refCurrent) {\n return refCurrent.element;\n }\n // Otherwise, treat the ref itself as the HTMLElement\n return refCurrent as unknown as HTMLElement;\n};\n\nexport const IGNORE_SCREENSHOT_CLASS = \"ignore-screenshot\";\n\nexport const highlightBoxShadow =\n \"rgba(0, 0, 0, 0.25) 0px 54px 55px, rgba(0, 0, 0, 0.12) 0px -12px 30px, rgba(0, 0, 0, 0.12) 0px 4px 6px, rgba(0, 0, 0, 0.17) 0px 12px 13px, rgba(0, 0, 0, 0.09) 0px -3px 5px\";\n\nexport interface HookOptions {\n renderLibrary?: \"html2canvas\" | \"html-to-image\";\n imageType?: \"png\" | \"jpeg\";\n backgroundColor?: string | null;\n boardEffect?: boolean;\n shadowEffect?: boolean;\n borderStyle?: string;\n borderRadius?: string;\n onSuccess?: () => void;\n onError?: (error: unknown) => void;\n onClipboardNotDefined?: (blob: Blob) => void;\n ignoreElements?: (element: Element) => boolean;\n}\n\nexport interface BlobHookReturn {\n status: \"idle\" | \"loading\" | \"success\" | \"error\";\n isLoading: boolean;\n isErrored: boolean;\n isSuccess: boolean;\n toImage: () => void;\n ref: RefObject<HTMLElement | null>;\n}\n\nexport function useCopyToClipboard({\n renderLibrary = \"html2canvas\",\n imageType = \"png\",\n backgroundColor = null,\n boardEffect = true,\n shadowEffect = false,\n borderStyle = \"solid 1px #ccc\",\n borderRadius = \"10px\",\n onSuccess,\n onError,\n ignoreElements,\n}: HookOptions) {\n const [status, setStatus] = useState<\n \"idle\" | \"loading\" | \"success\" | \"error\"\n >(\"idle\");\n const ref = useRef<DataGridRefType>(null);\n\n // ImageDownloadModal is used for browsers that don't support ClipboardItem\n const { onOpen, setImgBlob, ImageDownloadModal } = useImageDownloadModal();\n\n const toImage = async () => {\n if (!ref.current) {\n console.error(\"No node to use for screenshot\");\n throw new Error(\"No node to use for screenshot\");\n }\n\n const nodeToUse = getHTMLElementFromRef(ref.current);\n const overflow = nodeToUse.style.overflow;\n const border = nodeToUse.style.border;\n const radius = nodeToUse.style.borderRadius;\n const background = nodeToUse.style.backgroundColor;\n const heigh = nodeToUse.style.height;\n\n function resetStyles() {\n nodeToUse.style.overflow = overflow;\n nodeToUse.style.border = border;\n nodeToUse.style.borderRadius = radius;\n nodeToUse.style.backgroundColor = background;\n nodeToUse.style.height = heigh;\n }\n\n try {\n nodeToUse.style.overflow = \"hidden\";\n nodeToUse.style.border = boardEffect ? borderStyle : \"\";\n nodeToUse.style.borderRadius = boardEffect ? borderRadius : \"\";\n nodeToUse.style.backgroundColor = backgroundColor ?? \"#f5f5f5\";\n // after firefox v125, html2canvas can't get the correct style height of the element to clone\n nodeToUse.style.height = `${String(nodeToUse.offsetHeight)}px`;\n\n // Add style to make images inline-block\n // ref: https://github.com/niklasvh/html2canvas/issues/2107#issuecomment-1316354455\n const style = document.createElement(\"style\");\n document.head.appendChild(style);\n style.sheet?.insertRule(\n \"body > div:last-child img { display: inline-block; }\",\n );\n const filter = ignoreElements\n ? (n: HTMLElement) => !ignoreElements(n)\n : undefined;\n\n setStatus(\"loading\");\n const canvas =\n renderLibrary === \"html2canvas\"\n ? await html2canvas(nodeToUse, {\n logging: false,\n backgroundColor: \"#f5f5f5\",\n ignoreElements: ignoreElements,\n })\n : await toCanvas(nodeToUse, {\n filter: filter,\n }); // Use html-to-image for copy reactflow graph\n\n style.remove();\n const outputCanvas = shadowEffect\n ? document.createElement(\"canvas\")\n : canvas;\n\n if (shadowEffect) {\n // Add shadow effect\n outputCanvas.width = canvas.width + 80;\n outputCanvas.height = canvas.height + 80;\n const ctx = outputCanvas.getContext(\"2d\");\n if (ctx) {\n ctx.shadowColor = \"rgba(0, 0, 0, 0.5)\";\n ctx.shadowBlur = 20;\n ctx.shadowOffsetX = 10;\n ctx.shadowOffsetY = 10;\n ctx.drawImage(canvas, 40, 40);\n } else {\n console.error(\"Error getting canvas context\");\n throw new Error(\"Error getting canvas context to add shadow effect\");\n }\n }\n\n const response = await fetch(outputCanvas.toDataURL());\n return await response.blob();\n } catch (error: unknown) {\n console.error(\"Error converting to image\", error);\n throw error;\n } finally {\n resetStyles();\n }\n };\n\n const copyToClipboard = async () => {\n try {\n await navigator.clipboard.write([\n new ClipboardItem({ [`image/${imageType}`]: toImage() }),\n ]);\n setStatus(\"success\");\n if (onSuccess) {\n onSuccess();\n }\n } catch (error) {\n if ((error as Error).message === \"ClipboardItem is not defined\") {\n const blob = await toImage();\n setImgBlob(blob);\n onOpen();\n setStatus(\"success\");\n } else {\n setStatus(\"error\");\n console.error(\"Error copying to clipboard\", error);\n if (onError) {\n onError(error);\n }\n }\n }\n };\n\n return {\n status,\n isLoading: status === \"loading\",\n isErrored: status === \"error\",\n isSuccess: status === \"success\",\n copyToClipboard,\n ImageDownloadModal,\n ref,\n };\n}\n\nexport function useCopyToClipboardButton(options?: HookOptions) {\n const { successToast, failToast } = useClipBoardToast();\n\n const { isLoading, copyToClipboard, ImageDownloadModal, ref } =\n useCopyToClipboard({\n imageType: \"png\",\n shadowEffect: true,\n backgroundColor: options?.backgroundColor ?? \"#f5f5f5\",\n onSuccess: () => {\n successToast(\"Copied the query result as an image to clipboard\");\n },\n onError: (error) => {\n console.error(\"Error taking screenshot\", error);\n failToast(\"Failed to copy image to clipboard\", error);\n },\n });\n\n const onMouseEnter = useCallback(() => {\n if (ref.current) {\n const nodeToUse = getHTMLElementFromRef(ref.current);\n nodeToUse.style.boxShadow = highlightBoxShadow;\n nodeToUse.style.transition = \"box-shadow 0.5s ease-in-out\";\n }\n }, [ref]);\n\n const onMouseLeave = useCallback(() => {\n if (ref.current) {\n const nodeToUse = getHTMLElementFromRef(ref.current);\n nodeToUse.style.boxShadow = \"\";\n }\n }, [ref]);\n\n const onCopyToClipboard = useCallback(async () => {\n if (ref.current) {\n await copyToClipboard();\n const nodeToUse = getHTMLElementFromRef(ref.current);\n nodeToUse.style.boxShadow = \"\";\n } else {\n failToast(\"Failed to copy image to clipboard\", \"No content to copy\");\n }\n }, [ref, copyToClipboard, failToast]);\n\n function CopyToClipboardButton({\n imageType = \"png\",\n ...props\n }: {\n imageType?: \"png\" | \"jpeg\";\n }) {\n return (\n <>\n <Button\n size=\"sm\"\n style={{ position: \"absolute\", bottom: \"16px\", right: \"16px\" }}\n loading={isLoading}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onCopyToClipboard}\n >\n <PiCopy /> Copy to Clipboard\n </Button>\n <ImageDownloadModal />\n </>\n );\n }\n\n return {\n ref,\n CopyToClipboardButton,\n onMouseEnter,\n onMouseLeave,\n onCopyToClipboard,\n };\n}\n\nexport function useImageDownloadModal() {\n const { open, onOpen, onClose } = useDisclosure();\n const [imgBlob, setImgBlob] = useState<Blob>();\n\n function ImageDownloadModal() {\n const [base64Img, setBase64Img] = useState<string>();\n\n useEffect(() => {\n if (!imgBlob) {\n return;\n }\n const reader = new FileReader();\n reader.readAsDataURL(imgBlob);\n reader.onloadend = (e) => {\n if (e.target?.result != null) {\n setBase64Img(e.target.result as string);\n }\n };\n }, []);\n\n const onDownload = () => {\n if (!imgBlob) {\n return;\n }\n const now = new Date();\n const fileName = `recce-screenshot-${format(now, \"yyyy-MM-dd-HH-mm-ss\")}.png`;\n saveAs(imgBlob, fileName);\n onClose();\n };\n\n return (\n <Dialog.Root size=\"xl\" open={open} onOpenChange={onClose}>\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Screenshot Preview</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Flex px=\"10px\" gap=\"10px\" direction=\"column\">\n <Flex alignItems=\"center\" gap=\"5px\">\n <PiInfo color=\"red.600\" />\n <Text fontWeight=\"500\" display=\"inline\">\n Copy to the Clipboard\n </Text>{\" \"}\n is not supported in the current browser\n </Flex>\n <Text>Please download it directly</Text>\n </Flex>\n <Image src={base64Img} alt=\"screenshot\" />\n </Dialog.Body>\n\n <Dialog.Footer>\n <Button mr={3} onClick={onClose}>\n Close\n </Button>\n <Button colorPalette=\"blue\" onClick={onDownload}>\n Download\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n }\n\n return {\n onOpen,\n setImgBlob,\n ImageDownloadModal,\n };\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport {\n findByRunType,\n RegistryEntry,\n runTypeHasRef,\n} from \"@/components/run/registry\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { cancelRun, waitRun } from \"@/lib/api/runs\";\nimport { Run } from \"../api/types\";\nimport { useRunsAggregated } from \"./LineageGraphContext\";\n\ninterface UseRunResult {\n run?: Run;\n aborting: boolean;\n isRunning: boolean;\n error: Error | null;\n onCancel: () => Promise<void>;\n RunResultView?: RegistryEntry[\"RunResultView\"] | undefined;\n}\n\nexport const useRun = (runId?: string): UseRunResult => {\n const [isRunning, setIsRunning] = useState(false);\n const [aborting, setAborting] = useState(false);\n const [, refetchRunsAggregated] = useRunsAggregated();\n\n const { error, data: run } = useQuery({\n queryKey: cacheKeys.run(runId ?? \"\"),\n queryFn: async () => {\n return await waitRun(runId ?? \"\", isRunning ? 2 : 0);\n },\n enabled: !!runId,\n refetchInterval: isRunning ? 50 : false,\n retry: false,\n });\n\n // Track previous run state to detect changes\n const [prevRun, setPrevRun] = useState(run);\n const [prevError, setPrevError] = useState(error);\n\n // Adjust isRunning during render when run/error state changes\n if (run !== prevRun || error !== prevError) {\n setPrevRun(run);\n setPrevError(error);\n\n if (error || run?.result || run?.error) {\n setIsRunning(false);\n } else if (run?.status === \"running\") {\n setIsRunning(true);\n }\n }\n\n // Side effect: refetch aggregated runs when row count runs complete\n useEffect(() => {\n if (\n (error || run?.result || run?.error) &&\n (run?.type === \"row_count_diff\" || run?.type === \"row_count\")\n ) {\n refetchRunsAggregated();\n }\n }, [run, error, refetchRunsAggregated]);\n\n const onCancel = useCallback(async () => {\n setAborting(true);\n if (!runId) {\n return;\n }\n\n await cancelRun(runId);\n return;\n }, [runId]);\n\n let RunResultView: RegistryEntry[\"RunResultView\"] | undefined;\n if (run && runTypeHasRef(run.type)) {\n RunResultView = findByRunType(run.type)\n .RunResultView as RegistryEntry[\"RunResultView\"];\n }\n\n return {\n run,\n isRunning,\n aborting,\n error,\n onCancel,\n RunResultView,\n };\n};\n","import ReactSplit, { SplitProps } from \"react-split\";\nimport \"./styles.css\";\n\nexport const HSplit = (props: SplitProps) => {\n const { style, children, gutterSize = 5, ...rest } = props;\n\n return (\n <ReactSplit\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n ...style,\n }}\n direction=\"horizontal\"\n gutterSize={gutterSize}\n {...rest}\n >\n {children}\n </ReactSplit>\n );\n};\n\nexport const VSplit = (props: SplitProps) => {\n const { style, children, gutterSize = 5, ...rest } = props;\n\n return (\n <ReactSplit\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n ...style,\n }}\n gutterSize={gutterSize}\n direction=\"vertical\"\n {...rest}\n >\n {children}\n </ReactSplit>\n );\n};\n","import { Box, Button, HStack, StackSeparator } from \"@chakra-ui/react\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\n\nexport interface ActionControlProps {\n onClose: () => void;\n}\n\nexport function ActionControl({ onClose }: ActionControlProps) {\n const { cancel, actionState } = useLineageViewContextSafe();\n\n const getProgressMessage = () => {\n if (actionState.mode === \"per_node\") {\n return `${actionState.completed} / ${actionState.total}`;\n } else {\n if (actionState.currentRun?.progress?.percentage) {\n return `${actionState.currentRun.progress.percentage * 100}%`;\n } else {\n if (actionState.status === \"completed\") {\n return \"100%\";\n } else {\n return \"0%\";\n }\n }\n }\n };\n\n return (\n <Box bg=\"white\" rounded=\"md\" shadow=\"dark-lg\">\n <HStack\n p=\"5px 15px\"\n mt=\"4\"\n separator={<StackSeparator borderColor=\"gray.200\" />}\n gap={4}\n >\n <Box fontSize=\"10pt\">\n Progress: {getProgressMessage()}{\" \"}\n {actionState.status === \"canceled\" ? \" (canceled)\" : \"\"}\n </Box>\n\n {actionState.status === \"running\" ||\n actionState.status === \"canceling\" ? (\n <Button\n size=\"xs\"\n variant=\"outline\"\n onClick={cancel}\n loading={actionState.status === \"canceling\"}\n loadingText=\"Canceling\"\n >\n Cancel\n </Button>\n ) : (\n <HStack>\n <Button size=\"xs\" variant=\"outline\" onClick={onClose}>\n Close\n </Button>\n </HStack>\n )}\n </HStack>\n </Box>\n );\n}\n","import type { SVGProps } from \"react\";\nimport { FaCamera, FaCube, FaDatabase, FaSeedling } from \"react-icons/fa\";\nimport { FaChartSimple, FaCircleNodes, FaGauge } from \"react-icons/fa6\";\nimport { VscDiffAdded, VscDiffModified, VscDiffRemoved } from \"react-icons/vsc\";\nimport { system as themeSystem } from \"@/components/ui/theme\";\n\nexport const IconAdded = VscDiffAdded;\nexport const IconRemoved = VscDiffRemoved;\nexport const IconModified = VscDiffModified;\nexport const IconChanged = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 16 16\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 11 a3 3 0 1 0 0-6 3 3 0 0 0 0 6z\"\n />\n\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"\" />\n </svg>\n );\n};\n\nexport const IconModifiedDownstream = (props: SVGProps<SVGSVGElement>) => {\n return (\n <svg\n stroke=\"currentColor\"\n fill=\"currentColor\"\n strokeWidth=\"0\"\n viewBox=\"0 0 16 16\"\n height=\"1em\"\n width=\"1em\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...(props as SVGProps<SVGSVGElement>)}\n >\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M1.5 1 h13 l.5.5 v13 l-.5.5 h-13 l-.5-.5 v-13l.5-.5zM2 2v4h-1v4h1v4h4v1h4v-1h4v-4h1v-4h-1v-4h-4v-1h-4v1h-4z\"\n />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M8 11 a3 3 0 1 0 0-6 3 3 0 0 0 0 6z\"\n />\n\n <path fillRule=\"evenodd\" clipRule=\"evenodd\" d=\"\" />\n </svg>\n );\n};\n\nexport function getIconForChangeStatus(\n changeStatus?: \"added\" | \"removed\" | \"modified\",\n): {\n color: string;\n hexColor: string;\n backgroundColor: string;\n hexBackgroundColor: string;\n icon: typeof IconAdded | undefined;\n} {\n if (changeStatus === \"added\") {\n return {\n color: \"green.solid\",\n hexColor: String(themeSystem.token(\"colors.green.solid\")),\n backgroundColor: \"green.subtle\",\n hexBackgroundColor: String(themeSystem.token(\"colors.green.subtle\")),\n icon: IconAdded,\n };\n } else if (changeStatus === \"removed\") {\n return {\n color: \"red.solid\",\n hexColor: String(themeSystem.token(\"colors.red.solid\")),\n backgroundColor: \"red.subtle\",\n hexBackgroundColor: String(themeSystem.token(\"colors.red.subtle\")),\n icon: IconRemoved,\n };\n } else if (changeStatus === \"modified\") {\n return {\n color: \"orange.emphasized\",\n hexColor: String(themeSystem.token(\"colors.orange.emphasized\")),\n backgroundColor: \"orange.subtle\",\n hexBackgroundColor: String(themeSystem.token(\"colors.orange.subtle\")),\n icon: IconModified,\n };\n }\n\n return {\n color: \"gray.focusRing\",\n hexColor: String(themeSystem.token(\"colors.gray.focusRing\")),\n backgroundColor: \"white\",\n hexBackgroundColor: String(themeSystem.token(\"colors.white\")),\n icon: undefined,\n };\n}\n\nexport function getIconForResourceType(resourceType?: string): {\n color: string;\n icon: typeof FaCube | undefined;\n} {\n if (resourceType === \"model\") {\n return {\n color: String(themeSystem.token(\"colors.cyan.subtle\")),\n icon: FaCube,\n };\n } else if (resourceType === \"metric\") {\n return {\n color: String(themeSystem.token(\"colors.rose.subtle\")),\n icon: FaChartSimple,\n };\n } else if (resourceType === \"source\") {\n return {\n color: String(themeSystem.token(\"colors.green.muted\")),\n icon: FaDatabase,\n };\n } else if (resourceType === \"exposure\") {\n return {\n color: String(themeSystem.token(\"colors.rose.subtle\")),\n icon: FaGauge,\n };\n } else if (resourceType === \"semantic_model\") {\n return {\n color: String(themeSystem.token(\"colors.rose.focusRing\")),\n icon: FaCircleNodes,\n };\n } else if (resourceType === \"seed\") {\n return {\n color: String(themeSystem.token(\"colors.green.emphasized\")),\n icon: FaSeedling,\n };\n } else if (resourceType === \"snapshot\") {\n return {\n color: String(themeSystem.token(\"colors.green.emphasized\")),\n icon: FaCamera,\n };\n } else {\n return { color: \"inherit\", icon: undefined };\n }\n}\n","import { Box, Flex, Icon } from \"@chakra-ui/react\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { getIconForChangeStatus } from \"./styles\";\n\ntype ChangeStatus = \"added\" | \"removed\" | \"modified\";\n\nexport function ChangeStatusLegend() {\n const CHANGE_STATUS_MSGS: Record<ChangeStatus, [string, string]> = {\n added: [\"Added\", \"Added resource\"],\n removed: [\"Removed\", \"Removed resource\"],\n modified: [\"Modified\", \"Modified resource\"],\n };\n\n return (\n <Box\n bg=\"white\"\n padding=\"12px\"\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n fontSize=\"sm\"\n >\n {(\n Object.entries(CHANGE_STATUS_MSGS) as [ChangeStatus, [string, string]][]\n ).map(([key, [label, tip]]) => {\n const { icon, color } = getIconForChangeStatus(key);\n\n return (\n <Tooltip content={tip} key={key} positioning={{ placement: \"right\" }}>\n <Flex alignItems=\"center\" gap=\"6px\" marginBottom=\"2px\">\n <Icon color={color} as={icon} /> {label}\n </Flex>\n </Tooltip>\n );\n })}\n </Box>\n );\n}\n","import {\n Box,\n Button,\n Code,\n Flex,\n Icon,\n IconButton,\n Link,\n Popover,\n Portal,\n Spinner,\n Text,\n} from \"@chakra-ui/react\";\nimport { UseMutationResult } from \"@tanstack/react-query\";\nimport { useState } from \"react\";\nimport { FaRegDotCircle } from \"react-icons/fa\";\nimport { PiInfo, PiX } from \"react-icons/pi\";\nimport { CllInput, ColumnLineageData } from \"@/lib/api/cll\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport { Tooltip } from \"../ui/tooltip\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\n\nconst _AnalyzeChangeHint = ({ ml }: { ml?: number }) => {\n const [hovered, setHovered] = useState(false);\n\n return (\n <Popover.Root\n open={hovered}\n onFocusOutside={() => {\n setHovered(false);\n }}\n positioning={{ placement: \"bottom-start\" }}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Icon\n boxSize=\"10px\"\n as={PiInfo}\n cursor=\"pointer\"\n ml={ml}\n onMouseEnter={() => {\n setHovered(true);\n }}\n />\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content bg=\"black\" color=\"white\">\n <Popover.Arrow />\n <Popover.Body fontSize=\"sm\">\n Breaking changes are determined by analyzing SQL for changes that\n may impact downstream models.{\" \"}\n <Link\n href=\"https://docs.datarecce.io/features/breaking-change-analysis/\"\n target=\"_blank\"\n textDecoration=\"underline\"\n >\n Learn more\n </Link>\n .\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n\nconst _CllHint = () => {\n const [hovered, setHovered] = useState(false);\n\n return (\n <Popover.Root\n open={hovered}\n onFocusOutside={() => {\n setHovered(false);\n }}\n positioning={{ placement: \"bottom-start\" }}\n lazyMount\n unmountOnExit\n >\n <Popover.Trigger asChild>\n <Icon\n boxSize=\"10px\"\n as={PiInfo}\n color=\"white\"\n cursor=\"pointer\"\n ml=\"1\"\n onMouseEnter={() => {\n setHovered(true);\n }}\n />\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content bg=\"black\" color=\"white\">\n <Popover.Arrow />\n <Popover.Body fontSize=\"sm\">\n Column-Level Lineage provides visibility into the upstream and\n downstream relationships of a column.{\" \"}\n <Link\n href=\"https://docs.datarecce.io/features/column-level-lineage/\"\n target=\"_blank\"\n textDecoration=\"underline\"\n >\n Learn more\n </Link>\n .\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n\nconst ModeMessage = () => {\n const { lineageGraph } = useLineageGraphContext();\n const { centerNode, viewOptions } = useLineageViewContextSafe();\n const cllInput = viewOptions.column_level_lineage;\n\n if (!lineageGraph) {\n return <></>;\n }\n\n if (!cllInput) {\n return \"Default View\";\n }\n\n if (cllInput.node_id === undefined) {\n return <Text as=\"span\">Impact Radius for All Changed Models</Text>;\n }\n\n const nodeName =\n cllInput.node_id in lineageGraph.nodes\n ? lineageGraph.nodes[cllInput.node_id].data.name\n : cllInput.node_id;\n\n if (!cllInput.column) {\n const nodeId = cllInput.node_id;\n\n return (\n <>\n <Text as=\"span\" mr=\"5px\">\n Impact Radius for\n </Text>\n <Code\n onClick={() => {\n centerNode(nodeId);\n }}\n cursor=\"pointer\"\n >\n {nodeName}\n </Code>\n </>\n );\n } else {\n const nodeId = `${cllInput.node_id}_${cllInput.column}`;\n return (\n <>\n <Text as=\"span\" mr=\"5px\">\n Column Lineage for{\" \"}\n </Text>\n <Code\n onClick={() => {\n centerNode(nodeId);\n }}\n cursor=\"pointer\"\n >\n {nodeName}.{cllInput.column}\n </Code>\n </>\n );\n }\n};\n\nexport const ColumnLevelLineageControl = ({\n action,\n}: {\n action: UseMutationResult<ColumnLineageData, Error, CllInput>;\n}) => {\n const {\n showColumnLevelLineage,\n resetColumnLevelLineage,\n interactive,\n viewOptions,\n } = useLineageViewContextSafe();\n const { data: flagData } = useRecceServerFlag();\n const singleEnv = flagData?.single_env_onboarding ?? false;\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n\n return (\n <Flex direction=\"row\" gap=\"5px\">\n {!singleEnv && (\n <Box\n borderRadius=\"md\"\n boxShadow=\"md\"\n border=\"1px solid\"\n borderColor=\"gray.200\"\n bg=\"white\"\n >\n <Tooltip\n openDelay={50}\n content=\"Please provide catalog.json to enable Impact Radius\"\n disabled={!noCatalogCurrent}\n positioning={{ placement: \"top\" }}\n >\n <Button\n size=\"sm\"\n variant=\"ghost\"\n whiteSpace=\"nowrap\"\n display=\"inline-flex\"\n disabled={!interactive || noCatalogCurrent}\n onClick={() => {\n void showColumnLevelLineage({\n no_upstream: true,\n change_analysis: true,\n });\n }}\n >\n <FaRegDotCircle /> Impact Radius\n </Button>\n </Tooltip>\n </Box>\n )}\n {viewOptions.column_level_lineage && (\n <Flex\n borderRadius=\"md\"\n boxShadow=\"md\"\n border=\"1px solid\"\n borderColor=\"gray.200\"\n bg=\"white\"\n fontSize=\"0.8rem\"\n p=\"0 0.625rem\"\n alignItems=\"center\"\n >\n <ModeMessage />\n {action.isError && (\n <Tooltip\n content={`Error: ${action.error.message}`}\n positioning={{ placement: \"bottom\" }}\n >\n <Text\n as=\"span\"\n color=\"red.500\"\n ml=\"2px\"\n display=\"inline-flex\"\n alignItems=\"center\"\n >\n <Icon as={PiInfo} color=\"red.500\" boxSize=\"14px\" />\n </Text>\n </Tooltip>\n )}\n\n {action.isPending ? (\n <Spinner size=\"xs\" ml=\"2px\" />\n ) : (\n <IconButton\n variant=\"ghost\"\n size=\"xs\"\n ml=\"2px\"\n aria-label=\"Reset Column Level Lineage\"\n onClick={() => {\n void resetColumnLevelLineage();\n }}\n >\n <PiX size=\"10px\" />\n </IconButton>\n )}\n </Flex>\n )}\n </Flex>\n );\n};\n","import { Box, Flex, Icon, Spacer, Tag } from \"@chakra-ui/react\";\nimport { Handle, NodeProps, Position, useStore } from \"@xyflow/react\";\nimport React from \"react\";\nimport { COLUMN_HEIGHT, LineageGraphColumnNode } from \"./lineage\";\n\nimport \"./styles.css\";\n\nimport { VscKebabVertical } from \"react-icons/vsc\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\nimport { getIconForChangeStatus } from \"./styles\";\n\ntype GrapeColumnNodeProps = NodeProps<LineageGraphColumnNode>;\n\nexport const ChangeStatus = ({\n changeStatus,\n}: {\n changeStatus?: \"added\" | \"removed\" | \"modified\";\n}) => {\n if (!changeStatus) {\n return <></>;\n }\n\n const { color: colorChangeStatus, icon: iconChangeStatus } =\n getIconForChangeStatus(changeStatus);\n\n return (\n <Icon\n boxSize=\"14px\"\n display=\"inline-flex\"\n color={colorChangeStatus}\n as={iconChangeStatus}\n />\n );\n};\n\nexport const TransformationType = ({\n transformationType,\n legend,\n}: {\n transformationType?: string;\n legend?: boolean;\n}) => {\n let letter = \"U\";\n let color = \"red\";\n\n if (transformationType === \"passthrough\") {\n letter = \"P\";\n color = \"gray\";\n } else if (transformationType === \"renamed\") {\n letter = \"R\";\n color = \"orange\";\n } else if (transformationType === \"derived\") {\n letter = \"D\";\n color = \"orange\";\n } else if (transformationType === \"source\") {\n letter = \"S\";\n color = \"blue\";\n } else {\n letter = \"U\";\n color = \"red\";\n }\n\n if (!transformationType) {\n return <></>;\n }\n\n // # circle in color\n return (\n <>\n {legend ? (\n <Tag.Root\n fontSize=\"8pt\"\n size=\"sm\"\n colorPalette={color}\n borderRadius=\"full\"\n paddingX=\"4px\"\n >\n <Tag.Label>{letter}</Tag.Label>\n </Tag.Root>\n ) : (\n <Tag.Root\n fontSize=\"8pt\"\n size=\"sm\"\n colorPalette={color}\n borderRadius=\"full\"\n paddingX=\"4px\"\n >\n <Tag.Label>{letter}</Tag.Label>\n </Tag.Root>\n )}\n </>\n );\n};\n\nexport function GraphColumnNode(nodeProps: GrapeColumnNodeProps) {\n const { id: columnNodeId, data } = nodeProps;\n const { id: nodeId } = data.node;\n const { column, type, transformationType, changeStatus } = data;\n const showContent = useStore((s) => s.transform[2] > 0.3);\n\n const {\n viewOptions,\n showContextMenu,\n isNodeHighlighted,\n isNodeShowingChangeAnalysis,\n } = useLineageViewContextSafe();\n\n const selectedNode = viewOptions.column_level_lineage?.node_id;\n const selectedColumn = viewOptions.column_level_lineage?.column;\n const isFocus = column === selectedColumn && nodeId === selectedNode;\n const [isHovered, setIsHovered] = React.useState(false);\n const isHighlighted = isNodeHighlighted(columnNodeId);\n const isShowingChangeAnalysis = isNodeShowingChangeAnalysis(nodeId);\n\n if (!showContent) {\n return <></>;\n }\n\n return (\n <Flex\n width=\"280px\"\n padding=\"0px 10px\"\n border=\"1px solid gray\"\n backgroundColor={isFocus ? \"#f0f0f0\" : \"inherit\"}\n _hover={{\n backgroundColor: isFocus ? \"#f0f0f0\" : \"#f0f0f0\",\n }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n filter={isHighlighted ? \"none\" : \"opacity(0.2) grayscale(50%)\"}\n cursor=\"pointer\"\n >\n <Flex\n fontSize=\"11px\"\n color=\"black\"\n width=\"100%\"\n gap=\"3px\"\n alignItems=\"center\"\n height={`${COLUMN_HEIGHT - 1}px`}\n >\n {isShowingChangeAnalysis && changeStatus ? (\n <ChangeStatus changeStatus={changeStatus} />\n ) : (\n <TransformationType transformationType={transformationType} />\n )}\n <Box height={`${COLUMN_HEIGHT + 1}px`}>{column}</Box>\n <Spacer></Spacer>\n\n {isHovered ? (\n <Icon\n as={VscKebabVertical}\n boxSize=\"14px\"\n display={\"inline-flex\"}\n cursor={\"pointer\"}\n _hover={{ color: \"black\" }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n showContextMenu(\n e,\n nodeProps as unknown as LineageGraphColumnNode,\n );\n }}\n />\n ) : (\n <Box height={`${COLUMN_HEIGHT + 1} px`}>{type}</Box>\n )}\n </Flex>\n <Handle\n type=\"target\"\n position={Position.Left}\n isConnectable={false}\n style={{\n left: 0,\n visibility: \"hidden\",\n }}\n />\n <Handle\n type=\"source\"\n position={Position.Right}\n isConnectable={false}\n style={{\n right: 0,\n visibility: \"hidden\",\n }}\n />\n </Flex>\n );\n}\n","import { Box, Flex } from \"@chakra-ui/react\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { TransformationType } from \"./GraphColumnNode\";\n\nexport function ColumnLevelLineageLegend() {\n const TRANSFORMATION_MSGS: Record<string, [string, string]> = {\n passthrough: [\n \"Pass Through\",\n \"The column is directly selected from the upstream table.\",\n ],\n renamed: [\n \"Renamed\",\n \"The column is selected from the upstream table but with a different name.\",\n ],\n derived: [\n \"Derived\",\n \"The column is created through transformations applied to upstream columns, such as calculations, conditions, functions, or aggregations.\",\n ],\n source: [\n \"Source\",\n \"The column is not derived from any upstream data. It may originate from a seed/source node, literal value, or data generation function.\",\n ],\n unknown: [\n \"Unknown\",\n \"We have no information about the transformation type. This could be due to a parse error, or other unknown reason.\",\n ],\n };\n\n return (\n <Box\n bg=\"white\"\n padding=\"12px\"\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n fontSize=\"sm\"\n >\n {Object.entries(TRANSFORMATION_MSGS).map(([key, [label, tip]]) => {\n return (\n <Tooltip content={tip} key={key} positioning={{ placement: \"right\" }}>\n <Flex alignItems=\"center\" gap=\"6px\" marginBottom=\"2px\">\n <TransformationType legend transformationType={key} /> {label}\n </Flex>\n </Tooltip>\n );\n })}\n </Box>\n );\n}\n","import { BaseEdge, EdgeProps, getBezierPath } from \"@xyflow/react\";\nimport { LineageGraphEdge } from \"./lineage\";\nimport { getIconForChangeStatus } from \"./styles\";\n\nimport \"./styles.css\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\n\ntype GraphEdgeProps = EdgeProps<LineageGraphEdge>;\n\nexport default function GraphEdge(props: GraphEdgeProps) {\n const {\n source,\n target,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style: styleOverride = {},\n markerEnd,\n data,\n } = props;\n\n const style = {\n ...styleOverride,\n };\n\n const { isEdgeHighlighted } = useLineageViewContextSafe();\n\n if (data?.changeStatus) {\n style.stroke = getIconForChangeStatus(data.changeStatus).hexColor;\n style.strokeDasharray = \"5\";\n }\n\n const isHighlighted = isEdgeHighlighted(source, target);\n\n if (!isHighlighted) {\n style.filter = \"opacity(0.2) grayscale(50%)\";\n }\n\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n return (\n <>\n <BaseEdge\n path={edgePath}\n markerEnd={markerEnd}\n style={{ ...style, ...styleOverride }}\n />\n </>\n );\n}\n","import { NodeData } from \"@/lib/api/info\";\n\nexport function isSchemaChanged(\n baseSchema: NodeData[\"columns\"],\n currSchema: NodeData[\"columns\"],\n) {\n if (!baseSchema || !currSchema) {\n return undefined;\n }\n const baseKeys = Object.keys(baseSchema);\n const currKeys = Object.keys(currSchema);\n\n // added, removed\n if (baseKeys.length !== currKeys.length) {\n return true;\n }\n\n // reordered\n for (let i = 0; i < baseKeys.length; i++) {\n if (baseKeys[i] !== currKeys[i]) {\n return true;\n }\n }\n\n // modified\n for (const key of currKeys) {\n if (!baseSchema[key] || baseSchema[key].type !== currSchema[key]?.type) {\n return true;\n }\n }\n return false;\n}\n","import { Box, Link, Popover, Portal } from \"@chakra-ui/react\";\nimport { ReactElement, useCallback, useRef, useState } from \"react\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"@/constants/urls\";\n\ninterface SetupConnectionPopoverProps {\n children: ReactElement<{\n ref?: React.Ref<HTMLElement>;\n [key: string]: unknown;\n }>;\n display: boolean;\n}\n\nexport default function SetupConnectionPopover({\n children,\n display,\n}: SetupConnectionPopoverProps) {\n const [hovered, setHovered] = useState(false);\n const timeoutRef = useRef<NodeJS.Timeout | null>(null);\n const ref = useRef<HTMLElement | null>(null);\n const getAnchorRect = () => ref.current?.getBoundingClientRect() ?? null;\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n setHovered(true);\n }, []);\n\n const handleMouseLeave = useCallback(() => {\n timeoutRef.current = setTimeout(() => {\n setHovered(false);\n }, 100);\n }, []);\n\n if (!display) {\n return children;\n }\n\n return (\n <Popover.Root\n open={hovered}\n onFocusOutside={() => {\n setHovered(false);\n }}\n positioning={{ getAnchorRect }}\n lazyMount\n unmountOnExit\n size=\"xs\"\n autoFocus={false}\n >\n <Popover.Trigger asChild>\n <Box\n ref={ref}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n display=\"contents\"\n >\n {children}\n </Box>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n bg=\"gray.600\"\n color=\"white\"\n zIndex=\"popover\"\n width=\"auto\"\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <Popover.Body>\n Connect to a data warehouse to unlock Diff.{\" \"}\n <Link\n href={RECCE_SUPPORT_CALENDAR_URL}\n color=\"white\"\n target=\"_blank\"\n textDecoration=\"underline\"\n >\n Learn more\n </Link>\n .\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n}\n","import {\n Flex,\n HStack,\n Icon,\n IconButton,\n SkeletonText,\n Tag,\n Text,\n} from \"@chakra-ui/react\";\nimport { FiArrowRight, FiFrown } from \"react-icons/fi\";\nimport { PiRepeat } from \"react-icons/pi\";\nimport { RiArrowDownSFill, RiArrowUpSFill, RiSwapLine } from \"react-icons/ri\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { RowCount, RowCountDiff } from \"@/lib/api/models\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { deltaPercentageString } from \"../rowcount/delta\";\nimport { findByRunType } from \"../run/registry\";\nimport { LineageGraphNode } from \"./lineage\";\nimport { getIconForResourceType } from \"./styles\";\n\nexport function ResourceTypeTag({ node }: { node: LineageGraphNode }) {\n const { icon: ResourceTypeIcon } = getIconForResourceType(\n node.data.resourceType,\n );\n return (\n <Tooltip showArrow content=\"Type of resource\">\n <Tag.Root>\n {ResourceTypeIcon && (\n <Tag.StartElement>\n <ResourceTypeIcon />\n </Tag.StartElement>\n )}\n <Tag.Label>{node.data.resourceType}</Tag.Label>\n </Tag.Root>\n </Tooltip>\n );\n}\n\ninterface ModelRowCountProps {\n rowCount?: RowCountDiff;\n}\n\nfunction _RowCountByRate({ rowCount }: { rowCount: RowCountDiff }) {\n const base = rowCount.base;\n const current = rowCount.curr;\n const baseLabel = rowCount.base === null ? \"N/A\" : `${rowCount.base} rows`;\n const currentLabel = rowCount.curr === null ? \"N/A\" : `${rowCount.curr} rows`;\n\n if (base === null && current === null) {\n return <> Failed to load</>;\n } else if (base === null || current === null) {\n return (\n <HStack>\n <Text>{baseLabel}</Text>\n <Icon as={FiArrowRight} />\n <Text>{currentLabel}</Text>\n </HStack>\n );\n } else if (base === current) {\n return (\n <HStack>\n <Text>{currentLabel}</Text>\n <Icon as={RiSwapLine} color=\"gray.500\" />\n <Text color=\"gray.500\">No Change</Text>\n </HStack>\n );\n } else if (base < current) {\n return (\n <HStack>\n <Text>{currentLabel}</Text>\n <Icon as={RiArrowUpSFill} color=\"green.500\" />\n <Text color=\"green.500\">{deltaPercentageString(base, current)}</Text>\n </HStack>\n );\n } else {\n return (\n <HStack>\n <Text>{currentLabel}</Text>\n <Icon as={RiArrowDownSFill} color=\"red.500\" />\n <Text color=\"red.500\">{deltaPercentageString(base, current)}</Text>\n </HStack>\n );\n }\n}\n\nexport function ModelRowCount({ rowCount }: ModelRowCountProps) {\n if (!rowCount) {\n return (\n <HStack>\n <Text>Failed to load</Text>\n <Icon as={FiFrown} color=\"red.500\" />\n </HStack>\n );\n }\n\n const base = rowCount.base ?? \"N/A\";\n const current = rowCount.curr ?? \"N/A\";\n const label = `${base} -> ${current} rows`;\n\n return (\n <Tooltip showArrow content={label}>\n <_RowCountByRate rowCount={rowCount} />\n </Tooltip>\n );\n}\n\nexport interface RowCountDiffTagProps {\n node: LineageGraphNode;\n rowCount?: RowCountDiff;\n onRefresh?: () => void;\n isFetching?: boolean;\n error?: Error | null;\n}\n\nexport function RowCountDiffTag({\n rowCount: fetchedRowCount,\n node,\n onRefresh,\n isFetching,\n}: RowCountDiffTagProps) {\n const { featureToggles } = useRecceInstanceContext();\n const { runsAggregated } = useLineageGraphContext();\n const lastRowCount: RowCountDiff | undefined = runsAggregated?.[node.id]\n ?.row_count_diff.result as RowCountDiff | undefined;\n const RunTypeIcon = findByRunType(\"row_count_diff\").icon;\n\n // Calculate during render instead of effect\n const rowCount = fetchedRowCount ?? lastRowCount;\n const rowsToShow = rowCount;\n const label = rowCount\n ? `${rowCount.base ?? \"N/A\"} -> ${rowCount.curr ?? \"N/A\"} rows`\n : \"\";\n\n // TODO isFetching is not hooked up, so disabling it on the skeleton for now\n return (\n <Tooltip content={label}>\n <SetupConnectionPopover display={featureToggles.mode === \"metadata only\"}>\n <Tag.Root asChild>\n <Flex direction=\"row\" alignItems=\"center\" gap=\"1\">\n <RunTypeIcon />\n {rowsToShow != null || isFetching ? (\n <SkeletonText\n loading={false}\n noOfLines={1}\n minWidth={\"30px\"}\n fontSize=\"xs\"\n >\n {rowsToShow != null ? (\n <_RowCountByRate rowCount={rowsToShow} />\n ) : (\n \"row count\"\n )}\n </SkeletonText>\n ) : (\n <Text fontSize=\"xs\">row count</Text>\n )}\n {onRefresh && (\n <IconButton\n loading={isFetching}\n aria-label=\"Query Row Count\"\n size=\"2xs\"\n p=\"0\"\n variant=\"ghost\"\n onClick={onRefresh}\n disabled={featureToggles.disableDatabaseQuery}\n >\n <PiRepeat />\n </IconButton>\n )}\n </Flex>\n </Tag.Root>\n </SetupConnectionPopover>\n </Tooltip>\n );\n}\n\nexport interface RowCountTagProps {\n node: LineageGraphNode;\n rowCount?: RowCount;\n onRefresh?: () => void;\n isFetching?: boolean;\n error?: Error | null;\n}\n\nexport function RowCountTag({\n rowCount: fetchedRowCount,\n node,\n onRefresh,\n isFetching,\n}: RowCountTagProps) {\n const { runsAggregated } = useLineageGraphContext();\n const lastRowCount: RowCountDiff | undefined = runsAggregated?.[node.id]\n ?.row_count.result as RowCountDiff | undefined;\n\n const RunTypeIcon = findByRunType(\"row_count\").icon;\n\n let label;\n const rowCount = fetchedRowCount ?? lastRowCount;\n if (rowCount) {\n const rows = rowCount.curr ?? \"N/A\";\n label = `${rows} rows`;\n }\n\n return (\n <Tag.Root>\n <Tag.StartElement>\n <RunTypeIcon />\n </Tag.StartElement>\n <Tag.Label>\n {rowCount || isFetching ? (\n <SkeletonText\n loading={isFetching}\n lineClamp={1}\n height={2}\n minWidth={\"30px\"}\n >\n {rowCount ? `${label}` : \"row count\"}\n </SkeletonText>\n ) : (\n <>row count</>\n )}\n </Tag.Label>\n {onRefresh && (\n <IconButton\n loading={isFetching}\n aria-label=\"Query Row Count\"\n size=\"2xs\"\n p=\"0\"\n variant=\"ghost\"\n onClick={onRefresh}\n disabled={node.data.from === \"base\"}\n >\n <PiRepeat />\n </IconButton>\n )}\n </Tag.Root>\n );\n}\n","import { Box, Flex, ProgressCircle, Tag } from \"@chakra-ui/react\";\nimport { PiInfo, PiWarning } from \"react-icons/pi\";\nimport { LineageGraphNode } from \"@/components/lineage/lineage\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport {\n isRowCountDiffRun,\n isRowCountRun,\n isValueDiffRun,\n} from \"@/lib/api/types\";\nimport { ActionState } from \"./LineageViewContext\";\nimport { RowCountDiffTag, RowCountTag } from \"./NodeTag\";\n\ninterface ActionTagProps {\n node: LineageGraphNode;\n action: ActionState[\"actions\"][string];\n}\n\nexport const ActionTag = ({ node, action }: ActionTagProps) => {\n const { status, skipReason, run } = action;\n\n if (status === \"pending\") {\n return (\n <ProgressCircle.Root value={0} size=\"xs\">\n <ProgressCircle.Circle>\n <ProgressCircle.Track />\n <ProgressCircle.Range />\n </ProgressCircle.Circle>\n </ProgressCircle.Root>\n );\n }\n\n if (status === \"skipped\") {\n return (\n <Tag.Root backgroundColor={\"gray.100\"}>\n <Tag.Label>\n <Flex fontSize=\"10pt\" color=\"gray.500\" alignItems=\"center\" gap=\"3px\">\n <Box>Skipped</Box>\n {skipReason && (\n <Tooltip content={skipReason}>\n <PiInfo />\n </Tooltip>\n )}\n </Flex>\n </Tag.Label>\n </Tag.Root>\n );\n }\n\n if (!run) {\n return (\n <ProgressCircle.Root value={null} size=\"xs\">\n <ProgressCircle.Circle>\n <ProgressCircle.Track />\n <ProgressCircle.Range />\n </ProgressCircle.Circle>\n </ProgressCircle.Root>\n );\n }\n\n const { error, run_id, progress } = run;\n\n if (status === \"running\") {\n if (progress?.percentage === undefined) {\n return (\n <ProgressCircle.Root value={null} size=\"xs\">\n <ProgressCircle.Circle>\n <ProgressCircle.Track />\n <ProgressCircle.Range />\n </ProgressCircle.Circle>\n </ProgressCircle.Root>\n );\n } else {\n return (\n <ProgressCircle.Root value={progress.percentage * 100} size=\"xs\">\n <ProgressCircle.Circle>\n <ProgressCircle.Track />\n <ProgressCircle.Range />\n </ProgressCircle.Circle>\n </ProgressCircle.Root>\n );\n }\n }\n\n if (error) {\n return (\n <Flex fontSize=\"10pt\" color=\"gray\">\n <Box>Error</Box>\n {skipReason && (\n <Tooltip content={error}>\n <PiWarning />\n </Tooltip>\n )}\n </Flex>\n );\n }\n\n if (isValueDiffRun(run) && run.result) {\n const r = run.result;\n let mismatched = 0;\n\n for (const c of r.data.data) {\n if ((c[2] as number) < 1) {\n mismatched++;\n }\n }\n\n return (\n <Tag.Root backgroundColor={mismatched > 0 ? \"red.100\" : \"green.100\"}>\n <Tag.Label>\n <Flex\n fontSize=\"10pt\"\n color={mismatched > 0 ? \"red\" : \"green\"}\n alignItems=\"center\"\n gap=\"3px\"\n >\n {mismatched > 0\n ? `${mismatched} columns mismatched`\n : \"All columns match\"}\n </Flex>\n </Tag.Label>\n </Tag.Root>\n );\n }\n\n if (isRowCountDiffRun(run) && run.result) {\n const result = run.result;\n return <RowCountDiffTag rowCount={result[node.data.name]} node={node} />;\n }\n\n if (isRowCountRun(run) && run.result) {\n const result = run.result;\n return <RowCountTag rowCount={result[node.data.name]} node={node} />;\n }\n\n return <>{run_id}</>;\n};\n","import { Box, Center, Flex, HStack, Icon, Spacer, Tag } from \"@chakra-ui/react\";\nimport { Handle, NodeProps, Position, useStore } from \"@xyflow/react\";\nimport React, { useState } from \"react\";\nimport { COLUMN_HEIGHT, LineageGraphNode } from \"./lineage\";\nimport { getIconForChangeStatus, getIconForResourceType } from \"./styles\";\n\nimport \"./styles.css\";\n\nimport { FaCheckSquare, FaRegDotCircle, FaRegSquare } from \"react-icons/fa\";\nimport { VscKebabVertical } from \"react-icons/vsc\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { RowCountDiff } from \"@/lib/api/models\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { deltaPercentageString } from \"../rowcount/delta\";\nimport { findByRunType } from \"../run/registry\";\nimport { isSchemaChanged } from \"../schema/schemaDiff\";\nimport { ActionTag } from \"./ActionTag\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\n\nexport type GraphNodeProps = NodeProps<LineageGraphNode>;\n\nfunction _RowCountDiffTag({ rowCount }: { rowCount: RowCountDiff }) {\n const base = rowCount.base;\n const current = rowCount.curr;\n const baseLabel = rowCount.base === null ? \"N/A\" : `${rowCount.base} Rows`;\n const currentLabel = rowCount.curr === null ? \"N/A\" : `${rowCount.curr} Rows`;\n\n let tagLabel;\n let colorPalette;\n if (base === null && current === null) {\n tagLabel = \"Failed to load\";\n colorPalette = \"gray\";\n } else if (base === null || current === null) {\n tagLabel = `${baseLabel} -> ${currentLabel}`;\n colorPalette = base === null ? \"green\" : \"red\";\n } else if (base === current) {\n tagLabel = \"=\";\n colorPalette = \"gray\";\n } else if (base !== current) {\n tagLabel = `${deltaPercentageString(base, current)} Rows`;\n colorPalette = base < current ? \"green\" : \"red\";\n }\n\n return (\n <Tag.Root colorPalette={colorPalette}>\n <Flex gap={1} alignItems=\"center\">\n <Icon as={findByRunType(\"row_count_diff\").icon} />\n <Tag.Label>{tagLabel}</Tag.Label>\n </Flex>\n </Tag.Root>\n );\n}\n\nconst CHANGE_CATEGORY_MSGS = {\n breaking: \"Breaking\",\n non_breaking: \"Non Breaking\",\n partial_breaking: \"Partial Breaking\",\n unknown: \"Unknown\",\n};\n\nconst NodeRunsAggregated = ({\n id,\n inverted,\n}: {\n id: string;\n inverted: boolean;\n}) => {\n const { lineageGraph, runsAggregated } = useLineageGraphContext();\n const runs = runsAggregated?.[id];\n const node = lineageGraph?.nodes[id];\n if (!runs && !node) {\n return <></>;\n }\n\n let schemaChanged;\n if (node?.data.data.base && node.data.data.current) {\n const baseColumns = node.data.data.base.columns;\n const currColumns = node.data.data.current.columns;\n schemaChanged = isSchemaChanged(baseColumns, currColumns);\n }\n\n let rowCountChanged;\n if (runs?.row_count_diff) {\n const rowCountDiff = runs.row_count_diff;\n const result = rowCountDiff.result as RowCountDiff;\n rowCountChanged = result.curr !== result.base;\n }\n\n const colorChanged = inverted\n ? \"white\"\n : getIconForChangeStatus(\"modified\").color;\n const colorUnchanged = inverted ? \"gray\" : \"gray.100\";\n\n return (\n <Flex flex=\"1\">\n {schemaChanged !== undefined && (\n <Tooltip\n content={`Schema (${schemaChanged ? \"changed\" : \"no change\"})`}\n openDelay={500}\n >\n <Box height=\"16px\">\n <Icon\n as={findByRunType(\"schema_diff\").icon}\n color={schemaChanged ? colorChanged : colorUnchanged}\n />\n </Box>\n </Tooltip>\n )}\n <Spacer />\n {runs?.row_count_diff && rowCountChanged !== undefined && (\n <Tooltip\n content={`Row count (${rowCountChanged ? \"changed\" : \"=\"})`}\n openDelay={500}\n >\n <Box>\n <_RowCountDiffTag\n rowCount={runs.row_count_diff.result as RowCountDiff}\n />\n </Box>\n </Tooltip>\n )}\n </Flex>\n );\n};\n\nconst GraphNodeCheckbox = ({\n checked,\n onClick,\n}: {\n checked: boolean;\n onClick?: React.MouseEventHandler;\n}) => {\n return (\n <Flex\n onClick={onClick}\n alignSelf=\"center\"\n alignItems=\"center\"\n cursor={\"pointer\"}\n >\n {checked ? (\n <Icon boxSize=\"20px\" as={FaCheckSquare} />\n ) : (\n <Icon boxSize=\"20px\" as={FaRegSquare} />\n )}\n </Flex>\n );\n};\n\nconst GraphNodeTitle = ({\n name,\n color,\n resourceType,\n}: {\n name: string;\n color: string;\n resourceType?: string;\n}) => {\n return (\n <Box\n flex=\"1\"\n color={color}\n overflow=\"hidden\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n >\n <Tooltip\n content={resourceType === \"model\" ? name : `${name} (${resourceType})`}\n positioning={{ placement: \"top\" }}\n >\n <span>{name}</span>\n </Tooltip>\n </Box>\n );\n};\n\nexport function GraphNode(nodeProps: GraphNodeProps) {\n const { data } = nodeProps;\n const { id, resourceType, changeStatus } = data;\n\n const showContent = useStore((s) => s.transform[2] > 0.3);\n\n const { icon: resourceIcon } = getIconForResourceType(resourceType);\n const [isHovered, setIsHovered] = useState(false);\n const {\n interactive,\n selectNode,\n selectMode,\n focusedNode,\n getNodeAction,\n getNodeColumnSet,\n isNodeHighlighted,\n isNodeSelected,\n isNodeShowingChangeAnalysis,\n showContextMenu,\n viewOptions,\n cll,\n showColumnLevelLineage,\n } = useLineageViewContextSafe();\n const changeCategory = cll?.current.nodes[id]?.change_category;\n\n const _isNonBreakingChange = changeCategory === \"non_breaking\";\n const isHighlighted = isNodeHighlighted(id);\n const isSelected = isNodeSelected(id);\n const isFocusedByImpactRadius =\n viewOptions.column_level_lineage?.node_id === id &&\n viewOptions.column_level_lineage.column === undefined;\n const isFocused = focusedNode?.id === id || isFocusedByImpactRadius;\n\n const isShowingChangeAnalysis = isNodeShowingChangeAnalysis(id);\n\n // text color, icon\n const {\n icon: iconChangeStatus,\n color: colorChangeStatus,\n backgroundColor: backgroundColorChangeStatus,\n } = changeStatus\n ? getIconForChangeStatus(changeStatus)\n : {\n icon: undefined,\n color: \"gray.400\",\n backgroundColor: \"gray.100\",\n };\n\n // border width and color\n const borderWidth = \"2px\";\n const borderColor = colorChangeStatus;\n\n const name = data.name;\n const columnSet = getNodeColumnSet(data.id);\n const showColumns = columnSet.size > 0;\n const action =\n selectMode === \"action_result\" ? getNodeAction(data.id) : undefined;\n\n const nodeBackgroundColor = (function () {\n if (showContent) {\n if (selectMode === \"selecting\") {\n return isSelected ? colorChangeStatus : \"white\";\n } else if (selectMode === \"action_result\") {\n if (!action) {\n return \"white\";\n } else {\n return isFocused || isSelected || isHovered\n ? backgroundColorChangeStatus\n : colorChangeStatus;\n }\n } else {\n return isFocused || isSelected || isHovered\n ? backgroundColorChangeStatus\n : \"white\";\n }\n } else {\n return isFocused || isSelected || isHovered\n ? colorChangeStatus\n : backgroundColorChangeStatus;\n }\n })();\n const titleColor = (function () {\n if (selectMode === \"selecting\") {\n return isSelected ? \"white\" : \"inherit\";\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? \"white\" : \"inherit\";\n } else {\n return \"inherit\";\n }\n })();\n const iconResourceColor = (function () {\n if (selectMode === \"selecting\") {\n return isSelected ? \"white\" : \"inherit\";\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? \"white\" : \"inherit\";\n } else {\n return \"inherit\";\n }\n })();\n const iconChangeStatusColor = (function () {\n if (selectMode === \"selecting\") {\n return isSelected ? \"white\" : colorChangeStatus;\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? \"white\" : \"inherit\";\n } else {\n return colorChangeStatus;\n }\n })();\n\n return (\n <Flex\n cursor={selectMode === \"selecting\" ? \"pointer\" : \"inherit\"}\n direction=\"column\"\n width=\"300px\"\n transition=\"box-shadow 0.2s ease-in-out\"\n padding={0}\n filter={(function () {\n if (selectMode === \"action_result\") {\n return action ? \"none\" : \"opacity(0.2) grayscale(50%)\";\n } else {\n return isHighlighted || isFocused || isSelected || isHovered\n ? \"none\"\n : \"opacity(0.2) grayscale(50%)\";\n }\n })()}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n <Flex\n borderColor={borderColor}\n borderWidth={borderWidth}\n borderTopRadius={8}\n borderBottomRadius={showColumns ? 0 : 8}\n backgroundColor={nodeBackgroundColor}\n height=\"60px\"\n >\n <Flex\n bg={colorChangeStatus}\n padding={interactive ? \"8px\" : \"2px\"}\n borderRightWidth={borderWidth}\n borderColor={selectMode === \"selecting\" ? \"#00000020\" : borderColor}\n alignItems=\"top\"\n visibility={showContent ? \"inherit\" : \"hidden\"}\n >\n {interactive && (\n <GraphNodeCheckbox\n checked={\n (selectMode === \"selecting\" && isSelected) ||\n (selectMode === \"action_result\" && !!action)\n }\n onClick={(e) => {\n if (selectMode === \"action_result\") {\n return;\n }\n e.stopPropagation();\n selectNode(data.id);\n }}\n />\n )}\n </Flex>\n\n <Flex flex=\"1 0 auto\" mx=\"1\" width=\"100px\" direction=\"column\">\n <Flex\n width=\"100%\"\n textAlign=\"left\"\n fontWeight=\"600\"\n flex=\"1\"\n p={1}\n gap=\"5px\"\n alignItems=\"center\"\n visibility={showContent ? \"inherit\" : \"hidden\"}\n >\n <GraphNodeTitle\n name={name}\n color={titleColor}\n resourceType={resourceType}\n />\n\n {isHovered ? (\n <>\n {changeStatus === \"modified\" && (\n <Tooltip\n content=\"Show Impact Radius\"\n positioning={{ placement: \"top\" }}\n openDelay={500}\n >\n <Center>\n <Icon\n boxSize=\"14px\"\n as={FaRegDotCircle}\n color=\"gray\"\n cursor={\"pointer\"}\n _hover={{ color: \"black\" }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n\n void showColumnLevelLineage({\n node_id: id,\n change_analysis: true,\n no_upstream: true,\n });\n }}\n />\n </Center>\n </Tooltip>\n )}\n <Icon\n as={VscKebabVertical}\n color=\"gray\"\n cursor={\"pointer\"}\n _hover={{ color: \"black\" }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n showContextMenu(\n e,\n nodeProps as unknown as LineageGraphNode,\n );\n }}\n />\n </>\n ) : (\n <>\n <Icon\n boxSize=\"16px\"\n color={iconResourceColor}\n as={resourceIcon}\n />\n {changeStatus && (\n <Icon color={iconChangeStatusColor} as={iconChangeStatus} />\n )}\n </>\n )}\n </Flex>\n\n <Flex\n flex=\"1 0 auto\"\n mx=\"1\"\n direction=\"column\"\n paddingBottom=\"1\"\n visibility={showContent ? \"inherit\" : \"hidden\"}\n >\n <HStack gap={\"8px\"}>\n {action ? (\n <>\n <Spacer />\n <ActionTag\n node={data as unknown as LineageGraphNode}\n action={action}\n />\n </>\n ) : isShowingChangeAnalysis ? (\n <Box\n height=\"20px\"\n color=\"gray\"\n fontSize=\"9pt\"\n margin={0}\n fontWeight={600}\n >\n {changeCategory ? CHANGE_CATEGORY_MSGS[changeCategory] : \"\"}\n </Box>\n ) : selectMode !== \"action_result\" &&\n data.resourceType === \"model\" ? (\n <NodeRunsAggregated\n id={data.id}\n inverted={(function () {\n if (selectMode === \"selecting\") {\n return isSelected;\n } else {\n return false;\n }\n })()}\n />\n ) : (\n <></>\n )}\n </HStack>\n </Flex>\n </Flex>\n </Flex>\n {showColumns && (\n <Box\n p=\"10px 10px\"\n borderColor={borderColor}\n borderWidth={borderWidth}\n borderTopWidth={0}\n borderBottomRadius={8}\n >\n <Box\n height={`${columnSet.size * COLUMN_HEIGHT}px`}\n overflow=\"auto\"\n ></Box>\n </Box>\n )}\n {Object.keys(data.parents).length > 0 && (\n <Handle type=\"target\" position={Position.Left} isConnectable={false} />\n )}\n {Object.keys(data.children).length > 0 && (\n <Handle type=\"source\" position={Position.Right} isConnectable={false} />\n )}\n </Flex>\n );\n}\n","import { mergeKeys } from \"./mergeKeys\";\n\nexport function formatSelectColumns(\n baseColumns: string[],\n currentColumns: string[],\n): string[] {\n const mergedColumns = mergeKeys(baseColumns, currentColumns);\n\n // both side have no schema\n if (mergedColumns.length === 0) {\n return [];\n }\n\n // if either side has schema (added and removed model, no catalog.json)\n if (baseColumns.length === 0 || currentColumns.length === 0) {\n return mergedColumns.map((col, idx) => {\n const last = idx === mergedColumns.length - 1;\n if (last) {\n return col;\n }\n return col + \",\";\n });\n }\n\n let lastActualColumn = \"\";\n mergedColumns.forEach((col) => {\n if (baseColumns.includes(col) && currentColumns.includes(col)) {\n lastActualColumn = col;\n }\n });\n\n const selectColumns = mergedColumns.map((col, idx) => {\n let formatCol;\n\n if (!baseColumns.includes(col)) {\n formatCol = `--- ${col} (Added)`;\n } else if (!currentColumns.includes(col)) {\n formatCol = `--- ${col} (Removed)`;\n } else {\n formatCol = col;\n }\n\n if (col === lastActualColumn || idx === mergedColumns.length - 1) {\n return formatCol;\n }\n return formatCol + \",\";\n });\n\n return selectColumns;\n}\n","import React, { createContext, useContext } from \"react\";\n\nexport interface QueryContext {\n sqlQuery: string;\n setSqlQuery: (sqlQuery: string) => void;\n primaryKeys: string[] | undefined;\n setPrimaryKeys: (primaryKeys: string[] | undefined) => void;\n isCustomQueries: boolean;\n setCustomQueries: (isCustomQueries: boolean) => void;\n baseSqlQuery?: string;\n setBaseSqlQuery?: (baseSqlQuery: string) => void;\n}\n\nexport const defaultSqlQuery = 'select * from {{ ref(\"mymodel\") }}';\n\nconst defaultQueryContext: QueryContext = {\n sqlQuery: defaultSqlQuery,\n setSqlQuery: () => {\n return void 0;\n },\n primaryKeys: undefined,\n setPrimaryKeys: () => {\n return void 0;\n },\n isCustomQueries: false,\n setCustomQueries: () => {\n return void 0;\n },\n baseSqlQuery: defaultSqlQuery,\n setBaseSqlQuery: () => {\n return void 0;\n },\n};\n\nconst RecceQueryContext = createContext(defaultQueryContext);\n\ninterface QueryContextProps {\n children: React.ReactNode;\n}\n\nexport function RecceQueryContextProvider({ children }: QueryContextProps) {\n const [sqlQuery, setSqlQuery] = React.useState<string>(defaultSqlQuery);\n const [baseSqlQuery, setBaseSqlQuery] =\n React.useState<string>(defaultSqlQuery);\n const [isCustomQueries, setCustomQueries] = React.useState<boolean>(false);\n const [primaryKeys, setPrimaryKeys] = React.useState<string[] | undefined>();\n return (\n <RecceQueryContext.Provider\n value={{\n setSqlQuery,\n sqlQuery,\n setPrimaryKeys,\n primaryKeys,\n isCustomQueries,\n setCustomQueries,\n baseSqlQuery,\n setBaseSqlQuery,\n }}\n >\n {children}\n </RecceQueryContext.Provider>\n );\n}\n\nexport const useRecceQueryContext = () => useContext(RecceQueryContext);\n\nexport interface RowCountStateContext {\n isNodesFetching: string[];\n setIsNodesFetching: (nodes: string[]) => void;\n}\n\nconst defaultRowCountStateContext: RowCountStateContext = {\n isNodesFetching: [],\n setIsNodesFetching: () => {\n return void 0;\n },\n};\n\nconst RowCountStateContext = createContext(defaultRowCountStateContext);\n\ninterface RowCountStateContextProps {\n children: React.ReactNode;\n}\n\nexport function RowCountStateContextProvider({\n children,\n}: RowCountStateContextProps) {\n const [isNodesFetching, setIsNodesFetching] = React.useState<string[]>([]);\n return (\n <RowCountStateContext.Provider\n value={{ isNodesFetching, setIsNodesFetching }}\n >\n {children}\n </RowCountStateContext.Provider>\n );\n}\n\nexport const useRowCountStateContext = () => useContext(RowCountStateContext);\n","import { Icon, Menu, Portal, useDisclosure } from \"@chakra-ui/react\";\nimport { ReactNode, useState } from \"react\";\nimport { BiArrowFromBottom, BiArrowToBottom } from \"react-icons/bi\";\nimport { FaRegDotCircle } from \"react-icons/fa\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport { SubmitRunTrackProps } from \"@/lib/api/runs\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n LINEAGE_SELECTION_ACTION,\n trackExploreAction,\n trackLineageSelection,\n} from \"@/lib/api/track\";\nimport { formatSelectColumns } from \"@/lib/formatSelect\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceQueryContext } from \"@/lib/hooks/RecceQueryContext\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport { supportsHistogramDiff } from \"../histogram/HistogramDiffForm\";\nimport { findByRunType } from \"../run/registry\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\nimport {\n isLineageGraphColumnNode,\n isLineageGraphNode,\n LineageGraphColumnNode,\n LineageGraphNode,\n LineageGraphNodes,\n} from \"./lineage\";\n\ninterface LineageViewContextMenuProps<T> {\n x: number;\n y: number;\n node?: T;\n isOpen: boolean;\n onClose: () => void;\n}\n\ninterface ContextMenuItem {\n label?: string;\n itemIcon?: ReactNode;\n action?: () => void;\n isDisabled?: boolean;\n isSeparator?: boolean;\n}\n\ninterface ContextMenuProps {\n menuItems: ContextMenuItem[];\n open: boolean;\n onClose: () => void;\n x: number;\n y: number;\n}\n\nconst ContextMenu = ({ menuItems, open, onClose, x, y }: ContextMenuProps) => {\n const { featureToggles } = useRecceInstanceContext();\n\n return (\n <Menu.Root open={open} onOpenChange={onClose}>\n <Portal>\n <Menu.Positioner>\n <Menu.Content\n fontSize=\"0.85rem\"\n position=\"absolute\"\n width=\"250px\"\n style={{\n left: `${x}px`,\n top: `${y}px`,\n }}\n >\n {menuItems.length === 0 ? (\n <Menu.Item value=\"no-action\" disabled key=\"no action\">\n No action available\n </Menu.Item>\n ) : (\n menuItems.map(\n ({ isSeparator, label, isDisabled, action, itemIcon }) => {\n if (isSeparator) {\n return <Menu.Separator key={label} />;\n } else {\n const menuItem = (\n <Menu.Item\n value={String(label)}\n key={label}\n disabled={isDisabled}\n onClick={() => {\n if (action) {\n action();\n }\n onClose();\n }}\n >\n {itemIcon} {label}\n </Menu.Item>\n );\n\n // Wrap disabled items with SetupConnectionPopover\n if (isDisabled) {\n return (\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n key={label}\n >\n {menuItem}\n </SetupConnectionPopover>\n );\n }\n\n return menuItem;\n }\n },\n )\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\nexport const ModelNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphNode>) => {\n const menuItems: ContextMenuItem[] = [];\n\n const {\n selectParentNodes,\n selectChildNodes,\n getNodeColumnSet,\n selectMode,\n cll,\n showColumnLevelLineage,\n } = useLineageViewContextSafe();\n const { runAction } = useRecceActionContext();\n const { featureToggles } = useRecceInstanceContext();\n const { isActionAvailable } = useLineageGraphContext();\n const { data: flag } = useRecceServerFlag();\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n const singleEnv = flag?.single_env_onboarding ?? false;\n const isQueryDisabled = featureToggles.disableDatabaseQuery;\n\n // query\n const { primaryKey } = useModelColumns(node?.data?.name);\n const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext();\n const [, setLocation] = useAppLocation();\n\n if (!node?.data) {\n return <></>;\n }\n\n const modelNode = node.data;\n const resourceType = modelNode.resourceType;\n const columns = Array.from(getNodeColumnSet(node.id));\n const trackProps: SubmitRunTrackProps = {\n source: \"lineage_model_node\",\n };\n const changeStatus = modelNode.changeStatus;\n\n if (changeStatus === \"modified\") {\n menuItems.push({\n label: \"Show Impact Radius\",\n itemIcon: <FaRegDotCircle />,\n isDisabled: noCatalogCurrent,\n action: () => {\n void showColumnLevelLineage({\n node_id: node.id,\n change_analysis: true,\n no_upstream: true,\n });\n },\n });\n }\n\n if (\n !selectMode &&\n resourceType &&\n [\"model\", \"seed\", \"snapshot\"].includes(resourceType)\n ) {\n if (menuItems.length > 0) {\n menuItems.push({\n label: \"select group one\",\n isSeparator: true,\n });\n }\n\n // query\n const run = findByRunType(singleEnv ? \"query\" : \"query_diff\");\n const baseColumns = Object.keys(modelNode.data.base?.columns ?? {});\n const currentColumns = Object.keys(modelNode.data.current?.columns ?? {});\n const formattedColumns = formatSelectColumns(baseColumns, currentColumns);\n let query = `select * from {{ ref(\"${modelNode.name}\") }}`;\n if (formattedColumns.length) {\n query = `select \\n ${formattedColumns.join(\"\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n }\n\n menuItems.push({\n label: \"Query\",\n itemIcon: <Icon as={run.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n setSqlQuery(query);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n // Only set primary key if the action is available\n setPrimaryKeys(primaryKey !== undefined ? [primaryKey] : undefined);\n }\n setLocation(\"/query\");\n },\n });\n\n if (columns.length > 0) {\n if (cll !== undefined) {\n const allColumns = new Set<string>();\n if (primaryKey) {\n allColumns.add(primaryKey);\n }\n columns.forEach((column) => {\n allColumns.add(column);\n });\n\n menuItems.push({\n label: \"Query Related Columns\",\n itemIcon: <Icon as={run.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n const query = `select \\n ${Array.from(allColumns).join(\",\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n setSqlQuery(query);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n // Only set primary key if the action is available\n setPrimaryKeys(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n setLocation(\"/query\");\n },\n });\n } else {\n // modified columns\n const changedColumns = Object.entries(modelNode.change?.columns ?? {})\n .filter(([, value]) => value === \"modified\")\n .map(([key]) => key);\n if (changedColumns.length > 0) {\n const allColumns = new Set<string>();\n if (primaryKey) {\n allColumns.add(primaryKey);\n }\n changedColumns.forEach((column) => {\n allColumns.add(column);\n });\n\n menuItems.push({\n label: \"Query Modified Columns\",\n itemIcon: <Icon as={run.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n const query = `select \\n ${Array.from(allColumns).join(\",\\n \")}\\nfrom {{ ref(\"${modelNode.name}\") }}`;\n setSqlQuery(query);\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n // Only set primary key if the action is available\n setPrimaryKeys(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n setLocation(\"/query\");\n },\n });\n }\n }\n }\n\n // row count & row count diff\n const rowCountAndRowCountRun = findByRunType(\n singleEnv ? \"row_count\" : \"row_count_diff\",\n );\n menuItems.push({\n label: rowCountAndRowCountRun.title,\n itemIcon: <Icon as={rowCountAndRowCountRun.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n trackExploreAction({\n action: singleEnv\n ? EXPLORE_ACTION.ROW_COUNT\n : EXPLORE_ACTION.ROW_COUNT_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n singleEnv ? \"row_count\" : \"row_count_diff\",\n { node_names: [modelNode.name] },\n { showForm: false, trackProps },\n );\n },\n });\n\n // profile & profile diff\n const profileAndProfileDiffRun = findByRunType(\n singleEnv ? \"profile\" : \"profile_diff\",\n );\n menuItems.push({\n label: profileAndProfileDiffRun.title,\n itemIcon: <Icon as={profileAndProfileDiffRun.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n const columns = Array.from(getNodeColumnSet(node.id));\n trackExploreAction({\n action: singleEnv\n ? EXPLORE_ACTION.PROFILE\n : EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n singleEnv ? \"profile\" : \"profile_diff\",\n { model: modelNode.name, columns },\n { showForm: true, trackProps },\n );\n },\n });\n\n // value diff\n if (!singleEnv) {\n const valueDiffRun = findByRunType(\"value_diff\");\n menuItems.push({\n label: valueDiffRun.title,\n itemIcon: <Icon as={valueDiffRun.icon} />,\n isDisabled: isQueryDisabled,\n action: () => {\n const columns = Array.from(getNodeColumnSet(node.id));\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n \"value_diff\",\n { model: modelNode.name, columns },\n { showForm: true, trackProps },\n );\n },\n });\n }\n }\n\n if (!singleEnv) {\n if (menuItems.length > 0) {\n menuItems.push({\n label: \"select group two\",\n isSeparator: true,\n });\n }\n menuItems.push({\n label: \"Select Parent Nodes\",\n itemIcon: <BiArrowFromBottom />,\n action: () => {\n trackLineageSelection({\n action: LINEAGE_SELECTION_ACTION.SELECT_PARENT_NODES,\n });\n selectParentNodes(node.id, 1);\n },\n });\n menuItems.push({\n label: \"Select Child Nodes\",\n itemIcon: <BiArrowToBottom />,\n action: () => {\n trackLineageSelection({\n action: LINEAGE_SELECTION_ACTION.SELECT_CHILD_NODES,\n });\n selectChildNodes(node.id, 1);\n },\n });\n menuItems.push({\n label: \"Select All Upstream Nodes\",\n itemIcon: <BiArrowFromBottom />,\n action: () => {\n trackLineageSelection({\n action: LINEAGE_SELECTION_ACTION.SELECT_ALL_UPSTREAM,\n });\n selectParentNodes(node.id);\n },\n });\n menuItems.push({\n label: \"Select All Downstream Nodes\",\n itemIcon: <BiArrowToBottom />,\n action: () => {\n trackLineageSelection({\n action: LINEAGE_SELECTION_ACTION.SELECT_ALL_DOWNSTREAM,\n });\n selectChildNodes(node.id);\n },\n });\n }\n\n return (\n <ContextMenu\n x={x}\n y={y}\n menuItems={menuItems}\n open={isOpen}\n onClose={onClose}\n />\n );\n};\n\nexport const ColumnNodeContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphColumnNode>) => {\n const menuItems: ContextMenuItem[] = [];\n\n const { runAction } = useRecceActionContext();\n const { isActionAvailable } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n const { data: flag } = useRecceServerFlag();\n const singleEnv = flag?.single_env_onboarding ?? false;\n const isQueryDisabled = featureToggles.disableDatabaseQuery;\n\n if (node?.data === undefined) {\n return <></>;\n }\n\n const columnNode = node.data;\n const modelNode = columnNode.node;\n const column = columnNode.column;\n const columnType = columnNode.type;\n const trackProps: SubmitRunTrackProps = {\n source: \"lineage_column_node\",\n };\n\n const handleProfileDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n \"profile_diff\",\n { model: modelNode.name, columns: [column] },\n { showForm: false, trackProps },\n );\n };\n\n const handleHistogramDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.HISTOGRAM_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n \"histogram_diff\",\n { model: modelNode.name, column_name: column, column_type: columnType },\n { showForm: false, trackProps },\n );\n };\n\n const handleTopkDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.TOP_K_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n \"top_k_diff\",\n { model: modelNode.name, column_name: column, k: 50 },\n { showForm: false, trackProps },\n );\n };\n\n const handleValueDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_CONTEXT_MENU,\n node_count: 1,\n });\n runAction(\n \"value_diff\",\n { model: modelNode.name, columns: [column] },\n { showForm: true, trackProps },\n );\n };\n\n const addedOrRemoved =\n modelNode.data.base?.columns?.[column] === undefined ||\n modelNode.data.current?.columns?.[column] === undefined;\n\n const run = findByRunType(singleEnv ? \"profile\" : \"profile_diff\");\n menuItems.push({\n label: run.title,\n itemIcon: <Icon as={run.icon} />,\n action: handleProfileDiff,\n isDisabled:\n addedOrRemoved || !isActionAvailable(\"profile_diff\") || isQueryDisabled,\n });\n\n if (!singleEnv) {\n const isHistogramDiffRun = findByRunType(\"histogram_diff\");\n menuItems.push({\n label: isHistogramDiffRun.title,\n itemIcon: <Icon as={isHistogramDiffRun.icon} />,\n action: handleHistogramDiff,\n isDisabled:\n addedOrRemoved ||\n (columnType ? !supportsHistogramDiff(columnType) : true) ||\n isQueryDisabled,\n });\n const isTopKDiffRun = findByRunType(\"top_k_diff\");\n menuItems.push({\n label: isTopKDiffRun.title,\n itemIcon: <Icon as={isTopKDiffRun.icon} />,\n action: handleTopkDiff,\n isDisabled: addedOrRemoved || isQueryDisabled,\n });\n\n const isValueDiffRun = findByRunType(\"value_diff\");\n menuItems.push({\n label: isValueDiffRun.title,\n itemIcon: <Icon as={isValueDiffRun.icon} />,\n action: handleValueDiff,\n isDisabled: addedOrRemoved || isQueryDisabled,\n });\n }\n\n return (\n <ContextMenu\n x={x}\n y={y}\n menuItems={menuItems}\n open={isOpen}\n onClose={onClose}\n />\n );\n};\n\nexport const LineageViewContextMenu = ({\n isOpen,\n onClose,\n x,\n y,\n node,\n}: LineageViewContextMenuProps<LineageGraphNodes>) => {\n const { featureToggles } = useRecceInstanceContext();\n if (featureToggles.disableViewActionDropdown) {\n return (\n <ContextMenu menuItems={[]} open={isOpen} onClose={onClose} x={x} y={y} />\n );\n } else if (node && isLineageGraphNode(node)) {\n return (\n <ModelNodeContextMenu\n x={x}\n y={y}\n isOpen={isOpen}\n onClose={onClose}\n node={node}\n />\n );\n } else if (node && isLineageGraphColumnNode(node)) {\n return (\n <ColumnNodeContextMenu\n x={x}\n y={y}\n isOpen={isOpen}\n onClose={onClose}\n node={node}\n />\n );\n }\n};\n\nexport const useLineageViewContextMenu = () => {\n const { open, onClose, onOpen } = useDisclosure();\n const [position, setPosition] = useState<{ x: number; y: number }>({\n x: 0,\n y: 0,\n });\n const [node, setNode] = useState<LineageGraphNodes>();\n\n const showContextMenu = (x: number, y: number, node: LineageGraphNodes) => {\n setPosition({ x, y });\n setNode(node);\n onOpen();\n };\n\n const closeContextMenu = () => {\n setPosition({ x: 0, y: 0 });\n setNode(undefined);\n onClose();\n };\n\n const props: LineageViewContextMenuProps<LineageGraphNodes> = {\n x: position.x,\n y: position.y,\n node,\n isOpen: open,\n onClose,\n };\n\n return {\n props,\n showContextMenu,\n closeContextMenu,\n };\n};\n","const prefix = \"recce\";\n\nexport const sessionStorageKeys = {\n recommendationIgnored: `${prefix}-recommendation-ignored`,\n recommendationShowed: `${prefix}-recommendation-showed`,\n prevRefreshTimeStamp: `${prefix}-prev-refresh-timestamp`,\n lineageNotificationDismissed: `${prefix}-lineage-notification-dismissed`,\n};\n","import { CloseButton, Flex, Spacer } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { sessionStorageKeys } from \"@/lib/api/sessionStorageKeys\";\n\ninterface NotificationProps {\n notification?: React.ReactNode;\n type: \"info\" | \"success\" | \"warning\" | \"error\";\n}\n\nexport function LineageViewNotification({\n notification,\n type,\n}: NotificationProps) {\n const notificationKey = sessionStorageKeys.lineageNotificationDismissed;\n\n // Initialize state from sessionStorage (lazy initialization)\n const [visible, setVisible] = useState(() => {\n const dismissed = sessionStorage.getItem(notificationKey);\n return dismissed !== \"true\";\n });\n\n if (notification === null || !visible) {\n return null;\n }\n\n const bgColor = {\n info: \"blue.50\",\n success: \"green.50\",\n warning: \"yellow.50\",\n error: \"red.50\",\n }[type];\n\n return (\n <Flex\n w=\"100%\"\n direction=\"row\"\n p=\"5px 10px\"\n gap=\"5px\"\n alignItems=\"flex-start\"\n borderRadius=\"md\"\n boxShadow=\"md\"\n border=\"1px solid\"\n borderColor=\"gray.200\"\n bg={bgColor}\n >\n {notification}\n <Spacer />\n <CloseButton\n onClick={() => {\n sessionStorage.setItem(notificationKey, \"true\");\n setVisible(false);\n }}\n />\n </Flex>\n );\n}\n","\"use client\";\n\nimport { Box, Button } from \"@chakra-ui/react\";\nimport React, { ReactNode } from \"react\";\nimport { VscHistory } from \"react-icons/vsc\";\nimport { trackHistoryAction } from \"@/lib/api/track\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\n\nexport default function HistoryToggle(): ReactNode {\n const { isHistoryOpen, showHistory } = useRecceActionContext();\n\n if (isHistoryOpen) {\n return;\n }\n\n return (\n <Box>\n <Box fontSize=\"8pt\">History</Box>\n\n <Button\n size=\"2xs\"\n variant=\"outline\"\n onClick={() => {\n trackHistoryAction({ name: isHistoryOpen ? \"hide\" : \"show\" });\n showHistory();\n }}\n >\n <VscHistory /> Show\n </Button>\n </Box>\n );\n}\n","import {\n Box,\n Button,\n ButtonGroup,\n Checkbox,\n Code,\n HStack,\n Icon,\n Input,\n Menu,\n Portal,\n Spacer,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport { CSSProperties, useEffect, useRef, useState } from \"react\";\nimport { FiPackage } from \"react-icons/fi\";\nimport { PiCaretDown } from \"react-icons/pi\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport HistoryToggle from \"@/components/shared/HistoryToggle\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport { findByRunType } from \"../run/registry\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\nimport { getIconForResourceType } from \"./styles\";\n\nconst SelectFilterTooltip = () => {\n return (\n <VStack align={\"start\"} gap={0}>\n <Text fontSize=\"10pt\" color={\"gray.500\"} pb={1}>\n Select nodes by dbt node selector syntax\n </Text>\n <Text fontSize=\"8pt\">\n <Code fontSize={\"8pt\"}>model_name</Code> Select a node\n </Text>\n <Text fontSize=\"8pt\">\n <Code fontSize={\"8pt\"}>model_name+</Code> Select downstream nodes\n </Text>\n <Text fontSize=\"8pt\">\n <Code fontSize={\"8pt\"}>+model_name</Code> Select upstream nodes\n </Text>\n <Text fontSize=\"8pt\">\n <Code fontSize={\"8pt\"}>model*</Code> Select by wildcard\n </Text>\n </VStack>\n );\n};\n\nconst ViewModeSelectMenu = ({ isDisabled }: { isDisabled: boolean }) => {\n const { viewOptions, onViewOptionsChanged } = useLineageViewContextSafe();\n const viewMode = viewOptions.view_mode ?? \"changed_models\";\n const label = viewMode === \"changed_models\" ? \"Changed Models\" : \"All\";\n\n const handleSelect = (viewMode: LineageDiffViewOptions[\"view_mode\"]) => {\n onViewOptionsChanged({\n ...viewOptions,\n view_mode: viewMode,\n });\n };\n\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button\n minWidth=\"100px\"\n size=\"2xs\"\n variant=\"outline\"\n disabled={isDisabled}\n >\n <Icon as={getIconForResourceType(\"model\").icon} /> {label}{\" \"}\n <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.RadioItemGroup\n value={viewMode}\n onValueChange={(e) => {\n handleSelect(e.value as typeof viewMode);\n }}\n >\n <Menu.ItemGroupLabel>mode</Menu.ItemGroupLabel>\n <Menu.RadioItem value=\"changed_models\">\n Changed Models\n <Menu.ItemIndicator />\n </Menu.RadioItem>\n <Menu.RadioItem value=\"all\">\n All\n <Menu.ItemIndicator />\n </Menu.RadioItem>\n </Menu.RadioItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\nconst PackageSelectMenu = ({ isDisabled }: { isDisabled: boolean }) => {\n const { lineageGraph } = useLineageGraphContext();\n const { viewOptions, onViewOptionsChanged } = useLineageViewContextSafe();\n\n // get unique package names\n const available = new Set<string>();\n const nodes = Object.values(lineageGraph?.nodes ?? {});\n for (const node of nodes) {\n if (node.data.packageName) {\n available.add(node.data.packageName);\n }\n }\n\n const projectName = lineageGraph?.manifestMetadata.current?.project_name;\n\n const selected = viewOptions.packages\n ? new Set(viewOptions.packages)\n : projectName\n ? new Set([projectName])\n : available;\n const isSelectAll = selected.size === available.size;\n const isSelectNone = selected.size === 0;\n const label =\n selected.size === 1\n ? Array.from(selected)[0]\n : isSelectAll\n ? \"All Packages\"\n : isSelectNone\n ? \"No Package\"\n : `${selected.size} Packages`;\n\n const handleSelectAll = () => {\n if (isSelectAll) {\n onViewOptionsChanged({\n ...viewOptions,\n packages: [],\n });\n } else {\n onViewOptionsChanged({\n ...viewOptions,\n packages: Array.from(available),\n });\n }\n };\n\n const handleSelect = (pkg: string) => {\n const newSelected = new Set(selected);\n if (newSelected.has(pkg)) {\n newSelected.delete(pkg);\n } else {\n newSelected.add(pkg);\n }\n onViewOptionsChanged({\n ...viewOptions,\n packages: Array.from(newSelected),\n });\n };\n\n return (\n <Menu.Root closeOnSelect={false}>\n <Menu.Trigger asChild>\n <Button\n minWidth=\"100px\"\n size=\"2xs\"\n variant=\"outline\"\n disabled={isDisabled}\n >\n <Icon as={FiPackage} /> {label} <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.ItemGroup>\n <Menu.ItemGroupLabel>Select Packages</Menu.ItemGroupLabel>\n <Menu.Item value=\"\" asChild>\n <Checkbox.Root\n checked={\n !isSelectAll && !isSelectNone\n ? \"indeterminate\"\n : isSelectAll\n }\n onCheckedChange={handleSelectAll}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>Select All</Checkbox.Label>\n </Checkbox.Root>\n </Menu.Item>\n\n <Menu.Separator />\n\n {Array.from(available).map((pkg) => {\n const thePkg = pkg;\n return (\n <Menu.Item key={pkg} value={pkg}>\n <Checkbox.Root\n checked={selected.has(pkg)}\n onCheckedChange={() => {\n handleSelect(thePkg);\n }}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label className=\"no-track-pii-safe\">\n {pkg}\n </Checkbox.Label>\n </Checkbox.Root>\n </Menu.Item>\n );\n })}\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n};\n\nconst NodeSelectionInput = (props: {\n value: string;\n onChange: (value: string) => void;\n isDisabled?: boolean;\n tooltipComponent?: React.ReactNode;\n}) => {\n const [inputValue, setInputValue] = useState(props.value);\n const { data: flags } = useRecceServerFlag();\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current) {\n inputRef.current.value = props.value;\n }\n }, [props.value]);\n\n return (\n <Tooltip\n // Custom tooltip style\n contentProps={{\n width: \"300px\",\n padding: 2,\n shadow: \"md\",\n borderWidth: 1,\n rounded: \"md\",\n color: \"black\",\n backgroundColor: \"white\",\n }}\n content={props.tooltipComponent}\n positioning={{ placement: \"bottom-start\" }}\n closeOnClick={false}\n disabled={!flags?.single_env_onboarding}\n >\n <Input\n ref={inputRef}\n height=\"24px\"\n fontSize=\"10pt\"\n placeholder=\"with selectors\"\n disabled={props.isDisabled}\n value={inputValue}\n onChange={(event) => {\n setInputValue(event.target.value);\n }}\n onKeyUp={(event) => {\n if (event.key === \"Enter\") {\n props.onChange(inputValue);\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n setInputValue(props.value);\n if (inputRef.current) {\n inputRef.current.blur();\n }\n }\n }}\n onBlur={() => {\n setInputValue(props.value);\n }}\n />\n </Tooltip>\n );\n};\n\nconst SelectFilter = ({ isDisabled }: { isDisabled: boolean }) => {\n const { viewOptions, onViewOptionsChanged } = useLineageViewContextSafe();\n\n return (\n <NodeSelectionInput\n isDisabled={isDisabled}\n value={viewOptions.select ?? \"\"}\n onChange={(value) => {\n onViewOptionsChanged({\n ...viewOptions,\n select: value ? value : undefined,\n });\n }}\n tooltipComponent={<SelectFilterTooltip />}\n />\n );\n};\n\nconst ExcludeFilter = ({ isDisabled }: { isDisabled: boolean }) => {\n const { viewOptions, onViewOptionsChanged } = useLineageViewContextSafe();\n\n return (\n <NodeSelectionInput\n isDisabled={isDisabled}\n value={viewOptions.exclude ?? \"\"}\n onChange={(value) => {\n onViewOptionsChanged({\n ...viewOptions,\n exclude: value ? value : undefined,\n });\n }}\n />\n );\n};\n\nconst ControlItem = (props: {\n label?: string;\n children: React.ReactNode;\n style?: CSSProperties;\n}) => {\n return (\n <Box style={props.style} maxWidth=\"300px\">\n <Box fontSize=\"8pt\">{(props.label ?? \"\").trim() || <>&nbsp;</>}</Box>\n {props.children}\n </Box>\n );\n};\n\nexport const LineageViewTopBar = () => {\n const { deselect, focusedNode, selectedNodes, ...lineageViewContext } =\n useLineageViewContextSafe();\n const { featureToggles } = useRecceInstanceContext();\n const { data: flags } = useRecceServerFlag();\n const isSingleEnvOnboarding = flags?.single_env_onboarding;\n\n const isSingleSelect = !!focusedNode;\n const isMultiSelect = selectedNodes.length > 0;\n const isNoSelect = !isSingleSelect && !isMultiSelect;\n const isFilterDisabled = isMultiSelect;\n\n return (\n <HStack width=\"100%\" padding=\"4pt 8pt\" className=\"chakra-style-reset\">\n <HStack flex=\"1\">\n <HistoryToggle />\n <ControlItem label=\"Mode\" style={{ flexShrink: \"1\" }}>\n <ViewModeSelectMenu isDisabled={isFilterDisabled} />\n </ControlItem>\n <ControlItem label=\"Package\" style={{ flexShrink: \"1\" }}>\n <PackageSelectMenu isDisabled={isFilterDisabled} />\n </ControlItem>\n <ControlItem label=\"Select\" style={{ flex: \"100 1 auto\" }}>\n <SelectFilter isDisabled={isFilterDisabled} />\n </ControlItem>\n <ControlItem label=\"Exclude\" style={{ flex: \"100 1 auto\" }}>\n <ExcludeFilter isDisabled={isFilterDisabled} />\n </ControlItem>\n <Spacer />\n {isMultiSelect && (\n <>\n <ControlItem label=\"\" style={{ flexShrink: \"0\" }}>\n <Text fontSize=\"9pt\" color=\"gray.500\">\n {selectedNodes.length > 1\n ? `${selectedNodes.length} nodes selected`\n : `${selectedNodes.length} node selected`}\n </Text>\n </ControlItem>\n\n <ControlItem label=\"\">\n <Button\n variant={\"outline\"}\n size=\"2xs\"\n fontSize=\"9pt\"\n onClick={() => {\n deselect();\n }}\n >\n Deselect\n </Button>\n </ControlItem>\n {isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <ButtonGroup attached variant=\"outline\">\n <Menu.Root positioning={{ placement: \"bottom-end\" }}>\n <Menu.Trigger asChild>\n <Button size=\"2xs\">\n Actions <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.Item\n value=\"row-count\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runRowCount();\n }}\n >\n <Text textStyle=\"sm\">\n <Icon as={findByRunType(\"row_count_diff\").icon} />{\" \"}\n Row Count\n </Text>\n </Menu.Item>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </ButtonGroup>\n </ControlItem>\n )}\n </>\n )}\n {!isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <ButtonGroup attached variant=\"outline\">\n <Menu.Root positioning={{ placement: \"bottom-end\" }}>\n <Menu.Trigger asChild>\n <Button\n size=\"2xs\"\n disabled={featureToggles.disableViewActionDropdown}\n >\n Actions <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.ItemGroup m=\"0\" p=\"4px 12px\">\n <Menu.ItemGroupLabel>Diff</Menu.ItemGroupLabel>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Menu.Item\n value=\"row-count-diff\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runRowCountDiff();\n }}\n >\n <Text textStyle=\"sm\">\n <Icon as={findByRunType(\"row_count_diff\").icon} />{\" \"}\n Row Count Diff\n </Text>\n </Menu.Item>\n </SetupConnectionPopover>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Menu.Item\n value=\"value-diff\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runValueDiff();\n }}\n >\n <Text textStyle=\"sm\">\n <Icon as={findByRunType(\"value_diff\").icon} />{\" \"}\n Value Diff\n </Text>\n </Menu.Item>\n </SetupConnectionPopover>\n </Menu.ItemGroup>\n\n <Menu.Separator />\n\n <Menu.ItemGroup m=\"0\" px=\"12px\">\n <Menu.ItemGroupLabel>\n Add to Checklist\n </Menu.ItemGroupLabel>\n <Menu.Item\n value=\"lineage-diff\"\n disabled={\n !(\n isNoSelect ||\n (isMultiSelect && selectedNodes.length > 1)\n )\n }\n onClick={() => {\n lineageViewContext.addLineageDiffCheck(\n lineageViewContext.viewOptions.view_mode,\n );\n }}\n >\n <Text textStyle=\"sm\">\n <Icon as={findByRunType(\"lineage_diff\").icon} />{\" \"}\n Lineage Diff\n </Text>\n </Menu.Item>\n <Menu.Item\n value=\"schema-diff\"\n disabled={false}\n onClick={() => {\n lineageViewContext.addSchemaDiffCheck();\n }}\n >\n <Text textStyle=\"sm\">\n <Icon as={findByRunType(\"schema_diff\").icon} />{\" \"}\n Schema Diff\n </Text>\n </Menu.Item>\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </ButtonGroup>\n </ControlItem>\n )}\n </HStack>\n </HStack>\n );\n};\n","export const DisableTooltipMessages = {\n add_or_remove: \"Unavailable for added or removed resources.\",\n} as const;\n","import { CloseButton, Flex, Icon, Link, Spacer } from \"@chakra-ui/react\";\nimport { SystemProps } from \"@chakra-ui/styled-system\";\nimport { PropsWithChildren } from \"react\";\nimport { FiInfo } from \"react-icons/fi\";\nimport { LuExternalLink } from \"react-icons/lu\";\n\nexport const RecceNotification = (\n props: PropsWithChildren<{\n onClose: () => void;\n align?: SystemProps[\"alignItems\"];\n }>,\n) => {\n return (\n <Flex\n flex=\"1\"\n minH={\"48px\"}\n m=\"4px\"\n px=\"16px\"\n py=\"12px\"\n bg=\"blue.50\"\n border=\"1px\"\n borderRadius=\"4px\"\n borderColor=\"blue.400\"\n align={props.align ?? \"center\"}\n gap=\"12px\"\n >\n <Icon as={FiInfo} width={\"20px\"} height={\"20px\"} color={\"blue.900\"} />\n {props.children}\n <Spacer />\n <CloseButton onClick={props.onClose} />\n </Flex>\n );\n};\n\nexport const LearnHowLink = () => {\n return (\n <Link\n href=\"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\"\n target=\"_blank\"\n color=\"rgba(49, 130, 206, 1)\"\n fontWeight={\"bold\"}\n textDecoration={\"underline\"}\n >\n Learn how <LuExternalLink />\n </Link>\n );\n};\n","import { forwardRef, Key, Ref, useMemo, useState } from \"react\";\nimport \"react-data-grid/lib/styles.css\";\nimport { Alert, Flex } from \"@chakra-ui/react\";\nimport { CellMouseArgs, DataGridHandle } from \"react-data-grid\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { trackColumnLevelLineage } from \"@/lib/api/track\";\nimport {\n createDataGridFromData,\n SchemaDiffRow,\n SchemaRow,\n} from \"@/lib/dataGrid\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport {\n EmptyRowsRenderer,\n ScreenshotDataGrid,\n} from \"../data-grid/ScreenshotDataGrid\";\nimport { useLineageViewContext } from \"../lineage/LineageViewContext\";\n\ninterface SchemaViewProps {\n base?: NodeData;\n current?: NodeData;\n enableScreenshot?: boolean;\n showMenu?: boolean;\n}\n\nfunction PrivateSingleEnvSchemaView(\n { current, showMenu = true }: { current?: NodeData; showMenu?: boolean },\n ref: Ref<DataGridHandle>,\n) {\n const lineageViewContext = useLineageViewContext();\n const [cllRunningMap, setCllRunningMap] = useState<Map<string, boolean>>(\n new Map(),\n );\n const { columns, rows } = useMemo(() => {\n return createDataGridFromData(\n { type: \"schema_single\", columns: current?.columns },\n { node: current, cllRunningMap, showMenu },\n );\n }, [current, cllRunningMap, showMenu]);\n\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n let catalogMissingMessage = undefined;\n if (noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found. Run `recce debug` to troubleshoot.\";\n }\n\n const noSchemaCurrent = current && current.columns === undefined;\n let schemaMissingMessage = undefined;\n if (noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated. Update catalog.json to get schema information.\";\n }\n\n const handleViewCll = async (columnName: string) => {\n trackColumnLevelLineage({ action: \"view\", source: \"schema_column\" });\n setCllRunningMap((prev) => new Map(prev).set(columnName, true));\n const modelId = current?.id;\n if (modelId) {\n await lineageViewContext?.showColumnLevelLineage({\n node_id: modelId,\n column: columnName,\n });\n }\n setCllRunningMap((prev) => new Map(prev).set(columnName, false));\n };\n\n const rowKeyGetter = (row: SchemaDiffRow) => {\n const modelId = current?.id;\n return `${modelId}-${row.name}`;\n };\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRows: Set<Key> = cll\n ? new Set([`${cll.node_id}-${cll.column}`])\n : new Set();\n\n return (\n <Flex direction=\"column\">\n {catalogMissingMessage ? (\n <Alert.Root status=\"warning\" fontSize=\"12px\" p=\"8px\">\n <Alert.Indicator />\n <Alert.Description>{catalogMissingMessage}</Alert.Description>\n </Alert.Root>\n ) : schemaMissingMessage ? (\n <Alert.Root status=\"warning\" fontSize=\"12px\" p=\"8px\">\n <Alert.Indicator />\n <Alert.Description>{schemaMissingMessage}</Alert.Description>\n </Alert.Root>\n ) : (\n <></>\n )}\n\n {rows.length > 0 && (\n <ScreenshotDataGrid\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"10pt\",\n borderWidth: 1,\n }}\n columns={columns}\n rows={rows}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n className=\"rdg-light\"\n ref={ref}\n rowKeyGetter={rowKeyGetter}\n selectedRows={selectedRows}\n onSelectedRowsChange={() => {\n return void 0;\n }}\n onCellClick={async (args: CellMouseArgs<SchemaRow>) => {\n await handleViewCll(args.row.name);\n }}\n rowClass={() => {\n if (lineageViewContext !== undefined) {\n return \"row-normal row-selectable\";\n }\n return \"row-normal\";\n }}\n />\n )}\n </Flex>\n );\n}\n\nexport function PrivateSchemaView(\n { base, current, enableScreenshot = false, showMenu = true }: SchemaViewProps,\n ref: Ref<DataGridHandle>,\n) {\n const lineageViewContext = useLineageViewContext();\n const [cllRunningMap, setCllRunningMap] = useState<Map<string, boolean>>(\n new Map(),\n );\n const { columns, rows } = useMemo(() => {\n const resourceType = current?.resource_type ?? base?.resource_type;\n const node =\n resourceType &&\n [\"model\", \"seed\", \"snapshot\", \"source\"].includes(resourceType)\n ? (current ?? base)\n : undefined;\n\n return createDataGridFromData(\n { type: \"schema_diff\", base: base?.columns, current: current?.columns },\n { node, cllRunningMap, showMenu },\n );\n }, [base, current, cllRunningMap, showMenu]);\n\n const { lineageGraph } = useLineageGraphContext();\n const noCatalogBase = !lineageGraph?.catalogMetadata.base;\n const noCatalogCurrent = !lineageGraph?.catalogMetadata.current;\n let catalogMissingMessage = undefined;\n if (noCatalogBase && noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found on both environments. Run `recce debug` to troubleshoot.\";\n } else if (noCatalogBase) {\n catalogMissingMessage =\n \"catalog.json not found on base environment. Run `recce debug` to troubleshoot.\";\n } else if (noCatalogCurrent) {\n catalogMissingMessage =\n \"catalog.json not found on current environment. Run `recce debug` to troubleshoot.\";\n }\n\n const noSchemaBase = base && base.columns === undefined;\n const noSchemaCurrent = current && current.columns === undefined;\n let schemaMissingMessage = undefined;\n if (noSchemaBase && noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated on both environments. Update catalog.json to get schema information.\";\n } else if (noSchemaBase) {\n schemaMissingMessage =\n \"catalog.json is outdated on base environment. Update catalog.json to get schema information.\";\n } else if (noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated on current environment. Update catalog.json to get schema information.\";\n }\n\n const handleViewCll = async (columnName: string) => {\n trackColumnLevelLineage({ action: \"view\", source: \"schema_column\" });\n setCllRunningMap((prev) => new Map(prev).set(columnName, true));\n const modelId = current?.id ?? base?.id;\n if (modelId) {\n await lineageViewContext?.showColumnLevelLineage({\n node_id: modelId,\n column: columnName,\n });\n }\n setCllRunningMap((prev) => new Map(prev).set(columnName, false));\n };\n\n const rowKeyGetter = (row: SchemaDiffRow) => {\n const modelId = current?.id ?? base?.id;\n return `${modelId}-${row.name}`;\n };\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRows: Set<Key> = cll\n ? new Set([`${cll.node_id}-${cll.column}`])\n : new Set();\n\n return (\n <Flex direction=\"column\">\n {catalogMissingMessage ? (\n <Alert.Root status=\"warning\" fontSize=\"12px\" p=\"8px\">\n <Alert.Indicator />\n <Alert.Description>{catalogMissingMessage}</Alert.Description>\n </Alert.Root>\n ) : schemaMissingMessage ? (\n <Alert.Root status=\"warning\" fontSize=\"12px\" p=\"8px\">\n <Alert.Indicator />\n <Alert.Description>{schemaMissingMessage}</Alert.Description>\n </Alert.Root>\n ) : (\n <></>\n )}\n\n {rows.length > 0 && (\n <ScreenshotDataGrid\n style={{\n blockSize: \"auto\",\n maxHeight: \"100%\",\n overflow: \"auto\",\n fontSize: \"0.8rem\",\n borderWidth: 1,\n }}\n columns={columns}\n rows={rows}\n rowHeight={35}\n renderers={{ noRowsFallback: <EmptyRowsRenderer /> }}\n className=\"rdg-light no-track-pii-safe\"\n ref={ref}\n rowKeyGetter={rowKeyGetter}\n selectedRows={selectedRows}\n onSelectedRowsChange={() => {\n return void 0;\n }}\n onCellClick={async (args: CellMouseArgs<SchemaDiffRow>) => {\n if (\n args.row.baseIndex !== undefined &&\n args.row.currentIndex === undefined\n ) {\n return;\n }\n await handleViewCll(args.row.name);\n }}\n rowClass={(row: SchemaDiffRow) => {\n let className;\n if (row.baseIndex === undefined) {\n className = \"row-added\";\n } else if (row.currentIndex === undefined) {\n return \"row-removed\"; // removed column isn't selectable\n } else {\n className = \"row-normal\";\n }\n if (lineageViewContext !== undefined) {\n className += \" row-selectable\";\n }\n return className;\n }}\n />\n )}\n </Flex>\n );\n}\n\nexport const SchemaView = forwardRef(PrivateSchemaView);\nexport const SingleEnvSchemaView = forwardRef(PrivateSingleEnvSchemaView);\n","import {\n Button,\n CloseButton,\n Dialog,\n Flex,\n Heading,\n Icon,\n IconButton,\n Link,\n List,\n Portal,\n Separator,\n Table,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { format, formatDistance, parseISO } from \"date-fns\";\nimport { isEmpty } from \"lodash\";\nimport React, { useEffect, useRef } from \"react\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { LineageGraph } from \"@/components/lineage/lineage\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport {\n type EnvironmentConfigProps,\n trackEnvironmentConfig,\n} from \"@/lib/api/track\";\nimport type { EnvInfo as EnvInfoType } from \"@/lib/hooks/LineageGraphContext\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { IconInfo } from \"../icons\";\n\nexport function formatTimestamp(timestamp: string): string {\n const date = parseISO(timestamp);\n return format(date, \"yyyy-MM-dd'T'HH:mm:ss\");\n}\n\nexport function formatTimeToNow(timestamp: string): string {\n const date = parseISO(timestamp);\n return formatDistance(date, new Date(), {\n addSuffix: true,\n });\n}\n\nexport function extractSchemas(\n lineageGraph: LineageGraph | undefined,\n): [Set<string>, Set<string>] {\n const baseSchemas = new Set<string>();\n const currentSchemas = new Set<string>();\n\n if (lineageGraph?.nodes) {\n for (const value of Object.values(lineageGraph.nodes)) {\n if (value.data.data.base?.schema) {\n baseSchemas.add(value.data.data.base.schema);\n }\n if (value.data.data.current?.schema) {\n currentSchemas.add(value.data.data.current.schema);\n }\n }\n }\n return [baseSchemas, currentSchemas];\n}\n\nfunction buildEnvironmentTrackingData(\n envInfo: EnvInfoType | undefined,\n reviewMode: boolean | undefined,\n baseSchemas: Set<string>,\n currentSchemas: Set<string>,\n): EnvironmentConfigProps {\n const git = envInfo?.git;\n const pr = envInfo?.pullRequest;\n const dbtBase = envInfo?.dbt?.base;\n const dbtCurrent = envInfo?.dbt?.current;\n\n const trackingData: EnvironmentConfigProps = {\n review_mode: reviewMode || false,\n adapter_type: envInfo?.adapterType || null,\n has_git_info: !isEmpty(git),\n has_pr_info: !isEmpty(pr),\n };\n\n // DBT-specific tracking\n if (envInfo?.adapterType === \"dbt\") {\n trackingData.base = {\n schema_count: baseSchemas.size,\n dbt_version: dbtBase?.dbt_version || null,\n timestamp: dbtBase?.generated_at || null,\n };\n trackingData.current = {\n schema_count: currentSchemas.size,\n dbt_version: dbtCurrent?.dbt_version || null,\n timestamp: dbtCurrent?.generated_at || null,\n };\n trackingData.schemas_match =\n baseSchemas.size === currentSchemas.size &&\n Array.from(baseSchemas).every((s) => currentSchemas.has(s));\n }\n\n // SQLMesh-specific tracking\n if (envInfo?.adapterType === \"sqlmesh\") {\n trackingData.base = {\n has_env: !!envInfo.sqlmesh?.base_env,\n };\n trackingData.current = {\n has_env: !!envInfo.sqlmesh?.current_env,\n };\n }\n\n return trackingData;\n}\n\nfunction renderInfoEntries(info: object): React.JSX.Element[] {\n if (Object.values(info).every((value) => value === null)) {\n return [\n <Flex key={\"no info\"} ml=\"10px\">\n No information\n </Flex>,\n ];\n }\n\n return Object.entries(info)\n .filter(\n ([key, value]) => key !== \"url\" && value !== null && value !== undefined,\n )\n .map(([key, value]) => (\n <List.Item key={key} ml=\"10px\">\n {key}: {value}\n </List.Item>\n ));\n}\n\nexport function EnvInfo() {\n const { envInfo, reviewMode, lineageGraph } = useLineageGraphContext();\n const { open, onOpen, onClose } = useDisclosure();\n const git = envInfo?.git;\n const pr = envInfo?.pullRequest;\n const reviewInfo = { ...git, ...pr };\n\n const dbtBase = envInfo?.dbt?.base;\n const dbtCurrent = envInfo?.dbt?.current;\n\n const baseTime = dbtBase?.generated_at\n ? formatTimestamp(dbtBase.generated_at)\n : \"\";\n const currentTime = dbtCurrent?.generated_at\n ? formatTimestamp(dbtCurrent.generated_at)\n : \"\";\n let baseRelativeTime = \"\";\n let currentRelativeTime = \"\";\n if (dbtBase) {\n baseRelativeTime = dbtBase.generated_at\n ? formatTimeToNow(dbtBase.generated_at)\n : \"\";\n }\n if (dbtCurrent) {\n currentRelativeTime = dbtCurrent.generated_at\n ? formatTimeToNow(dbtCurrent.generated_at)\n : \"\";\n }\n const [baseSchemas, currentSchemas] = extractSchemas(lineageGraph);\n\n // Track environment configuration once at startup\n const hasTrackedRef = useRef(false);\n useEffect(() => {\n if (!hasTrackedRef.current && envInfo) {\n hasTrackedRef.current = true;\n const trackingData = buildEnvironmentTrackingData(\n envInfo,\n reviewMode,\n baseSchemas,\n currentSchemas,\n );\n trackEnvironmentConfig(trackingData);\n }\n }, [envInfo, reviewMode, baseSchemas, currentSchemas]);\n\n return (\n <>\n <Tooltip\n content=\"Environment Info\"\n positioning={{ placement: \"bottom-end\" }}\n >\n <div\n className=\"flex items-center hover:cursor-pointer hover:text-black\"\n onClick={onOpen}\n >\n <div className=\"hidden text-sm lg:flex lg:flex-col\">\n <div className=\"flex gap-1\">\n <Text\n as=\"span\"\n color=\"envBase\"\n className=\"no-track-pii-safe max-w-32 truncate\"\n >\n {Array.from(baseSchemas).join(\", \")}\n </Text>{\" \"}\n ({baseRelativeTime})\n </div>\n <div className=\"flex gap-1\">\n <Text\n as=\"span\"\n color=\"envCurrent\"\n className=\"no-track-pii-safe max-w-32 truncate\"\n >\n {Array.from(currentSchemas).join(\", \")}\n </Text>{\" \"}\n ({currentRelativeTime})\n </div>\n </div>\n <IconButton size=\"sm\" variant=\"plain\" aria-label=\"Environment Info\">\n <Icon verticalAlign=\"middle\" as={IconInfo} boxSize={\"16px\"} />\n </IconButton>\n </div>\n </Tooltip>\n <Dialog.Root open={open} onOpenChange={onClose} size=\"lg\">\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title>Environment Information</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Flex direction=\"column\" gap=\"5px\">\n {reviewMode ? (\n <>\n <Flex justifyContent=\"left\" gap=\"5px\" direction=\"column\">\n <Heading size=\"sm\">Review Information</Heading>\n <List.Root>\n {reviewInfo.url && (\n <List.Item ml=\"10px\">\n url:{\" \"}\n <Link\n href={reviewInfo.url}\n color=\"blue.500\"\n target=\"_blank\"\n >\n {reviewInfo.url} <LuExternalLink />\n </Link>\n </List.Item>\n )}\n {!isEmpty(reviewInfo) &&\n renderInfoEntries(reviewInfo)}\n </List.Root>\n </Flex>\n </>\n ) : (\n <>\n <Flex justifyContent=\"left\" gap=\"5px\" direction=\"column\">\n <Heading size=\"sm\">Dev Information</Heading>\n <List.Root>{git && renderInfoEntries(git)}</List.Root>\n </Flex>\n </>\n )}\n <Separator />\n {envInfo?.adapterType === \"dbt\" && (\n <Flex justifyContent=\"left\" gap=\"5px\" direction=\"column\">\n <Heading size=\"sm\">DBT</Heading>\n <Table.ScrollArea borderWidth=\"1px\" height=\"30rem\">\n <Table.Root size=\"sm\" variant=\"line\" stickyHeader>\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeader></Table.ColumnHeader>\n <Table.ColumnHeader>base</Table.ColumnHeader>\n <Table.ColumnHeader>current</Table.ColumnHeader>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n <Table.Row>\n <Table.Cell>schema</Table.Cell>\n <Table.Cell className=\"no-track-pii-safe\">\n {Array.from(baseSchemas).map((item) => (\n <Tooltip\n key={item}\n content={item}\n positioning={{ placement: \"bottom\" }}\n >\n <div className=\"max-w-72 truncate\">\n {item}\n </div>\n </Tooltip>\n ))}\n </Table.Cell>\n <Table.Cell className=\"no-track-pii-safe\">\n {Array.from(currentSchemas).map((item) => (\n <Tooltip\n key={item}\n content={item}\n positioning={{ placement: \"bottom\" }}\n >\n <div className=\"max-w-72 truncate\">\n {item}\n </div>\n </Tooltip>\n ))}\n </Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>version</Table.Cell>\n <Table.Cell>{dbtBase?.dbt_version}</Table.Cell>\n <Table.Cell>{dbtCurrent?.dbt_version}</Table.Cell>\n </Table.Row>\n <Table.Row>\n <Table.Cell>timestamp</Table.Cell>\n <Table.Cell>{baseTime}</Table.Cell>\n <Table.Cell>{currentTime}</Table.Cell>\n </Table.Row>\n </Table.Body>\n </Table.Root>\n </Table.ScrollArea>\n </Flex>\n )}\n {envInfo?.adapterType === \"sqlmesh\" && (\n <Flex justifyContent=\"left\" gap=\"5px\" direction=\"column\">\n <Heading size=\"sm\">SQLMesh</Heading>\n <Table.ScrollArea borderWidth=\"1px\" height=\"30rem\">\n <Table.Root variant=\"line\" stickyHeader>\n <Table.Header>\n <Table.Row>\n <Table.ColumnHeader></Table.ColumnHeader>\n <Table.ColumnHeader>base</Table.ColumnHeader>\n <Table.ColumnHeader>current</Table.ColumnHeader>\n </Table.Row>\n </Table.Header>\n <Table.Body>\n <Table.Row>\n <Table.Cell>Environment</Table.Cell>\n <Table.Cell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.base_env}\n </Table.Cell>\n <Table.Cell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.current_env}\n </Table.Cell>\n </Table.Row>\n </Table.Body>\n </Table.Root>\n </Table.ScrollArea>\n </Flex>\n )}\n </Flex>\n </Dialog.Body>\n <Dialog.Footer>\n <Button colorPalette=\"blue\" mr={3} onClick={onClose}>\n Close\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n </>\n );\n}\n","import { Button, Flex, Spacer, Stack, Text } from \"@chakra-ui/react\";\nimport { Editor, EditorProps } from \"@monaco-editor/react\";\nimport { editor } from \"monaco-editor\";\nimport React, { useEffect } from \"react\";\nimport { FaPlay } from \"react-icons/fa6\";\nimport { extractSchemas, formatTimeToNow } from \"@/components/app/EnvInfo\";\nimport { ManifestMetadata } from \"@/lib/api/info\";\n\nimport IStandaloneCodeEditor = editor.IStandaloneCodeEditor;\n\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\n\nexport interface SqlEditorProps {\n language?: string;\n theme?: string;\n value: string;\n baseValue?: string;\n onChange?: (value: string) => void;\n onChangeBase?: (value: string) => void;\n onRun?: () => void;\n onRunBase?: () => void;\n onRunDiff?: () => void;\n options?: EditorProps[\"options\"];\n manifestData?: ManifestMetadata;\n schemas?: string;\n label?: string;\n CustomEditor?: React.ReactNode;\n}\n\nexport interface DualSqlEditorProps extends SqlEditorProps {\n labels?: [string, string]; // [baseLabel, currentLabel]\n SetupGuide?: React.ReactNode;\n}\n\nfunction SqlEditor({\n value,\n onChange,\n onRun,\n onRunBase,\n onRunDiff,\n label,\n CustomEditor,\n options = {},\n manifestData,\n schemas,\n ...props\n}: SqlEditorProps) {\n const { featureToggles } = useRecceInstanceContext();\n const handleEditorChange = (value: string | undefined) => {\n if (value !== undefined && onChange) {\n onChange(value);\n }\n };\n let timestamp = \"\";\n if (manifestData) {\n timestamp = manifestData.generated_at\n ? formatTimeToNow(manifestData.generated_at)\n : \"\";\n }\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Check if Monaco editor has focus\n const monacoElement = document.querySelector(\".monaco-editor\");\n if (monacoElement?.contains(document.activeElement) && e.key === \" \") {\n e.stopPropagation(); // Prevent other from capturing\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown, true); // capture phase\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown, true);\n };\n }, []);\n\n const handleMonacoSpaceBar = (\n editor: IStandaloneCodeEditor,\n monaco: typeof import(\"monaco-editor\"),\n ) => {\n // Register space bar handling through Monaco's internal API\n editor.addCommand(\n monaco.KeyCode.Space,\n () => {\n // Explicitly trigger space insertion\n const position = editor.getPosition();\n if (position) {\n console.log(\"Inserting space at\", position);\n editor.executeEdits(\"\", [\n {\n range: new monaco.Range(\n position.lineNumber,\n position.column,\n position.lineNumber,\n position.column,\n ),\n text: \" \",\n forceMoveMarkers: true,\n },\n ]);\n }\n },\n \"!suggestWidgetVisible && !findWidgetVisible\", // Context key expression\n );\n };\n\n return (\n <>\n {(label ?? onRun ?? onRunBase) && (\n <Flex\n backgroundColor=\"#EDF2F880\"\n height=\"40px\"\n minH=\"40px\"\n fontSize={\"14px\"}\n align=\"center\"\n margin={\"0\"}\n padding={\"0px 16px\"}\n flex=\"0 0 40px\"\n >\n <Text as=\"strong\" className=\"no-track-pii-safe\">\n {label ? label.toUpperCase() : \"\"}\n </Text>\n {manifestData && (\n <span className=\"ml-1\">\n (\n {schemas && (\n <span className=\"no-track-pii-safe\">{schemas}, </span>\n )}\n <span>{timestamp}</span>)\n </span>\n )}\n\n <Spacer />\n {(onRun ?? onRunBase) && (\n <Button\n size=\"xs\"\n variant=\"outline\"\n onClick={onRun ?? onRunBase}\n backgroundColor={\"white\"}\n padding={\"6px 12px\"}\n disabled={featureToggles.disableDatabaseQuery}\n >\n <FaPlay /> Run Query\n </Button>\n )}\n </Flex>\n )}\n {CustomEditor ?? (\n <Editor\n className=\"no-track-pii-safe\"\n language=\"sql\"\n theme=\"vs\"\n value={value}\n onChange={handleEditorChange}\n onMount={(editor, monaco) => {\n handleMonacoSpaceBar(editor, monaco);\n\n if (onRun) {\n editor.addCommand(\n monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter,\n onRun,\n );\n }\n\n if (onRunBase) {\n editor.addCommand(\n monaco.KeyMod.Alt | monaco.KeyCode.Enter,\n onRunBase,\n );\n }\n\n if (onRunDiff) {\n editor.addCommand(\n monaco.KeyMod.CtrlCmd |\n monaco.KeyMod.Shift |\n monaco.KeyCode.Enter,\n onRunDiff,\n );\n }\n }}\n options={{\n domReadOnly: false,\n readOnly: false,\n extraEditorClassName: \"no-track-pii-safe max-h-dvh\",\n tabSize: 2,\n fontSize: 16,\n lineNumbers: \"on\",\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: \"on\",\n wrappingIndent: \"indent\",\n // Additional options as needed\n ...options,\n }}\n />\n )}\n </>\n );\n}\n\nexport function DualSqlEditor({\n value,\n baseValue,\n onChange,\n onChangeBase,\n onRun,\n onRunBase,\n onRunDiff,\n options = {},\n labels,\n SetupGuide,\n ...props\n}: DualSqlEditorProps) {\n const baseLabel = labels ? labels[0] : \"Base\";\n const currentLabel = labels ? labels[1] : \"Current\";\n const { envInfo, lineageGraph } = useLineageGraphContext();\n\n let dbtBase: ManifestMetadata | undefined;\n let dbtCurrent: ManifestMetadata | undefined;\n if (envInfo?.dbt?.base && envInfo.dbt.current) {\n dbtBase = envInfo.dbt.base;\n dbtCurrent = envInfo.dbt.current;\n }\n\n const [baseSchemas, currentSchemas] = extractSchemas(lineageGraph);\n\n return (\n <>\n <Flex height={\"100%\"} gap={0}>\n <Stack\n height={\"100%\"}\n width={\"50%\"}\n gap={0}\n borderRight={\"1px\"}\n borderColor={\"#D4DBE4\"}\n >\n <SqlEditor\n label={baseLabel}\n value={baseValue ?? \"\"}\n onChange={onChangeBase}\n onRunBase={onRunBase}\n options={options}\n CustomEditor={SetupGuide}\n manifestData={dbtBase ?? undefined}\n schemas={Array.from(baseSchemas).join(\", \")}\n {...props}\n />\n </Stack>\n <Stack height={\"100%\"} width={\"50%\"} gap={0}>\n <SqlEditor\n label={currentLabel}\n value={value}\n onChange={onChange}\n onRun={onRun}\n options={options}\n manifestData={dbtCurrent ?? undefined}\n schemas={Array.from(currentSchemas).join(\", \")}\n {...props}\n />\n </Stack>\n </Flex>\n </>\n );\n}\n\nexport default SqlEditor;\n","import {\n Box,\n CloseButton,\n Dialog,\n IconButton,\n Portal,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport {\n DiffEditor,\n DiffEditorProps,\n Editor,\n EditorProps,\n} from \"@monaco-editor/react\";\nimport React, { useState } from \"react\";\nimport { FaExpandArrowsAlt } from \"react-icons/fa\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport SqlEditor from \"../query/SqlEditor\";\nimport { LineageGraphNode } from \"./lineage\";\n\ninterface NodeSqlViewProps {\n node: LineageGraphNode;\n}\n\nexport const NodeSqlView = ({ node }: NodeSqlViewProps) => {\n const { open: isOpen, onOpen: onOpen, onClose: onClose } = useDisclosure();\n const [isHovered, setIsHovered] = useState(false);\n const { data: flags, isLoading } = useRecceServerFlag();\n const isSingleEnvOnboarding = flags?.single_env_onboarding;\n\n if (isLoading) {\n return <></>;\n }\n\n if (\n node.data.resourceType !== \"model\" &&\n node.data.resourceType !== \"snapshot\"\n ) {\n return \"Not available\";\n }\n\n const diffOptions: DiffEditorProps[\"options\"] = {\n readOnly: true,\n lineNumbers: \"on\",\n automaticLayout: true,\n renderOverviewRuler: false,\n wordWrap: \"off\",\n minimap: { enabled: false },\n };\n const sqlOptions: EditorProps[\"options\"] = {\n readOnly: true,\n lineNumbers: \"on\",\n automaticLayout: true,\n wordWrap: \"off\",\n minimap: { enabled: false },\n };\n\n const original = node.data.data.base?.raw_code;\n const modified = node.data.data.current?.raw_code;\n const modelName =\n node.data.data.base?.name ?? node.data.data.current?.name ?? \"\";\n\n return (\n <Box\n className=\"no-track-pii-safe\"\n style={{ position: \"relative\" }}\n height=\"100%\"\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n {isSingleEnvOnboarding ? (\n <SqlEditor\n language=\"sql\"\n theme=\"light\"\n value={original ?? \"\"}\n options={sqlOptions}\n />\n ) : (\n <DiffEditor\n language=\"sql\"\n theme=\"light\"\n original={original}\n modified={modified}\n keepCurrentOriginalModel={true}\n keepCurrentModifiedModel={true}\n options={{\n ...diffOptions,\n renderSideBySide: false,\n }}\n />\n )}\n <IconButton\n onClick={onOpen}\n size=\"md\"\n aria-label=\"Expand\"\n variant={\"ghost\"}\n style={{\n position: \"absolute\",\n top: \"5px\",\n right: \"20px\",\n opacity: isHovered ? 0.5 : 0.1,\n transition: \"opacity 0.3s ease-in-out\",\n }}\n >\n <FaExpandArrowsAlt />\n </IconButton>\n <Dialog.Root open={isOpen} onOpenChange={onClose} size=\"xl\">\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content overflowY=\"auto\" height=\"75%\">\n <Dialog.Header>\n {isSingleEnvOnboarding ? (\n <Dialog.Title>\n <code>{modelName}</code> Model Code\n </Dialog.Title>\n ) : (\n <Dialog.Title>\n <code>{modelName}</code> Model Code Diff\n </Dialog.Title>\n )}\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Header>\n <Dialog.Body>\n {isSingleEnvOnboarding ? (\n <Editor\n language=\"sql\"\n theme=\"light\"\n value={original ?? \"\"}\n options={{ ...sqlOptions, fontSize: 16 }}\n />\n ) : (\n <DiffEditor\n language=\"sql\"\n theme=\"light\"\n original={original}\n modified={modified}\n options={{ ...diffOptions, fontSize: 16 }}\n />\n )}\n </Dialog.Body>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n </Box>\n );\n};\n","import { SubmitOptions, submitRun } from \"./runs\";\nimport { ColumnRenderMode, DataFrame } from \"./types\";\n\nexport interface QueryParams\n extends QueryRunParams,\n QueryDiffParams,\n QueryPreviewChangeParams {}\n\nexport interface QueryPreviewChangeParams {\n current_model?: string;\n sql_template: string;\n primary_keys?: string[];\n}\n\nexport interface QueryRunParams {\n sql_template: string;\n}\n\nexport interface QueryViewOptions {\n pinned_columns?: string[];\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\nexport type QueryResult = DataFrame;\n\nexport interface QueryDiffParams {\n sql_template: string;\n base_sql_template?: string;\n primary_keys?: string[];\n}\n\nexport interface QueryDiffResult {\n base?: DataFrame;\n current?: DataFrame;\n diff?: DataFrame;\n}\n\nexport interface QueryDiffViewOptions {\n changed_only?: boolean;\n primary_keys?: string[];\n pinned_columns?: string[];\n display_mode?: \"inline\" | \"side_by_side\";\n columnsRenderMode?: Record<string, ColumnRenderMode>;\n}\n\nexport async function submitQuery(\n params: QueryRunParams,\n options?: SubmitOptions,\n) {\n return await submitRun(\"query\", params, options);\n}\n\nexport async function submitQueryBase(\n params: QueryRunParams,\n options?: SubmitOptions,\n) {\n return await submitRun(\"query_base\", params, options);\n}\n\nexport async function submitQueryDiff(\n params: QueryDiffParams,\n options?: SubmitOptions,\n) {\n return await submitRun(\"query_diff\", params, options);\n}\n","const prefix = \"recce-\";\n\nexport const localStorageKeys = {\n bypassSaveOverwrite: `${prefix}-bypass-save-overwrite`,\n previewChangeFeedbackID: `${prefix}-preview-change-feedback`,\n prepareEnvGuideID: `${prefix}-prepare-env`,\n};\n","import { Flex, HStack, IconButton, Image, Link } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { toaster } from \"@/components/ui/toaster\";\n\nfunction ReactionFeedback({\n description,\n onLike,\n onDislike,\n onClickLink,\n externalLink,\n externalLinkText,\n}: {\n description: string;\n onLike: () => void;\n onDislike: () => void;\n onClickLink: () => void;\n externalLink?: string;\n externalLinkText?: string;\n}) {\n return (\n <Flex\n gap={4}\n justifyContent=\"center\"\n alignContent={\"center\"}\n alignItems={\"center\"}\n >\n {description}\n <IconButton\n aria-label=\"thumbs up\"\n variant={\"ghost\"}\n width={\"32px\"}\n height={\"32px\"}\n onClick={onLike}\n >\n <Image src=\"/imgs/feedback/thumbs-up.png\" alt=\"like\" />\n </IconButton>\n <IconButton\n aria-label=\"thumbs down\"\n variant={\"ghost\"}\n width={\"32px\"}\n height={\"32px\"}\n onClick={onDislike}\n >\n <Image src=\"/imgs/feedback/thumbs-down.png\" alt=\"dislike\" />\n </IconButton>\n {externalLink && externalLinkText && (\n <Link\n href={externalLink}\n target=\"_blank\"\n textDecoration=\"underline\"\n onClick={onClickLink}\n >\n {externalLinkText} <LuExternalLink />\n </Link>\n )}\n </Flex>\n );\n}\n\nexport function useFeedbackCollectionToast(options: {\n feedbackId: string;\n description: string;\n onFeedbackSubmit: (feedback: string) => void;\n externalLink?: string;\n externalLinkText?: string;\n}) {\n const {\n feedbackId,\n description,\n onFeedbackSubmit,\n externalLink,\n externalLinkText,\n } = options;\n const [toastId, setToastId] = useState<string | undefined>(undefined);\n\n function feedBackCollectionToast(skipBypassFeedback = false) {\n const isSkipFeedback = localStorage.getItem(feedbackId);\n if (toastId != null) {\n // Don't show the toast again if it's already active\n return;\n }\n if (isSkipFeedback === \"true\" && !skipBypassFeedback) {\n return;\n }\n\n setToastId(\n toaster.create({\n id: feedbackId,\n duration: undefined,\n type: \"success\",\n description: (\n <HStack>\n <ReactionFeedback\n description={description}\n onLike={() => {\n onFeedbackSubmit(\"like\");\n toaster.dismiss(toastId);\n localStorage.setItem(feedbackId, \"true\");\n }}\n onDislike={() => {\n onFeedbackSubmit(\"dislike\");\n toaster.dismiss(toastId);\n localStorage.setItem(feedbackId, \"true\");\n }}\n externalLink={externalLink}\n externalLinkText={externalLinkText}\n onClickLink={() => {\n onFeedbackSubmit(\"link\");\n }}\n />\n </HStack>\n ),\n }),\n );\n }\n\n return {\n feedbackToast: feedBackCollectionToast,\n closeToast: () => {\n toaster.dismiss(toastId);\n },\n };\n}\n","import { useState } from \"react\";\nimport { toaster } from \"@/components/ui/toaster\";\n\nexport function useGuideToast(options: {\n guideId: string;\n description: string;\n externalLink?: string;\n externalLinkText?: string;\n onExternalLinkClick?: () => void;\n}) {\n const [toastId, setToastId] = useState<string | undefined>(undefined);\n const { guideId, description, externalLinkText, onExternalLinkClick } =\n options;\n\n function guideToast() {\n if (toastId != null) {\n // Don't show the toast again if it's already active\n return;\n }\n\n setToastId(\n toaster.create({\n id: guideId,\n duration: 3000,\n type: \"success\",\n description: description,\n action: {\n label: externalLinkText ?? \"link\",\n onClick: () => {\n if (onExternalLinkClick) {\n onExternalLinkClick();\n }\n },\n },\n }),\n );\n }\n\n return {\n guideToast: guideToast,\n closeGuideToast: () => {\n toaster.dismiss(toastId);\n },\n };\n}\n","import {\n Box,\n Button,\n Input,\n InputGroup,\n InputProps,\n Menu,\n Portal,\n Tag,\n Wrap,\n WrapItem,\n} from \"@chakra-ui/react\";\nimport _ from \"lodash\";\nimport React, { useRef, useState } from \"react\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\n\nexport interface DropdownValuesInputProps extends InputProps {\n unitName: string;\n suggestionList?: string[];\n defaultValues?: string[];\n onValuesChange: (values: string[]) => void;\n}\n\nexport const DropdownValuesInput = (props: DropdownValuesInputProps) => {\n const { defaultValues, suggestionList, onValuesChange, className } = props;\n const [values, setValues] = useState<string[]>(defaultValues ?? []);\n const [filter, setFilter] = useState<string>(\"\");\n const [isTyping, setIsTyping] = useState<boolean>(false);\n const inputRef = useRef<HTMLInputElement>(null);\n\n const showNumberOfValuesSelected = (tags: string[]) => {\n if (tags.length > 1) {\n return `${tags.length} ${props.unitName}s selected`;\n } else if (tags.length === 1) {\n return tags[0];\n }\n return \"\";\n };\n\n const handleSelect = (value: string) => {\n if (!values.includes(value)) {\n setFilter(\"\");\n setValues([...values, value]);\n onValuesChange([...values, value]);\n }\n };\n\n const handleClear = () => {\n setFilter(\"\");\n setValues([]);\n onValuesChange([]);\n };\n\n // Filter the suggestion list without case sensitivity based on the current input\n const lowerCaseFilter = filter.toLowerCase();\n const filteredList =\n suggestionList\n ?.filter(\n (value) =>\n lowerCaseFilter === \"\" ||\n value.toLowerCase().includes(lowerCaseFilter),\n )\n .filter((value) => !values.includes(value)) ?? [];\n const limit = 10;\n\n const endElement =\n values.length > 0 ? (\n <Button\n size=\"2xs\"\n variant=\"ghost\"\n color={\"#3182CE\"}\n fontSize={props.size}\n paddingTop=\"0\"\n me={-2}\n onClick={handleClear}\n >\n Clear\n </Button>\n ) : undefined;\n\n return (\n <InputGroup\n width={props.width}\n className={className}\n endElement={endElement}\n >\n <Menu.Root\n size=\"sm\"\n lazyMount\n closeOnSelect={false}\n onOpenChange={() => inputRef.current?.focus()}\n >\n <Menu.Trigger asChild>\n <Button\n width={\"100%\"}\n size=\"2xs\"\n colorPalette=\"gray\"\n variant=\"outline\"\n justifyContent=\"flex-start\"\n >\n {showNumberOfValuesSelected(values)}\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content\n zIndex={\"popover\"}\n fontSize={props.size}\n width={props.width}\n className=\"no-track-pii-safe\"\n >\n {/* Input Filter & Show Tags */}\n <Menu.ItemGroup>\n <Wrap\n border={\"1px solid #e2e8f0\"}\n borderRadius={\"4px\"}\n width={\"calc(100% - 8px)\"}\n marginX={\"4px\"}\n padding={\"4px\"}\n >\n {values.map((value) => (\n <WrapItem key={value}>\n <Tag.Root\n key={value}\n paddingX={\"0.5rem\"}\n size={\n props.size === \"sm\"\n ? props.size\n : props.size === \"md\"\n ? props.size\n : props.size === \"lg\"\n ? props.size\n : \"md\"\n }\n >\n <Tag.Label>{value}</Tag.Label>\n <Tag.EndElement>\n <Tag.CloseTrigger\n onClick={() => {\n setValues(values.filter((v) => v !== value));\n onValuesChange(values.filter((v) => v !== value));\n }}\n />\n </Tag.EndElement>\n </Tag.Root>\n </WrapItem>\n ))}\n <WrapItem width={\"100%\"}>\n <Input\n ref={inputRef}\n placeholder=\"Filter or add custom keys\"\n variant=\"subtle\"\n size={props.size}\n value={filter}\n onChange={(e) => {\n setFilter(e.target.value);\n setIsTyping(true);\n }}\n onKeyDown={(e) => {\n const newText = e.currentTarget.value\n .trim()\n .replace(\",\", \"\");\n switch (e.key) {\n case \",\":\n case \"Enter\":\n handleSelect(newText);\n setFilter(\"\");\n break;\n case \"Backspace\":\n if (\n e.currentTarget.value === \"\" &&\n values.length > 0\n ) {\n setValues(values.slice(0, -1));\n onValuesChange(values.slice(0, -1));\n }\n break;\n default:\n break;\n }\n }}\n onBlur={() => {\n if (inputRef.current && isTyping)\n inputRef.current.focus();\n }}\n />\n </WrapItem>\n </Wrap>\n </Menu.ItemGroup>\n <Menu.Separator />\n {/* Suggestion List */}\n <Menu.ItemGroup>\n {filter !== \"\" && !suggestionList?.includes(filter) && (\n <Menu.Item\n key={\"custom-value-by-filter\"}\n value=\"custom-value-by-filter\"\n onClick={() => {\n handleSelect(filter);\n setIsTyping(false);\n }}\n >\n Add &apos;{filter}&apos; to the list\n </Menu.Item>\n )}\n {filteredList\n .map((value, cid) => (\n <Menu.Item\n key={_.uniqueId(`option-${cid}`)}\n value={`option-${cid}`}\n onClick={() => {\n handleSelect(value);\n }}\n >\n {value}\n </Menu.Item>\n ))\n .slice(0, limit)}\n {filteredList.length > limit && (\n <Tooltip\n content=\"Please use filter to find more items\"\n positioning={{ placement: \"top\" }}\n >\n <Box px=\"12px\" color=\"gray\" fontSize=\"8pt\">\n and {filteredList.length - limit} more items...\n </Box>\n </Tooltip>\n )}\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n </InputGroup>\n );\n};\n","import { Field, Flex, FlexProps } from \"@chakra-ui/react\";\nimport { useMemo } from \"react\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { NodeColumnData } from \"@/lib/api/info\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { DropdownValuesInput } from \"@/utils/DropdownValuesInput\";\n\ninterface QueryFormProps extends FlexProps {\n defaultPrimaryKeys: string[] | undefined;\n onPrimaryKeysChange: (primaryKeys: string[]) => void;\n}\n\nexport const QueryForm = ({\n defaultPrimaryKeys,\n onPrimaryKeysChange,\n ...prob\n}: QueryFormProps) => {\n const { lineageGraph, isActionAvailable } = useLineageGraphContext();\n\n const labelInfo =\n \"Provide a primary key to perform query diff in data warehouse and only return changed rows.\";\n\n const availableColumns = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n const columnSet = new Set<string>();\n for (const modelName in lineageGraph.nodes) {\n const model = lineageGraph.nodes[modelName];\n const combinedColumns: Record<string, NodeColumnData | undefined> = {\n ...(model.data.data.base?.columns ?? {}),\n ...(model.data.data.current?.columns ?? {}),\n };\n\n Object.entries(combinedColumns).forEach(([columnName, col]) => {\n if (col?.unique) {\n columnSet.add(columnName);\n }\n });\n }\n return Array.from(columnSet).sort();\n }, [lineageGraph]);\n\n return (\n <Flex {...prob}>\n <Field.Root m=\"0 0.5rem\" gap={0}>\n <Field.Label fontSize=\"0.625rem\" margin={0}>\n Diff with Primary Key(s) (suggested){\" \"}\n <Tooltip\n content={labelInfo}\n positioning={{ placement: \"bottom-end\" }}\n >\n <PiInfo color=\"gray.600\" />\n </Tooltip>\n </Field.Label>\n <DropdownValuesInput\n className=\"no-track-pii-safe\"\n unitName=\"key\"\n defaultValues={defaultPrimaryKeys}\n suggestionList={availableColumns}\n onValuesChange={onPrimaryKeysChange}\n size=\"2xs\"\n width={\"240px\"}\n placeholder=\"Select or type to add keys\"\n disabled={!isActionAvailable(\"query_diff_with_primary_key\")}\n />\n </Field.Root>\n </Flex>\n );\n};\n","import { axiosClient } from \"./axiosClient\";\n\nexport interface ConnectToCloud {\n connection_url: string;\n}\n\nexport async function connectToCloud(): Promise<ConnectToCloud> {\n const data = await axiosClient.post<ConnectToCloud>(\"/api/connect\");\n return data.data;\n}\n","\"use client\";\n\nimport {\n Button,\n Dialog,\n Image,\n Link,\n Portal,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport Cookies from \"js-cookie\";\nimport { StaticImageData } from \"next/image\";\nimport ReloadImage from \"public/imgs/reload-image.svg\";\nimport {\n Dispatch,\n ReactNode,\n SetStateAction,\n useCallback,\n useEffect,\n useState,\n} from \"react\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { connectToCloud } from \"@/lib/api/connectToCloud\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\n\ntype AuthState = \"authenticating\" | \"pending\" | \"canceled\" | \"ignored\";\n\ninterface AuthModalProps {\n handleParentClose?: Dispatch<SetStateAction<boolean>>;\n parentOpen?: boolean;\n ignoreCookie?: boolean;\n variant?: \"auth\" | \"enable-share\" | \"user-profile\";\n}\n\nexport default function AuthModal({\n handleParentClose,\n parentOpen = false,\n ignoreCookie = false,\n variant = \"auth\",\n}: AuthModalProps): ReactNode {\n const { authed } = useRecceInstanceContext();\n const [open, setOpen] = useState(parentOpen || !authed);\n\n // Cookie handling only for auth variant\n const authStateCookieValue = (Cookies.get(\"authState\") ??\n \"pending\") as AuthState;\n const [authState, setAuthState] = useState<AuthState>(\n ignoreCookie ? \"pending\" : authStateCookieValue,\n );\n\n if (authState === \"ignored\" && !ignoreCookie) {\n return null;\n }\n\n if (authed) {\n return null;\n }\n\n // Content configuration based on variant\n const contents = {\n auth: {\n title: \"Configure Cloud Token\",\n action: \"Get token and configure\",\n },\n \"enable-share\": {\n title: \"Enable Sharing with Cloud\",\n action: \"Enable sharing\",\n },\n \"user-profile\": {\n title: \"Configure Cloud Token\",\n action: \"Get token and configure\",\n },\n };\n\n const content = contents[variant];\n\n return (\n <Dialog.Root\n size=\"lg\"\n placement=\"center\"\n lazyMount\n open={open}\n onOpenChange={(e) => {\n setOpen(e.open);\n if (handleParentClose) {\n handleParentClose(e.open);\n }\n }}\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content borderRadius=\"2xl\">\n {authState !== \"authenticating\" && (\n <Dialog.Header className=\"text-center\" fontSize=\"2xl\">\n <Dialog.Title>{content.title}</Dialog.Title>\n </Dialog.Header>\n )}\n {authState !== \"authenticating\" ? (\n <>\n <Dialog.Body className=\"space-y-2 font-light\">\n <Text>\n To enable sharing, get your token from Recce Cloud and\n launch your local instance with it.\n </Text>\n <ul className=\"list-inside list-disc\">\n <li>Share your instance with teammates via Recce Cloud.</li>\n <li>\n Your instance will be securely and freely hosted for\n sharing.\n </li>\n {variant === \"auth\" && (\n <li>This step is recommended but optional.</li>\n )}\n </ul>\n <Text display=\"flex\" gap={1}>\n More directions\n <Link\n variant=\"underline\"\n color=\"blue.500\"\n _focus={{\n outline: \"none\",\n }}\n href=\"https://cloud.datarecce.io/connect-to-cloud\"\n target=\"_blank\"\n >\n here <LuExternalLink />\n </Link>\n </Text>\n </Dialog.Body>\n <Dialog.Footer>\n <div className=\"flex w-full flex-col gap-2\">\n <Button\n className=\"w-full !rounded-lg !font-medium\"\n colorPalette=\"brand\"\n onClick={async () => {\n setAuthState(\"authenticating\");\n const { connection_url } = await connectToCloud();\n // Open the connection URL in a new tab\n window.open(connection_url, \"_blank\");\n }}\n >\n {content.action} <LuExternalLink />\n </Button>\n <Dialog.ActionTrigger asChild>\n <Button\n className=\"!rounded-lg !font-medium\"\n variant=\"subtle\"\n colorPalette=\"gray\"\n size=\"sm\"\n >\n {variant === \"auth\" ? \"Skip\" : \"Cancel\"}\n </Button>\n </Dialog.ActionTrigger>\n {variant === \"auth\" && (\n <Dialog.ActionTrigger asChild>\n <Button\n width=\"100%\"\n className=\"!rounded-lg !font-medium !text-black\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => {\n Cookies.set(\"authState\", \"ignored\", {\n expires: 30,\n });\n setAuthState(\"ignored\");\n }}\n >\n Snooze for 30 days\n </Button>\n </Dialog.ActionTrigger>\n )}\n </div>\n </Dialog.Footer>\n </>\n ) : (\n <>\n <Dialog.Body className=\"space-y-2 self-center font-light\">\n <VStack gap={4} paddingTop=\"1rem\">\n <Image\n className=\"mx-auto mb-2\"\n h=\"6rem\"\n fit=\"contain\"\n src={(ReloadImage as StaticImageData).src}\n />\n <Text fontSize=\"2xl\" fontWeight=\"medium\">\n Reload to Finish\n </Text>\n <Text>Reload to complete connection to Recce Cloud</Text>\n </VStack>\n </Dialog.Body>\n <Dialog.Footer>\n <Button\n className=\"w-full\"\n colorPalette=\"brand\"\n onClick={() => {\n window.location.reload();\n }}\n >\n Reload\n </Button>\n </Dialog.Footer>\n </>\n )}\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { AxiosResponse } from \"axios\";\nimport { RunType } from \"@/components/run/registry\";\nimport { axiosClient } from \"./axiosClient\";\nimport { cacheKeys } from \"./cacheKeys\";\nimport { getExperimentTrackingBreakingChangeEnabled } from \"./track\";\nimport { Run, RunParamTypes } from \"./types\";\n\nexport interface Check<PT = unknown, VO = unknown> {\n check_id: string;\n name: string;\n description?: string;\n type: RunType;\n params?: PT;\n view_options?: VO;\n is_checked?: boolean;\n is_preset?: boolean;\n last_run?: Run;\n}\n\nexport interface CreateCheckBody {\n name?: string;\n description?: string;\n run_id?: string;\n type?: RunType;\n params?: Record<string, string | boolean>;\n view_options?: Record<string, string | boolean>;\n track_props?: Record<string, string | boolean>;\n}\n\nexport async function createSimpleCheck(): Promise<Check> {\n const response = await axiosClient.post<\n CreateCheckBody,\n AxiosResponse<Check>\n >(\"/api/checks\", {\n type: \"simple\",\n });\n return response.data;\n}\n\nexport async function createCheckByRun(\n runId: string,\n viewOptions?: Record<string, unknown>,\n): Promise<Check> {\n const track_props = getExperimentTrackingBreakingChangeEnabled()\n ? { breaking_change_analysis: true }\n : {};\n const response = await axiosClient.post<\n CreateCheckBody,\n AxiosResponse<Check>\n >(\"/api/checks\", {\n run_id: runId,\n view_options: viewOptions,\n track_props,\n });\n return response.data;\n}\n\nexport async function listChecks(): Promise<Check[]> {\n return (await axiosClient.get<never, AxiosResponse<Check[]>>(\"/api/checks\"))\n .data;\n}\n\nexport function useChecks(enabled: boolean) {\n return useQuery({\n queryKey: cacheKeys.checks(),\n queryFn: listChecks,\n enabled,\n });\n}\n\nexport async function getCheck(checkId: string): Promise<Check<RunParamTypes>> {\n const response = await axiosClient.get<\n never,\n AxiosResponse<Check<RunParamTypes>>\n >(`/api/checks/${checkId}`);\n return response.data;\n}\n\nexport async function updateCheck(\n checkId: string,\n payload: Partial<Check>,\n): Promise<Check> {\n const response = await axiosClient.patch<\n Partial<Check>,\n AxiosResponse<Check>\n >(`/api/checks/${checkId}`, payload);\n return response.data;\n}\n\nexport async function deleteCheck(checkId: string) {\n const response = await axiosClient.delete<\n never,\n AxiosResponse<Pick<Check, \"check_id\">>\n >(`/api/checks/${checkId}`);\n return response.data;\n}\n\nexport async function reorderChecks(order: {\n source: number;\n destination: number;\n}) {\n return await axiosClient.post<\n { source: number; destination: number },\n AxiosResponse<unknown>\n >(\"/api/checks/reorder\", order);\n}\n\nexport async function markAsPresetCheck(checkId: string): Promise<void> {\n await axiosClient.post(`/api/checks/${checkId}/mark-as-preset`);\n}\n","import React, { createContext, useContext, useState } from \"react\";\nimport { shareState } from \"@/lib/api/state\";\n\ninterface ShareStateProps {\n shareUrl?: string;\n isLoading: boolean;\n error?: string;\n handleShareClick: () => Promise<void>;\n}\n\nconst ShareState = createContext<ShareStateProps | undefined>(undefined);\n\nexport function RecceShareStateContextProvider({\n children,\n}: {\n children: React.ReactNode;\n}) {\n const [shareUrl, setShareUrl] = useState<string>();\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string>();\n\n const handleShareClick = async () => {\n setIsLoading(true);\n setError(undefined);\n setShareUrl(undefined);\n try {\n const response = await shareState();\n if (response.status !== \"success\") {\n setError(response.message);\n return;\n }\n setShareUrl(response.share_url);\n } catch (err) {\n setError((err as Error).message);\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n <ShareState.Provider\n value={{ shareUrl, isLoading, error, handleShareClick }}\n >\n {children}\n </ShareState.Provider>\n );\n}\n\nexport const useRecceShareStateContext = () => {\n const context = useContext(ShareState);\n if (!context) {\n throw new Error(\n \"useRecceShareStateContext must be used within a RecceShareStateContextProvider\",\n );\n }\n return context;\n};\n","import { Flex, Spinner, Text } from \"@chakra-ui/react\";\nimport { format } from \"date-fns\";\nimport { Run } from \"@/lib/api/types\";\n\nexport function formatRunDate(date: Date | null) {\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n if (date == null) {\n return null;\n }\n\n if (today.toDateString() === date.toDateString()) {\n return \"Today\";\n } else if (yesterday.toDateString() === date.toDateString()) {\n return \"Yesterday\";\n } else {\n return format(date, \"MMM d\");\n }\n}\n\nexport function formatRunDateTime(date: Date | null) {\n const today = new Date();\n const yesterday = new Date();\n yesterday.setDate(today.getDate() - 1);\n if (date == null) {\n return null;\n }\n\n if (today.toDateString() === date.toDateString()) {\n return \"Today, \" + format(date, \"HH:mm\");\n } else if (yesterday.toDateString() === date.toDateString()) {\n return \"Yesterday, \" + format(date, \"HH:mm\");\n } else {\n return format(date, \"MMM d, HH:mm\");\n }\n}\n\nexport const RunStatusAndDate = ({ run }: { run: Run }) => {\n const isRunning = run.status === \"running\";\n\n let status = run.status;\n if (!status) {\n if (run.result) {\n status = \"finished\";\n } else if (run.error) {\n status = \"failed\";\n }\n }\n\n let color: string;\n let message: string;\n if (status === \"finished\") {\n color = \"green\";\n message = \"Finished\";\n } else if (status === \"failed\") {\n color = \"red\";\n message = \"Failed\";\n } else if (status === \"cancelled\") {\n color = \"gray\";\n message = \"Cancelled\";\n } else if (status === \"running\") {\n color = \"blue\";\n message = \"Running\";\n } else {\n color = \"green\";\n message = \"Finished\";\n }\n const dateTime = run.run_at ? formatRunDateTime(new Date(run.run_at)) : null;\n\n return (\n <Flex\n justifyContent=\"start\"\n fontSize=\"11pt\"\n color=\"gray.500\"\n gap=\"3px\"\n alignItems={\"center\"}\n overflow={\"hidden\"}\n >\n {isRunning && <Spinner size=\"xs\" color={`${color}.400`} />}\n <Text fontWeight={500} color={`${color}.400`}>\n {message}\n </Text>\n <Text>•</Text>\n <Text textOverflow={\"ellipsis\"} overflow={\"hidden\"} whiteSpace=\"nowrap\">\n {dateTime}\n </Text>\n </Flex>\n );\n};\n","import { Box, Button, Center, Flex, Heading } from \"@chakra-ui/react\";\nimport {\n FallbackRender,\n ErrorBoundary as SentryErrorBoundary,\n} from \"@sentry/react\";\nimport * as React from \"react\";\nimport { ReactNode, useState } from \"react\";\n\nconst Fallback: FallbackRender = (errorData) => {\n return (\n <Center height=\"100%\" backgroundColor=\"gray.50\">\n <Flex\n p={4}\n direction=\"column\"\n justifyContent=\"flex-start\"\n backgroundColor=\"white\"\n border=\"solid lightgray 1px\"\n minHeight=\"200px\"\n >\n <Heading width=\"800px\" size=\"md\">\n You have encountered an error\n </Heading>\n\n <Box flex=\"1\" fontSize=\"10pt\">\n {String(errorData.error)}\n </Box>\n\n <Button\n justifySelf=\"center\"\n alignSelf={\"center\"}\n mt=\"20px\"\n colorPalette=\"blue\"\n size=\"sm\"\n onClick={() => {\n errorData.resetError();\n }}\n >\n Reset\n </Button>\n </Flex>\n </Center>\n );\n};\n\n/* For testing purposes only */\n// noinspection JSUnusedGlobalSymbols\nexport const ErrorButton = () => {\n const [a, setA] = useState<{ foo: string } | undefined>({ foo: \"bar\" });\n\n return (\n <Button\n pos=\"absolute\"\n onClick={() => {\n setA(undefined);\n }}\n zIndex={1}\n >\n {a?.foo}\n </Button>\n );\n};\n\nexport const ErrorBoundary = ({\n children,\n fallback = Fallback,\n}: {\n children: ReactNode;\n fallback?: React.ReactElement | FallbackRender | undefined;\n}) => {\n return (\n <SentryErrorBoundary fallback={fallback}>{children}</SentryErrorBoundary>\n );\n};\n","import { Alert, Box, Center, Flex, Heading } from \"@chakra-ui/react\";\nimport { FallbackRender } from \"@sentry/react\";\nimport * as React from \"react\";\n\nconst ResultErrorFallback: FallbackRender = (errorData) => {\n return (\n <Alert.Root status=\"error\" title=\"You have encountered an error\">\n <Alert.Indicator />\n <Alert.Title>{String(errorData.error)}</Alert.Title>\n </Alert.Root>\n );\n};\n\nexport default ResultErrorFallback;\n","import {\n Alert,\n Box,\n Button,\n Center,\n Flex,\n ProgressCircle,\n VStack,\n} from \"@chakra-ui/react\";\nimport React, { forwardRef } from \"react\";\nimport { ErrorBoundary } from \"@/components/errorboundary/ErrorBoundary\";\nimport {\n RefTypes,\n RegistryEntry,\n ViewOptionTypes,\n} from \"@/components/run/registry\";\nimport { Run } from \"@/lib/api/types\";\nimport ResultErrorFallback from \"@/lib/result/ResultErrorFallback\";\nimport { RunResultViewProps } from \"./types\";\n\n// Define an error type\ninterface ApiError {\n response?: {\n data?: {\n detail?: string;\n };\n };\n}\n\ninterface RunViewProps<VO = ViewOptionTypes> {\n isRunning?: boolean;\n run?: Run;\n error?: Error | null;\n progress?: Run[\"progress\"];\n isAborting?: boolean;\n isCheckDetail?: boolean;\n onCancel?: () => void;\n onExecuteRun?: () => void;\n viewOptions?: VO;\n onViewOptionsChanged?: (viewOptions: VO) => void;\n RunResultView?: RegistryEntry[\"RunResultView\"] | undefined;\n children?: (params: RunResultViewProps) => React.ReactNode;\n}\n\nexport const RunView = forwardRef(\n (\n {\n isRunning,\n isAborting,\n progress,\n error,\n run,\n onCancel,\n viewOptions,\n onViewOptionsChanged,\n RunResultView,\n children,\n onExecuteRun,\n }: RunViewProps,\n ref: React.Ref<RefTypes>,\n ) => {\n const errorMessage =\n (error as ApiError | undefined)?.response?.data?.detail ?? run?.error;\n\n if (errorMessage) {\n return (\n <Alert.Root status=\"error\" title={`Error: ${errorMessage}`}>\n <Alert.Indicator />\n <Alert.Title>\n Error: <span className=\"no-track-pii-safe\">{errorMessage}</span>\n </Alert.Title>\n </Alert.Root>\n );\n }\n\n if (isRunning ?? run?.status === \"running\") {\n let loadingMessage = \"Loading...\";\n if (progress?.message) {\n loadingMessage = progress.message;\n } else if (run?.progress?.message) {\n loadingMessage = run.progress.message;\n }\n\n return (\n <Center p=\"1rem\" height=\"100%\" bg=\"rgb(249,249,249)\">\n <VStack>\n <Flex alignItems=\"center\">\n {progress?.percentage == null ? (\n <ProgressCircle.Root value={null} size=\"md\" mr=\"0.5rem\">\n <ProgressCircle.Circle />\n </ProgressCircle.Root>\n ) : (\n <ProgressCircle.Root\n value={progress.percentage * 100}\n size=\"md\"\n mr=\"0.5rem\"\n >\n <ProgressCircle.Circle />\n </ProgressCircle.Root>\n )}\n\n {isAborting ? (\n <span>Aborting...</span>\n ) : (\n <span className=\"no-track-pii-safe\">{loadingMessage}</span>\n )}\n </Flex>\n {!isAborting && (\n <Button onClick={onCancel} colorPalette=\"blue\" size=\"sm\">\n Cancel\n </Button>\n )}\n </VStack>\n </Center>\n );\n }\n\n if (!run) {\n return (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\">\n Loading...\n </Center>\n );\n }\n\n if (children && RunResultView) {\n throw new Error(\n \"RunView requires either a children or a RunResultView prop, but not both.\",\n );\n }\n if (!children && !RunResultView) {\n throw new Error(\n \"RunView requires at least one of children or RunResultView prop.\",\n );\n }\n\n return (\n <Box\n h=\"100%\"\n style={{ contain: \"layout\" }}\n overflow=\"auto\"\n className=\"no-track-pii-safe\"\n >\n {RunResultView && (run.error ?? run.result) && (\n <ErrorBoundary fallback={ResultErrorFallback}>\n <RunResultView\n ref={ref}\n run={run}\n viewOptions={viewOptions}\n onViewOptionsChanged={onViewOptionsChanged}\n />\n </ErrorBoundary>\n )}\n {children?.({ run, viewOptions, onViewOptionsChanged })}\n </Box>\n );\n },\n);\n","import {\n Button,\n CloseButton,\n Flex,\n HStack,\n Menu,\n Portal,\n Spacer,\n Tabs,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { Editor } from \"@monaco-editor/react\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { ReactNode, Ref, useCallback, useState } from \"react\";\nimport { PiCaretDown, PiCheck, PiCopy, PiRepeat } from \"react-icons/pi\";\nimport { TbCloudUpload } from \"react-icons/tb\";\nimport YAML from \"yaml\";\nimport AuthModal from \"@/components/AuthModal/AuthModal\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { createCheckByRun } from \"@/lib/api/checks\";\nimport { trackCopyToClipboard, trackShareState } from \"@/lib/api/track\";\nimport {\n AxiosQueryParams,\n isQueryBaseRun,\n isQueryDiffRun,\n isQueryRun,\n RunParamTypes,\n} from \"@/lib/api/types\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceShareStateContext } from \"@/lib/hooks/RecceShareStateContext\";\nimport { useCopyToClipboardButton } from \"@/lib/hooks/ScreenShot\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { useRun } from \"@/lib/hooks/useRun\";\nimport {\n LearnHowLink,\n RecceNotification,\n} from \"../onboarding-guide/Notification\";\nimport SqlEditor, { DualSqlEditor } from \"../query/SqlEditor\";\nimport { RunStatusAndDate } from \"./RunStatusAndDate\";\nimport { RunView } from \"./RunView\";\nimport {\n findByRunType,\n RefTypes,\n RegistryEntry,\n runTypeHasRef,\n ViewOptionTypes,\n} from \"./registry\";\n\ninterface RunPageProps {\n onClose?: () => void;\n disableAddToChecklist?: boolean;\n isSingleEnvironment?: boolean;\n}\n\nconst _ParamView = (data: { type: string; params: RunParamTypes }) => {\n const yaml = YAML.stringify(data, null, 2);\n\n return (\n <Editor\n className=\"no-track-pii-safe\"\n height=\"100%\"\n language=\"yaml\"\n theme=\"vs\"\n value={yaml}\n options={{\n extraEditorClassName: \"no-track-pii-safe\",\n readOnly: true,\n fontSize: 14,\n lineNumbers: \"off\",\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: \"on\",\n wrappingIndent: \"same\",\n scrollBeyondLastLine: false,\n }}\n />\n );\n};\n\nconst SingleEnvironmentSetupNotification = ({\n runType,\n}: {\n runType?: string;\n}) => {\n const { open, onClose } = useDisclosure({ defaultOpen: true });\n\n if (!open) {\n return <></>;\n }\n switch (runType) {\n case \"row_count\":\n return (\n <RecceNotification onClose={onClose}>\n <Text>\n Enable row count diffing, and other Recce features, by configuring a\n base dbt environment to compare against. <LearnHowLink />\n </Text>\n </RecceNotification>\n );\n case \"profile\":\n return (\n <RecceNotification onClose={onClose}>\n <Text>\n Enable data-profile diffing, and other Recce features, by\n configuring a base dbt environment to compare against.{\" \"}\n <LearnHowLink />\n </Text>\n </RecceNotification>\n );\n default:\n return <></>;\n }\n};\n\nconst RunResultShareMenu = ({\n disableCopyToClipboard,\n onCopyToClipboard,\n onMouseEnter,\n onMouseLeave,\n}: {\n disableCopyToClipboard: boolean;\n onCopyToClipboard: () => Promise<void>;\n onMouseEnter: () => void;\n onMouseLeave: () => void;\n}) => {\n const { authed } = useRecceInstanceContext();\n const { handleShareClick } = useRecceShareStateContext();\n const [showModal, setShowModal] = useState(false);\n\n return (\n <>\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button size=\"xs\" variant=\"outline\" colorPalette=\"gray\">\n Share <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content minW=\"0\">\n <Menu.Item\n value=\"copy-to-clipboard\"\n onClick={onCopyToClipboard}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n disabled={disableCopyToClipboard}\n >\n <PiCopy /> Copy to Clipboard\n </Menu.Item>\n <Menu.Separator />\n {authed ? (\n <Menu.Item\n value=\"share-to-cloud\"\n onClick={async () => {\n await handleShareClick();\n trackShareState({ name: \"create\" });\n }}\n >\n <TbCloudUpload /> Share to Cloud\n </Menu.Item>\n ) : (\n <>\n <Menu.Item\n value=\"share\"\n onClick={() => {\n setShowModal(true);\n }}\n >\n <TbCloudUpload /> Share\n </Menu.Item>\n </>\n )}\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n {showModal && (\n <AuthModal\n parentOpen={showModal}\n handleParentClose={setShowModal}\n ignoreCookie\n variant=\"enable-share\"\n />\n )}\n </>\n );\n};\n\ntype TabValueItems = \"result\" | \"params\" | \"query\";\n\nexport const PrivateLoadableRunView = ({\n runId,\n onClose,\n isSingleEnvironment,\n}: {\n runId?: string;\n onClose?: () => void;\n isSingleEnvironment?: boolean;\n}) => {\n const { featureToggles } = useRecceInstanceContext();\n const { runAction } = useRecceActionContext();\n const { error, run, onCancel, isRunning } = useRun(runId);\n const [viewOptions, setViewOptions] = useState<ViewOptionTypes>();\n const [tabValue, setTabValue] = useState<TabValueItems>(\"result\");\n const _disableAddToChecklist = isSingleEnvironment;\n const showSingleEnvironmentSetupNotification = isSingleEnvironment;\n\n let RunResultView: RegistryEntry[\"RunResultView\"] | undefined;\n if (run && runTypeHasRef(run.type)) {\n RunResultView = findByRunType(run.type)\n .RunResultView as RegistryEntry[\"RunResultView\"];\n }\n\n const handleRerun = useCallback(() => {\n if (run) {\n runAction(run.type, run.params as unknown as AxiosQueryParams);\n }\n }, [run, runAction]);\n\n const isQuery =\n run?.type === \"query\" ||\n run?.type === \"query_diff\" ||\n run?.type === \"query_base\";\n const { ref, onCopyToClipboard, onMouseEnter, onMouseLeave } =\n useCopyToClipboardButton();\n const disableCopyToClipboard =\n !runId || !run?.result || !!error || tabValue !== \"result\";\n\n return (\n <Flex direction=\"column\">\n {showSingleEnvironmentSetupNotification && (\n <SingleEnvironmentSetupNotification runType={run?.type} />\n )}\n <Tabs.Root\n size=\"lg\"\n colorPalette=\"iochmara\"\n value={tabValue}\n onValueChange={(e) => {\n setTabValue(e.value as TabValueItems);\n }}\n flexDirection=\"column\"\n mb=\"1px\"\n >\n <Tabs.List>\n <Tabs.Trigger value=\"result\">Result</Tabs.Trigger>\n <Tabs.Trigger value=\"params\">Params</Tabs.Trigger>\n {isQuery && <Tabs.Trigger value=\"query\">Query</Tabs.Trigger>}\n <Spacer />\n <HStack overflow=\"hidden\">\n {run && <RunStatusAndDate run={run} />}\n <Button\n variant=\"outline\"\n colorPalette=\"gray\"\n disabled={\n !runId || isRunning || featureToggles.disableDatabaseQuery\n }\n size=\"xs\"\n onClick={handleRerun}\n >\n <PiRepeat /> Rerun\n </Button>\n {featureToggles.disableShare ? (\n <Button\n variant=\"outline\"\n disabled={\n !runId || !run?.result || !!error || tabValue !== \"result\"\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n size=\"sm\"\n onClick={onCopyToClipboard}\n >\n <PiCopy /> Copy to Clipboard\n </Button>\n ) : (\n <RunResultShareMenu\n disableCopyToClipboard={disableCopyToClipboard}\n onCopyToClipboard={async () => {\n await onCopyToClipboard();\n trackCopyToClipboard({\n type: run?.type ?? \"unknown\",\n from: \"run\",\n });\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n />\n )}\n\n <AddToCheckButton\n runId={runId}\n viewOptions={viewOptions as Record<string, unknown>}\n />\n\n <CloseButton\n size=\"sm\"\n onClick={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </HStack>\n </Tabs.List>\n </Tabs.Root>\n {tabValue === \"result\" && (\n <RunView\n ref={ref as unknown as Ref<RefTypes>}\n error={error}\n run={run}\n onCancel={onCancel}\n viewOptions={viewOptions}\n onViewOptionsChanged={setViewOptions}\n RunResultView={RunResultView}\n />\n )}\n\n {tabValue === \"params\" && run && (\n <_ParamView type={run.type} params={run.params} />\n )}\n\n {tabValue === \"query\" &&\n run &&\n run.params &&\n (isQueryRun(run) || isQueryBaseRun(run) || isQueryDiffRun(run)) &&\n (isQueryDiffRun(run) ? (\n <DualSqlEditor\n value={run.params.sql_template}\n baseValue={run.params.base_sql_template}\n options={{ readOnly: true }}\n />\n ) : (\n <SqlEditor\n value={run.params.sql_template}\n options={{ readOnly: true }}\n />\n ))}\n </Flex>\n );\n};\n\nexport const RunResultPane = ({\n onClose,\n isSingleEnvironment,\n}: RunPageProps) => {\n const { runId } = useRecceActionContext();\n\n return (\n <PrivateLoadableRunView\n runId={runId}\n onClose={onClose}\n isSingleEnvironment={isSingleEnvironment}\n />\n );\n};\n\ninterface AddToCheckButtonProps {\n runId?: string;\n viewOptions: Record<string, unknown>;\n}\n\nfunction AddToCheckButton({\n runId,\n viewOptions,\n}: AddToCheckButtonProps): ReactNode {\n const { featureToggles } = useRecceInstanceContext();\n const { error, run } = useRun(runId);\n const queryClient = useQueryClient();\n const [, setLocation] = useAppLocation();\n\n const checkId = run?.check_id;\n\n const handleGoToCheck = useCallback(() => {\n if (!checkId) {\n return;\n }\n\n setLocation(`/checks/?id=${checkId}`);\n }, [checkId, setLocation]);\n\n const handleAddToChecklist = useCallback(async () => {\n if (!runId) {\n return;\n }\n const check = await createCheckByRun(runId, viewOptions);\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(`/checks/?id=${check.check_id}`);\n }, [runId, setLocation, queryClient, viewOptions]);\n\n if (featureToggles.disableUpdateChecklist) {\n return <></>;\n }\n if (run?.check_id) {\n return (\n <Button\n disabled={!runId || !run.result || !!error}\n size=\"sm\"\n colorPalette=\"iochmara\"\n onClick={handleGoToCheck}\n >\n <PiCheck /> Go to Check\n </Button>\n );\n }\n return (\n <Button\n disabled={!runId || !run?.result || !!error}\n size=\"xs\"\n colorPalette=\"iochmara\"\n onClick={handleAddToChecklist}\n >\n <PiCheck /> Add to Checklist\n </Button>\n );\n}\n","import {\n Badge,\n Box,\n Button,\n CloseButton,\n Dialog,\n Flex,\n Heading,\n Icon,\n IconButton,\n Image,\n Portal,\n Spacer,\n Stack,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { DiffEditor } from \"@monaco-editor/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { editor } from \"monaco-editor\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { AiOutlineExperiment } from \"react-icons/ai\";\nimport { VscFeedback } from \"react-icons/vsc\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { QueryParams, submitQueryDiff } from \"@/lib/api/adhocQuery\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { localStorageKeys } from \"@/lib/api/localStorageKeys\";\nimport { SubmitOptions, waitRun } from \"@/lib/api/runs\";\nimport {\n trackPreviewChange,\n trackPreviewChangeFeedback,\n trackSingleEnvironment,\n} from \"@/lib/api/track\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceQueryContext } from \"@/lib/hooks/RecceQueryContext\";\nimport { useFeedbackCollectionToast } from \"@/lib/hooks/useFeedbackCollectionToast\";\nimport { useGuideToast } from \"@/lib/hooks/useGuideToast\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport { formatTimestamp } from \"../app/EnvInfo\";\nimport { QueryForm } from \"../query/QueryForm\";\nimport { RunResultPane } from \"../run/RunResultPane\";\nimport { VSplit } from \"../split/Split\";\n\ninterface SandboxViewProps {\n isOpen: boolean;\n onClose: () => void;\n current?: NodeData;\n height?: string;\n}\n\nfunction SandboxTopBar({\n current,\n primaryKeys,\n setPrimaryKeys,\n onRunResultOpen,\n runQuery,\n isPending,\n}: {\n current?: NodeData;\n primaryKeys: string[];\n setPrimaryKeys: (primaryKeys: string[]) => void;\n onRunResultOpen: () => void;\n runQuery: () => void;\n isPending: boolean;\n}) {\n return (\n <Flex\n justifyContent=\"right\"\n alignItems=\"center\"\n padding=\"4pt 8pt\"\n gap=\"5px\"\n height=\"54px\"\n borderBottom=\"1px solid lightgray\"\n flex=\"0 0 54px\"\n >\n <Box>\n <Heading as=\"h2\" size=\"md\" display=\"flex\" alignItems=\"center\" gap=\"5px\">\n <Icon as={AiOutlineExperiment} boxSize=\"1.2em\" />\n Sandbox\n </Heading>\n <Text fontSize=\"xs\" color=\"gray.500\">\n Compare the run results based on the modified SQL code of model{\" \"}\n <b>{current?.name}</b>\n </Text>\n </Box>\n <Spacer />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={setPrimaryKeys}\n />\n <Tooltip content=\"Run diff to see the changes\">\n <Button\n size=\"xs\"\n marginTop={\"16px\"}\n fontSize=\"14px\"\n onClick={() => {\n onRunResultOpen();\n runQuery();\n }}\n colorPalette=\"blue\"\n loading={isPending}\n >\n Run Diff\n </Button>\n </Tooltip>\n </Flex>\n );\n}\nfunction SandboxEditorLabels({\n currentModelID,\n height = \"32px\",\n flex = \"0 0 auto\",\n}: {\n currentModelID: string;\n height?: string;\n flex?: string;\n}) {\n const { lineageGraph, envInfo } = useLineageGraphContext();\n const widthOfBar = \"50%\";\n const margin = \"0 16px\";\n\n const currentTime = formatTimestamp(\n envInfo?.dbt?.current?.generated_at ?? \"\",\n );\n const latestUpdateDistanceToNow = formatDistanceToNow(currentTime, {\n addSuffix: true,\n });\n let schema = \"N/A\";\n if (lineageGraph?.nodes[currentModelID]) {\n const value = lineageGraph.nodes[currentModelID];\n if (value.data.data.current?.schema) {\n schema = value.data.data.current.schema;\n }\n }\n\n return (\n <Flex\n gap={0}\n height={height}\n flex={flex}\n fontSize={\"14px\"}\n align=\"center\"\n margin={\"0\"}\n backgroundColor=\"#EDF2F880\"\n >\n <Stack width={widthOfBar}>\n <Text as=\"b\" margin={margin}>\n ORIGINAL (Schema: {schema}, Last Updated: {latestUpdateDistanceToNow})\n </Text>\n </Stack>\n <Stack width={widthOfBar}>\n <Text as=\"b\" margin={margin}>\n SANDBOX EDITOR\n </Text>\n </Stack>\n </Flex>\n );\n}\n\ninterface UseDiffEditorSync {\n onMount: (editor: editor.IStandaloneDiffEditor) => void;\n}\n\nfunction useDiffEditorSync(\n value: string,\n onChange: (value: string) => void,\n): UseDiffEditorSync {\n const editorRef = useRef<editor.IStandaloneCodeEditor | null>(null);\n\n useEffect(() => {\n if (editorRef.current && value !== editorRef.current.getValue()) {\n editorRef.current.setValue(value);\n }\n }, [value]);\n\n return {\n onMount(editor: editor.IStandaloneDiffEditor) {\n const modified = editor.getModifiedEditor();\n editorRef.current = modified;\n\n modified.onDidChangeModelContent(() => {\n onChange(modified.getValue());\n });\n },\n };\n}\n\ninterface SqlPreviewProps {\n current?: NodeData;\n onChange: (value: string) => void;\n}\n\nfunction SqlPreview({ current, onChange }: SqlPreviewProps) {\n const diffEditorSync = useDiffEditorSync(current?.raw_code ?? \"\", onChange);\n\n return (\n <Box flex={1} overflowY={\"auto\"}>\n <DiffEditor\n language=\"sql\"\n theme=\"vs\"\n original={current?.raw_code}\n modified={current?.raw_code}\n options={{\n readOnly: false,\n fontSize: 14,\n lineNumbers: \"on\",\n automaticLayout: true,\n renderOverviewRuler: false,\n minimap: { enabled: true },\n }}\n onMount={diffEditorSync.onMount}\n />\n </Box>\n );\n}\n\nexport function SandboxView({ isOpen, onClose, current }: SandboxViewProps) {\n const {\n open: isRunResultOpen,\n onClose: onRunResultClose,\n onOpen: onRunResultOpen,\n } = useDisclosure();\n const [modifiedCode, setModifiedCode] = useState<string>(\n current?.raw_code ?? \"\",\n );\n const [prevIsOpen, setPrevIsOpen] = useState(isOpen);\n const { showRunId, clearRunResult } = useRecceActionContext();\n const { primaryKeys, setPrimaryKeys } = useRecceQueryContext();\n const { data: flags, isLoading } = useRecceServerFlag();\n\n const queryFn = async () => {\n const sqlTemplate = modifiedCode;\n const runFn = submitQueryDiff;\n const params: QueryParams = {\n current_model: current?.name ?? \"\",\n primary_keys: primaryKeys,\n sql_template: sqlTemplate,\n };\n const options: SubmitOptions = { nowait: true };\n\n const { run_id } = await runFn(params, options);\n\n showRunId(run_id);\n\n return await waitRun(run_id);\n };\n\n const { mutate: runQuery, isPending } = useMutation({\n mutationFn: queryFn,\n onSuccess(data) {\n if (data.error) {\n trackPreviewChange({\n action: \"run\",\n node: current?.name,\n status: \"failure\",\n });\n } else {\n trackPreviewChange({\n action: \"run\",\n node: current?.name,\n status: \"success\",\n });\n setTimeout(() => {\n feedbackToast();\n }, 1000);\n if (!isLoading && flags?.single_env_onboarding) {\n setTimeout(() => {\n prepareEnvToast();\n }, 2000);\n }\n }\n },\n });\n\n const { feedbackToast, closeToast } = useFeedbackCollectionToast({\n feedbackId: localStorageKeys.previewChangeFeedbackID,\n description: \"Enjoy preview change?\",\n\n onFeedbackSubmit: (feedback: string) => {\n switch (feedback) {\n case \"like\":\n trackPreviewChangeFeedback({ feedback: \"like\", node: current?.name });\n break;\n case \"dislike\":\n trackPreviewChangeFeedback({\n feedback: \"dislike\",\n node: current?.name,\n });\n break;\n case \"link\":\n trackPreviewChangeFeedback({ feedback: \"form\", node: current?.name });\n break;\n default:\n console.log(\"Not support feedback type\");\n }\n },\n externalLink:\n \"https://docs.google.com/forms/d/e/1FAIpQLSd7Lei7Ijwo7MinWaI0K6rzZi_21gV1BKetmiNEX254kDziDA/viewform?usp=header\",\n externalLinkText: \"Give us feedback\",\n });\n\n const { guideToast: prepareEnvToast, closeGuideToast } = useGuideToast({\n guideId: localStorageKeys.prepareEnvGuideID,\n description: \"Want to compare data changes with production data?\",\n externalLink:\n \"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\",\n externalLinkText: \"Learn how.\",\n onExternalLinkClick: () => {\n trackSingleEnvironment({\n action: \"external_link\",\n from: \"preview_changes\",\n node: current?.name,\n });\n },\n });\n\n // Reset modifiedCode when modal opens (during render)\n if (isOpen !== prevIsOpen) {\n setPrevIsOpen(isOpen);\n if (isOpen) {\n // Modal just opened, reset to original code\n setModifiedCode(current?.raw_code ?? \"\");\n }\n }\n\n return (\n <Dialog.Root\n open={isOpen}\n size=\"cover\"\n onOpenChange={() => {\n onClose();\n onRunResultClose();\n clearRunResult();\n closeToast();\n closeGuideToast();\n trackPreviewChange({ action: \"close\", node: current?.name });\n }}\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content height={\"100%\"}>\n <Dialog.Header height={\"40px\"} bg=\"rgb(77, 209, 176)\" px={0} py={4}>\n <Flex alignItems=\"center\" height={\"100%\"} gap={\"10px\"}>\n <Image\n boxSize=\"20px\"\n ml=\"18px\"\n src=\"/logo/recce-logo-white.png\"\n alt=\"recce-logo-white\"\n />\n <Dialog.Title\n as=\"h1\"\n fontFamily={`\"Montserrat\", sans-serif`}\n fontSize=\"lg\"\n color=\"white\"\n >\n RECCE\n </Dialog.Title>\n <Badge fontSize=\"sm\" color=\"white/80\" variant=\"outline\">\n Experiment\n </Badge>\n </Flex>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Header>\n <Dialog.Body p={0}>\n <VSplit\n sizes={isRunResultOpen ? [50, 50] : [100, 0]}\n minSize={isRunResultOpen ? 100 : 0}\n gutterSize={isRunResultOpen ? 5 : 0}\n style={{\n flex: \"1\",\n contain: \"size\",\n height: \"100%\",\n }}\n >\n <Flex direction=\"column\" height=\"100%\" m={0} p={0}>\n <SandboxTopBar\n current={current}\n primaryKeys={primaryKeys ?? []}\n setPrimaryKeys={setPrimaryKeys}\n onRunResultOpen={onRunResultOpen}\n runQuery={runQuery}\n isPending={isPending}\n />\n <SandboxEditorLabels\n height=\"32pxs\"\n flex=\"0 0 auto\"\n currentModelID={current?.id ?? \"\"}\n />\n <SqlPreview current={current} onChange={setModifiedCode} />\n </Flex>\n {isRunResultOpen ? (\n <RunResultPane\n onClose={onRunResultClose}\n disableAddToChecklist\n />\n ) : (\n <Box></Box>\n )}\n </VSplit>\n </Dialog.Body>\n {/* Fixed position button */}\n <Box position=\"fixed\" bottom=\"4\" right=\"4\" opacity={0.5}>\n <Tooltip content=\"Give us feedback\">\n <IconButton\n aria-label=\"feedback\"\n variant=\"ghost\"\n size=\"md\"\n onClick={() => {\n feedbackToast(true);\n }}\n >\n <VscFeedback />\n </IconButton>\n </Tooltip>\n </Box>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n}\n","import {\n Box,\n Button,\n CloseButton,\n Grid,\n Heading,\n HStack,\n Icon,\n Menu,\n Portal,\n Spacer,\n Tabs,\n Text,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport { useCallback } from \"react\";\nimport { PiCaretDown } from \"react-icons/pi\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { DisableTooltipMessages } from \"@/constants/tooltipMessage\";\nimport { createSchemaDiffCheck } from \"@/lib/api/schemacheck\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n trackExploreAction,\n trackPreviewChange,\n} from \"@/lib/api/track\";\nimport { formatSelectColumns } from \"@/lib/formatSelect\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceQueryContext } from \"@/lib/hooks/RecceQueryContext\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport useModelColumns from \"@/lib/hooks/useModelColumns\";\nimport {\n LearnHowLink,\n RecceNotification,\n} from \"../onboarding-guide/Notification\";\nimport { findByRunType } from \"../run/registry\";\nimport { SchemaView, SingleEnvSchemaView } from \"../schema/SchemaView\";\nimport { LineageGraphNode } from \"./lineage\";\nimport { NodeSqlView } from \"./NodeSqlView\";\nimport { ResourceTypeTag, RowCountDiffTag, RowCountTag } from \"./NodeTag\";\nimport { SandboxView } from \"./SandboxView\";\n\ninterface NodeViewProps {\n node: LineageGraphNode;\n onCloseNode: () => void;\n}\n\nexport function NodeView({ node, onCloseNode }: NodeViewProps) {\n const withColumns =\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"source\" ||\n node.data.resourceType === \"snapshot\";\n\n const {\n open: isSandboxOpen,\n onOpen: onSandboxOpen,\n onClose: onSandboxClose,\n } = useDisclosure();\n const { open: isNotificationOpen, onClose: onNotificationClose } =\n useDisclosure({\n defaultOpen: true,\n });\n const { runAction } = useRecceActionContext();\n const { isActionAvailable } = useLineageGraphContext();\n\n const refetchRowCount = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT,\n source: EXPLORE_SOURCE.SCHEMA_ROW_COUNT_BUTTON,\n node_count: 1,\n });\n runAction(\n \"row_count\",\n { node_names: [node.data.name] },\n { showForm: false, showLast: false },\n );\n };\n const refetchRowCountDiff = () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT_DIFF,\n source: EXPLORE_SOURCE.SCHEMA_ROW_COUNT_BUTTON,\n node_count: 1,\n });\n runAction(\n \"row_count_diff\",\n { node_names: [node.data.name] },\n { showForm: false, showLast: false },\n );\n };\n const { singleEnv: isSingleEnvOnboarding } = useRecceInstanceContext();\n\n const disableReason = (isAddedOrRemoved: boolean, runType: string) => {\n if (isAddedOrRemoved) {\n return DisableTooltipMessages.add_or_remove;\n }\n if (!isActionAvailable(runType)) {\n return \"This action is not supported yet.\";\n }\n return \"\";\n };\n\n const baseColumns = Object.keys(node.data.data.base?.columns ?? {});\n const currentColumns = Object.keys(node.data.data.current?.columns ?? {});\n\n return (\n <Grid height=\"100%\" templateRows=\"auto auto 1fr\">\n <HStack>\n <Box flex=\"0 1 20%\" p=\"16px\">\n <Heading size=\"sm\" className=\"no-track-pii-safe\">\n {node.data.name}\n </Heading>\n </Box>\n <Spacer />\n {isSingleEnvOnboarding ? (\n <SingleEnvironmentMenuButton\n node={node}\n baseColumns={baseColumns}\n currentColumns={currentColumns}\n refetchRowCount={refetchRowCount}\n disableReason={disableReason}\n />\n ) : (\n <ExploreChangeMenuButton\n node={node}\n baseColumns={baseColumns}\n currentColumns={currentColumns}\n disableReason={disableReason}\n refetchRowCountDiff={refetchRowCountDiff}\n onSandboxOpen={onSandboxOpen}\n />\n )}\n\n <Box flex=\"0 1 1%\">\n <CloseButton size=\"2xs\" onClick={onCloseNode} />\n </Box>\n </HStack>\n <Box color=\"gray\" paddingLeft={\"16px\"}>\n <HStack gap={\"8px\"}>\n <ResourceTypeTag node={node} />\n {(node.data.resourceType === \"model\" ||\n node.data.resourceType === \"snapshot\" ||\n node.data.resourceType === \"seed\") &&\n (isSingleEnvOnboarding ? (\n <RowCountTag node={node} onRefresh={refetchRowCount} />\n ) : (\n <RowCountDiffTag node={node} onRefresh={refetchRowCountDiff} />\n ))}\n </HStack>\n </Box>\n {withColumns && (\n <Tabs.Root defaultValue=\"columns\" overflow=\"auto\">\n {isSingleEnvOnboarding && isNotificationOpen && (\n <Box p=\"12px\">\n <RecceNotification\n onClose={onNotificationClose}\n align={\"flex-start\"}\n >\n <Text>\n Enable the Recce Checklist and start adding checks for better\n data validation and review.\n <br />\n <LearnHowLink />\n </Text>\n </RecceNotification>\n </Box>\n )}\n <Tabs.List>\n <Tabs.Trigger value=\"columns\">Columns</Tabs.Trigger>\n <Tabs.Trigger value=\"code\">Code</Tabs.Trigger>\n </Tabs.List>\n <Tabs.ContentGroup overflow=\"auto\" height=\"calc(100% - 42px)\">\n <Tabs.Content value=\"columns\" p={0} overflowY=\"auto\" height=\"100%\">\n {isSingleEnvOnboarding ? (\n <SingleEnvSchemaView current={node.data.data.current} />\n ) : (\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n />\n )}\n </Tabs.Content>\n <Tabs.Content value=\"code\" height=\"100%\" p={0}>\n <NodeSqlView node={node} />\n </Tabs.Content>\n </Tabs.ContentGroup>\n </Tabs.Root>\n )}\n <SandboxView\n isOpen={isSandboxOpen}\n onClose={onSandboxClose}\n current={node.data.data.current}\n />\n </Grid>\n );\n}\n\ninterface SingleEnvironmentMenuButtonProps {\n node: LineageGraphNode;\n baseColumns: string[];\n currentColumns: string[];\n refetchRowCount: () => void;\n disableReason: (isAddedOrRemoved: boolean, runType: string) => string;\n}\n\nfunction SingleEnvironmentMenuButton({\n node,\n baseColumns,\n currentColumns,\n refetchRowCount,\n disableReason,\n}: SingleEnvironmentMenuButtonProps) {\n const [, setLocation] = useAppLocation();\n const { setSqlQuery } = useRecceQueryContext();\n const { runAction } = useRecceActionContext();\n const { envInfo } = useLineageGraphContext();\n const isAddedOrRemoved =\n node.data.changeStatus === \"added\" || node.data.changeStatus === \"removed\";\n\n const formattedColumns = formatSelectColumns(baseColumns, currentColumns);\n let query = `select * from {{ ref(\"${node.data.name}\") }}`;\n if (formattedColumns.length) {\n query = `select \\n ${formattedColumns.join(\"\\n \")}\\nfrom {{ ref(\"${node.data.name}\") }}`;\n }\n if (\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"snapshot\"\n ) {\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button size=\"xs\" variant=\"outline\">\n Explore <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <Menu.Item\n value=\"label\"\n fontSize=\"14px\"\n onClick={() => {\n if (envInfo?.adapterType === \"dbt\") {\n setSqlQuery(query);\n } else if (envInfo?.adapterType === \"sqlmesh\") {\n setSqlQuery(`select * from ${node.data.name}`);\n }\n setLocation(\"/query\");\n }}\n >\n <Icon as={findByRunType(\"query\").icon} /> Query\n </Menu.Item>\n <Menu.Item\n value=\"row-count\"\n fontSize=\"14px\"\n onClick={() => {\n refetchRowCount();\n }}\n >\n <Icon as={findByRunType(\"row_count\").icon} /> Row Count\n </Menu.Item>\n <Tooltip\n content={disableReason(isAddedOrRemoved, \"profile\")}\n positioning={{ placement: \"left\" }}\n >\n <Menu.Item\n value=\"profile\"\n fontSize=\"14px\"\n disabled={isAddedOrRemoved}\n onClick={() => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_SINGLE_ENV,\n node_count: 1,\n });\n runAction(\n \"profile\",\n {\n model: node.data.name,\n },\n { showForm: true, showLast: false },\n );\n }}\n >\n <Icon as={findByRunType(\"profile\").icon} /> Profile\n </Menu.Item>\n </Tooltip>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n } else {\n return <></>;\n }\n}\n\ninterface ExploreChangeMenuButtonProps {\n node: LineageGraphNode;\n baseColumns: string[];\n currentColumns: string[];\n disableReason: (isAddedOrRemoved: boolean, runType: string) => string;\n onSandboxOpen: () => void;\n refetchRowCountDiff: () => void;\n}\n\nfunction ExploreChangeMenuButton({\n node,\n baseColumns,\n currentColumns,\n disableReason,\n onSandboxOpen,\n refetchRowCountDiff,\n}: ExploreChangeMenuButtonProps) {\n const [, setLocation] = useAppLocation();\n const { runAction } = useRecceActionContext();\n const { setSqlQuery, setPrimaryKeys } = useRecceQueryContext();\n const { envInfo, isActionAvailable } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n const { primaryKey } = useModelColumns(node.data.name);\n\n const metadataOnly = featureToggles.mode === \"metadata only\";\n const isAddedOrRemoved =\n node.data.changeStatus === \"added\" || node.data.changeStatus === \"removed\";\n\n const addSchemaCheck = useCallback(async () => {\n const nodeId = node.id;\n const check = await createSchemaDiffCheck({ node_id: nodeId });\n setLocation(`/checks/?id=${check.check_id}`);\n }, [node, setLocation]);\n\n const formattedColumns = formatSelectColumns(baseColumns, currentColumns);\n let query = `select * from {{ ref(\"${node.data.name}\") }}`;\n if (formattedColumns.length) {\n query = `select \\n ${formattedColumns.join(\"\\n \")}\\nfrom {{ ref(\"${node.data.name}\") }}`;\n }\n\n const wrapMenuItem = (\n children: React.ReactElement<{\n ref?: React.Ref<HTMLElement>;\n [key: string]: unknown;\n }>,\n runType: string,\n ) => {\n if (metadataOnly) {\n return (\n <SetupConnectionPopover display={true}>\n {children}\n </SetupConnectionPopover>\n );\n }\n\n const tooltipContent = disableReason(isAddedOrRemoved, runType);\n return (\n <Tooltip\n disabled={tooltipContent === \"\"}\n content={tooltipContent}\n positioning={{ placement: \"left\" }}\n >\n {children}\n </Tooltip>\n );\n };\n\n if (\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"snapshot\"\n ) {\n return (\n <Menu.Root>\n <Menu.Trigger asChild>\n <Button\n size=\"2xs\"\n variant=\"outline\"\n disabled={featureToggles.disableNodeActionDropdown}\n >\n Explore <PiCaretDown />\n </Button>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n <SetupConnectionPopover display={metadataOnly}>\n <Menu.Item\n value=\"query\"\n fontSize=\"14px\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={() => {\n if (envInfo?.adapterType === \"dbt\") {\n setSqlQuery(query);\n } else if (envInfo?.adapterType === \"sqlmesh\") {\n setSqlQuery(`select * from ${node.data.name}`);\n }\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n // Only set primary key if the action is available\n setPrimaryKeys(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n setLocation(\"/query\");\n }}\n >\n <Icon as={findByRunType(\"query_diff\").icon} /> Query\n </Menu.Item>\n </SetupConnectionPopover>\n <SetupConnectionPopover display={metadataOnly}>\n <Menu.Item\n value=\"sandbox\"\n fontSize=\"14px\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={() => {\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n // Only set primary key if the action is available\n setPrimaryKeys(\n primaryKey !== undefined ? [primaryKey] : undefined,\n );\n }\n onSandboxOpen();\n trackPreviewChange({\n action: \"explore\",\n node: node.data.name,\n });\n }}\n >\n <Icon as={findByRunType(\"sandbox\").icon} /> Sandbox\n (Experiment)\n </Menu.Item>\n </SetupConnectionPopover>\n <Menu.Separator />\n <Menu.ItemGroup m=\"0\" p=\"0\">\n <Menu.ItemGroupLabel>Diff</Menu.ItemGroupLabel>\n <SetupConnectionPopover display={metadataOnly}>\n <Menu.Item\n value=\"row-count-diff\"\n fontSize=\"14px\"\n disabled={featureToggles.disableDatabaseQuery}\n onClick={() => {\n refetchRowCountDiff();\n }}\n >\n <Icon as={findByRunType(\"row_count_diff\").icon} /> Row Count\n Diff\n </Menu.Item>\n </SetupConnectionPopover>\n {wrapMenuItem(\n <Menu.Item\n value=\"profile-diff\"\n fontSize=\"14px\"\n disabled={\n isAddedOrRemoved || featureToggles.disableDatabaseQuery\n }\n onClick={() => {\n trackExploreAction({\n action: EXPLORE_ACTION.PROFILE_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"profile_diff\",\n {\n model: node.data.name,\n },\n { showForm: true, showLast: false },\n );\n }}\n >\n <Icon as={findByRunType(\"profile_diff\").icon} /> Profile\n Diff\n </Menu.Item>,\n \"profile_diff\",\n )}\n {wrapMenuItem(\n <Menu.Item\n value=\"value-diff\"\n fontSize=\"14px\"\n disabled={\n isAddedOrRemoved || featureToggles.disableDatabaseQuery\n }\n onClick={() => {\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"value_diff\",\n {\n model: node.data.name,\n },\n { showForm: true, showLast: false },\n );\n }}\n >\n <Icon as={findByRunType(\"value_diff\").icon} /> Value Diff\n </Menu.Item>,\n \"value_diff\",\n )}\n {wrapMenuItem(\n <Menu.Item\n value=\"top-k-diff\"\n fontSize=\"14px\"\n disabled={\n isAddedOrRemoved || featureToggles.disableDatabaseQuery\n }\n onClick={() => {\n trackExploreAction({\n action: EXPLORE_ACTION.TOP_K_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"top_k_diff\",\n { model: node.data.name, column_name: \"\", k: 50 },\n { showForm: true },\n );\n }}\n >\n <Icon as={findByRunType(\"top_k_diff\").icon} /> Top-K Diff\n </Menu.Item>,\n \"top_k_diff\",\n )}\n {wrapMenuItem(\n <Menu.Item\n value=\"histogram-diff\"\n fontSize=\"14px\"\n disabled={\n isAddedOrRemoved || featureToggles.disableDatabaseQuery\n }\n onClick={() => {\n trackExploreAction({\n action: EXPLORE_ACTION.HISTOGRAM_DIFF,\n source: EXPLORE_SOURCE.NODE_SIDEBAR_MULTI_ENV,\n node_count: 1,\n });\n runAction(\n \"histogram_diff\",\n {\n model: node.data.name,\n column_name: \"\",\n column_type: \"\",\n },\n { showForm: true },\n );\n }}\n >\n <Icon as={findByRunType(\"histogram_diff\").icon} /> Histogram\n Diff\n </Menu.Item>,\n \"histogram_diff\",\n )}\n </Menu.ItemGroup>\n <Menu.Separator />\n <Menu.ItemGroup m=\"0\" p=\"4px 12px\">\n <Menu.ItemGroupLabel>Add to Checklist</Menu.ItemGroupLabel>\n <Menu.Item\n value=\"schema-diff\"\n fontSize=\"14px\"\n onClick={() => {\n void addSchemaCheck();\n }}\n >\n <Icon as={findByRunType(\"schema_diff\").icon} /> Schema Diff\n </Menu.Item>\n </Menu.ItemGroup>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n );\n } else {\n return <></>;\n }\n}\n","import { RECCE_SUPPORT_CALENDAR_URL } from \"@/constants/urls\";\nimport { RecceInstanceInfo } from \"@/lib/api/instanceInfo\";\n\n/**\n * Generate the settings URL based on instance info\n * @param instanceInfo - Recce instance information containing web_url and organization_name\n * @returns Absolute URL to settings page or fallback to calendar booking\n */\nexport function getSettingsUrl(instanceInfo?: RecceInstanceInfo): string {\n if (instanceInfo?.organization_name && instanceInfo.web_url) {\n // Use absolute URL from Recce Cloud\n return `${instanceInfo.web_url}/organizations/${instanceInfo.organization_name}/settings`;\n }\n // Fallback to calendar booking if not in cloud environment\n return RECCE_SUPPORT_CALENDAR_URL;\n}\n","import { Button, HStack, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { getRecceInstanceInfo } from \"@/lib/api/instanceInfo\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { getSettingsUrl } from \"@/lib/utils/urls\";\n\nexport default function SetupConnectionBanner() {\n const { featureToggles } = useRecceInstanceContext();\n const { data: instanceInfo } = useQuery({\n queryKey: cacheKeys.instanceInfo(),\n queryFn: getRecceInstanceInfo,\n });\n\n if (featureToggles.mode !== \"metadata only\") {\n return null;\n }\n\n return (\n <div className=\"flex items-center w-full px-2 py-0.5 bg-cyan-50\">\n <HStack flex=\"1\" fontSize=\"sm\" color=\"cyan.600\">\n <PiInfo />\n <Text>\n Query functions disabled without a data warehouse connection.\n </Text>\n <Button\n bgColor=\"iochmara.400\"\n size=\"2xs\"\n onClick={() => {\n window.open(getSettingsUrl(instanceInfo), \"_blank\");\n }}\n >\n Connect to Data Warehouse\n </Button>\n </HStack>\n </div>\n );\n}\n","import {\n Button,\n Flex,\n Heading,\n Icon,\n Link,\n List,\n Text,\n} from \"@chakra-ui/react\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { RiMindMap, RiTerminalBoxLine } from \"react-icons/ri\";\n\nexport function BaseEnvironmentSetupGuide() {\n return (\n <Flex\n flex=\"1\"\n h=\"100%\"\n minH={0}\n m=\"2\"\n p=\"4\"\n bg=\"blue.50\"\n borderRadius=\"lg\"\n boxShadow=\"md\"\n justifyContent={\"center\"}\n >\n <Flex w=\"80%\" direction=\"column\" overflowY=\"auto\" gap={6} px={8} pb={8}>\n <Flex direction=\"column\" alignItems={\"center\"} gap={4}>\n <Flex\n p={2}\n bg=\"white\"\n borderRadius=\"full\"\n alignItems=\"center\"\n justifyContent=\"center\"\n boxShadow=\"md\"\n >\n <Icon as={RiTerminalBoxLine} boxSize={7} color=\"blue.500\" />\n </Flex>\n <Heading mt=\"4\" size=\"lg\">\n Wait, there's more!\n </Heading>\n <Text fontSize=\"md\" textAlign=\"center\">\n Recce is currently running in{\" \"}\n <Text fontWeight=\"bold\" as=\"span\">\n limited functionality mode\n </Text>{\" \"}\n so you can run queries but{\" \"}\n <Text fontWeight=\"bold\" as=\"span\">\n can't diff the results yet!\n </Text>\n </Text>\n </Flex>\n <Flex direction=\"column\" gap={2}>\n <Text fontSize=\"md\">\n To unlock the full power of Recce, set up a base environment of dbt\n artifacts for comparison.\n </Text>\n <Text>Once configured, you'll be able to:</Text>\n <List.Root>\n <List.Item>\n <Text>Run statistical data diffs</Text>\n </List.Item>\n <List.Item>\n <Text>Run query diffs</Text>\n </List.Item>\n <List.Item>\n <Text>Save checks to your Recce Checklist</Text>\n </List.Item>\n <List.Item>\n <Text>...and more!</Text>\n </List.Item>\n </List.Root>\n <Text fontSize=\"md\">\n Take the next step toward better data impact assessment.\n </Text>\n </Flex>\n <Flex w=\"100%\" direction=\"column\" mt={6}>\n <Button\n colorPalette=\"blue\"\n size=\"lg\"\n onClick={() => {\n window.open(\n \"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\",\n \"_blank\",\n );\n }}\n >\n Start Now\n </Button>\n </Flex>\n </Flex>\n </Flex>\n );\n}\n\nexport function BaseEnvironmentSetupNotification() {\n return (\n <Flex direction=\"row\" gap=\"10px\" alignItems={\"flex-start\"}>\n <Icon as={RiMindMap} color=\"blue.500\" boxSize=\"5\" />\n <Flex direction=\"column\" gap=\"5px\">\n <Text fontWeight=\"bold\">\n Single Environment Mode{\" \"}\n <Text color=\"red\" as=\"span\">\n Limited Functionality\n </Text>\n </Text>\n\n <Text fontSize=\"sm\">\n Single Environment Mode allows you to explore your dbt project but\n won't show data comparisons between environments.\n </Text>\n <Text fontSize=\"sm\">To set up full environment comparison:</Text>\n <List.Root ps=\"4\">\n <List.Item>\n <Text fontSize=\"sm\">Run `recce debug` for setup assistance</Text>\n </List.Item>\n <List.Item>\n <Text fontSize=\"sm\">\n Visit{\" \"}\n <Link\n color=\"blue.500\"\n fontSize=\"sm\"\n fontWeight=\"medium\"\n target=\"_blank\"\n href=\"https://docs.datarecce.io/configure-diff/\"\n >\n docs\n </Link>{\" \"}\n for configuration details\n </Text>\n </List.Item>\n </List.Root>\n </Flex>\n </Flex>\n );\n}\n","import { useRef } from \"react\";\nimport { RunType } from \"@/components/run/registry\";\nimport { createLineageDiffCheck } from \"@/lib/api/lineagecheck\";\nimport { RowCountDiffParams, RowCountParams } from \"@/lib/api/rowcount\";\nimport { cancelRun, submitRun, waitRun } from \"@/lib/api/runs\";\nimport { createSchemaDiffCheck } from \"@/lib/api/schemacheck\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_SOURCE,\n trackExploreAction,\n} from \"@/lib/api/track\";\nimport { ValueDiffParams } from \"@/lib/api/valuediff\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { ActionState } from \"./LineageViewContext\";\nimport { LineageGraphNode } from \"./lineage\";\n\nconst initValue: ActionState = {\n mode: \"per_node\",\n status: \"pending\",\n completed: 0,\n total: 0,\n actions: {},\n};\n\nexport const useMultiNodesAction = (\n nodes: LineageGraphNode[],\n {\n onActionStarted,\n onActionNodeUpdated,\n onActionCompleted,\n }: {\n onActionStarted: () => void;\n onActionNodeUpdated: (node: LineageGraphNode) => void;\n onActionCompleted: () => void;\n },\n) => {\n const actionState = useRef<ActionState>({\n ...initValue,\n }).current;\n\n const { showRunId } = useRecceActionContext();\n\n const submitRunForNodes = async (\n type: RunType,\n skip: (node: LineageGraphNode) => string | undefined,\n getParams: (\n nodes: LineageGraphNode[],\n ) => RowCountParams | RowCountDiffParams,\n ) => {\n actionState.mode = \"multi_nodes\";\n actionState.actions = {};\n const mode = actionState.mode;\n const actions = actionState.actions;\n\n onActionStarted();\n actionState.status = \"running\";\n\n const candidates: LineageGraphNode[] = [];\n\n for (const node of nodes) {\n const skipReason = skip(node);\n\n if (skipReason) {\n actions[node.id] = {\n mode,\n status: \"skipped\",\n skipReason,\n };\n onActionNodeUpdated(node);\n } else {\n actions[node.id] = { mode, status: \"pending\" };\n candidates.push(node);\n }\n }\n\n const params = getParams(candidates);\n\n try {\n const { run_id } = await submitRun(type, params, { nowait: true });\n showRunId(run_id);\n actionState.currentRun = { run_id };\n actionState.total = 1;\n\n for (;;) {\n const run = await waitRun(run_id, 2);\n actionState.currentRun = run;\n\n const status = run.error\n ? \"failure\"\n : run.result\n ? \"success\"\n : \"running\";\n\n for (const node of candidates) {\n actions[node.id] = {\n mode,\n status,\n run,\n };\n onActionNodeUpdated(node);\n }\n\n if (run.error || run.result) {\n break;\n }\n }\n } catch (_e) {\n // don't need to do anything here, the error will be shown in the summary\n }\n\n actionState.completed = 1;\n if ((actionState.status as string) === \"canceling\") {\n actionState.status = \"canceled\";\n onActionCompleted();\n return;\n }\n\n actionState.status = \"completed\";\n onActionCompleted();\n };\n\n const submitRunsPerNodes = async (\n type: RunType,\n getParams: (node: LineageGraphNode) => {\n /* params is the input parameters for the run of a node */\n params?: ValueDiffParams;\n /* skipReason is a string that explains why the node is skipped */\n skipReason?: string;\n },\n ) => {\n actionState.mode = \"per_node\";\n actionState.actions = {};\n const mode = actionState.mode;\n const actions = actionState.actions;\n\n onActionStarted();\n actionState.status = \"running\";\n\n for (const node of nodes) {\n actions[node.id] = { mode, status: \"pending\" };\n onActionNodeUpdated(node);\n }\n\n actionState.completed = 0;\n actionState.total = nodes.length;\n\n for (const node of nodes) {\n const { params, skipReason } = getParams(node);\n if (skipReason) {\n actions[node.id] = {\n mode,\n status: \"skipped\",\n skipReason,\n };\n onActionNodeUpdated(node);\n } else {\n try {\n const { run_id } = await submitRun(type, params, { nowait: true });\n actionState.currentRun = { run_id };\n actions[node.id] = {\n mode,\n status: \"running\",\n };\n onActionNodeUpdated(node);\n\n for (;;) {\n const run = await waitRun(run_id, 2);\n actionState.currentRun = run;\n const status = run.error\n ? \"failure\"\n : run.result\n ? \"success\"\n : \"running\";\n actions[node.id] = {\n mode,\n status,\n run,\n };\n onActionNodeUpdated(node);\n\n if (run.error || run.result) {\n break;\n }\n }\n } catch (_e) {\n // don't need to do anything here, the error will be shown in the summary\n } finally {\n actionState.currentRun = undefined;\n }\n }\n actionState.completed++;\n if ((actionState.status as string) === \"canceling\") {\n actionState.status = \"canceled\";\n onActionCompleted();\n return;\n }\n }\n\n actionState.status = \"completed\";\n onActionCompleted();\n };\n\n const runRowCount = async () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_TOP_BAR,\n node_count: nodes.length,\n });\n\n const nodeNames = [];\n for (const node of nodes) {\n if (node.data.resourceType !== \"model\") {\n actionState.actions[node.id] = {\n mode: \"multi_nodes\",\n status: \"skipped\",\n skipReason: \"Not a model\",\n };\n onActionNodeUpdated(node);\n } else {\n nodeNames.push(node.data.name);\n }\n }\n\n const skip = (node: LineageGraphNode) => {\n if (node.data.resourceType !== \"model\") {\n return \"Not a model\";\n }\n };\n const getParams = (nodes: LineageGraphNode[]): RowCountParams => {\n return {\n node_names: nodes.map((node) => node.data.name),\n };\n };\n\n await submitRunForNodes(\"row_count\", skip, getParams);\n };\n\n const runRowCountDiff = async () => {\n trackExploreAction({\n action: EXPLORE_ACTION.ROW_COUNT_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_TOP_BAR,\n node_count: nodes.length,\n });\n\n const nodeNames = [];\n for (const node of nodes) {\n if (node.data.resourceType !== \"model\") {\n actionState.actions[node.id] = {\n mode: \"multi_nodes\",\n status: \"skipped\",\n skipReason: \"Not a model\",\n };\n onActionNodeUpdated(node);\n } else {\n nodeNames.push(node.data.name);\n }\n }\n\n const skip = (node: LineageGraphNode) => {\n if (node.data.resourceType !== \"model\") {\n return \"Not a model\";\n }\n };\n const getParams = (nodes: LineageGraphNode[]): RowCountDiffParams => {\n return {\n node_names: nodes.map((node) => node.data.name),\n };\n };\n\n await submitRunForNodes(\"row_count_diff\", skip, getParams);\n };\n\n const runValueDiff = async () => {\n trackExploreAction({\n action: EXPLORE_ACTION.VALUE_DIFF,\n source: EXPLORE_SOURCE.LINEAGE_VIEW_TOP_BAR,\n node_count: nodes.length,\n });\n\n await submitRunsPerNodes(\"value_diff\", (node) => {\n const primaryKey = node.data.data.current?.primary_key;\n if (!primaryKey) {\n return {\n skipReason:\n \"No primary key found. The first unique column is used as primary key.\",\n };\n }\n\n const params: ValueDiffParams = {\n model: node.data.name,\n primary_key: primaryKey,\n };\n\n return { params };\n });\n };\n\n const addLineageDiffCheck = async () => {\n const nodeIds = nodes.map((node) => node.id);\n return await createLineageDiffCheck({\n node_ids: nodeIds,\n });\n };\n\n const addSchemaDiffCheck = async () => {\n let check;\n if (nodes.length === 1) {\n check = await createSchemaDiffCheck({ node_id: nodes[0].id });\n } else {\n const nodeIds = nodes.map((node) => node.id);\n check = await createSchemaDiffCheck({ node_id: nodeIds });\n }\n return check;\n };\n\n const cancel = async () => {\n actionState.status = \"canceling\";\n if (actionState.currentRun?.run_id) {\n await cancelRun(actionState.currentRun.run_id);\n }\n };\n\n const reset = () => {\n Object.assign(actionState, initValue);\n };\n\n return {\n actionState,\n runRowCount,\n runRowCountDiff,\n runValueDiff,\n addLineageDiffCheck,\n addSchemaDiffCheck,\n cancel,\n reset,\n };\n};\n","import {\n Box,\n Button,\n CloseButton,\n Dialog,\n Flex,\n Portal,\n useDisclosure,\n} from \"@chakra-ui/react\";\nimport React, { useCallback, useRef, useState } from \"react\";\nimport {\n EXPLORE_ACTION,\n EXPLORE_FORM_EVENT,\n trackExploreActionForm,\n} from \"@/lib/api/track\";\n\nfunction useValueDiffAlertDialog() {\n const { open, onOpen, onClose } = useDisclosure();\n const [nodeCount, setNodeCount] = useState(0);\n const [resolvePromise, setResolvePromise] =\n useState<(value: boolean) => void>();\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n const confirm = useCallback(\n (nodeCount: number) => {\n setNodeCount(nodeCount);\n return new Promise<boolean>((resolve) => {\n setResolvePromise(() => resolve);\n onOpen();\n });\n },\n [onOpen],\n );\n\n const handleConfirm = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.EXECUTE,\n });\n resolvePromise?.(true);\n onClose();\n };\n\n const handleCancel = () => {\n trackExploreActionForm({\n action: EXPLORE_ACTION.VALUE_DIFF,\n event: EXPLORE_FORM_EVENT.CANCEL,\n });\n resolvePromise?.(false);\n onClose();\n };\n\n const ValueDiffAlertDialog = (\n <Dialog.Root\n size={\"xl\"}\n open={open}\n role=\"alertdialog\"\n initialFocusEl={() => {\n return cancelRef.current;\n }}\n onOpenChange={handleCancel}\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header fontSize=\"lg\" fontWeight=\"bold\">\n <Dialog.Title>Value Diff on {nodeCount} nodes</Dialog.Title>\n </Dialog.Header>\n\n <Dialog.Body gap=\"20px\" as={Flex} direction=\"column\">\n <Box>\n Value diff will be executed on {nodeCount} nodes in the Lineage,\n which can add extra costs to your bill.\n </Box>\n </Dialog.Body>\n\n <Dialog.Footer gap={1}>\n <Button\n ref={cancelRef}\n onClick={handleCancel}\n variant=\"outline\"\n colorPalette=\"gray\"\n >\n Cancel\n </Button>\n <Button colorPalette=\"iochmara\" onClick={handleConfirm} ml={3}>\n Execute\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n\n return { confirm, AlertDialog: ValueDiffAlertDialog };\n}\n\nexport default useValueDiffAlertDialog;\n","import {\n Box,\n Button,\n Center,\n Flex,\n Icon,\n Spinner,\n StackSeparator,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport {\n Background,\n ControlButton,\n Controls,\n getNodesBounds,\n MiniMap,\n Node,\n Panel,\n ReactFlow,\n useEdgesState,\n useNodesState,\n useReactFlow,\n} from \"@xyflow/react\";\nimport React, {\n forwardRef,\n Ref,\n RefObject,\n useCallback,\n useEffect,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n isLineageGraphColumnNode,\n isLineageGraphNode,\n LineageGraphColumnNode,\n LineageGraphEdge,\n LineageGraphNode,\n LineageGraphNodes,\n layout,\n NodeColumnSetMap,\n selectDownstream,\n selectUpstream,\n toReactFlow,\n} from \"./lineage\";\nimport \"@xyflow/react/dist/style.css\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { AxiosError } from \"axios\";\nimport { FiCopy } from \"react-icons/fi\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { Check } from \"@/lib/api/checks\";\nimport { CllInput, ColumnLineageData, getCll } from \"@/lib/api/cll\";\nimport {\n createLineageDiffCheck,\n LineageDiffViewOptions,\n} from \"@/lib/api/lineagecheck\";\nimport { createSchemaDiffCheck } from \"@/lib/api/schemacheck\";\nimport { select } from \"@/lib/api/select\";\nimport {\n type LineageViewRenderProps,\n trackCopyToClipboard,\n trackLineageViewRender,\n trackMultiNodesAction,\n} from \"@/lib/api/track\";\nimport {\n isHistogramDiffRun,\n isProfileDiffRun,\n isTopKDiffRun,\n isValueDiffDetailRun,\n isValueDiffRun,\n} from \"@/lib/api/types\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport {\n IGNORE_SCREENSHOT_CLASS,\n useCopyToClipboard,\n} from \"@/lib/hooks/ScreenShot\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { useClipBoardToast } from \"@/lib/hooks/useClipBoardToast\";\nimport { useRun } from \"@/lib/hooks/useRun\";\nimport { HSplit } from \"../split/Split\";\nimport { ActionControl } from \"./ActionControl\";\nimport { ChangeStatusLegend } from \"./ChangeStatusLegend\";\nimport { ColumnLevelLineageControl } from \"./ColumnLevelLineageControl\";\nimport { ColumnLevelLineageLegend } from \"./ColumnLevelLineageLegend\";\nimport { GraphColumnNode } from \"./GraphColumnNode\";\nimport GraphEdge from \"./GraphEdge\";\nimport { GraphNode } from \"./GraphNode\";\nimport { union } from \"./graph\";\nimport {\n LineageViewContext,\n LineageViewContextType,\n} from \"./LineageViewContext\";\nimport {\n LineageViewContextMenu,\n useLineageViewContextMenu,\n} from \"./LineageViewContextMenu\";\nimport { LineageViewNotification } from \"./LineageViewNotification\";\nimport { LineageViewTopBar } from \"./LineageViewTopBar\";\nimport { NodeView } from \"./NodeView\";\nimport SetupConnectionBanner from \"./SetupConnectionBanner\";\nimport { BaseEnvironmentSetupNotification } from \"./SingleEnvironmentQueryView\";\nimport { getIconForChangeStatus } from \"./styles\";\nimport { useMultiNodesAction } from \"./useMultiNodesAction\";\nimport useValueDiffAlertDialog from \"./useValueDiffAlertDialog\";\n\nexport interface LineageViewProps {\n viewOptions?: LineageDiffViewOptions;\n interactive?: boolean;\n weight?: number;\n height?: number;\n\n // to be removed\n // viewMode?: \"changed_models\" | \"all\"; // deprecated\n filterNodes?: (key: string, node: LineageGraphNode) => boolean;\n}\n\nexport interface LineageViewRef {\n copyToClipboard: () => void;\n}\n\nconst nodeTypes = {\n lineageGraphNode: GraphNode,\n lineageGraphColumnNode: GraphColumnNode,\n};\nconst initialNodes: LineageGraphNode[] = [];\nconst edgeTypes = {\n lineageGraphEdge: GraphEdge,\n};\nconst nodeColor = (node: LineageGraphNode) => {\n return node.data.changeStatus\n ? getIconForChangeStatus(node.data.changeStatus).hexColor\n : (\"lightgray\" as string);\n};\n\nconst useResizeObserver = (\n ref: RefObject<HTMLElement | null>,\n handler: () => void,\n) => {\n const size = useRef({\n width: 0,\n height: 0,\n });\n\n useEffect(() => {\n const target = ref.current;\n const handleResize = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n const newWidth = entry.contentRect.width;\n const newHeight = entry.contentRect.height;\n\n if (\n Math.abs(newHeight - size.current.height) > 10 ||\n Math.abs(newWidth - size.current.width) > 10\n ) {\n if (\n size.current.height > 0 &&\n newHeight > 0 &&\n size.current.width > 0 &&\n newWidth > 0\n ) {\n handler();\n }\n }\n size.current = {\n width: newWidth,\n height: newHeight,\n };\n }\n };\n\n const resizeObserver = new ResizeObserver(handleResize);\n\n if (target) {\n resizeObserver.observe(target);\n }\n\n return () => {\n if (target) {\n resizeObserver.unobserve(target);\n }\n };\n }, [handler, ref]);\n};\n\nconst useNavToCheck = () => {\n const [, setLocation] = useAppLocation();\n return useCallback(\n (check: Check) => {\n if (check.check_id) {\n setLocation(`/checks/?id=${check.check_id}`);\n }\n },\n [setLocation],\n );\n};\n\nexport function PrivateLineageView(\n { interactive = false, ...props }: LineageViewProps,\n ref: Ref<LineageViewRef>,\n) {\n const reactFlow = useReactFlow();\n const refResize = useRef<HTMLDivElement>(null);\n const { successToast, failToast } = useClipBoardToast();\n const {\n copyToClipboard,\n ImageDownloadModal,\n ref: refReactFlow,\n } = useCopyToClipboard({\n renderLibrary: \"html-to-image\",\n imageType: \"png\",\n shadowEffect: true,\n backgroundColor: \"white\",\n ignoreElements: (element: Element) => {\n try {\n return element.classList.contains(IGNORE_SCREENSHOT_CLASS);\n } catch {\n if (element.className) {\n return element.className.includes(IGNORE_SCREENSHOT_CLASS);\n }\n return false;\n }\n },\n onSuccess: () => {\n successToast(\"Copied the Lineage View as an image to clipboard\");\n },\n onError: (error) => {\n console.error(\"Error taking screenshot\", error);\n failToast(\"Failed to copy image to clipboard\", error);\n },\n });\n const [nodes, setNodes, onNodesChange] =\n useNodesState<LineageGraphNodes>(initialNodes);\n const [edges, setEdges, onEdgesChange] = useEdgesState<LineageGraphEdge>([]);\n\n const {\n lineageGraph,\n retchLineageGraph,\n isLoading,\n error,\n refetchRunsAggregated,\n } = useLineageGraphContext();\n\n const { featureToggles, singleEnv } = useRecceInstanceContext();\n const { runId, showRunId, closeRunResult, runAction, isRunResultOpen } =\n useRecceActionContext();\n const { run } = useRun(runId);\n\n const [viewOptions, setViewOptions] = useState<LineageDiffViewOptions>({\n ...props.viewOptions,\n });\n\n // Helper to track lineage view render with node counts\n const trackLineageRender = useCallback(\n (\n nodes: LineageGraphNodes[],\n currentViewMode: string,\n impactRadiusEnabled: boolean,\n cllColumnActive: boolean,\n rightSidebarOpen: boolean,\n ) => {\n const lineageGraphNodesOnly = nodes.filter(isLineageGraphNode);\n const grouped = Object.groupBy(\n lineageGraphNodesOnly,\n (node) => node.data.changeStatus ?? \"unchanged\",\n );\n // Prefix status counts with \"nodes_\"\n const statusCounts = Object.fromEntries(\n Object.entries(grouped).map(([status, nodes]) => [\n `nodes_${status}`,\n nodes?.length ?? 0,\n ]),\n );\n const trackingData = {\n node_count: lineageGraphNodesOnly.length,\n view_mode: currentViewMode,\n impact_radius_enabled: impactRadiusEnabled,\n right_sidebar_open: rightSidebarOpen,\n ...statusCounts,\n } as LineageViewRenderProps;\n // Only include cll_column_active when a column is being viewed\n if (cllColumnActive) {\n trackingData.cll_column_active = true;\n }\n trackLineageViewRender(trackingData);\n },\n [],\n );\n\n const cllHistory = useRef<(CllInput | undefined)[]>([]).current;\n\n const [cll, setCll] = useState<ColumnLineageData | undefined>(undefined);\n const actionGetCll = useMutation({\n mutationFn: getCll,\n });\n const [nodeColumnSetMap, setNodeColumSetMap] = useState<NodeColumnSetMap>({});\n\n const findNodeByName = useCallback(\n (name: string) => {\n return nodes.filter(isLineageGraphNode).find((n) => n.data.name === name);\n },\n [nodes],\n );\n\n // Expose the function to the parent via the ref\n useImperativeHandle(ref, () => ({\n copyToClipboard,\n }));\n\n const isModelsChanged = useMemo(() => {\n return !!(lineageGraph && lineageGraph.modifiedSet.length > 0);\n }, [lineageGraph]);\n\n /**\n * View mode\n * - all: show all nodes\n * - changed_models: show only changed models\n */\n const viewMode = viewOptions.view_mode ?? \"changed_models\";\n const filteredNodeIds: string[] = useMemo(() => {\n return nodes\n .filter((node) => node.type === \"lineageGraphNode\")\n .map((node) => node.id);\n }, [nodes]);\n const filteredNodes = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n\n return filteredNodeIds.map((nodeId) => lineageGraph.nodes[nodeId]);\n }, [lineageGraph, filteredNodeIds]);\n\n /**\n * Focused node: the node that is currently focused. Show the NodeView when a node is focused\n */\n const [focusedNodeId, setFocusedNodeId] = useState<string>();\n const focusedNode = focusedNodeId\n ? lineageGraph?.nodes[focusedNodeId]\n : undefined;\n\n /**\n * Select mode: the behavior of clicking on nodes\n * - (undefined): no selection\n * - selecting: selecting nodes\n * - action_result: take action on selected nodes\n */\n const [selectMode, setSelectMode] = useState<\"selecting\" | \"action_result\">();\n const [selectedNodeIds, setSelectedNodeIds] = useState<Set<string>>(\n new Set(),\n );\n const selectedNodes = useMemo(() => {\n if (!lineageGraph) {\n return [];\n }\n\n const nodeIds = Array.from(selectedNodeIds);\n return nodeIds.map((nodeId) => lineageGraph.nodes[nodeId]);\n }, [lineageGraph, selectedNodeIds]);\n const multiNodeAction = useMultiNodesAction(\n selectedNodes.length > 0 ? selectedNodes : filteredNodes,\n {\n onActionStarted: () => {\n setSelectMode(\"action_result\");\n },\n onActionNodeUpdated: (updated: LineageGraphNode) => {\n // trigger a re-render by updating the nodes\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id === updated.id) {\n return {\n ...node,\n };\n }\n return node;\n }),\n );\n },\n onActionCompleted: () => {\n return void 0;\n },\n },\n );\n\n /**\n * Highlighted nodes: the nodes that are highlighted. The behavior of highlighting depends on the select mode\n *\n * - Default: nodes in the impact radius, or all nodes if the impact radius is not available\n * - Focus: upstream/downstream nodes of the focused node\n * - Multi-select: nodes in the impact radius, or all nodes if the impact radius is not available\n * - Action Result: selected nodes\n */\n const highlighted = useMemo<Set<string>>(() => {\n if (!lineageGraph) {\n return new Set<string>();\n }\n\n let highlightedModels: Set<string> = new Set<string>();\n if (cll) {\n for (const [nodeId, node] of Object.entries(cll.current.nodes)) {\n if (node.impacted !== false) {\n highlightedModels.add(nodeId);\n }\n }\n for (const columnId of Object.keys(cll.current.columns)) {\n highlightedModels.add(columnId);\n }\n } else if (selectMode === \"action_result\") {\n const nodeIds = Object.keys(multiNodeAction.actionState.actions);\n highlightedModels = new Set(nodeIds);\n } else if (focusedNode) {\n highlightedModels = union(\n selectUpstream(lineageGraph, [focusedNode.id]),\n selectDownstream(lineageGraph, [focusedNode.id]),\n );\n } else if (isModelsChanged) {\n highlightedModels = selectDownstream(\n lineageGraph,\n lineageGraph.modifiedSet,\n );\n } else {\n highlightedModels = new Set(filteredNodeIds);\n }\n\n // Add columns in the highlighted models\n return new Set<string>(highlightedModels);\n }, [\n lineageGraph,\n cll,\n selectMode,\n focusedNode,\n isModelsChanged,\n multiNodeAction.actionState.actions,\n filteredNodeIds,\n ]);\n\n const lineageViewContextMenu = useLineageViewContextMenu();\n\n const closeContextMenu = () => {\n lineageViewContextMenu.closeContextMenu();\n };\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: Intentionally only run when lineageGraph changes (initial load/refetch).\n useLayoutEffect(() => {\n const t = async () => {\n let filteredNodeIds: string[] | undefined = undefined;\n\n if (!lineageGraph) {\n return;\n }\n\n if (viewOptions.node_ids) {\n filteredNodeIds = viewOptions.node_ids;\n } else {\n const packageName = lineageGraph.manifestMetadata.current?.project_name;\n const viewMode =\n viewOptions.view_mode ?? (isModelsChanged ? \"changed_models\" : \"all\");\n\n const newViewOptions: LineageDiffViewOptions = {\n view_mode: viewMode,\n packages: packageName ? [packageName] : undefined,\n ...props.viewOptions,\n };\n\n try {\n const result = await select({\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n });\n filteredNodeIds = result.nodes;\n } catch (_) {\n // fallback behavior\n newViewOptions.view_mode = \"all\";\n const result = await select({\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n });\n filteredNodeIds = result.nodes;\n }\n\n setViewOptions(newViewOptions);\n }\n\n let cll: ColumnLineageData | undefined;\n if (viewOptions.column_level_lineage) {\n try {\n cll = await actionGetCll.mutateAsync(\n viewOptions.column_level_lineage,\n );\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Column Level Lineage error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n return;\n }\n }\n }\n\n const [nodes, edges, nodeColumnSetMap] = toReactFlow(lineageGraph, {\n selectedNodes: filteredNodeIds,\n cll: cll,\n });\n layout(nodes, edges);\n setNodes(nodes);\n setEdges(edges);\n setNodeColumSetMap(nodeColumnSetMap);\n setCll(cll);\n\n // TODO : code smell: vioates DRY. This really shouldn't hit both here and below\n\n // Track lineage view render\n trackLineageRender(\n nodes,\n viewOptions.view_mode ?? \"changed_models\",\n viewOptions.column_level_lineage?.change_analysis ?? false,\n !!viewOptions.column_level_lineage?.column,\n !!focusedNodeId || !!run,\n );\n };\n\n void t();\n // Intentionally only run when lineageGraph changes (initial load/refetch).\n // viewOptions changes are handled separately by handleViewOptionsChanged.\n // Other dependencies (setNodes, setEdges, actionGetCll) are stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [lineageGraph]);\n\n const onNodeViewClosed = () => {\n setFocusedNodeId(undefined);\n };\n\n const centerNode = async (nodeId: string) => {\n let node = nodes.find((n) => n.id === nodeId);\n if (!node) {\n return;\n }\n\n if (node.parentId) {\n const parentId = node.parentId;\n node = nodes.find((n) => n.id === parentId) ?? node;\n }\n\n if (node.measured != null) {\n const { width, height } = node.measured;\n if (width && height) {\n const x = node.position.x + width / 2;\n const y = node.position.y + height / 2;\n const zoom = reactFlow.getZoom();\n\n await reactFlow.setCenter(x, y, { zoom, duration: 200 });\n }\n }\n };\n\n const navToCheck = useNavToCheck();\n\n useResizeObserver(refResize, async () => {\n if (selectMode !== \"selecting\") {\n if (!focusedNodeId) {\n await reactFlow.fitView({ nodes, duration: 200 });\n } else {\n await centerNode(focusedNodeId);\n }\n }\n });\n\n const showColumnLevelLineage = async (\n columnLevelLineage?: CllInput,\n previous = false,\n ) => {\n const previousColumnLevelLineage = viewOptions.column_level_lineage;\n\n await handleViewOptionsChanged(\n {\n ...viewOptions,\n column_level_lineage: columnLevelLineage,\n },\n false,\n );\n\n if (!previous) {\n cllHistory.push(previousColumnLevelLineage);\n }\n if (columnLevelLineage?.node_id) {\n setFocusedNodeId(columnLevelLineage.node_id);\n } else {\n setFocusedNodeId(undefined);\n }\n };\n\n const resetColumnLevelLineage = async (previous?: boolean) => {\n if (previous) {\n if (cllHistory.length === 0) {\n return;\n }\n const previousCll = cllHistory.pop();\n if (previousCll) {\n await showColumnLevelLineage(previousCll, true);\n } else {\n await showColumnLevelLineage(undefined, true);\n }\n } else {\n await showColumnLevelLineage(undefined, true);\n }\n };\n\n const onColumnNodeClick = (\n event: React.MouseEvent,\n node: LineageGraphColumnNode,\n ) => {\n if (selectMode) {\n return;\n }\n\n void showColumnLevelLineage({\n node_id: node.data.node.id,\n column: node.data.column,\n });\n };\n\n const onNodeClick = (event: React.MouseEvent, node: Node) => {\n if (!interactive) return;\n if (!lineageGraph) {\n return;\n }\n\n if (isLineageGraphColumnNode(node as LineageGraphNodes)) {\n onColumnNodeClick(event, node as LineageGraphColumnNode);\n return;\n }\n\n closeContextMenu();\n if (!selectMode) {\n setFocusedNodeId(node.id);\n } else if (selectMode === \"action_result\") {\n const action = multiNodeAction.actionState.actions[node.id];\n if (action.run?.run_id) {\n showRunId(action.run.run_id);\n }\n setFocusedNodeId(node.id);\n } else {\n const newSet = new Set(selectedNodeIds);\n if (selectedNodeIds.has(node.id)) {\n newSet.delete(node.id);\n } else {\n newSet.add(node.id);\n }\n setSelectedNodeIds(newSet);\n if (newSet.size === 0) {\n setSelectMode(undefined);\n }\n }\n };\n\n const refreshLayout = async (options: {\n viewOptions?: LineageDiffViewOptions;\n fitView?: boolean;\n }) => {\n let { viewOptions: newViewOptions = viewOptions } = options;\n const { fitView } = options;\n\n let selectedNodes: string[] | undefined = undefined;\n\n if (!lineageGraph) {\n return;\n }\n\n const reselect =\n viewOptions.select !== newViewOptions.select ||\n viewOptions.exclude !== newViewOptions.exclude ||\n viewOptions.packages !== newViewOptions.packages ||\n viewOptions.view_mode !== newViewOptions.view_mode;\n\n if (reselect) {\n try {\n const result = await select({\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n });\n // focus to unfocus the model or column node\n newViewOptions = { ...newViewOptions, column_level_lineage: undefined };\n selectedNodes = result.nodes;\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Select node error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n }\n return;\n }\n setFocusedNodeId(undefined);\n } else {\n selectedNodes = nodes.map((n) => n.id);\n }\n\n let cll: ColumnLineageData | undefined;\n if (newViewOptions.column_level_lineage) {\n try {\n cll = await actionGetCll.mutateAsync(\n newViewOptions.column_level_lineage,\n );\n } catch (e) {\n if (e instanceof AxiosError) {\n const e2 = e as AxiosError<{ detail?: string }>;\n toaster.create({\n title: \"Column Level Lineage error\",\n description: e2.response?.data.detail ?? e.message,\n type: \"error\",\n closable: true,\n });\n return;\n }\n }\n }\n\n const [newNodes, newEdges, newNodeColumnSetMap] = toReactFlow(\n lineageGraph,\n {\n selectedNodes,\n cll,\n },\n );\n setNodes(newNodes);\n setEdges(newEdges);\n setNodeColumSetMap(newNodeColumnSetMap);\n setCll(cll);\n\n // Track lineage view render\n trackLineageRender(\n newNodes,\n newViewOptions.view_mode ?? \"changed_models\",\n newViewOptions.column_level_lineage?.change_analysis ?? false,\n !!newViewOptions.column_level_lineage?.column,\n !!focusedNodeId || !!run,\n );\n\n // Close the run result view if the run result node is not in the new nodes\n if (\n run &&\n (isTopKDiffRun(run) ||\n isProfileDiffRun(run) ||\n isHistogramDiffRun(run) ||\n isValueDiffRun(run) ||\n isValueDiffDetailRun(run))\n ) {\n if (run.params?.model && !findNodeByName(run.params.model)) {\n closeRunResult();\n }\n }\n\n if (fitView) {\n await new Promise((resolve) => setTimeout(resolve, 1));\n (() => {\n void reactFlow.fitView({ nodes: newNodes, duration: 200 });\n })();\n }\n };\n\n const handleViewOptionsChanged = async (\n newViewOptions: LineageDiffViewOptions,\n fitView = true,\n ) => {\n setViewOptions(newViewOptions);\n await refreshLayout({\n viewOptions: newViewOptions,\n fitView,\n });\n };\n\n const valueDiffAlertDialog = useValueDiffAlertDialog();\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: handleViewOptionsChanged and onNodeClick are intentionally omitted\n useEffect(() => {\n const runResultType = run?.type;\n if (!interactive) {\n // Skip the following logic if the view is not interactive\n return;\n }\n if (!isRunResultOpen) {\n // Skip the following logic if the run result is not open\n return;\n }\n if (\n !runResultType ||\n [\"query_diff\", \"query\", \"row_count\"].includes(runResultType)\n ) {\n // Skip the following logic if the run result type is not related to a node\n return;\n }\n\n if (!selectMode) {\n // Skip the following logic if the select mode is not single\n let selectedRunModel = undefined;\n if (\n isTopKDiffRun(run) ||\n isProfileDiffRun(run) ||\n isHistogramDiffRun(run) ||\n isValueDiffRun(run) ||\n isValueDiffDetailRun(run)\n ) {\n selectedRunModel = run.params?.model;\n }\n\n // Create a mock MouseEvent\n const mockEvent = new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n }) as unknown as React.MouseEvent;\n\n if (selectedRunModel) {\n // If the run result is related to a node, select the node to show NodeView\n const node = findNodeByName(selectedRunModel);\n if (!node) {\n // Cannot find the node in the current nodes, try to change the view mode to 'all'\n void handleViewOptionsChanged({\n ...viewOptions,\n view_mode: \"all\",\n });\n } else if (isLineageGraphNode(node) && focusedNode !== node.data.data) {\n // Only select the node if it is not already selected\n onNodeClick(mockEvent, node);\n }\n } else {\n // If the run result is not related to a node, close the NodeView\n onNodeViewClosed();\n }\n }\n // handleViewOptionsChanged and onNodeClick are intentionally omitted to prevent\n // unnecessary re-runs. These functions are called conditionally within the effect\n // and don't need to trigger the effect when they change.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n run,\n viewOptions,\n isRunResultOpen,\n selectMode,\n findNodeByName,\n focusedNode,\n interactive,\n ]);\n\n const selectParentNodes = (nodeId: string, degree = 1000) => {\n if (selectMode === \"action_result\" || lineageGraph === undefined) return;\n\n if (!selectMode) {\n setSelectMode(\"selecting\");\n multiNodeAction.reset();\n if (viewOptions.column_level_lineage) {\n void handleViewOptionsChanged({\n ...viewOptions,\n column_level_lineage: undefined,\n });\n }\n }\n\n const upstream = selectUpstream(lineageGraph, [nodeId], degree);\n setSelectedNodeIds(union(selectedNodeIds, upstream));\n };\n\n const selectChildNodes = (nodeId: string, degree = 1000) => {\n if (selectMode === \"action_result\" || lineageGraph === undefined) return;\n\n if (!selectMode) {\n setSelectMode(\"selecting\");\n multiNodeAction.reset();\n if (viewOptions.column_level_lineage) {\n void handleViewOptionsChanged({\n ...viewOptions,\n column_level_lineage: undefined,\n });\n }\n }\n\n const downstream = selectDownstream(lineageGraph, [nodeId], degree);\n setSelectedNodeIds(union(selectedNodeIds, downstream));\n };\n\n const onNodeContextMenu = (\n event: React.MouseEvent,\n node: LineageGraphNodes,\n ) => {\n if (!interactive) {\n return;\n }\n if (selectMode === \"action_result\") {\n return;\n }\n // Only show context menu when selectMode is action\n // Prevent native context menu from showing\n event.preventDefault();\n const reactFlowDiv = refReactFlow.current as unknown as HTMLDivElement;\n const pane = reactFlowDiv.getBoundingClientRect();\n const x = event.clientX - pane.left;\n const y = event.clientY - pane.top + reactFlowDiv.offsetTop;\n lineageViewContextMenu.showContextMenu(x, y, node);\n };\n\n const selectNode = (nodeId: string) => {\n if (!selectMode) {\n if (!lineageGraph) {\n return;\n }\n\n setSelectedNodeIds(new Set([nodeId]));\n setSelectMode(\"selecting\");\n setFocusedNodeId(undefined);\n multiNodeAction.reset();\n } else if (selectMode === \"selecting\") {\n const newSelectedNodeIds = new Set(selectedNodeIds);\n if (selectedNodeIds.has(nodeId)) {\n newSelectedNodeIds.delete(nodeId);\n } else {\n newSelectedNodeIds.add(nodeId);\n }\n\n setSelectedNodeIds(newSelectedNodeIds);\n if (newSelectedNodeIds.size === 0) {\n setSelectMode(undefined);\n }\n }\n };\n const deselect = () => {\n setSelectMode(undefined);\n setSelectedNodeIds(new Set());\n setFocusedNodeId(undefined);\n closeRunResult();\n refetchRunsAggregated?.();\n };\n\n const contextValue: LineageViewContextType = {\n interactive,\n nodes,\n focusedNode,\n selectedNodes,\n viewOptions,\n showContextMenu: onNodeContextMenu,\n onViewOptionsChanged: handleViewOptionsChanged,\n selectMode,\n selectNode,\n selectParentNodes,\n selectChildNodes,\n deselect,\n isNodeHighlighted: (nodeId: string) => highlighted.has(nodeId),\n isNodeSelected: (nodeId: string) => selectedNodeIds.has(nodeId),\n isEdgeHighlighted: (source, target) => {\n if (!cll) {\n return highlighted.has(source) && highlighted.has(target);\n } else {\n if (!(source in cll.current.parent_map)) {\n return false;\n }\n return target in cll.current.parent_map[source];\n }\n },\n isNodeShowingChangeAnalysis: (nodeId: string) => {\n if (!lineageGraph) {\n return false;\n }\n\n const node =\n nodeId in lineageGraph.nodes ? lineageGraph.nodes[nodeId] : undefined;\n\n if (viewOptions.column_level_lineage?.change_analysis) {\n const cll = viewOptions.column_level_lineage;\n\n if (cll.node_id && !cll.column) {\n return cll.node_id === nodeId && !!node?.data.changeStatus;\n } else {\n return !!node?.data.changeStatus;\n }\n }\n\n return false;\n },\n getNodeAction: (nodeId: string) => {\n return multiNodeAction.actionState.actions[nodeId];\n },\n getNodeColumnSet: (nodeId: string) => {\n if (!(nodeId in nodeColumnSetMap)) {\n return new Set<string>();\n }\n\n return new Set(nodeColumnSetMap[nodeId]);\n },\n runRowCount: async () => {\n if (selectMode === \"selecting\") {\n await multiNodeAction.runRowCount();\n trackMultiNodesAction({ type: \"row_count\", selected: \"multi\" });\n } else if (focusedNode) {\n runAction(\n \"row_count\",\n { node_names: [focusedNode.data.name] },\n { showForm: false, showLast: false },\n );\n trackMultiNodesAction({ type: \"row_count\", selected: \"single\" });\n } else {\n runAction(\"row_count\", {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n });\n trackMultiNodesAction({ type: \"row_count\", selected: \"none\" });\n }\n },\n runRowCountDiff: async () => {\n if (selectMode === \"selecting\") {\n await multiNodeAction.runRowCountDiff();\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"multi\" });\n } else if (focusedNode) {\n runAction(\n \"row_count_diff\",\n { node_names: [focusedNode.data.name] },\n { showForm: false, showLast: false },\n );\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"single\" });\n } else {\n runAction(\"row_count_diff\", {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n });\n trackMultiNodesAction({ type: \"row_count_diff\", selected: \"none\" });\n }\n },\n runValueDiff: async () => {\n if (focusedNode) {\n runAction(\n \"value_diff\",\n {\n model: focusedNode.data.name,\n },\n { showForm: true, showLast: false },\n );\n trackMultiNodesAction({ type: \"value_diff\", selected: \"single\" });\n } else {\n const nodeCount =\n selectMode === \"selecting\"\n ? selectedNodes.length\n : filteredNodeIds.length;\n if (await valueDiffAlertDialog.confirm(nodeCount)) {\n await multiNodeAction.runValueDiff();\n trackMultiNodesAction({\n type: \"value_diff\",\n selected: selectMode === \"selecting\" ? \"multi\" : \"none\",\n });\n }\n }\n },\n addLineageDiffCheck: async () => {\n let check: Check | undefined = undefined;\n if (selectMode === \"selecting\") {\n check = await multiNodeAction.addLineageDiffCheck();\n deselect();\n trackMultiNodesAction({ type: \"lineage_diff\", selected: \"multi\" });\n } else if (!focusedNode) {\n check = await createLineageDiffCheck(viewOptions);\n trackMultiNodesAction({ type: \"lineage_diff\", selected: \"none\" });\n }\n\n if (check) {\n navToCheck(check);\n }\n },\n addSchemaDiffCheck: async () => {\n let check: Check | undefined = undefined;\n\n if (selectMode === \"selecting\") {\n if (selectedNodes.length > 0) {\n check = await multiNodeAction.addSchemaDiffCheck();\n deselect();\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"multi\" });\n }\n } else if (focusedNode) {\n check = await createSchemaDiffCheck({\n node_id: focusedNode.id,\n });\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"single\" });\n } else {\n check = await createSchemaDiffCheck({\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n });\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"none\" });\n }\n\n if (check) {\n navToCheck(check);\n }\n },\n cancel: multiNodeAction.cancel,\n actionState: multiNodeAction.actionState,\n\n // Column Level Lineage\n centerNode,\n cll,\n showColumnLevelLineage,\n resetColumnLevelLineage,\n };\n\n if (isLoading) {\n return (\n <Flex\n width=\"100%\"\n height=\"100%\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <Spinner size=\"xl\" />\n </Flex>\n );\n }\n\n if (error) {\n return (\n <Center h=\"100%\">\n <VStack>\n <Box>\n Failed to load lineage data. This could be because the server has\n been terminated or there is a network error.\n </Box>\n <Box>[Reason: {error}]</Box>\n <Button\n colorPalette=\"blue\"\n onClick={() => {\n if (retchLineageGraph) {\n retchLineageGraph();\n }\n }}\n >\n Retry\n </Button>\n </VStack>\n </Center>\n );\n }\n\n if (!lineageGraph || nodes == initialNodes) {\n return <></>;\n }\n\n if (viewMode === \"changed_models\" && !lineageGraph.modifiedSet.length) {\n return (\n <Center h=\"100%\">\n <VStack>\n <>No change detected</>\n <Button\n colorPalette=\"blue\"\n onClick={async () => {\n await handleViewOptionsChanged({\n ...viewOptions,\n view_mode: \"all\",\n });\n }}\n >\n Show all nodes\n </Button>\n </VStack>\n </Center>\n );\n }\n return (\n <LineageViewContext.Provider value={contextValue}>\n <HSplit\n sizes={focusedNode ? [70, 30] : [100, 0]}\n minSize={focusedNode ? 400 : 0}\n gutterSize={focusedNode ? 5 : 0}\n style={{ height: \"100%\", width: \"100%\" }}\n >\n <VStack\n ref={refResize}\n separator={<StackSeparator borderColor=\"gray.200\" />}\n gap={0}\n style={{ contain: \"strict\" }}\n position=\"relative\"\n >\n {interactive && (\n <>\n <LineageViewTopBar />\n {featureToggles.mode === \"metadata only\" && (\n <SetupConnectionBanner />\n )}\n </>\n )}\n <ReactFlow\n proOptions={{\n hideAttribution: true,\n }}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeClick={onNodeClick}\n onNodeContextMenu={onNodeContextMenu}\n onClick={closeContextMenu}\n onInit={async () => {\n if (isModelsChanged) {\n await reactFlow.fitView();\n } else {\n const bounds = getNodesBounds(nodes, {});\n await reactFlow.setCenter(\n bounds.x + bounds.width / 2,\n bounds.y + bounds.height / 2,\n {\n zoom: 1,\n },\n );\n }\n }}\n maxZoom={1}\n minZoom={0.1}\n nodesDraggable={interactive}\n ref={refReactFlow as unknown as Ref<HTMLDivElement>}\n >\n <Background color=\"#ccc\" />\n <Controls\n showInteractive={false}\n position=\"top-right\"\n className={IGNORE_SCREENSHOT_CLASS}\n >\n <ControlButton\n title=\"copy image\"\n onClick={async () => {\n await copyToClipboard();\n trackCopyToClipboard({\n type: viewMode,\n from: \"lineage_view\",\n });\n }}\n >\n <Icon as={FiCopy} />\n </ControlButton>\n </Controls>\n <ImageDownloadModal />\n <Panel position=\"bottom-left\">\n <Flex direction=\"column\" gap=\"5px\">\n {isModelsChanged && <ChangeStatusLegend />}\n {viewOptions.column_level_lineage && (\n <ColumnLevelLineageLegend />\n )}\n </Flex>\n </Panel>\n <Panel position=\"top-center\">\n <LineageViewNotification\n notification={\n singleEnv ? <BaseEnvironmentSetupNotification /> : null\n }\n type={\"info\"}\n />\n </Panel>\n <Panel position=\"top-left\">\n <Flex direction=\"column\" gap=\"5px\">\n <ColumnLevelLineageControl action={actionGetCll} />\n {nodes.length == 0 && (\n <Text fontSize=\"xl\" color=\"grey\" opacity={0.5}>\n No nodes\n </Text>\n )}\n </Flex>\n </Panel>\n <MiniMap\n nodeColor={nodeColor}\n nodeStrokeWidth={3}\n zoomable\n pannable\n />\n {selectMode === \"action_result\" && (\n <Panel\n position=\"bottom-center\"\n className={IGNORE_SCREENSHOT_CLASS}\n >\n <ActionControl\n onClose={() => {\n deselect();\n }}\n />\n </Panel>\n )}\n </ReactFlow>\n <LineageViewContextMenu {...lineageViewContextMenu.props} />\n </VStack>\n {focusedNode ? (\n <Box borderLeft=\"solid 1px lightgray\" height=\"100%\">\n <NodeView node={focusedNode} onCloseNode={onNodeViewClosed} />\n </Box>\n ) : (\n <Box></Box>\n )}\n </HSplit>\n {valueDiffAlertDialog.AlertDialog}\n </LineageViewContext.Provider>\n );\n}\n\nexport const LineageView = forwardRef<LineageViewRef, LineageViewProps>(\n PrivateLineageView,\n);\n","import { ReactFlowProvider } from \"@xyflow/react\";\nimport { LineageView } from \"./LineageView\";\n\nexport function LineagePage() {\n return (\n <ReactFlowProvider>\n <LineageView interactive />\n </ReactFlowProvider>\n );\n}\n","import { Button, Heading, Icon, Text } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { RiTerminalBoxLine } from \"react-icons/ri\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { getRecceInstanceInfo } from \"@/lib/api/instanceInfo\";\nimport { getSettingsUrl } from \"@/lib/utils/urls\";\n\nexport default function SetupConnectionGuide() {\n const { data: instanceInfo } = useQuery({\n queryKey: cacheKeys.instanceInfo(),\n queryFn: getRecceInstanceInfo,\n });\n\n return (\n <div className=\"flex flex-1 h-full min-h-0 m-2 p-4 bg-blue-50 rounded-lg shadow-md justify-center\">\n <div className=\"w-4/5 flex flex-col overflow-y-auto gap-6 px-8 pb-8\">\n <div className=\"flex flex-col items-center gap-4\">\n <div className=\"p-2 bg-white rounded-full flex items-center justify-center shadow-md\">\n <Icon as={RiTerminalBoxLine} boxSize={7} color=\"blue.500\" />\n </div>\n <Heading mt=\"4\" size=\"lg\">\n Wait, there's more!\n </Heading>\n <Text fontSize=\"md\" textAlign=\"center\">\n Query functions disabled without a{\" \"}\n <Text fontWeight=\"bold\" as=\"span\">\n data warehouse connection\n </Text>\n </Text>\n </div>\n <div className=\"w-1/2 flex flex-col mt-6 mx-auto\">\n <Button\n colorPalette=\"blue\"\n size=\"lg\"\n onClick={() => {\n window.open(getSettingsUrl(instanceInfo), \"_blank\");\n }}\n >\n Connect to Data Warehouse\n </Button>\n </div>\n </div>\n </div>\n );\n}\n","import { Box, Button, Flex, Spacer, Switch } from \"@chakra-ui/react\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport React, { useMemo } from \"react\";\nimport { PiInfoFill } from \"react-icons/pi\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport HistoryToggle from \"@/components/shared/HistoryToggle\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"@/constants/urls\";\nimport {\n QueryParams,\n submitQuery,\n submitQueryBase,\n submitQueryDiff,\n} from \"@/lib/api/adhocQuery\";\nimport { SubmitOptions, waitRun } from \"@/lib/api/runs\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport {\n defaultSqlQuery,\n useRecceQueryContext,\n} from \"@/lib/hooks/RecceQueryContext\";\nimport { BaseEnvironmentSetupGuide } from \"../lineage/SingleEnvironmentQueryView\";\nimport { QueryForm } from \"./QueryForm\";\nimport SetupConnectionGuide from \"./SetupConnectionGuide\";\nimport SqlEditor, { DualSqlEditor } from \"./SqlEditor\";\n\nconst QueryModeToggle = () => {\n const { isCustomQueries, setCustomQueries, sqlQuery, setBaseSqlQuery } =\n useRecceQueryContext();\n const handleToggle = () => {\n if (!isCustomQueries && setBaseSqlQuery) setBaseSqlQuery(sqlQuery);\n setCustomQueries(!isCustomQueries);\n };\n const customQueriesDescription =\n \"Custom queries allow you to use two SQL queries to compare results between current and base environments.\";\n return (\n <Box>\n <Flex fontSize=\"0.75rem\" gap={1} alignItems=\"center\">\n Custom Queries{\" \"}\n <Tooltip content={customQueriesDescription}>\n <PiInfoFill color=\"gray.600\" fontSize=\"1rem\" />\n </Tooltip>\n </Flex>\n <Switch.Root\n size=\"sm\"\n colorPalette=\"iochmara\"\n checked={isCustomQueries}\n onCheckedChange={handleToggle}\n >\n <Switch.HiddenInput />\n <Switch.Control />\n <Switch.Label />\n </Switch.Root>\n </Box>\n );\n};\n\nexport const QueryPage = () => {\n const {\n sqlQuery: _sqlQuery,\n baseSqlQuery,\n setSqlQuery,\n setBaseSqlQuery,\n primaryKeys,\n setPrimaryKeys,\n isCustomQueries,\n } = useRecceQueryContext();\n const { lineageGraph, envInfo } = useLineageGraphContext();\n const { featureToggles, singleEnv } = useRecceInstanceContext();\n\n let sqlQuery = _sqlQuery;\n if (envInfo?.adapterType === \"sqlmesh\" && _sqlQuery === defaultSqlQuery) {\n sqlQuery = `select * from db.mymodel`;\n }\n\n if (featureToggles.mode === \"read only\") {\n sqlQuery = `--- Would like to do query here? Book a demo with us at ${RECCE_SUPPORT_CALENDAR_URL}\\n${sqlQuery}`;\n }\n\n const { showRunId } = useRecceActionContext();\n const queryFn = async (type: \"query\" | \"query_base\" | \"query_diff\") => {\n function queryFactory(type: string) {\n switch (type) {\n case \"query\":\n return submitQuery;\n case \"query_base\":\n return submitQueryBase;\n case \"query_diff\":\n return submitQueryDiff;\n default:\n throw new Error(`Unknown query type: ${type}`);\n }\n }\n const sqlTemplate = type === \"query_base\" ? (baseSqlQuery ?? \"\") : sqlQuery;\n const runFn = queryFactory(type);\n const params: QueryParams = { sql_template: sqlTemplate };\n const options: SubmitOptions = { nowait: true };\n\n if (type === \"query_diff\") {\n params.primary_keys = primaryKeys;\n if (isCustomQueries) params.base_sql_template = baseSqlQuery;\n }\n const { run_id } = await runFn(params, options);\n\n showRunId(run_id);\n\n return await waitRun(run_id);\n };\n\n const { mutate: runQuery, isPending } = useMutation({\n mutationFn: queryFn,\n });\n\n const currentSchema = useMemo(() => {\n const initialValue = \"N/A\";\n // find the most common schema from the current lineage graph\n const countMap: Record<string, number> = {};\n if (!lineageGraph) {\n return initialValue;\n }\n\n for (const key in lineageGraph.nodes) {\n const schema = lineageGraph.nodes[key].data.data.current?.schema;\n if (schema) {\n countMap[schema] = (countMap[schema] || 0) + 1;\n }\n }\n // Find the most common value\n return Object.keys(countMap).reduce((mostCommon, current) => {\n if (countMap[current] > (countMap[mostCommon] || 0)) {\n return current;\n }\n return mostCommon;\n }, initialValue);\n }, [lineageGraph]);\n\n if (singleEnv || featureToggles.mode === \"metadata only\") {\n return (\n <Flex direction=\"column\" height=\"100%\">\n <Flex\n justifyContent=\"right\"\n alignItems=\"center\"\n padding=\"4pt 8pt\"\n gap=\"5px\"\n height=\"54px\"\n borderBottom=\"1px solid lightgray\"\n >\n <HistoryToggle />\n <Spacer />\n {singleEnv ? (\n <Tooltip\n content=\"Please configure the base environment before running the diff\"\n positioning={{ placement: \"left\" }}\n >\n <Button\n colorPalette=\"iochmara\"\n disabled\n size=\"xs\"\n fontSize=\"14px\"\n marginTop={\"16px\"}\n >\n Run Diff\n </Button>\n </Tooltip>\n ) : (\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n colorPalette=\"iochmara\"\n disabled\n size=\"xs\"\n fontSize=\"14px\"\n marginTop={\"16px\"}\n >\n Run Diff\n </Button>\n </SetupConnectionPopover>\n )}\n </Flex>\n <DualSqlEditor\n value={sqlQuery}\n onChange={setSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n labels={[\"base (production)\", `current (${currentSchema})`]}\n SetupGuide={\n featureToggles.mode === \"metadata only\" ? (\n <SetupConnectionGuide />\n ) : (\n <BaseEnvironmentSetupGuide />\n )\n }\n />\n </Flex>\n );\n }\n\n return (\n <Flex direction=\"column\" height=\"100%\">\n <Flex\n justifyContent=\"right\"\n alignItems=\"flex-end\"\n padding=\"4pt 8pt\"\n gap=\"5px\"\n height=\"54px\"\n borderBottom=\"1px solid lightgray\"\n flex=\"0 0 54px\"\n >\n <HistoryToggle />\n <QueryModeToggle />\n <Spacer />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={setPrimaryKeys}\n />\n <Button\n colorPalette=\"iochmara\"\n onClick={() => {\n runQuery(\"query_diff\");\n }}\n disabled={isPending || featureToggles.disableDatabaseQuery}\n size=\"2xs\"\n >\n Run Diff\n </Button>\n </Flex>\n\n <Box width=\"100%\" flex=\"1\">\n {isCustomQueries ? (\n <DualSqlEditor\n value={sqlQuery}\n baseValue={baseSqlQuery}\n onChange={setSqlQuery}\n onChangeBase={setBaseSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n onRunBase={() => {\n runQuery(\"query_base\");\n }}\n onRunDiff={() => {\n runQuery(\"query_diff\");\n }}\n />\n ) : (\n <SqlEditor\n value={sqlQuery}\n onChange={setSqlQuery}\n onRun={() => {\n runQuery(\"query\");\n }}\n onRunDiff={() => {\n runQuery(\"query_diff\");\n }}\n />\n )}\n </Box>\n </Flex>\n );\n};\n","import { RunType } from \"@/components/run/registry\";\nimport { Run } from \"@/lib/api/types\";\n\nexport const isDisabledByNoResult = (\n type: RunType,\n run: Run | undefined,\n): boolean => {\n if (type === \"schema_diff\" || type === \"lineage_diff\") {\n return false;\n }\n return !run?.result || !!run.error;\n};\n","import { toaster } from \"@/components/ui/toaster\";\n\nexport function useCheckToast() {\n function markedAsApprovedToast() {\n toaster.create({\n title: \"Marked as approved\",\n type: \"success\",\n duration: 2000,\n });\n }\n return {\n markedAsApprovedToast,\n };\n}\n","import \"react-data-grid/lib/styles.css\";\nimport {\n Box,\n Button,\n Checkbox,\n CloseButton,\n Dialog,\n Flex,\n Icon,\n Portal,\n Separator,\n useDisclosure,\n VStack,\n} from \"@chakra-ui/react\";\nimport {\n DragDropContext,\n Draggable,\n Droppable,\n DropResult,\n} from \"@hello-pangea/dnd\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport React, { useState } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { isDisabledByNoResult } from \"@/components/check/utils\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check, updateCheck } from \"@/lib/api/checks\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useCheckToast } from \"@/lib/hooks/useCheckToast\";\nimport { useRun } from \"@/lib/hooks/useRun\";\nimport { findByRunType } from \"../run/registry\";\n\nconst ChecklistItem = ({\n check,\n selected,\n onSelect,\n onMarkAsApproved,\n}: {\n check: Check;\n selected: boolean;\n onSelect: (checkId: string) => void;\n onMarkAsApproved: () => void;\n}) => {\n const { featureToggles } = useRecceInstanceContext();\n const queryClient = useQueryClient();\n const checkId = check.check_id;\n const { mutate } = useMutation({\n mutationFn: (check: Partial<Check>) => updateCheck(checkId, check),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n const trackedRunId = check.last_run?.run_id;\n const { run } = useRun(trackedRunId);\n\n const icon: IconType = findByRunType(check.type).icon;\n const isMarkAsApprovedDisabled =\n isDisabledByNoResult(check.type, run) ||\n featureToggles.disableUpdateChecklist;\n const isNoResult = isDisabledByNoResult(check.type, run);\n\n return (\n <>\n <Flex\n width=\"100%\"\n p=\"10px 20px\"\n cursor=\"pointer\"\n _hover={{ bg: \"Cornsilk\" }}\n bg={selected ? \"Floralwhite\" : \"inherit\"}\n borderBlockEndWidth={\"1px\"}\n borderLeftWidth={\"3px\"}\n borderLeftColor={selected ? \"orange\" : \"transparent\"}\n onClick={() => {\n onSelect(check.check_id);\n }}\n alignItems=\"center\"\n gap=\"5px\"\n >\n <Icon as={icon} />\n <Box\n flex=\"1\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n className=\"no-track-pii-safe\"\n >\n {check.name}\n </Box>\n\n {/* {check.is_checked && <Icon color=\"green\" as={FaCheckCircle} />} */}\n <Tooltip\n content={\n isNoResult ? \"Run the check first\" : \"Click to mark as approved\"\n }\n positioning={{ placement: \"top\" }}\n showArrow\n >\n <Flex>\n <Checkbox.Root\n checked={check.is_checked}\n colorPalette=\"green\"\n variant=\"solid\"\n size=\"sm\"\n onCheckedChange={(details) => {\n if (!details.checked) {\n // If unchecking, just update the check\n mutate({ is_checked: details.checked as boolean });\n } else {\n // Show Mark as Approved warning modal\n onMarkAsApproved();\n }\n }}\n disabled={isMarkAsApprovedDisabled}\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control\n borderColor=\"border.inverted\"\n backgroundColor={\n isMarkAsApprovedDisabled ? \"bg.emphasized\" : undefined\n }\n />\n </Checkbox.Root>\n </Flex>\n </Tooltip>\n </Flex>\n </>\n );\n};\n\nexport const CheckList = ({\n checks,\n selectedItem,\n onCheckSelected,\n onChecksReordered,\n}: {\n checks: Check[];\n selectedItem: string | null;\n onCheckSelected: (checkId: string) => void;\n onChecksReordered: (source: number, destination: number) => void;\n}) => {\n const [bypassModal, setBypassModal] = useState(false);\n const queryClient = useQueryClient();\n const { mutate: markCheckedByID } = useMutation({\n mutationFn: (checkId: string) => updateCheck(checkId, { is_checked: true }),\n onSuccess: async (_, checkId: string) => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n\n const onDragEnd = (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n\n onChecksReordered(result.source.index, result.destination.index);\n };\n const {\n open: isMarkAsApprovedOpen,\n onOpen: onMarkAsApprovedOpen,\n onClose: onMarkAsApprovedClosed,\n } = useDisclosure();\n\n const { markedAsApprovedToast } = useCheckToast();\n const handleOnMarkAsApproved = () => {\n if (selectedItem) {\n const bypassMarkAsApprovedWarning = localStorage.getItem(\n \"bypassMarkAsApprovedWarning\",\n );\n if (bypassMarkAsApprovedWarning === \"true\") {\n markCheckedByID(selectedItem);\n markedAsApprovedToast();\n } else {\n onMarkAsApprovedOpen();\n }\n }\n };\n\n const handleMarkAsApprovedConfirmed = () => {\n if (selectedItem) {\n markCheckedByID(selectedItem);\n if (bypassModal) {\n localStorage.setItem(\"bypassMarkAsApprovedWarning\", \"true\");\n }\n markedAsApprovedToast();\n onMarkAsApprovedClosed();\n }\n };\n\n return (\n <>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"checklist\">\n {(provided) => (\n <VStack\n {...provided.droppableProps}\n ref={provided.innerRef}\n className=\"no-track-pii-safe\"\n w=\"full\"\n gap=\"0\"\n flex=\"1\"\n overflow={\"auto\"}\n >\n {checks.map((check, index) => (\n <Draggable\n key={check.check_id}\n draggableId={check.check_id}\n index={index}\n >\n {(provided, snapshot) => {\n // see https://github.com/atlassian/react-beautiful-dnd/issues/1881#issuecomment-691237307\n if (snapshot.isDragging) {\n const props = provided.draggableProps;\n if (props.style != null && \"left\" in props.style) {\n const offset = { x: 0, y: 80 };\n const x = props.style.left - offset.x;\n const y = props.style.top - offset.y;\n props.style.left = x;\n props.style.top = y;\n }\n }\n\n return (\n <Flex\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n w=\"full\"\n >\n <ChecklistItem\n key={check.check_id}\n check={check}\n selected={check.check_id === selectedItem}\n onSelect={onCheckSelected}\n onMarkAsApproved={handleOnMarkAsApproved}\n />\n </Flex>\n );\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </VStack>\n )}\n </Droppable>\n </DragDropContext>\n <Dialog.Root\n open={isMarkAsApprovedOpen}\n onOpenChange={onMarkAsApprovedClosed}\n placement=\"center\"\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content width={\"400px\"}>\n <Dialog.Header>\n <Dialog.Title>Mark as Approved?</Dialog.Title>\n </Dialog.Header>\n <Separator />\n <Box p={\"16px\"} fontSize=\"sm\" gap=\"16px\">\n <p>\n Please ensure you have reviewed the contents of this check\n before marking it as approved.\n </p>\n <Checkbox.Root\n checked={bypassModal}\n onCheckedChange={(e) => {\n setBypassModal(Boolean(e.checked));\n }}\n fontWeight=\"bold\"\n size=\"sm\"\n pt=\"8px\"\n >\n <Checkbox.HiddenInput />\n <Checkbox.Control />\n <Checkbox.Label>Don&apos;t show this again</Checkbox.Label>\n </Checkbox.Root>\n </Box>\n <Separator />\n <Dialog.Footer gap={0}>\n <Button\n variant=\"outline\"\n size=\"xs\"\n mr={2}\n onClick={onMarkAsApprovedClosed}\n >\n Cancel\n </Button>\n <Button\n colorPalette=\"iochmara\"\n size=\"xs\"\n onClick={handleMarkAsApprovedConfirmed}\n >\n Mark as approved\n </Button>\n </Dialog.Footer>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n </>\n );\n};\n","import axios, { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\nexport interface User {\n id: string;\n login: string;\n login_type: string;\n email: string;\n onboarding_state: string;\n}\n\ninterface GitHubUser {\n login: string;\n id: number;\n avatar_url: string;\n}\n\nexport async function fetchUser(): Promise<User> {\n try {\n const response = await axiosClient.get<never, AxiosResponse<User>>(\n \"/api/users\",\n );\n return response.data;\n } catch (error) {\n console.error(\"Error fetching user data:\", error);\n throw error;\n }\n}\n\nexport async function fetchGitHubAvatar(\n userId: string,\n): Promise<string | null> {\n try {\n const response = await axios.get<GitHubUser>(\n `https://api.github.com/user/${userId}`,\n );\n return response.data.avatar_url;\n } catch (error) {\n console.warn(\"Failed to fetch GitHub avatar:\", error);\n return null;\n }\n}\n","/**\n * Check Events API - Types and Client Functions\n *\n * Provides timeline/conversation functionality for Checks, enabling\n * GitHub PR-style discussions with comments and automatic tracking\n * of state changes.\n *\n * NOTE: This feature is only available when connected to Recce Cloud.\n */\n\nimport { AxiosResponse } from \"axios\";\nimport { axiosClient } from \"./axiosClient\";\n\n// ============================================================================\n// Event Types\n// ============================================================================\n\nexport type CheckEventType =\n | \"check_created\"\n | \"comment\"\n | \"approval_change\"\n | \"description_change\"\n | \"name_change\"\n | \"preset_applied\";\n\nexport type ActorType = \"user\" | \"recce_ai\" | \"preset_system\";\n\n// ============================================================================\n// Actor Interface\n// ============================================================================\n\nexport interface CheckEventActor {\n type: ActorType;\n user_id: number | null;\n login: string | null;\n fullname: string | null;\n}\n\n// ============================================================================\n// Check Event Interface\n// ============================================================================\n\nexport interface CheckEvent {\n id: string;\n check_id: string;\n event_type: CheckEventType;\n actor: CheckEventActor;\n content: string | null;\n old_value: string | null;\n new_value: string | null;\n is_edited: boolean;\n is_deleted: boolean;\n created_at: string;\n updated_at: string;\n}\n\n// ============================================================================\n// Request/Response Types\n// ============================================================================\n\nexport interface CreateCommentRequest {\n content: string;\n}\n\nexport interface UpdateCommentRequest {\n content: string;\n}\n\nexport interface CheckEventsListResponse {\n events: CheckEvent[];\n}\n\n// ============================================================================\n// API Client Functions\n// ============================================================================\n\n/**\n * List all events for a check in chronological order.\n *\n * @param checkId - The check ID\n * @returns Promise resolving to array of CheckEvent objects\n */\nexport async function listCheckEvents(checkId: string): Promise<CheckEvent[]> {\n const response = await axiosClient.get<never, AxiosResponse<CheckEvent[]>>(\n `/api/checks/${checkId}/events`,\n );\n return response.data;\n}\n\n/**\n * Get a specific event by ID.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID\n * @returns Promise resolving to a CheckEvent object\n */\nexport async function getCheckEvent(\n checkId: string,\n eventId: string,\n): Promise<CheckEvent> {\n const response = await axiosClient.get<never, AxiosResponse<CheckEvent>>(\n `/api/checks/${checkId}/events/${eventId}`,\n );\n return response.data;\n}\n\n/**\n * Create a new comment on a check.\n *\n * @param checkId - The check ID\n * @param content - The comment content (plain text for now, markdown later)\n * @returns Promise resolving to the created CheckEvent\n */\nexport async function createComment(\n checkId: string,\n content: string,\n): Promise<CheckEvent> {\n const response = await axiosClient.post<\n CreateCommentRequest,\n AxiosResponse<CheckEvent>\n >(`/api/checks/${checkId}/events`, { content });\n return response.data;\n}\n\n/**\n * Update an existing comment.\n * Only the author or an admin can update a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to update\n * @param content - The new comment content\n * @returns Promise resolving to the updated CheckEvent\n */\nexport async function updateComment(\n checkId: string,\n eventId: string,\n content: string,\n): Promise<CheckEvent> {\n const response = await axiosClient.patch<\n UpdateCommentRequest,\n AxiosResponse<CheckEvent>\n >(`/api/checks/${checkId}/events/${eventId}`, { content });\n return response.data;\n}\n\n/**\n * Delete a comment (soft delete).\n * Only the author or an admin can delete a comment.\n *\n * @param checkId - The check ID\n * @param eventId - The event ID of the comment to delete\n * @returns Promise resolving when deletion is complete\n */\nexport async function deleteComment(\n checkId: string,\n eventId: string,\n): Promise<void> {\n await axiosClient.delete(`/api/checks/${checkId}/events/${eventId}`);\n}\n\n// ============================================================================\n// Type Guards\n// ============================================================================\n\nexport function isCommentEvent(event: CheckEvent): boolean {\n return event.event_type === \"comment\";\n}\n\nexport function isStateChangeEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"approval_change\" ||\n event.event_type === \"description_change\" ||\n event.event_type === \"name_change\"\n );\n}\n\nexport function isSystemEvent(event: CheckEvent): boolean {\n return (\n event.event_type === \"check_created\" ||\n event.event_type === \"preset_applied\"\n );\n}\n\n// ============================================================================\n// Display Helpers\n// ============================================================================\n\n/**\n * Get a human-readable description of an event for display.\n */\nexport function getEventDescription(event: CheckEvent): string {\n const actorName = event.actor.fullname || event.actor.login || \"Someone\";\n\n switch (event.event_type) {\n case \"check_created\":\n return `${actorName} created this check`;\n case \"comment\":\n if (event.is_deleted) {\n return \"Comment deleted\";\n }\n return event.content || \"\";\n case \"approval_change\":\n if (event.new_value === \"true\") {\n return `${actorName} approved this check`;\n }\n return `${actorName} unapproved this check`;\n case \"description_change\":\n return `${actorName} updated the description`;\n case \"name_change\":\n return `${actorName} renamed this check`;\n case \"preset_applied\":\n return `${actorName} applied a preset`;\n default:\n return `${actorName} made a change`;\n }\n}\n\n/**\n * Get the appropriate icon name for an event type.\n * Returns a string that can be used with react-icons.\n */\nexport function getEventIconType(\n event: CheckEvent,\n): \"comment\" | \"approve\" | \"unapprove\" | \"edit\" | \"create\" | \"preset\" {\n switch (event.event_type) {\n case \"check_created\":\n return \"create\";\n case \"comment\":\n return \"comment\";\n case \"approval_change\":\n return event.new_value === \"true\" ? \"approve\" : \"unapprove\";\n case \"description_change\":\n case \"name_change\":\n return \"edit\";\n case \"preset_applied\":\n return \"preset\";\n default:\n return \"edit\";\n }\n}\n","/**\n * Custom hook for managing check events (timeline/conversation).\n *\n * Provides data fetching with polling for real-time updates,\n * and mutation functions for CRUD operations.\n */\n\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport {\n CheckEvent,\n createComment,\n deleteComment,\n listCheckEvents,\n updateComment,\n} from \"@/lib/api/checkEvents\";\n\nconst POLLING_INTERVAL = 10000; // 10 seconds\n\ninterface UseCheckEventsOptions {\n enabled?: boolean;\n}\n\nexport function useCheckEvents(\n checkId: string,\n options: UseCheckEventsOptions = {},\n) {\n const { enabled = true } = options;\n const queryClient = useQueryClient();\n\n // Fetch events with polling\n const {\n data: events,\n isLoading,\n error,\n refetch,\n } = useQuery({\n queryKey: cacheKeys.checkEvents(checkId),\n queryFn: () => listCheckEvents(checkId),\n enabled,\n refetchInterval: POLLING_INTERVAL,\n refetchIntervalInBackground: false,\n });\n\n // Create comment mutation\n const createCommentMutation = useMutation({\n mutationFn: (content: string) => createComment(checkId, content),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.checkEvents(checkId),\n });\n },\n });\n\n // Update comment mutation\n const updateCommentMutation = useMutation({\n mutationFn: ({ eventId, content }: { eventId: string; content: string }) =>\n updateComment(checkId, eventId, content),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.checkEvents(checkId),\n });\n },\n });\n\n // Delete comment mutation\n const deleteCommentMutation = useMutation({\n mutationFn: (eventId: string) => deleteComment(checkId, eventId),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.checkEvents(checkId),\n });\n },\n });\n\n return {\n events: events ?? [],\n isLoading,\n error,\n refetch,\n\n // Mutations\n createComment: createCommentMutation.mutate,\n isCreatingComment: createCommentMutation.isPending,\n createCommentError: createCommentMutation.error,\n\n // Use mutateAsync for updateComment to allow awaiting in UI\n updateComment: updateCommentMutation.mutateAsync,\n isUpdatingComment: updateCommentMutation.isPending,\n updateCommentError: updateCommentMutation.error,\n\n // Use mutateAsync for deleteComment to allow awaiting in UI\n deleteComment: deleteCommentMutation.mutateAsync,\n isDeletingComment: deleteCommentMutation.isPending,\n deleteCommentError: deleteCommentMutation.error,\n };\n}\n","/**\n * CommentInput - Text area for adding new comments to a check timeline.\n */\n\nimport { Box, Button, Flex, Textarea } from \"@chakra-ui/react\";\nimport { useState } from \"react\";\n\ninterface CommentInputProps {\n onSubmit: (content: string) => void;\n isSubmitting?: boolean;\n placeholder?: string;\n}\n\nexport function CommentInput({\n onSubmit,\n isSubmitting = false,\n placeholder = \"Add a comment...\",\n}: CommentInputProps) {\n const [content, setContent] = useState(\"\");\n\n const handleSubmit = () => {\n const trimmed = content.trim();\n if (trimmed) {\n onSubmit(trimmed);\n setContent(\"\");\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n // Submit on Cmd+Enter or Ctrl+Enter\n if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSubmit();\n }\n };\n\n return (\n <Box>\n <Textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n size=\"sm\"\n resize=\"vertical\"\n minH=\"80px\"\n bg=\"white\"\n borderColor=\"gray.200\"\n _focus={{ borderColor: \"blue.400\", boxShadow: \"0 0 0 1px #4299E1\" }}\n disabled={isSubmitting}\n />\n <Flex justify=\"flex-end\" mt={2}>\n <Button\n size=\"sm\"\n colorPalette=\"blue\"\n onClick={handleSubmit}\n disabled={!content.trim() || isSubmitting}\n loading={isSubmitting}\n >\n Comment\n </Button>\n </Flex>\n </Box>\n );\n}\n","/**\n * ExternalLinkConfirmDialog - Confirmation dialog for external links.\n *\n * Shows a warning when users click on links that navigate outside of Recce.\n */\n\nimport {\n Box,\n Button,\n CloseButton,\n Code,\n Dialog,\n Portal,\n Text,\n} from \"@chakra-ui/react\";\nimport { useRef } from \"react\";\nimport { PiWarning } from \"react-icons/pi\";\n\ninterface ExternalLinkConfirmDialogProps {\n /** Whether the dialog is open */\n isOpen: boolean;\n /** The external URL the user is trying to navigate to */\n url: string;\n /** Callback when user confirms navigation */\n onConfirm: () => void;\n /** Callback when user cancels navigation */\n onCancel: () => void;\n}\n\n/**\n * Truncate a URL for display, keeping the domain visible\n */\nfunction truncateUrl(url: string, maxLength = 60): string {\n if (url.length <= maxLength) return url;\n\n try {\n const urlObj = new URL(url);\n const domain = urlObj.hostname;\n const path = urlObj.pathname + urlObj.search + urlObj.hash;\n\n // Always show the domain\n if (domain.length >= maxLength - 3) {\n return domain.substring(0, maxLength - 3) + \"...\";\n }\n\n // Calculate remaining space for path\n const remainingLength = maxLength - domain.length - 3;\n if (path.length > remainingLength) {\n return `${domain}${path.substring(0, remainingLength)}...`;\n }\n\n return url;\n } catch {\n // If URL parsing fails, just truncate normally\n return url.substring(0, maxLength - 3) + \"...\";\n }\n}\n\nexport function ExternalLinkConfirmDialog({\n isOpen,\n url,\n onConfirm,\n onCancel,\n}: ExternalLinkConfirmDialogProps) {\n const cancelRef = useRef<HTMLButtonElement>(null);\n\n return (\n <Dialog.Root\n open={isOpen}\n onOpenChange={(e) => {\n if (!e.open) onCancel();\n }}\n role=\"alertdialog\"\n initialFocusEl={() => cancelRef.current}\n size=\"md\"\n >\n <Portal>\n <Dialog.Backdrop />\n <Dialog.Positioner>\n <Dialog.Content>\n <Dialog.Header>\n <Dialog.Title display=\"flex\" alignItems=\"center\" gap={2}>\n <Box as={PiWarning} color=\"orange.500\" boxSize=\"20px\" />\n External Link\n </Dialog.Title>\n </Dialog.Header>\n\n <Dialog.Body>\n <Text mb={3}>\n This link will take you to an external website outside of Recce.\n Are you sure you want to continue?\n </Text>\n <Box\n bg=\"gray.50\"\n p={2}\n borderRadius=\"md\"\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n >\n <Code\n fontSize=\"sm\"\n wordBreak=\"break-all\"\n whiteSpace=\"pre-wrap\"\n bg=\"transparent\"\n >\n {truncateUrl(url, 100)}\n </Code>\n </Box>\n </Dialog.Body>\n\n <Dialog.Footer gap={2}>\n <Button ref={cancelRef} variant=\"outline\" onClick={onCancel}>\n Cancel\n </Button>\n <Button colorPalette=\"blue\" onClick={onConfirm}>\n Open Link\n </Button>\n </Dialog.Footer>\n\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n );\n}\n","/**\n * MarkdownContent - Renders GitHub-flavored Markdown content.\n *\n * Features:\n * - GFM support (tables, task lists, strikethrough, autolinks)\n * - Syntax highlighting for code blocks\n * - External link confirmation dialog\n * - XSS-safe rendering (no dangerouslySetInnerHTML)\n */\n\nimport { Box, Code, Link, Text } from \"@chakra-ui/react\";\nimport React, { useState } from \"react\";\nimport Markdown, { Components } from \"react-markdown\";\nimport { Prism as SyntaxHighlighter } from \"react-syntax-highlighter\";\nimport { oneDark } from \"react-syntax-highlighter/dist/esm/styles/prism\";\nimport remarkGfm from \"remark-gfm\";\nimport { ExternalLinkConfirmDialog } from \"./ExternalLinkConfirmDialog\";\n\ninterface MarkdownContentProps {\n /** The markdown content to render */\n content: string;\n /** Font size for the rendered content */\n fontSize?: string;\n /** Base URL for determining internal links (defaults to window.location.origin) */\n internalDomains?: string[];\n}\n\n/**\n * Check if a URL is external (not part of the Recce application)\n */\nfunction isExternalUrl(href: string, internalDomains: string[]): boolean {\n if (!href) return false;\n\n // Relative URLs are internal\n if (href.startsWith(\"/\") || href.startsWith(\"#\") || href.startsWith(\"?\")) {\n return false;\n }\n\n // Check for protocol-relative or absolute URLs\n try {\n const url = new URL(href, window.location.origin);\n\n // Check if the hostname matches any internal domain\n return !internalDomains.some(\n (domain) =>\n url.hostname === domain || url.hostname.endsWith(`.${domain}`),\n );\n } catch {\n // If URL parsing fails, treat as internal (likely a relative path)\n return false;\n }\n}\n\n/**\n * Custom link component that shows confirmation for external links\n */\nfunction MarkdownLink({\n href,\n children,\n internalDomains,\n}: {\n href?: string;\n children?: React.ReactNode;\n internalDomains: string[];\n}) {\n const [showConfirm, setShowConfirm] = useState(false);\n const [pendingUrl, setPendingUrl] = useState<string | null>(null);\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>) => {\n if (!href) return;\n\n if (isExternalUrl(href, internalDomains)) {\n e.preventDefault();\n setPendingUrl(href);\n setShowConfirm(true);\n }\n };\n\n const handleConfirm = () => {\n if (pendingUrl) {\n window.open(pendingUrl, \"_blank\", \"noopener,noreferrer\");\n }\n setShowConfirm(false);\n setPendingUrl(null);\n };\n\n const handleCancel = () => {\n setShowConfirm(false);\n setPendingUrl(null);\n };\n\n const isExternal = href ? isExternalUrl(href, internalDomains) : false;\n\n return (\n <>\n <Link\n href={href}\n onClick={handleClick}\n color=\"blue.500\"\n textDecoration=\"underline\"\n _hover={{ color: \"blue.600\" }}\n target=\"_blank\"\n rel={isExternal ? \"noopener noreferrer\" : undefined}\n >\n {children}\n {isExternal && \" ↗\"}\n </Link>\n <ExternalLinkConfirmDialog\n isOpen={showConfirm}\n url={pendingUrl || \"\"}\n onConfirm={handleConfirm}\n onCancel={handleCancel}\n />\n </>\n );\n}\n\n/**\n * Custom code block component with syntax highlighting\n */\nfunction CodeBlock({\n className,\n children,\n ...props\n}: {\n className?: string;\n children?: React.ReactNode;\n node?: unknown;\n}) {\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match ? match[1] : undefined;\n const codeString = String(children).replace(/\\n$/, \"\");\n\n // Check if this is an inline code block (no language, single line, no newlines)\n const isInline = !match && !String(children).includes(\"\\n\");\n\n if (isInline) {\n return (\n <Code\n bg=\"gray.100\"\n px={1}\n py={0.5}\n borderRadius=\"sm\"\n fontSize=\"0.9em\"\n {...props}\n >\n {children}\n </Code>\n );\n }\n\n return (\n <Box my={2} borderRadius=\"md\" overflow=\"hidden\" fontSize=\"sm\">\n <SyntaxHighlighter\n style={oneDark}\n language={language}\n PreTag=\"div\"\n customStyle={{\n margin: 0,\n borderRadius: \"6px\",\n fontSize: \"0.85em\",\n }}\n >\n {codeString}\n </SyntaxHighlighter>\n </Box>\n );\n}\n\nexport function MarkdownContent({\n content,\n fontSize = \"sm\",\n internalDomains = [],\n}: MarkdownContentProps) {\n // Build the list of internal domains\n const allInternalDomains = [\n window.location.hostname,\n \"reccehq.com\",\n \"datarecce.io\",\n \"localhost\",\n ...internalDomains,\n ];\n\n // Custom component renderers\n const components: Components = {\n // Links with external confirmation\n a: ({ href, children }) => (\n <MarkdownLink href={href} internalDomains={allInternalDomains}>\n {children}\n </MarkdownLink>\n ),\n\n // Code blocks with syntax highlighting\n code: CodeBlock,\n\n // Paragraphs\n p: ({ children }) => (\n <Text fontSize={fontSize} mb={2} _last={{ mb: 0 }}>\n {children}\n </Text>\n ),\n\n // Headers\n h1: ({ children }) => (\n <Text fontSize=\"xl\" fontWeight=\"bold\" mb={2} mt={3}>\n {children}\n </Text>\n ),\n h2: ({ children }) => (\n <Text fontSize=\"lg\" fontWeight=\"bold\" mb={2} mt={3}>\n {children}\n </Text>\n ),\n h3: ({ children }) => (\n <Text fontSize=\"md\" fontWeight=\"semibold\" mb={2} mt={2}>\n {children}\n </Text>\n ),\n\n // Lists\n ul: ({ children }) => (\n <Box as=\"ul\" pl={4} mb={2} listStyleType=\"disc\">\n {children}\n </Box>\n ),\n ol: ({ children }) => (\n <Box as=\"ol\" pl={4} mb={2} listStyleType=\"decimal\">\n {children}\n </Box>\n ),\n li: ({ children }) => (\n <Box as=\"li\" fontSize={fontSize} mb={1}>\n {children}\n </Box>\n ),\n\n // Blockquotes\n blockquote: ({ children }) => (\n <Box\n borderLeftWidth=\"3px\"\n borderLeftColor=\"gray.300\"\n pl={3}\n py={1}\n my={2}\n color=\"gray.600\"\n fontStyle=\"italic\"\n >\n {children}\n </Box>\n ),\n\n // Tables\n table: ({ children }) => (\n <Box overflowX=\"auto\" my={2}>\n <Box\n as=\"table\"\n width=\"100%\"\n fontSize={fontSize}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n borderRadius=\"md\"\n >\n {children}\n </Box>\n </Box>\n ),\n thead: ({ children }) => (\n <Box as=\"thead\" bg=\"gray.50\">\n {children}\n </Box>\n ),\n tbody: ({ children }) => <Box as=\"tbody\">{children}</Box>,\n tr: ({ children }) => (\n <Box as=\"tr\" borderBottomWidth=\"1px\" borderColor=\"gray.200\">\n {children}\n </Box>\n ),\n th: ({ children }) => (\n <Box as=\"th\" px={2} py={1} fontWeight=\"semibold\" textAlign=\"left\">\n {children}\n </Box>\n ),\n td: ({ children }) => (\n <Box as=\"td\" px={2} py={1}>\n {children}\n </Box>\n ),\n\n // Horizontal rule\n hr: () => <Box as=\"hr\" my={3} borderColor=\"gray.200\" />,\n\n // Strong/Bold\n strong: ({ children }) => (\n <Text as=\"strong\" fontWeight=\"semibold\">\n {children}\n </Text>\n ),\n\n // Emphasis/Italic\n em: ({ children }) => (\n <Text as=\"em\" fontStyle=\"italic\">\n {children}\n </Text>\n ),\n\n // Strikethrough\n del: ({ children }) => (\n <Text as=\"del\" textDecoration=\"line-through\" color=\"gray.500\">\n {children}\n </Text>\n ),\n };\n\n return (\n <Box className=\"markdown-content\">\n <Markdown remarkPlugins={[remarkGfm]} components={components}>\n {content}\n </Markdown>\n </Box>\n );\n}\n","/**\n * TimelineEvent - Renders a single event in the check timeline.\n *\n * Handles different event types:\n * - check_created: Shows creation message\n * - comment: Shows user comment with edit/delete options\n * - approval_change: Shows approval status change\n * - description_change: Shows description update\n * - name_change: Shows name update\n * - preset_applied: Shows preset application\n */\n\nimport {\n Avatar,\n Box,\n Button,\n Flex,\n HStack,\n Icon,\n IconButton,\n Popover,\n Portal,\n Text,\n Textarea,\n} from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { Activity, useState } from \"react\";\nimport {\n PiBookmarkSimple,\n PiChatText,\n PiCheckCircle,\n PiCircle,\n PiNotePencil,\n PiPencilSimple,\n PiPlusCircle,\n PiTrashSimple,\n} from \"react-icons/pi\";\nimport { MarkdownContent } from \"@/components/ui/markdown/MarkdownContent\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { CheckEvent, getEventIconType } from \"@/lib/api/checkEvents\";\nimport { fetchGitHubAvatar } from \"@/lib/api/user\";\n\ninterface TimelineEventProps {\n event: CheckEvent;\n currentUserId?: string;\n onEdit?: (eventId: string, content: string) => Promise<void>;\n onDelete?: (eventId: string) => Promise<void>;\n}\n\nfunction EventIcon({ event }: { event: CheckEvent }) {\n const iconType = getEventIconType(event);\n\n const iconMap = {\n create: PiPlusCircle,\n comment: PiChatText,\n approve: PiCheckCircle,\n unapprove: PiCircle,\n edit: PiNotePencil,\n preset: PiBookmarkSimple,\n };\n\n const colorMap = {\n create: \"blue.500\",\n comment: \"gray.500\",\n approve: \"green.500\",\n unapprove: \"gray.400\",\n edit: \"orange.500\",\n preset: \"purple.500\",\n };\n\n const IconComponent = iconMap[iconType];\n const color = colorMap[iconType];\n\n return <Icon as={IconComponent} color={color} boxSize=\"16px\" />;\n}\n\nfunction UserAvatar({ event }: { event: CheckEvent }) {\n const { actor } = event;\n const userId = actor.user_id?.toString();\n\n const { data: avatarUrl } = useQuery({\n queryKey: [\"github-avatar\", userId],\n queryFn: () => (userId ? fetchGitHubAvatar(userId) : Promise.resolve(null)),\n enabled: !!userId,\n retry: false,\n staleTime: 5 * 60 * 1000, // Cache for 5 minutes\n });\n\n const displayName = actor.fullname || actor.login || \"User\";\n const initials = displayName.charAt(0).toUpperCase();\n\n return (\n <Avatar.Root size=\"xs\">\n <Avatar.Fallback name={displayName}>{initials}</Avatar.Fallback>\n {avatarUrl && <Avatar.Image src={avatarUrl} />}\n </Avatar.Root>\n );\n}\n\nfunction StateChangeEvent({ event }: { event: CheckEvent }) {\n const { actor } = event;\n const actorName = actor.fullname || actor.login || \"Someone\";\n const relativeTime = formatDistanceToNow(new Date(event.created_at), {\n addSuffix: true,\n });\n\n let message = \"\";\n switch (event.event_type) {\n case \"check_created\":\n message = \"created this check\";\n break;\n case \"approval_change\":\n message =\n event.new_value === \"true\"\n ? \"approved this check\"\n : \"unapproved this check\";\n break;\n case \"description_change\":\n message = \"updated the description\";\n break;\n case \"name_change\":\n message = \"renamed this check\";\n break;\n case \"preset_applied\":\n message = \"applied a preset\";\n break;\n default:\n message = \"made a change\";\n }\n\n return (\n <Flex gap={2} alignItems=\"flex-start\" py={2}>\n <Box pt=\"2px\">\n <EventIcon event={event} />\n </Box>\n <Box flex={1}>\n <HStack gap={1} flexWrap=\"wrap\">\n <UserAvatar event={event} />\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {actorName}\n </Text>\n <Text fontSize=\"sm\" color=\"gray.600\">\n {message}\n </Text>\n <Text fontSize=\"xs\" color=\"gray.400\">\n {relativeTime}\n </Text>\n </HStack>\n </Box>\n </Flex>\n );\n}\n\nfunction CommentEvent({\n event,\n currentUserId,\n onEdit,\n onDelete,\n}: {\n event: CheckEvent;\n currentUserId?: string;\n onEdit?: (eventId: string, content: string) => Promise<void>;\n onDelete?: (eventId: string) => Promise<void>;\n}) {\n const [isEditing, setIsEditing] = useState(false);\n const [editContent, setEditContent] = useState(event.content || \"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n const [isDeletePopoverOpen, setIsDeletePopoverOpen] = useState(false);\n\n const { actor } = event;\n const actorName = actor.fullname || actor.login || \"Someone\";\n const relativeTime = formatDistanceToNow(new Date(event.created_at), {\n addSuffix: true,\n });\n const isAuthor =\n currentUserId && String(actor.user_id) === String(currentUserId);\n\n const handleStartEdit = () => {\n setEditContent(event.content || \"\");\n setIsEditing(true);\n };\n\n const handleCancelEdit = () => {\n setEditContent(event.content || \"\");\n setIsEditing(false);\n };\n\n const handleSaveEdit = async () => {\n const trimmed = editContent.trim();\n if (!trimmed || trimmed === event.content) {\n handleCancelEdit();\n return;\n }\n\n if (onEdit) {\n setIsSubmitting(true);\n try {\n await onEdit(event.id, trimmed);\n setIsEditing(false);\n } finally {\n setIsSubmitting(false);\n }\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (e.key === \"Escape\") {\n handleCancelEdit();\n } else if (e.key === \"Enter\" && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleSaveEdit();\n }\n };\n\n const handleDelete = async () => {\n if (onDelete) {\n setIsDeleting(true);\n try {\n await onDelete(event.id);\n setIsDeletePopoverOpen(false);\n } finally {\n setIsDeleting(false);\n }\n }\n };\n\n if (event.is_deleted) {\n return (\n <Flex gap={2} alignItems=\"center\" py={2}>\n <Box pt=\"2px\" display=\"flex\" alignItems=\"center\">\n <EventIcon event={event} />\n </Box>\n <Box display=\"flex\" flex={1} alignItems=\"center\">\n <Text fontSize=\"sm\" color=\"gray.400\" fontStyle=\"italic\">\n Comment deleted\n </Text>\n </Box>\n </Flex>\n );\n }\n\n return (\n <Flex gap={2} alignItems=\"flex-start\" py={2}>\n <Box pt=\"2px\">\n <EventIcon event={event} />\n </Box>\n <Box flex={1}>\n <HStack gap={1} mb={1} flexWrap=\"wrap\">\n <UserAvatar event={event} />\n <Text fontSize=\"sm\" fontWeight=\"medium\">\n {actorName}\n <Activity mode={isAuthor ? \"visible\" : \"hidden\"}>\n {\" \"}\n (Author)\n </Activity>\n </Text>\n <Text fontSize=\"xs\" color=\"gray.400\">\n {relativeTime}\n </Text>\n {event.is_edited && (\n <Text fontSize=\"xs\" color=\"gray.400\">\n (edited)\n </Text>\n )}\n </HStack>\n\n {isEditing ? (\n // Edit mode\n <Box>\n <Textarea\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n resize=\"vertical\"\n minH=\"80px\"\n bg=\"white\"\n borderColor=\"gray.300\"\n _focus={{\n borderColor: \"blue.400\",\n boxShadow: \"0 0 0 1px #4299E1\",\n }}\n disabled={isSubmitting}\n autoFocus\n />\n <HStack gap={2} mt={2} justify=\"flex-end\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={handleCancelEdit}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n size=\"xs\"\n colorPalette=\"blue\"\n onClick={handleSaveEdit}\n disabled={!editContent.trim() || isSubmitting}\n loading={isSubmitting}\n >\n Save\n </Button>\n </HStack>\n </Box>\n ) : (\n // View mode\n <Box\n className=\"group\"\n bg=\"gray.50\"\n borderRadius=\"md\"\n p={2}\n borderWidth=\"1px\"\n borderColor=\"gray.200\"\n position=\"relative\"\n >\n <MarkdownContent content={event.content || \"\"} fontSize=\"sm\" />\n\n {/* Edit/Delete buttons - only visible to author on hover */}\n <Activity\n mode={isAuthor && (onEdit || onDelete) ? \"visible\" : \"hidden\"}\n >\n <HStack\n position=\"absolute\"\n top={1}\n right={1}\n gap={0}\n opacity={0}\n _groupHover={{ opacity: 1 }}\n transition=\"opacity 0.2s\"\n >\n {onEdit && (\n <Tooltip content=\"Edit comment\">\n <IconButton\n aria-label=\"Edit comment\"\n size=\"xs\"\n variant=\"ghost\"\n onClick={handleStartEdit}\n >\n <PiPencilSimple />\n </IconButton>\n </Tooltip>\n )}\n {onDelete && (\n <Popover.Root\n open={isDeletePopoverOpen}\n onOpenChange={(e) => setIsDeletePopoverOpen(e.open)}\n >\n <Popover.Trigger asChild>\n <span>\n <Tooltip content=\"Delete comment\">\n <IconButton\n aria-label=\"Delete comment\"\n size=\"xs\"\n variant=\"ghost\"\n colorPalette=\"red\"\n >\n <PiTrashSimple />\n </IconButton>\n </Tooltip>\n </span>\n </Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content width=\"auto\">\n <Popover.Arrow>\n <Popover.ArrowTip />\n </Popover.Arrow>\n <Popover.Body p={3}>\n <Text fontSize=\"sm\" mb={3}>\n Delete this comment?\n </Text>\n <HStack gap={2} justify=\"flex-end\">\n <Button\n size=\"xs\"\n variant=\"ghost\"\n onClick={() => setIsDeletePopoverOpen(false)}\n disabled={isDeleting}\n >\n Cancel\n </Button>\n <Button\n size=\"xs\"\n colorPalette=\"red\"\n onClick={handleDelete}\n loading={isDeleting}\n >\n Delete\n </Button>\n </HStack>\n </Popover.Body>\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n )}\n </HStack>\n </Activity>\n </Box>\n )}\n </Box>\n </Flex>\n );\n}\n\nexport function TimelineEvent({\n event,\n currentUserId,\n onEdit,\n onDelete,\n}: TimelineEventProps) {\n if (event.event_type === \"comment\") {\n return (\n <CommentEvent\n event={event}\n currentUserId={currentUserId}\n onEdit={onEdit}\n onDelete={onDelete}\n />\n );\n }\n\n return <StateChangeEvent event={event} />;\n}\n","/**\n * CheckTimeline - Main timeline/conversation panel for a check.\n *\n * Displays a chronological list of events (comments, state changes)\n * and provides an input for adding new comments.\n *\n * This component is only rendered when connected to Recce Cloud.\n */\n\nimport {\n Box,\n Center,\n Heading,\n Separator,\n Spinner,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { fetchUser } from \"@/lib/api/user\";\nimport { useCheckEvents } from \"@/lib/hooks/useCheckEvents\";\nimport { CommentInput } from \"./CommentInput\";\nimport { TimelineEvent } from \"./TimelineEvent\";\n\ninterface CheckTimelineProps {\n checkId: string;\n}\n\nexport function CheckTimeline({ checkId }: CheckTimelineProps) {\n const {\n events,\n isLoading,\n error,\n createComment,\n isCreatingComment,\n updateComment,\n deleteComment,\n } = useCheckEvents(checkId);\n\n // Get current user for determining edit/delete permissions\n const { data: currentUser } = useQuery({\n queryKey: cacheKeys.user(),\n queryFn: fetchUser,\n retry: false,\n });\n\n const handleCreateComment = (content: string) => {\n createComment(content);\n };\n\n const handleEditComment = async (eventId: string, content: string) => {\n await updateComment({ eventId, content });\n };\n\n const handleDeleteComment = async (eventId: string) => {\n await deleteComment(eventId);\n };\n\n if (isLoading) {\n return (\n <Center h=\"100%\" p={4}>\n <Spinner size=\"sm\" />\n </Center>\n );\n }\n\n if (error) {\n return (\n <Center h=\"100%\" p={4}>\n <Text fontSize=\"sm\" color=\"red.500\">\n Failed to load timeline\n </Text>\n </Center>\n );\n }\n\n return (\n <VStack\n h=\"100%\"\n align=\"stretch\"\n gap={0}\n borderLeft=\"1px solid\"\n borderColor=\"gray.200\"\n >\n {/* Header */}\n <Box px={3} py={2} borderBottom=\"1px solid\" borderColor=\"gray.200\">\n <Heading size=\"sm\" fontWeight=\"medium\">\n Activity\n </Heading>\n </Box>\n\n {/* Events List - Scrollable */}\n <Box flex={1} overflowY=\"auto\" px={3} py={2}>\n {events.length === 0 ? (\n <Text fontSize=\"sm\" color=\"gray.500\">\n No activity yet\n </Text>\n ) : (\n <VStack align=\"stretch\" gap={0}>\n {events.map((event, index) => (\n <Box key={event.id}>\n <TimelineEvent\n event={event}\n currentUserId={currentUser?.id}\n onEdit={handleEditComment}\n onDelete={handleDeleteComment}\n />\n {index < events.length - 1 && (\n <Separator borderColor=\"gray.100\" />\n )}\n </Box>\n ))}\n </VStack>\n )}\n </Box>\n\n {/* Comment Input - Fixed at bottom */}\n <Box\n px={3}\n py={3}\n borderTop=\"1px solid\"\n borderColor=\"gray.200\"\n bg=\"gray.50\"\n >\n <CommentInput\n onSubmit={handleCreateComment}\n isSubmitting={isCreatingComment}\n />\n </Box>\n </VStack>\n );\n}\n","import React, { createContext, useContext } from \"react\";\n\nexport interface CheckContext {\n latestSelectedCheckId: string;\n setLatestSelectedCheckId: (selectCheckId: string) => void;\n}\n\ninterface CheckContextProps {\n children: React.ReactNode;\n}\n\nconst RecceCheckContext = createContext<CheckContext>({\n latestSelectedCheckId: \"\",\n setLatestSelectedCheckId: () => {\n return void 0;\n },\n});\n\nexport function RecceCheckContextProvider({ children }: CheckContextProps) {\n const [selectCheckId, setSelectCheckId] = React.useState<string>(\"\");\n return (\n <RecceCheckContext.Provider\n value={{\n setLatestSelectedCheckId: setSelectCheckId,\n latestSelectedCheckId: selectCheckId,\n }}\n >\n {children}\n </RecceCheckContext.Provider>\n );\n}\n\nexport const useRecceCheckContext = () => useContext(RecceCheckContext);\n","import { Box, Breadcrumb, Input } from \"@chakra-ui/react\";\nimport React, {\n ChangeEvent,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\n\ninterface CheckBreadcrumbProps {\n name: string;\n setName: (name: string) => void;\n}\n\nexport function CheckBreadcrumb({ name, setName }: CheckBreadcrumbProps) {\n const [isEditing, setIsEditing] = useState(false);\n const [editValue, setEditValue] = useState(name);\n const editInputRef = useRef<HTMLInputElement>(null);\n\n const handleClick = () => {\n setEditValue(name);\n setIsEditing(true);\n };\n\n const handleCommit = useCallback(() => {\n setName(editValue);\n setIsEditing(false);\n }, [setName, editValue]);\n\n const handleKeyDown: React.KeyboardEventHandler = (event) => {\n if (event.key === \"Enter\") {\n setName(editValue);\n setIsEditing(false);\n } else if (event.key === \"Escape\") {\n setEditValue(name);\n setIsEditing(false);\n }\n };\n\n const handleChange: React.ChangeEventHandler = (\n event: ChangeEvent<HTMLInputElement>,\n ) => {\n setEditValue(event.target.value);\n };\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n editInputRef.current &&\n !editInputRef.current.contains(event.target as Node | null)\n ) {\n handleCommit();\n }\n };\n\n if (isEditing) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n }\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n };\n }, [isEditing, handleCommit]);\n\n return (\n <Breadcrumb.Root\n flex=\"0 1 auto\"\n fontSize=\"12pt\"\n fontWeight=\"500\"\n className=\"no-track-pii-safe\"\n overflow={\"hidden\"}\n >\n <Breadcrumb.Item cursor=\"pointer\" flex=\"0 1 auto\" overflow=\"hidden\">\n {isEditing ? (\n <Input\n ref={editInputRef}\n value={editValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n size=\"sm\"\n w=\"100%\"\n />\n ) : (\n <Box\n flex=\"0 1 auto\"\n onClick={handleClick}\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n >\n {name}\n </Box>\n )}\n </Breadcrumb.Item>\n </Breadcrumb.Root>\n );\n}\n","import { Button, Flex, Link, Text, Textarea } from \"@chakra-ui/react\";\nimport {\n ChangeEvent,\n ChangeEventHandler,\n KeyboardEventHandler,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\n\ninterface CheckDescriptionProps {\n value?: string;\n onChange?: (value?: string) => void;\n}\n\nexport function CheckDescription({ value, onChange }: CheckDescriptionProps) {\n const { featureToggles } = useRecceInstanceContext();\n const [editing, setEditing] = useState(false);\n const [tempValue, setTempValue] = useState<string>();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleEdit = () => {\n setTempValue(value ?? \"\");\n setEditing(true);\n };\n\n const handleCancel = () => {\n setTimeout(() => {\n setEditing(false);\n }, 100);\n };\n\n const handleUpdate = () => {\n if (onChange) {\n onChange(tempValue);\n setEditing(false);\n }\n };\n\n const handleKeyDown: KeyboardEventHandler = (event) => {\n if (event.key === \"Escape\") {\n setEditing(false);\n }\n if (\n (event.metaKey || event.ctrlKey) && // mac: cmd, windows: ctrl\n event.key === \"Enter\"\n ) {\n event.preventDefault();\n handleUpdate();\n }\n };\n\n const handleChange: ChangeEventHandler = (\n event: ChangeEvent<HTMLTextAreaElement>,\n ) => {\n setTempValue(event.target.value);\n };\n\n useEffect(() => {\n if (editing && textareaRef.current) {\n const element = textareaRef.current;\n element.focus();\n element.setSelectionRange(element.value.length, element.value.length);\n }\n }, [editing]);\n\n if (editing) {\n return (\n <Flex\n direction=\"column\"\n align=\"flex-end\"\n height=\"100%\"\n className=\"no-track-pii-safe\"\n >\n <Textarea\n value={tempValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={textareaRef}\n flex={1}\n ></Textarea>\n <Flex gap=\"12px\" alignItems=\"flex-end\">\n <Link onClick={handleCancel} colorPalette=\"blue\">\n cancel\n </Link>\n <Button mt=\"8px\" size=\"sm\" colorPalette=\"blue\" onClick={handleUpdate}>\n Update\n </Button>\n </Flex>\n </Flex>\n );\n }\n\n return (\n <Text\n className=\"no-track-pii-safe\"\n height=\"100%\"\n overflow=\"auto\"\n fontSize=\"11pt\"\n onClick={!featureToggles.disableUpdateChecklist ? handleEdit : undefined}\n whiteSpace=\"pre-wrap\"\n wordBreak=\"break-word\"\n color={!value ? \"lightgray\" : \"inherit\"}\n >\n {(value ?? \"\").trim() || \"Add description here\"}\n </Text>\n );\n}\n","import { stripIndent } from \"common-tags\";\nimport { Check } from \"@/lib/api/checks\";\nimport { RunParamTypes } from \"@/lib/api/types\";\n\nexport function buildTitle(check: Check) {\n return `${check.is_checked ? \"✅ \" : \"\"}${check.name}`;\n}\n\nexport function buildDescription(check: Check) {\n return (check.description ?? \"\") || \"_(no description)_\";\n}\n\nexport function buildQuery(check: Check<RunParamTypes>) {\n const params = check.params;\n let sqlTemplate = \"\";\n if (params && \"sql_template\" in params) {\n sqlTemplate = params.sql_template;\n }\n return stripIndent`\n **SQL**\n \\`\\`\\`sql\n ${sqlTemplate}\n \\`\\`\\`\n `;\n}\n","import { Flex } from \"@chakra-ui/react\";\nimport { ReactFlowProvider } from \"@xyflow/react\";\nimport { forwardRef, Ref } from \"react\";\nimport { Check } from \"@/lib/api/checks\";\nimport { LineageDiffViewOptions } from \"@/lib/api/lineagecheck\";\nimport { LineageView, LineageViewRef } from \"../lineage/LineageView\";\n\nexport interface LineageDiffViewProps {\n check: Check;\n}\n\nfunction _LineageDiffView(\n { check }: LineageDiffViewProps,\n ref: Ref<LineageViewRef>,\n) {\n const viewOptions = {\n ...(check.params as Record<string, unknown>),\n ...(check.view_options as LineageDiffViewOptions),\n };\n\n return (\n <Flex direction=\"column\" height=\"100%\">\n <ReactFlowProvider>\n <LineageView viewOptions={viewOptions} interactive={false} ref={ref} />\n </ReactFlowProvider>\n </Flex>\n );\n}\n\nexport const LineageDiffView = forwardRef<LineageViewRef, LineageDiffViewProps>(\n _LineageDiffView,\n);\n","import { Editor } from \"@monaco-editor/react\";\nimport YAML from \"yaml\";\n\nexport function generateCheckTemplate({\n name,\n description,\n type,\n params,\n viewOptions,\n}: PresetCheckTemplateViewProps) {\n const check: Record<string, unknown> = { name, description, type, params };\n if (viewOptions) {\n check.view_options = viewOptions;\n }\n return YAML.stringify({\n checks: [check],\n });\n}\n\ninterface PresetCheckTemplateViewProps {\n name: string;\n description: string;\n type: string;\n params: Record<string, unknown>;\n viewOptions?: Record<string, unknown>;\n}\n\nexport function PresetCheckTemplateView({\n yamlTemplate,\n}: {\n yamlTemplate: string;\n}) {\n return (\n <Editor\n height=\"300px\"\n language=\"yaml\"\n theme=\"vs\"\n value={yamlTemplate}\n options={{\n readOnly: true,\n fontSize: 14,\n lineNumbers: \"off\",\n automaticLayout: true,\n minimap: { enabled: false },\n wordWrap: \"on\",\n wrappingIndent: \"same\",\n scrollBeyondLastLine: false,\n }}\n />\n );\n}\n","import { Box, Center, Flex, Icon, List } from \"@chakra-ui/react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport React, { forwardRef, useMemo, useState } from \"react\";\nimport { DataGridHandle } from \"react-data-grid\";\nimport { IconType } from \"react-icons\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check } from \"@/lib/api/checks\";\nimport { select } from \"@/lib/api/select\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { LineageGraphNode } from \"../lineage/lineage\";\nimport {\n getIconForChangeStatus,\n getIconForResourceType,\n} from \"../lineage/styles\";\nimport { findByRunType } from \"../run/registry\";\nimport { SchemaView } from \"../schema/SchemaView\";\nimport { isSchemaChanged } from \"../schema/schemaDiff\";\nimport { HSplit } from \"../split/Split\";\n\ninterface SchemaDiffViewProps {\n check: Check;\n}\n\nexport interface SchemaDiffParams {\n node_id?: string | string[];\n select?: string;\n exclude?: string;\n view_mode?: \"all\" | \"changed_models\";\n packages?: string[];\n}\n\nconst NodelistItem = ({\n node,\n selected,\n onSelect,\n schemaChanged,\n}: {\n node: LineageGraphNode;\n selected: boolean;\n onSelect: (nodeId: string) => void;\n schemaChanged: boolean;\n}) => {\n const { icon } = getIconForResourceType(node.data.resourceType);\n const { base, current } = node.data.data;\n\n let statusIcon: IconType | undefined;\n let statusColor: string | undefined;\n\n if (schemaChanged) {\n statusIcon = findByRunType(\"schema_diff\").icon;\n statusColor = getIconForChangeStatus(\"modified\").color;\n } else if (!base && current) {\n statusIcon = getIconForChangeStatus(\"added\").icon;\n statusColor = getIconForChangeStatus(\"added\").color;\n } else if (base && !current) {\n statusIcon = getIconForChangeStatus(\"removed\").icon;\n statusColor = getIconForChangeStatus(\"removed\").color;\n }\n\n return (\n <List.Item>\n <Flex\n width=\"100%\"\n fontSize=\"10pt\"\n p=\"5px 8px\"\n cursor=\"pointer\"\n _hover={{ bg: \"gray.200\" }}\n bg={selected ? \"gray.100\" : \"inherit\"}\n onClick={() => {\n onSelect(node.id);\n }}\n alignItems=\"center\"\n gap=\"5px\"\n >\n <Icon as={icon} />\n <Box\n flex=\"1\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n >\n {node.data.name}\n </Box>\n\n {statusIcon && statusColor && (\n <Icon as={statusIcon} color={statusColor} />\n )}\n </Flex>\n </List.Item>\n );\n};\n\nexport function PrivateSchemaDiffView(\n { check }: SchemaDiffViewProps,\n ref: React.Ref<DataGridHandle>,\n) {\n const { lineageGraph } = useLineageGraphContext();\n const params = check.params as SchemaDiffParams;\n\n const queryKey = [...cacheKeys.check(check.check_id), \"select\"];\n\n const { isLoading, error, data } = useQuery({\n queryKey,\n queryFn: async () =>\n select({\n select: params.select,\n exclude: params.exclude,\n packages: params.packages,\n view_mode: params.view_mode,\n }),\n refetchOnMount: true,\n enabled: !params.node_id,\n });\n\n const [nodes, changedNodes] = useMemo(() => {\n const selectedNodes: LineageGraphNode[] = [];\n const changedNodes: string[] = [];\n const addedNodes: string[] = [];\n const removedNodes: string[] = [];\n\n if (params.node_id) {\n const nodeIds =\n params.node_id instanceof Array ? params.node_id : [params.node_id];\n for (const nodeId of nodeIds) {\n const node = lineageGraph?.nodes[nodeId];\n if (node) {\n selectedNodes.push(node);\n }\n }\n } else {\n for (const nodeId of data?.nodes ?? []) {\n const node = lineageGraph?.nodes[nodeId];\n if (node) {\n selectedNodes.push(node);\n }\n }\n }\n\n // filter that the resourec_type is mode,seed, source, or snapshot\n const filteredNodes = selectedNodes.filter(\n (node) =>\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"source\" ||\n node.data.resourceType === \"snapshot\",\n );\n\n for (const node of filteredNodes) {\n if (\n isSchemaChanged(\n node.data.data.base?.columns,\n node.data.data.current?.columns,\n )\n ) {\n changedNodes.push(node.id);\n } else if (!node.data.data.base && node.data.data.current) {\n addedNodes.push(node.id);\n } else if (node.data.data.base && !node.data.data.current) {\n removedNodes.push(node.id);\n }\n }\n function sortScore(node: LineageGraphNode) {\n if (changedNodes.includes(node.id)) {\n return 3;\n }\n if (addedNodes.includes(node.id)) {\n return 2;\n }\n if (removedNodes.includes(node.id)) {\n return 1;\n }\n return 0;\n }\n\n //sort the selectedNodes from schemaChange and node name\n filteredNodes.sort((a, b) => {\n const scoreA = sortScore(a);\n const scoreB = sortScore(b);\n if (scoreA !== scoreB) {\n return scoreB - scoreA;\n } else {\n return a.data.name.localeCompare(b.data.name);\n }\n });\n\n return [filteredNodes, changedNodes];\n }, [params.node_id, data?.nodes, lineageGraph]);\n\n const [selected, setSelected] = useState<number>(0);\n\n if (isLoading) {\n return (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\">\n Loading...\n </Center>\n );\n } else if (error) {\n return (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\" className=\"no-track-pii-safe\">\n Error: {error.message}\n </Center>\n );\n } else if (nodes.length == 0) {\n return (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\">\n No nodes matched\n </Center>\n );\n } else if (selected < nodes.length) {\n const node = nodes[selected];\n return (\n <HSplit sizes={[80, 20]} minSize={30} style={{ height: \"100%\" }}>\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n enableScreenshot={true}\n showMenu={false}\n ref={ref}\n />\n <List.Root\n overflow=\"auto\"\n backgroundColor=\"white\"\n as=\"ul\"\n listStyle=\"none\"\n >\n {nodes.map((node, i) => (\n <NodelistItem\n key={node.id}\n node={node}\n schemaChanged={changedNodes.includes(node.id)}\n selected={i === selected}\n onSelect={() => {\n setSelected(i);\n }}\n />\n ))}\n </List.Root>\n </HSplit>\n );\n }\n\n // TODO: handle the edge case where the node is not found\n return <></>;\n}\n\nexport const SchemaDiffView = forwardRef(PrivateSchemaDiffView);\n","\"use client\";\n\nimport {\n Box,\n Button,\n Center,\n CloseButton,\n Dialog,\n Flex,\n Grid,\n GridItem,\n Heading,\n Highlight,\n HStack,\n Icon,\n IconButton,\n Menu,\n MenuSeparator,\n Portal,\n Spacer,\n Tabs,\n Tag,\n Text,\n useDisclosure,\n VStack,\n} from \"@chakra-ui/react\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { stripIndents } from \"common-tags\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport React, { ReactNode, Ref, useCallback, useRef, useState } from \"react\";\nimport { CiBookmark } from \"react-icons/ci\";\nimport { IoMdCodeWorking } from \"react-icons/io\";\nimport { IoBookmarksOutline } from \"react-icons/io5\";\nimport { PiCheckCircle, PiCopy, PiRepeat, PiTrashFill } from \"react-icons/pi\";\nimport { VscCircleLarge, VscKebabVertical } from \"react-icons/vsc\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\nimport { CheckTimeline } from \"@/components/check/timeline\";\nimport { isDisabledByNoResult } from \"@/components/check/utils\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport {\n QueryDiffParams,\n QueryParams,\n QueryRunParams,\n} from \"@/lib/api/adhocQuery\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport {\n Check,\n deleteCheck,\n getCheck,\n markAsPresetCheck,\n updateCheck,\n} from \"@/lib/api/checks\";\nimport { cancelRun, submitRunFromCheck } from \"@/lib/api/runs\";\nimport { trackCopyToClipboard } from \"@/lib/api/track\";\nimport { Run, RunParamTypes } from \"@/lib/api/types\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceCheckContext } from \"@/lib/hooks/RecceCheckContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useCopyToClipboardButton } from \"@/lib/hooks/ScreenShot\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { useCheckToast } from \"@/lib/hooks/useCheckToast\";\nimport { useClipBoardToast } from \"@/lib/hooks/useClipBoardToast\";\nimport { useRun } from \"@/lib/hooks/useRun\";\nimport { LineageViewRef } from \"../lineage/LineageView\";\nimport SqlEditor, { DualSqlEditor } from \"../query/SqlEditor\";\nimport { RunView } from \"../run/RunView\";\nimport {\n findByRunType,\n RefTypes,\n RegistryEntry,\n ViewOptionTypes,\n} from \"../run/registry\";\nimport { VSplit } from \"../split/Split\";\nimport { CheckBreadcrumb } from \"./CheckBreadcrumb\";\nimport { CheckDescription } from \"./CheckDescription\";\nimport { buildDescription, buildQuery, buildTitle } from \"./check\";\nimport { LineageDiffView } from \"./LineageDiffView\";\nimport {\n generateCheckTemplate,\n PresetCheckTemplateView,\n} from \"./PresetCheckTemplateView\";\nimport { SchemaDiffView } from \"./SchemaDiffView\";\n\ninterface CheckDetailProps {\n checkId: string;\n refreshCheckList?: () => void;\n}\n\ntype TabValueList = \"result\" | \"query\";\n\nexport function CheckDetail({\n checkId,\n refreshCheckList,\n}: CheckDetailProps): ReactNode {\n const { featureToggles, sessionId } = useRecceInstanceContext();\n const { setLatestSelectedCheckId } = useRecceCheckContext();\n const { cloudMode } = useLineageGraphContext();\n const queryClient = useQueryClient();\n const [, setLocation] = useAppLocation();\n const { successToast, failToast } = useClipBoardToast();\n const { markedAsApprovedToast } = useCheckToast();\n const [submittedRunId, setSubmittedRunId] = useState<string>();\n const [progress] = useState<Run[\"progress\"]>();\n const [isAborting, setAborting] = useState(false);\n const {\n open: isPresetCheckTemplateOpen,\n onOpen: onPresetCheckTemplateOpen,\n onClose: onPresetCheckTemplateClose,\n } = useDisclosure();\n const [overlay, setOverlay] = useState(<Overlay />);\n\n const {\n isLoading,\n error,\n data: check,\n } = useQuery({\n queryKey: cacheKeys.check(checkId),\n queryFn: async () => getCheck(checkId),\n refetchOnMount: true,\n });\n\n const trackedRunId = submittedRunId ?? check?.last_run?.run_id;\n const { run, error: rerunError } = useRun(trackedRunId);\n const isRunning = submittedRunId\n ? !run || run.status === \"running\"\n : run?.status === \"running\";\n\n const runTypeEntry = check?.type ? findByRunType(check.type) : undefined;\n\n const RunResultView = runTypeEntry?.RunResultView;\n\n const isPresetCheck = check?.is_preset ?? false;\n\n const lineageViewRef = useRef<LineageViewRef>(null);\n\n const { mutate } = useMutation({\n mutationFn: (check: Partial<Check>) => updateCheck(checkId, check),\n onSuccess: async () => {\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n },\n });\n\n const { mutate: handleDelete } = useMutation({\n mutationFn: () => deleteCheck(checkId),\n onSuccess: async () => {\n setLatestSelectedCheckId(\"\");\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(\"/checks\");\n },\n });\n\n const { mutate: handleMarkAsPresetCheck, isPending: isMarkingAsPreset } =\n useMutation({\n mutationFn: async () => {\n if (!check) {\n throw new Error(\"Check not found\");\n }\n\n return await markAsPresetCheck(checkId);\n },\n onSuccess: async () => {\n successToast(\"Check marked as preset successfully\");\n // Invalidate queries to refresh the check data\n await queryClient.invalidateQueries({\n queryKey: cacheKeys.check(checkId),\n });\n },\n onError: (error) => {\n failToast(\"Failed to mark check as preset\", error);\n },\n });\n\n const handleRerun = useCallback(async () => {\n const type = check?.type;\n if (!type) {\n return;\n }\n\n const submittedRun = await submitRunFromCheck(checkId, { nowait: true });\n setSubmittedRunId(submittedRun.run_id);\n await queryClient.invalidateQueries({ queryKey: cacheKeys.check(checkId) });\n if (refreshCheckList) refreshCheckList(); // refresh the checklist to fetch correct last run status\n }, [check, checkId, queryClient, refreshCheckList]);\n\n const handleCancel = useCallback(async () => {\n setAborting(true);\n if (!trackedRunId) {\n return;\n }\n\n return await cancelRun(trackedRunId);\n }, [trackedRunId]);\n\n const handleCopy = async () => {\n if (!check) {\n return;\n }\n\n const markdown = buildMarkdown(check);\n // @see https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts\n if (!window.isSecureContext) {\n failToast(\n \"Failed to copy the check to clipboard\",\n new Error(\n \"Copy to clipboard is available only in secure contexts (HTTPS)\",\n ),\n );\n return;\n }\n\n try {\n await navigator.clipboard.writeText(markdown);\n successToast(\"Copied the check to the clipboard\");\n } catch (err) {\n failToast(\"Failed to copy the check to clipboard\", err);\n }\n };\n\n const handleApproveCheck = useCallback(() => {\n const isChecked = check?.is_checked;\n mutate({ is_checked: !isChecked });\n if (!isChecked) {\n markedAsApprovedToast();\n }\n }, [check?.is_checked, mutate, markedAsApprovedToast]);\n\n const handelUpdateViewOptions = (viewOptions: ViewOptionTypes) => {\n mutate({ view_options: viewOptions });\n };\n\n const handleUpdateDescription = (description?: string) => {\n mutate({ description });\n };\n\n const [tabValue, setTabValue] = useState<TabValueList>(\"result\");\n const { ref, onCopyToClipboard, onMouseEnter, onMouseLeave } =\n useCopyToClipboardButton();\n\n // Calculate during render instead of effect\n const presetCheckTemplate = generateCheckTemplate({\n name: check?.name ?? \"\",\n description: check?.description ?? \"\",\n type: check?.type ?? \"\",\n params: check?.params as Record<string, unknown>,\n viewOptions: check?.view_options as Record<string, unknown>,\n });\n\n if (isLoading) {\n return <Center h=\"100%\">Loading</Center>;\n }\n\n if (error) {\n return (\n <Center h=\"100%\">\n Error: <span className=\"no-track-pii-safe\">{error.message}</span>\n </Center>\n );\n }\n\n if (!check) {\n return (\n <VSplit\n minSize={100}\n sizes={[30, 70]}\n style={{ height: \"100%\", width: \"100%\", maxHeight: \"100%\" }}\n >\n <Box\n style={{ contain: \"strict\" }}\n display=\"flex\"\n flexDirection=\"column\"\n >\n <Flex p=\"0px 16px\" alignItems=\"center\" h=\"40px\">\n <CheckBreadcrumb\n name=\"Check not found\"\n setName={() => {\n // do nothing\n }}\n />\n </Flex>\n </Box>\n </VSplit>\n );\n }\n\n const relativeTime = run?.run_at\n ? formatDistanceToNow(new Date(run.run_at), { addSuffix: true })\n : null;\n\n return (\n <VSplit\n minSize={100}\n sizes={[30, 70]}\n style={{ height: \"100%\", width: \"100%\", maxHeight: \"100%\" }}\n >\n <Grid\n templateColumns={cloudMode ? \"2fr 1fr\" : \"1fr\"}\n h=\"100%\"\n style={{ contain: \"strict\" }}\n >\n <GridItem display=\"flex\" flexDirection=\"column\" overflow=\"hidden\">\n <Flex p=\"0px 16px\" alignItems=\"center\" h=\"40px\">\n <CheckBreadcrumb\n name={check.name}\n setName={(name) => {\n mutate({ name });\n }}\n />\n {isPresetCheck && (\n <Tooltip content=\"Preset Check defined in recce config\">\n <Tag.Root size=\"sm\" flex=\"0 0 auto\" ml=\"2\">\n <Tag.StartElement>\n <CiBookmark size=\"14px\" />\n </Tag.StartElement>\n <Tag.Label>Preset</Tag.Label>\n </Tag.Root>\n </Tooltip>\n )}\n <Spacer />\n <HStack mr=\"10px\">\n {relativeTime && (\n <Box\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n fontSize=\"10pt\"\n >\n {relativeTime}\n </Box>\n )}\n\n <Menu.Root>\n <Menu.Trigger asChild>\n <IconButton rounded=\"full\" variant=\"ghost\" size=\"sm\">\n <Icon as={VscKebabVertical} />\n </IconButton>\n </Menu.Trigger>\n <Portal>\n <Menu.Positioner>\n <Menu.Content>\n {sessionId && (\n <Menu.Item\n value=\"mark-as-preset-check\"\n onClick={() => handleMarkAsPresetCheck()}\n disabled={isMarkingAsPreset || isPresetCheck}\n >\n <Flex alignItems=\"center\" gap={1} textStyle=\"sm\">\n <IoBookmarksOutline /> Mark as Preset Check\n </Flex>\n </Menu.Item>\n )}\n <Menu.Item\n value=\"preset-check-template\"\n onClick={() => {\n setOverlay(<Overlay />);\n onPresetCheckTemplateOpen();\n }}\n >\n <Flex alignItems=\"center\" gap={1} textStyle=\"sm\">\n <IoMdCodeWorking /> Get Preset Check Template\n </Flex>\n </Menu.Item>\n <Menu.Item\n value=\"copy-markdown\"\n onClick={() => handleCopy()}\n >\n <Flex alignItems=\"center\" gap={1} textStyle=\"sm\">\n <PiCopy /> Copy Markdown\n </Flex>\n </Menu.Item>\n <MenuSeparator />\n <Menu.Item\n value=\"delete\"\n color=\"red.solid\"\n onClick={() => {\n handleDelete();\n }}\n disabled={featureToggles.disableUpdateChecklist}\n >\n <Flex alignItems=\"center\" gap={1} textStyle=\"sm\">\n <PiTrashFill /> Delete\n </Flex>\n </Menu.Item>\n </Menu.Content>\n </Menu.Positioner>\n </Portal>\n </Menu.Root>\n\n <Tooltip\n content={\n isDisabledByNoResult(check.type, run)\n ? \"Run the check first\"\n : check.is_checked\n ? \"Mark as Pending\"\n : \"Mark as Approved\"\n }\n positioning={{ placement: \"bottom-end\" }}\n >\n <Button\n flex=\"0 0 auto\"\n size=\"sm\"\n colorPalette={check.is_checked ? \"green\" : \"gray\"}\n variant={check.is_checked ? \"solid\" : \"outline\"}\n onClick={() => {\n handleApproveCheck();\n }}\n disabled={\n isDisabledByNoResult(check.type, run) ||\n featureToggles.disableUpdateChecklist\n }\n >\n {check.is_checked ? (\n <PiCheckCircle />\n ) : (\n <Icon as={VscCircleLarge} color=\"lightgray\" />\n )}{\" \"}\n {check.is_checked ? \"Approved\" : \"Mark as Approved\"}\n </Button>\n </Tooltip>\n </HStack>\n </Flex>\n\n <Box flex=\"1\" p=\"8px 16px\" minHeight=\"100px\">\n <CheckDescription\n key={check.check_id}\n value={check.description}\n onChange={handleUpdateDescription}\n />\n </Box>\n </GridItem>\n {/* Timeline panel - only shown when connected to cloud */}\n {cloudMode && (\n <GridItem overflow=\"hidden\">\n <CheckTimeline checkId={checkId} />\n </GridItem>\n )}\n </Grid>\n\n <Box style={{ contain: \"strict\" }}>\n <Tabs.Root\n height=\"100%\"\n display=\"flex\"\n flexDirection=\"column\"\n value={tabValue}\n onValueChange={(e) => {\n setTabValue(e.value as TabValueList);\n }}\n >\n <Tabs.List height=\"50px\">\n <Tabs.Trigger value=\"result\" fontSize=\"0.75rem\">\n Result\n </Tabs.Trigger>\n {(check.type === \"query\" || check.type === \"query_diff\") && (\n <Tabs.Trigger value=\"query\" fontSize=\"0.75rem\">\n Query\n </Tabs.Trigger>\n )}\n <Spacer />\n <HStack mr=\"10px\">\n {RunResultView && (\n <Tooltip content=\"Rerun\">\n <Button\n variant=\"outline\"\n loading={isRunning}\n size=\"sm\"\n onClick={() => handleRerun()}\n disabled={featureToggles.disableDatabaseQuery}\n >\n <PiRepeat /> Rerun\n </Button>\n </Tooltip>\n )}\n <Button\n variant=\"outline\"\n disabled={\n isDisabledByNoResult(check.type, run) || tabValue !== \"result\"\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n size=\"sm\"\n onClick={async () => {\n if (check.type === \"lineage_diff\") {\n lineageViewRef.current?.copyToClipboard();\n } else {\n await onCopyToClipboard();\n }\n trackCopyToClipboard({ type: check.type, from: \"check\" });\n }}\n >\n <PiCopy /> Copy to Clipboard\n </Button>\n </HStack>\n </Tabs.List>\n <Tabs.ContentGroup\n height=\"100%\"\n flex=\"1\"\n style={{ contain: \"strict\" }}\n >\n <Tabs.Content value=\"result\" p={0} width=\"100%\" height=\"100%\">\n {RunResultView &&\n (check.last_run || trackedRunId ? (\n <RunView\n ref={ref as unknown as Ref<RefTypes>}\n isRunning={isRunning}\n isAborting={isAborting}\n run={trackedRunId ? run : check.last_run}\n error={rerunError}\n progress={progress}\n RunResultView={\n RunResultView as unknown as RegistryEntry[\"RunResultView\"]\n }\n viewOptions={check.view_options as ViewOptionTypes}\n onViewOptionsChanged={handelUpdateViewOptions}\n onCancel={handleCancel}\n onExecuteRun={handleRerun}\n />\n ) : (\n <Center bg=\"rgb(249,249,249)\" height=\"100%\">\n <VStack gap={4}>\n <Box>\n This action is part of the initial preset and has not\n been performed yet. Once performed, the result will be\n shown here.\n </Box>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n onClick={handleRerun}\n colorPalette=\"blue\"\n size=\"sm\"\n disabled={featureToggles.disableDatabaseQuery}\n >\n Run Query\n </Button>\n </SetupConnectionPopover>\n </VStack>\n </Center>\n ))}\n {check.type === \"schema_diff\" && (\n <SchemaDiffView key={check.check_id} check={check} ref={ref} />\n )}\n {check.type === \"lineage_diff\" && (\n <LineageDiffView\n key={check.check_id}\n check={check}\n ref={lineageViewRef}\n />\n )}\n </Tabs.Content>\n {(check.type === \"query\" ||\n check.type === \"query_diff\" ||\n check.type === \"query_base\") && (\n <Tabs.Content value=\"query\" p={0} height=\"100%\" width=\"100%\">\n {(check.params as QueryParams).base_sql_template ? (\n <DualSqlEditor\n value={(check.params as QueryDiffParams).sql_template || \"\"}\n baseValue={\n (check.params as QueryDiffParams).base_sql_template ?? \"\"\n }\n options={{ readOnly: true }}\n />\n ) : (\n <SqlEditor\n value={(check.params as QueryRunParams).sql_template || \"\"}\n options={{ readOnly: true }}\n />\n )}\n </Tabs.Content>\n )}\n </Tabs.ContentGroup>\n </Tabs.Root>\n </Box>\n <Dialog.Root\n open={isPresetCheckTemplateOpen}\n onOpenChange={onPresetCheckTemplateClose}\n placement=\"center\"\n size=\"xl\"\n >\n <Portal>\n {overlay}\n <Dialog.Positioner>\n <Dialog.Content overflowY=\"auto\" height=\"40%\" width=\"60%\">\n <Dialog.Header>\n <Dialog.Title>Preset Check Template</Dialog.Title>\n </Dialog.Header>\n <Dialog.Body>\n <Heading size=\"sm\" fontWeight=\"bold\">\n Please{\" \"}\n <Text\n as=\"span\"\n cursor=\"pointer\"\n _hover={{ textDecoration: \"underline\" }}\n color={\"blue.500\"}\n onClick={async () => {\n await navigator.clipboard.writeText(presetCheckTemplate);\n successToast(\"Copied the template to the clipboard\");\n }}\n >\n copy\n </Text>{\" \"}\n the following template and paste it into the{\" \"}\n <Highlight\n query=\"recce.yml\"\n styles={{ px: \"1\", py: \"0\", bg: \"red.100\" }}\n >\n recce.yml\n </Highlight>{\" \"}\n file.\n </Heading>\n <br />\n <PresetCheckTemplateView yamlTemplate={presetCheckTemplate} />\n </Dialog.Body>\n <Dialog.CloseTrigger asChild>\n <CloseButton size=\"sm\" />\n </Dialog.CloseTrigger>\n </Dialog.Content>\n </Dialog.Positioner>\n </Portal>\n </Dialog.Root>\n </VSplit>\n );\n}\n\nfunction Overlay(): ReactNode {\n return <Dialog.Backdrop bg=\"blackAlpha.300\" backdropFilter=\"blur(10px) \" />;\n}\n\nfunction buildMarkdown(check: Check<RunParamTypes>) {\n return stripIndents`\n <details><summary>${buildTitle(check)}</summary>\n\n ${buildBody(check)}\n\n </details>`;\n}\n\nfunction buildBody(check: Check<RunParamTypes>) {\n if (check.type === \"query\" || check.type === \"query_diff\") {\n return `${buildDescription(check)}\\n\\n${buildQuery(check)}`;\n }\n\n return buildDescription(check);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { waitRun } from \"@/lib/api/runs\";\nimport { RunView } from \"./RunView\";\nimport { findByRunType, RegistryEntry, runTypeHasRef } from \"./registry\";\n\ninterface RunPageProps {\n runId: string;\n}\n\nexport const RunPage = ({ runId }: RunPageProps) => {\n const { error, data: run } = useQuery({\n queryKey: cacheKeys.run(runId),\n queryFn: async () => waitRun(runId),\n });\n\n let RunResultView: RegistryEntry[\"RunResultView\"] | undefined;\n if (run && runTypeHasRef(run.type)) {\n RunResultView = findByRunType(run.type)\n .RunResultView as RegistryEntry[\"RunResultView\"];\n }\n\n return <RunView error={error} run={run} RunResultView={RunResultView} />;\n};\n","import \"react-data-grid/lib/styles.css\";\nimport {\n Box,\n Center,\n Flex,\n Heading,\n HStack,\n Icon,\n IconButton,\n Spacer,\n Text,\n} from \"@chakra-ui/react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport React, { ReactNode, useCallback } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FaCheckCircle, FaRegCheckCircle } from \"react-icons/fa\";\nimport SimpleBar from \"simplebar-react\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { createCheckByRun } from \"@/lib/api/checks\";\nimport { listRuns, waitRun } from \"@/lib/api/runs\";\nimport { Run } from \"@/lib/api/types\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { findByRunType } from \"../run/registry\";\nimport \"simplebar/dist/simplebar.min.css\";\nimport { PiX } from \"react-icons/pi\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { trackHistoryAction } from \"@/lib/api/track\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { formatRunDate, RunStatusAndDate } from \"./RunStatusAndDate\";\n\nconst RunListItem = ({\n run,\n isSelected,\n onSelectRun,\n onAddToChecklist,\n onGoToCheck,\n}: {\n run: Run;\n isSelected: boolean;\n onSelectRun: (runId: string) => void;\n onAddToChecklist: (runId: string) => void;\n onGoToCheck: (checkId: string) => void;\n}) => {\n const { featureToggles } = useRecceInstanceContext();\n const { data: fetchedRun } = useQuery({\n queryKey: cacheKeys.run(run.run_id),\n queryFn: async () => {\n return await waitRun(run.run_id);\n },\n enabled: run.status === \"running\",\n retry: false,\n });\n\n const icon: IconType = findByRunType(run.type).icon;\n const checkId = run.check_id;\n const hideAddToChecklist = featureToggles.disableUpdateChecklist;\n\n return (\n <Flex\n minWidth=\"200px\"\n direction=\"column\"\n width=\"100%\"\n p=\"5px 20px\"\n cursor=\"pointer\"\n borderBottom={\"solid 1px lightgray\"}\n borderLeft={\"4px\"}\n borderLeftColor={isSelected ? \"orange.400\" : \"transparent\"}\n backgroundColor={isSelected ? \"orange.50\" : \"transparent\"}\n onClick={() => {\n onSelectRun(run.run_id);\n }}\n _hover={{ bg: isSelected ? \"orange.50\" : \"gray.200\" }}\n >\n <Flex\n onClick={() => {\n return void 0;\n }}\n alignItems=\"center\"\n gap=\"12px\"\n >\n <Icon as={icon} />\n <Box\n className=\"no-track-pii-safe\"\n flex=\"1\"\n textOverflow=\"ellipsis\"\n whiteSpace=\"nowrap\"\n overflow=\"hidden\"\n color={run.name ? \"inherit\" : \"gray.500\"}\n fontSize=\"11pt\"\n fontWeight=\"500\"\n >\n {(run.name ?? \"\").trim() || \"<no name>\"}\n </Box>\n {checkId ? (\n <Tooltip content=\"Go to Check\" aria-label=\"Go to Check\">\n <Text\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onGoToCheck(checkId);\n }}\n >\n <Icon color=\"green\" as={FaCheckCircle} />\n </Text>\n </Tooltip>\n ) : !hideAddToChecklist ? (\n <Tooltip content=\"Add to Checklist\" aria-label=\"Add to Checklist\">\n <Text\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n trackHistoryAction({ name: \"add_to_checklist\" });\n onAddToChecklist(run.run_id);\n }}\n >\n <Icon as={FaRegCheckCircle} />\n </Text>\n </Tooltip>\n ) : null}\n </Flex>\n <Flex\n justifyContent=\"start\"\n fontSize=\"11pt\"\n color=\"gray.500\"\n gap=\"3px\"\n alignItems={\"center\"}\n >\n <RunStatusAndDate run={fetchedRun ?? run} />\n </Flex>\n </Flex>\n );\n};\n\nconst DateSegmentItem = ({ runAt }: { runAt?: string }) => {\n const dateTime = runAt ? formatRunDate(new Date(runAt)) : null;\n\n return (\n <Flex\n minWidth=\"200px\"\n width=\"100%\"\n p=\"5px 20px\"\n borderBottom={\"solid 1px lightgray\"}\n color=\"gray.500\"\n fontSize={\"11pt\"}\n >\n {dateTime}\n </Flex>\n );\n};\n\nexport const RunList = () => {\n const { closeHistory } = useRecceActionContext();\n const { data: runs, isLoading } = useQuery({\n queryKey: cacheKeys.runs(),\n queryFn: async () => {\n return await listRuns();\n },\n retry: false,\n });\n\n return (\n <Flex direction=\"column\" height=\"100%\">\n <HStack\n width=\"100%\"\n flex=\"0 0 54px\"\n paddingInline=\"24px 8px\"\n borderBottom=\"solid 1px lightgray\"\n >\n <Heading size=\"md\">History</Heading>\n <Spacer />\n <IconButton\n variant=\"ghost\"\n aria-label=\"Close History\"\n onClick={() => {\n trackHistoryAction({ name: \"hide\" });\n closeHistory();\n }}\n >\n <PiX />\n </IconButton>\n </HStack>\n <Box flex=\"1 1 auto\">\n {isLoading ? (\n \"Loading...\"\n ) : runs?.length === 0 ? (\n <Center height=\"100%\" color=\"gray.400\">\n No runs\n </Center>\n ) : (\n <SimpleBar style={{ minHeight: \"100%\", height: 0 }}>\n {(runs ?? []).map((run, idx) => {\n if (runs != null) {\n const previousDate =\n idx === 0\n ? null\n : new Date(runs[idx - 1].run_at).toDateString();\n return (\n <DateDividedRunHistoryItem\n key={run.run_id}\n run={run}\n previousDate={previousDate}\n />\n );\n }\n })}\n </SimpleBar>\n )}\n </Box>\n </Flex>\n );\n};\n\ninterface DateDividedRunHistoryItemProps {\n run: Run;\n previousDate: string | null;\n}\n\nfunction DateDividedRunHistoryItem({\n run,\n previousDate,\n}: DateDividedRunHistoryItemProps): ReactNode {\n const [, setLocation] = useAppLocation();\n const queryClient = useQueryClient();\n const { showRunId, runId } = useRecceActionContext();\n\n const currentDate = new Date(run.run_at).toDateString();\n const shouldRenderDateSegment =\n previousDate != null && previousDate !== currentDate;\n\n const handleSelectRun = (runId: string) => {\n trackHistoryAction({ name: \"click_run\" });\n showRunId(runId, false);\n };\n\n const handleAddToChecklist = useCallback(async () => {\n if (!runId) {\n return;\n }\n const check = await createCheckByRun(runId);\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(`/checks/?id=${check.check_id}`);\n }, [runId, setLocation, queryClient]);\n\n const handleGoToCheck = useCallback(\n (checkId: string) => {\n trackHistoryAction({ name: \"go_to_check\" });\n setLocation(`/checks/?id=${checkId}`);\n },\n [setLocation],\n );\n return (\n <React.Fragment>\n {shouldRenderDateSegment && (\n <DateSegmentItem key={currentDate} runAt={run.run_at} />\n )}\n <RunListItem\n key={run.run_id}\n run={run}\n isSelected={run.run_id === runId}\n onSelectRun={handleSelectRun}\n onGoToCheck={handleGoToCheck}\n onAddToChecklist={handleAddToChecklist}\n />\n </React.Fragment>\n );\n}\n","import { Box, Flex, Grid, Icon, Text, VStack } from \"@chakra-ui/react\";\nimport { ReactNode } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FiInfo } from \"react-icons/fi\";\nimport { Tooltip } from \"@/components/ui/tooltip\";\nimport { NodeData } from \"@/lib/api/info\";\nimport { LineageGraph } from \"../lineage/lineage\";\nimport {\n IconAdded,\n IconChanged,\n IconModified,\n IconRemoved,\n} from \"../lineage/styles\";\n\nexport type ChangeStatus =\n // node change\n // code change (user edit)\n | \"added\"\n | \"removed\"\n | \"modified\"\n\n // column change\n | \"col_added\"\n | \"col_removed\"\n | \"col_changed\"\n\n // folder change\n | \"folder_changed\"\n | null;\n\nexport const NODE_CHANGE_STATUS_MSGS = {\n added: [\"Model Added\", \"Added resource\"],\n removed: [\"Model Removed\", \"Removed resource\"],\n modified: [\"Model Modified\", \"Modified resource\"],\n col_added: [\"Column Added\", \"Added column\"],\n col_removed: [\"Column Removed\", \"Removed column\"],\n col_changed: [\"Column Modified\", \"Modified column\"],\n folder_changed: [\"Modified\", \"Modified folder\"],\n};\n\nexport function getIconForChangeStatus(changeStatus?: ChangeStatus): {\n color: string;\n icon: IconType | undefined; //IconType not provided\n} {\n if (changeStatus === \"added\") {\n return { color: \"#1dce00\", icon: IconAdded };\n } else if (changeStatus === \"removed\") {\n return { color: \"#ff067e\", icon: IconRemoved };\n } else if (changeStatus === \"modified\") {\n return { color: \"#ffa502\", icon: IconModified };\n } else if (changeStatus === \"col_added\") {\n return { color: \"#1dce00\", icon: IconAdded };\n } else if (changeStatus === \"col_removed\") {\n return { color: \"#ff067e\", icon: IconRemoved };\n } else if (changeStatus === \"col_changed\") {\n return { color: \"#ffa502\", icon: IconModified };\n } else if (changeStatus === \"folder_changed\") {\n return { color: \"#ffa502\", icon: IconChanged };\n }\n\n return { color: \"inherit\", icon: undefined };\n}\n\nfunction SummaryText({\n name,\n value,\n tip,\n}: {\n name: ReactNode;\n value: ReactNode;\n tip?: ReactNode;\n}) {\n return (\n <VStack alignItems=\"stretch\">\n <Text fontSize=\"sm\" color=\"gray\">\n {name}\n {tip && (\n <Tooltip content={tip}>\n <Box display=\"inline-block\">\n <Icon mx={\"2px\"} as={FiInfo} boxSize={3} />\n </Box>\n </Tooltip>\n )}\n </Text>\n {value}\n </VStack>\n );\n}\n\nfunction ChangeStatusCountLabel({\n changeStatus,\n value,\n}: {\n changeStatus: ChangeStatus;\n value: number;\n}) {\n const [label] = changeStatus ? NODE_CHANGE_STATUS_MSGS[changeStatus] : [\"\"];\n const { icon, color } = getIconForChangeStatus(changeStatus);\n\n return (\n <VStack alignItems=\"stretch\">\n <Flex alignItems=\"center\" fontSize=\"sm\" color=\"gray\">\n {icon && <Icon mr=\"5px\" as={icon} color={color} />}\n {label}\n </Flex>\n <Text fontSize=\"sm\">{value}</Text>\n </VStack>\n );\n}\n\nfunction calculateColumnChange(\n base: NodeData | undefined,\n current: NodeData | undefined,\n) {\n let adds = 0;\n let removes = 0;\n let modifies = 0;\n if (!base && !current) return { adds, removes, modifies };\n\n // Add columns\n if (current) {\n Object.keys(current.columns ?? {}).forEach((col) => {\n if (!base?.columns?.[col]) adds++;\n });\n }\n\n // Remove columns\n if (base) {\n Object.keys(base.columns ?? {}).forEach((col) => {\n if (!current?.columns?.[col]) removes++;\n });\n }\n\n // Modify columns\n if (current && base) {\n Object.keys(current.columns ?? {}).forEach((col) => {\n if (base.columns && current.columns?.[col] && base.columns[col]) {\n if (base.columns[col].type !== current.columns[col].type) modifies++;\n }\n });\n }\n\n return { adds, removes, modifies };\n}\n\nfunction calculateChangeSummary(lineageGraph: LineageGraph) {\n const modifiedSet = lineageGraph.modifiedSet;\n let adds = 0;\n let removes = 0;\n let modifies = 0;\n let col_added = 0;\n let col_removed = 0;\n let col_changed = 0;\n\n modifiedSet.forEach((nodeId) => {\n if (lineageGraph.nodes[nodeId].data.changeStatus === \"added\") adds++;\n else if (lineageGraph.nodes[nodeId].data.changeStatus === \"removed\")\n removes++;\n else if (lineageGraph.nodes[nodeId].data.changeStatus === \"modified\")\n modifies++;\n\n const base = lineageGraph.nodes[nodeId].data.data.base;\n const current = lineageGraph.nodes[nodeId].data.data.current;\n const columnChange = calculateColumnChange(base, current);\n col_added += columnChange.adds;\n col_removed += columnChange.removes;\n col_changed += columnChange.modifies;\n });\n\n return { adds, removes, modifies, col_added, col_removed, col_changed };\n}\n\nexport interface Props {\n lineageGraph: LineageGraph;\n}\n\nexport function ChangeSummary({ lineageGraph }: Props) {\n const { adds, removes, modifies, col_added, col_removed, col_changed } =\n calculateChangeSummary(lineageGraph);\n\n return (\n <Grid\n templateColumns=\"1fr 1fr\"\n mb=\"10px\"\n borderTop=\"1px solid lightgray\"\n padding={\"2.5vw\"}\n >\n <Box borderColor=\"lightgray\">\n <SummaryText\n name=\"Code Changes\"\n value={\n <>\n <Grid templateColumns=\"1fr 1fr 1fr\" width=\"100%\">\n <ChangeStatusCountLabel changeStatus=\"added\" value={adds} />\n <ChangeStatusCountLabel\n changeStatus=\"removed\"\n value={removes}\n />\n <ChangeStatusCountLabel\n changeStatus=\"modified\"\n value={modifies}\n />\n </Grid>\n </>\n }\n />\n </Box>\n <Box borderLeft=\"1px\" paddingLeft=\"12px\" borderColor=\"lightgray\">\n <SummaryText\n name=\"Column Changes\"\n value={\n <>\n <Grid templateColumns=\"1fr 1fr 1fr\" width=\"100%\">\n <ChangeStatusCountLabel\n changeStatus=\"col_added\"\n value={col_added}\n />\n <ChangeStatusCountLabel\n changeStatus=\"col_removed\"\n value={col_removed}\n />\n <ChangeStatusCountLabel\n changeStatus=\"col_changed\"\n value={col_changed}\n />\n </Grid>\n </>\n }\n />\n </Box>\n </Grid>\n );\n}\n","import {\n Card,\n Flex,\n Heading,\n HStack,\n SimpleGrid,\n Text,\n} from \"@chakra-ui/react\";\nimport { useEffect, useState } from \"react\";\nimport { mergeKeysWithStatus } from \"@/lib/mergeKeys\";\nimport { LineageGraph, LineageGraphNode } from \"../lineage/lineage\";\nimport { ResourceTypeTag, RowCountDiffTag } from \"../lineage/NodeTag\";\nimport { SchemaView } from \"../schema/SchemaView\";\n\ninterface SchemaDiffCardProps {\n title: string;\n node: LineageGraphNode;\n}\n\nfunction SchemaDiffCard({ node, ...props }: SchemaDiffCardProps) {\n return (\n <Card.Root maxWidth={\"500px\"}>\n <Card.Header>\n <Card.Title fontSize={18}>{props.title}</Card.Title>\n <Card.Description>\n <HStack gap={\"8px\"} p={\"16px\"}>\n <ResourceTypeTag node={node} />\n {node.data.resourceType === \"model\" && (\n <RowCountDiffTag node={node} />\n )}\n </HStack>\n </Card.Description>\n </Card.Header>\n <Card.Body>\n <Flex>\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n />\n </Flex>\n </Card.Body>\n </Card.Root>\n );\n}\n\nfunction listChangedNodes(lineageGraph: LineageGraph) {\n const changedNodes: LineageGraphNode[] = [];\n const allNodes = lineageGraph.nodes;\n lineageGraph.modifiedSet.forEach((nodeId) => {\n const node = allNodes[nodeId];\n const columnDiffStatus = mergeKeysWithStatus(\n Object.keys(node.data.data.base?.columns ?? {}),\n Object.keys(node.data.data.current?.columns ?? {}),\n );\n const isSchemaChanged = !Object.values(columnDiffStatus).every(\n (el) => el === undefined,\n );\n // We only want to show nodes that have real schema changes.\n // It doesn't include added or deleted model.\n if (isSchemaChanged && node.data.data.base && node.data.data.current)\n changedNodes.push(node);\n });\n return changedNodes;\n}\n\nexport interface Props {\n lineageGraph: LineageGraph;\n}\n\nexport function SchemaSummary({ lineageGraph }: Props) {\n const [changedNodes, setChangedNodes] = useState<LineageGraphNode[]>([]);\n\n useEffect(() => {\n setChangedNodes(listChangedNodes(lineageGraph));\n }, [lineageGraph]);\n\n return (\n <>\n <Flex\n w={\"100%\"}\n paddingBottom=\"10px\"\n marginBottom=\"20px\"\n marginTop=\"20px\"\n >\n <Heading fontSize={24}>Schema Summary</Heading>\n </Flex>\n <Flex w={\"100%\"} paddingBottom=\"10px\" marginBottom=\"20px\">\n {changedNodes.length === 0 ? (\n <>\n <Text fontSize={18} color={\"gray\"}>\n No schema changes detected.\n </Text>\n </>\n ) : (\n <>\n <SimpleGrid\n minChildWidth=\"400px\"\n gap={\"2vw\"}\n padding={\"2.5vw\"}\n width={\"100%\"}\n backgroundColor={\"lightgray\"}\n >\n {changedNodes.map((node) => {\n return (\n <SchemaDiffCard\n key={node.id}\n title={node.data.name}\n node={node}\n />\n );\n })}\n </SimpleGrid>\n </>\n )}\n </Flex>\n </>\n );\n}\n","import { Flex, Heading, Separator } from \"@chakra-ui/react\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { ChangeSummary } from \"./ChangeSummary\";\nimport { SchemaSummary } from \"./SchemaSummary\";\n\nexport default function SummaryView() {\n const { lineageGraph } = useLineageGraphContext();\n return (\n <>\n <Flex direction=\"column\" w={\"100%\"} minHeight=\"650px\">\n <Flex w={\"100%\"} paddingBottom=\"10px\" marginBottom=\"20px\">\n <Heading fontSize={24}>Change Summary</Heading>\n </Flex>\n {lineageGraph && (\n <>\n <ChangeSummary lineageGraph={lineageGraph} />\n <Separator />\n <SchemaSummary lineageGraph={lineageGraph} />\n </>\n )}\n </Flex>\n </>\n );\n}\n"]}