@datarecce/ui 0.1.37 → 0.1.39
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.
- package/LICENSE +201 -0
- package/README.md +93 -207
- package/dist/{RecceCheckContext-BOGmP80K.js → RecceCheckContext-BJprb2xR.js} +11 -17
- package/dist/RecceCheckContext-BJprb2xR.js.map +1 -0
- package/dist/{RecceCheckContext-CwUCo6AW.mjs → RecceCheckContext-DbZ7BdRy.mjs} +11 -17
- package/dist/RecceCheckContext-DbZ7BdRy.mjs.map +1 -0
- package/dist/api.d.mts +1 -1
- package/dist/{components-DQUwJlNQ.mjs → components-B6oaPB5f.mjs} +2 -3
- package/dist/components-B6oaPB5f.mjs.map +1 -0
- package/dist/{components-uVp0e4cH.js → components-DTLQ2djq.js} +2 -3
- package/dist/components-DTLQ2djq.js.map +1 -0
- package/dist/components.d.mts +1 -1
- package/dist/components.js +2 -2
- package/dist/components.mjs +2 -2
- package/dist/{hooks-CfZ4UBBF.js → hooks-cQsBXBd1.js} +2 -2
- package/dist/{hooks-CfZ4UBBF.js.map → hooks-cQsBXBd1.js.map} +1 -1
- package/dist/{hooks-C6Kma5ld.mjs → hooks-eaHm_yEp.mjs} +2 -2
- package/dist/{hooks-C6Kma5ld.mjs.map → hooks-eaHm_yEp.mjs.map} +1 -1
- package/dist/hooks.d.mts +1 -1
- package/dist/hooks.js +2 -2
- package/dist/hooks.mjs +2 -2
- package/dist/index-DvKRw-cR.d.ts.map +1 -1
- package/dist/{index-Cln_wUJL.d.mts → index-DzBojsjY.d.mts} +70 -70
- package/dist/{index-Cln_wUJL.d.mts.map → index-DzBojsjY.d.mts.map} +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.js +3 -3
- package/dist/index.mjs +3 -3
- package/dist/theme.d.mts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +1 -1
- package/recce-source/js/src/components/profile/ProfileDiffResultView.tsx +0 -2
- package/recce-source/js/src/components/query/QueryDiffResultView.tsx +0 -2
- package/recce-source/js/src/components/rowcount/RowCountDiffResultView.tsx +0 -1
- package/recce-source/js/src/components/rowcount/delta.test.ts +51 -0
- package/recce-source/js/src/components/rowcount/delta.ts +6 -1
- package/recce-source/js/src/components/schema/SchemaView.tsx +0 -1
- package/recce-source/js/src/components/valuediff/ValueDiffDetailResultView.tsx +0 -1
- package/recce-source/js/src/components/valuediff/ValueDiffResultView.tsx +0 -1
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.test.ts +3 -3
- package/recce-source/js/src/lib/dataGrid/generators/rowCountUtils.ts +1 -1
- package/dist/RecceCheckContext-BOGmP80K.js.map +0 -1
- package/dist/RecceCheckContext-CwUCo6AW.mjs.map +0 -1
- package/dist/components-DQUwJlNQ.mjs.map +0 -1
- package/dist/components-uVp0e4cH.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components-DTLQ2djq.js","names":["MuiThemeProvider","lightTheme","darkTheme","CssBaseline","Fallback: FallbackRender","Box","Typography","Button","SentryErrorBoundary","ReactSplit","_","_","process","_a","_","_","_a","format","_","_","_a","node","_","useCopyToClipboard","colors","canvas: HTMLCanvasElement","error: unknown","useClipBoardToast","Button","PiCopy","MuiDialog","DialogTitle","IconButton","IoClose","DialogContent","Stack","Box","PiInfo","Typography","DialogActions","useApiConfig","useRunsAggregated","cacheKeys","waitRun","cancelRun","RunResultView: RegistryEntry[\"RunResultView\"] | undefined","runTypeHasRef","findByRunType","colors","useLineageViewContextSafe","Box","Stack","Divider","Button","VscDiffAdded","VscDiffRemoved","VscDiffModified","getIconForChangeStatus","color","token","backgroundColor","FaCube","FaChartSimple","FaDatabase","FaGauge","FaCircleNodes","FaSeedling","FaCamera","Box","getIconForChangeStatus","Tooltip","useLineageGraphContext","useLineageViewContextSafe","Typography","Box","useRecceServerFlag","Stack","MuiTooltip","Button","FaRegDotCircle","PiInfo","CircularProgress","IconButton","PiX","getIconForChangeStatus","Box","color: \"default\" | \"error\" | \"warning\" | \"info\" | \"success\"","Chip","useLineageViewContextSafe","React","COLUMN_HEIGHT","VscKebabVertical","Handle","Position","Box","Tooltip","useLineageViewContextSafe","getIconForChangeStatus","BaseEdge","Box","MuiPopover","Link","RECCE_SUPPORT_CALENDAR_URL","MuiTooltip","Box","Stack","Typography","FiArrowRight","RiSwapLine","RiArrowUpSFill","deltaPercentageString","RiArrowDownSFill","FiFrown","useRecceInstanceContext","useLineageGraphContext","lastRowCount: RowCountDiff | undefined","findByRunType","Skeleton","IconButton","PiRepeat","CircularProgress","Chip","Stack","Box","MuiTooltip","PiInfo","PiWarning","isValueDiffRun","isRowCountDiffRun","isRowCountRun","chipColor: \"default\" | \"success\" | \"error\"","deltaPercentageString","findByRunType","Chip","useLineageGraphContext","getIconForChangeStatus","Box","MuiTooltip","FaCheckSquare","FaRegSquare","useLineageViewContextSafe","token","FaRegDotCircle","VscKebabVertical","Stack","COLUMN_HEIGHT","Handle","Position","mergeKeys","useRecceInstanceContext","Menu","MenuItem","Divider","menuItems: ContextMenuItem[]","useLineageViewContextSafe","useRecceActionContext","useLineageGraphContext","useRecceServerFlag","useModelColumns","useRecceQueryContext","useAppLocation","trackProps: SubmitRunTrackProps","FaRegDotCircle","findByRunType","Box","EXPLORE_ACTION","EXPLORE_SOURCE","columns","BiArrowFromBottom","LINEAGE_SELECTION_ACTION","BiArrowToBottom","isHistogramDiffRun","supportsHistogramDiff","isTopKDiffRun","isValueDiffRun","isLineageGraphNode","isLineageGraphColumnNode","node","sessionStorageKeys","Box","IconButton","IoClose","useRecceActionContext","Box","Button","VscHistory","Stack","Typography","Box","useLineageViewContextSafe","Button","PiCaretDown","Menu","ListSubheader","RadioGroup","MenuItem","FormControlLabel","Radio","useLineageGraphContext","FiPackage","Checkbox","ListItemText","Divider","useRecceServerFlag","MuiTooltip","TextField","useRecceInstanceContext","findByRunType","ListItemIcon","Box","FiInfo","IconButton","IoClose","MuiLink","LuExternalLink","useLineageViewContext","createDataGridFromData","useLineageGraphContext","Box","MuiAlert","ScreenshotDataGrid","EmptyRowsRenderer","getLanguageExtension","PostgreSQL","EditorView","Prec","keymap","githubDark","githubLight","CodeMirror","PostgreSQL","githubDark","githubLight","MergeView","EditorView","EditorState","Text","useRecceServerFlag","Box","IconButton","FaExpandArrowsAlt","MuiDialog","DialogTitle","IoClose","DialogContent","Box","IconButton","Link","LuExternalLink","toaster","Stack","toaster","trackingData: EnvironmentConfigProps","Box","useLineageGraphContext","MuiTooltip","Typography","IconButton","IconInfo","MuiDialog","DialogTitle","IoClose","DialogContent","Stack","Link","LuExternalLink","Divider","TableContainer","Table","TableHead","TableRow","TableCell","TableBody","DialogActions","Button","Box","Button","Typography","Menu","Chip","InputBase","Divider","MenuItem","_","MuiTooltip","useLineageGraphContext","combinedColumns: Record<string, NodeColumnData | undefined>","Box","Stack","Typography","MuiTooltip","PiInfo","useRecceInstanceContext","useApiConfig","Cookies","MuiDialog","DialogTitle","DialogContent","Typography","Box","Link","LuExternalLink","DialogActions","Button","connectToCloud","Stack","useRecceInstanceContext","value","Stack","colors","Typography","Box","Button","FaPlay","useLineageGraphContext","dbtBase: ManifestMetadata | undefined","dbtCurrent: ManifestMetadata | undefined","color: string","message: string","Box","CircularProgress","Typography","token","ResultErrorFallback: FallbackRender","MuiAlert","MuiAlert","Box","Stack","CircularProgress","Typography","Button","ResultErrorFallback","YAML","Typography","useRecceInstanceContext","useRecceShareStateContext","Button","PiCaretDown","Menu","MenuItem","ListItemIcon","PiCopy","ListItemText","Divider","TbCloudUpload","useRecceActionContext","RunResultView: RegistryEntry[\"RunResultView\"] | undefined","runTypeHasRef","findByRunType","Box","Tabs","Tab","Stack","PiRepeat","IconButton","IoClose","isQueryRun","isQueryBaseRun","isQueryDiffRun","SqlEditor","useAppLocation","useApiConfig","createCheckByRun","cacheKeys","PiCheck","Stack","Box","Typography","AiOutlineExperiment","MuiTooltip","Button","useLineageGraphContext","colors","useRecceActionContext","useRecceQueryContext","useRecceServerFlag","useApiConfig","submitQueryDiff","waitRun","localStorageKeys","MuiDialog","Chip","IconButton","IoClose","DialogContent","VscFeedback","useRecceActionContext","useLineageGraphContext","EXPLORE_ACTION","EXPLORE_SOURCE","useRecceInstanceContext","DisableTooltipMessages","Box","Stack","Typography","IconButton","IoClose","Tabs","Tab","useAppLocation","useRecceQueryContext","findByRunType","Button","MuiTooltip","useModelColumns","useApiConfig","createSchemaDiffCheck","RECCE_SUPPORT_CALENDAR_URL","useRecceInstanceContext","useRecceInstanceInfo","Box","Stack","PiInfo","Typography","Button","Stack","Box","RiTerminalBoxLine","Typography","List","ListItem","Button","RiMindMap","Link","initValue: ActionState","useApiConfig","useRecceActionContext","candidates: LineageGraphNode[]","submitRun","waitRun","EXPLORE_ACTION","EXPLORE_SOURCE","nodes","createLineageDiffCheck","createSchemaDiffCheck","cancelRun","initialNodes: LineageGraphNode[]","getIconForChangeStatus","colors","useAppLocation","useApiConfig","useClipBoardToast","useCopyToClipboard","error","useLineageGraphContext","useRecceInstanceContext","useRecceActionContext","nodes","isLineageGraphNode","getCll","filteredNodeIds: string[]","highlightedModels: Set<string>","union","selectUpstream","selectDownstream","filteredNodeIds: string[] | undefined","newViewOptions: LineageDiffViewOptions","select","_","cll: ColumnLineageData | undefined","AxiosError","edges","nodeColumnSetMap","toReactFlow","filteredNodeIds","cll","isLineageGraphColumnNode","selectedNodes: string[] | undefined","isTopKDiffRun","isProfileDiffRun","isHistogramDiffRun","isValueDiffRun","isValueDiffDetailRun","useValueDiffAlertDialog","contextValue: LineageViewContextType","check: Check | undefined","createLineageDiffCheck","createSchemaDiffCheck","Box","CircularProgress","Stack","Button","LineageViewContext","Divider","ReactFlow","Background","BackgroundVariant","Controls","ControlButton","FiCopy","Panel","Typography","MiniMap","ReactFlowProvider","useRecceInstanceInfo","Stack","Box","RiTerminalBoxLine","Typography","Button","useRecceQueryContext","Box","Stack","Typography","MuiTooltip","PiInfoFill","MuiSwitch","useLineageGraphContext","useRecceInstanceContext","defaultSqlQuery","RECCE_SUPPORT_CALENDAR_URL","useRecceActionContext","useApiConfig","type","submitQuery","submitQueryBase","submitQueryDiff","params: QueryParams","options: SubmitOptions","waitRun","countMap: Record<string, number>","Button","SqlEditor","useRecceInstanceContext","useApiConfig","updateCheck","check","cacheKeys","icon: IconType","findByRunType","Box","MuiTooltip","Checkbox","useCheckToast","DragDropContext","Droppable","Stack","Draggable","provided","MuiDialog","DialogTitle","IconButton","IoClose","Divider","DialogContent","Typography","FormControlLabel","DialogActions","Button","axiosClient","useApiConfig","cacheKeys","Box","TextField","Stack","Button","MuiDialog","DialogTitle","Box","PiWarning","IconButton","IoClose","DialogContent","Typography","DialogActions","Button","Link","Box","SyntaxHighlighter","oneDark","Markdown","remarkGfm","Typography","PiPlusCircle","PiChatText","PiCheckCircle","PiCircle","PiNotePencil","PiBookmarkSimple","colorMap: Record<string, string>","Box","fetchGitHubAvatar","MuiAvatar","Stack","Typography","event","TextField","Button","MuiTooltip","IconButton","PiPencilSimple","PiTrashSimple","Popover","useApiConfig","cacheKeys","fetchUser","updateComment","deleteComment","Box","CircularProgress","Typography","Stack","Divider","handleKeyDown: React.KeyboardEventHandler","handleChange: React.ChangeEventHandler","Box","TextField","useRecceInstanceContext","handleKeyDown: KeyboardEventHandler","handleChange: ChangeEventHandler","Stack","TextField","Link","Button","Typography","Box","ReactFlowProvider","check: Record<string, unknown>","YAML","statusIcon: IconType | undefined","statusColor: string | undefined","findByRunType","getIconForChangeStatus","ListItem","Box","useApiConfig","useLineageGraphContext","cacheKeys","select","selectedNodes: LineageGraphNode[]","changedNodes: string[]","addedNodes: string[]","removedNodes: string[]","changedNodes","List","node","useApiConfig","useRecceInstanceContext","useRecceCheckContext","useLineageGraphContext","useAppLocation","useClipBoardToast","useCheckToast","cacheKeys","getCheck","findByRunType","RunResultView: RegistryEntry[\"RunResultView\"] | undefined","updateCheck","check","deleteCheck","markAsPresetCheck","error","submitRunFromCheck","cancelRun","Box","checkTypeIcon: IconType | undefined","Grid","Stack","MuiTooltip","FaBookmark","IconButton","VscKebabVertical","Menu","MenuItem","ListItemIcon","IoBookmarksOutline","ListItemText","IoMdCodeWorking","PiCopy","Divider","PiTrashFill","Button","PiCheckCircle","VscCircleLarge","Tabs","Tab","PiRepeat","SqlEditor","MuiDialog","DialogTitle","DialogContent","Typography","DialogActions","IoClose","useAppLocation","useApiConfig","createSchemaDiffCheck","cacheKeys","Box","Stack","TbChecklist","Typography","Button","TbPlus","useApiConfig","cacheKeys","waitRun","RunResultView: RegistryEntry[\"RunResultView\"] | undefined","runTypeHasRef","findByRunType","useRecceInstanceContext","useApiConfig","cacheKeys","waitRun","IconComponent: IconType","findByRunType","Box","MuiTooltip","Typography","FaCheckCircle","FaRegCheckCircle","useRecceActionContext","listRuns","Stack","IconButton","PiX","SimpleBar","useAppLocation","runId","createCheckByRun","React","token","Stack","Typography","MuiTooltip","Box","FiInfo","Grid","Card","CardHeader","Typography","Stack","CardContent","Box","changedNodes: LineageGraphNode[]","mergeKeysWithStatus","useLineageGraphContext","Stack","Box","Typography","Divider","useApiConfig","cacheKeys","fetchUser","fetchGitHubAvatar","Box","CircularProgress","MuiAvatar","Menu","Typography","Divider","MenuItem","ListItemIcon","FaCloud","ListItemText","RECCE_SUPPORT_CALENDAR_URL","FaUser","useIdleTimeout","Badge","Box","IoWarning","formatDuration","IconButton","PiSun","Tooltip","PiMoon","useVersionNumber","Box","Link","Typography","Link","useLineageGraphContext","useRecceInstanceContext","Box","colors","Typography","Badge","Stack","VscGitPullRequest","FaGithub","FaSlack","FaQuestionCircle","AxiosError","useRecceInstanceContext","useLineageGraphContext","useApiConfig","useChecks","localStorageKeys","saveAs","rename","cacheKeys","error: unknown","Stack","Box","MuiTooltip","IconButton","IconEdit","IconSave","MuiDialog","DialogTitle","IoClose","DialogContent","TextField","newErrorMessage: string | undefined","DialogActions","Button","Typography","FormControlLabel","Checkbox","useRecceInstanceContext","useApiConfig","exportState","MuiTooltip","IconButton","Box","IconExport","useClipBoardToast","useRecceInstanceContext","useRecceShareStateContext","error","Stack","Button","TbCloudUpload","Box","PiCheckCircle","Typography","IconButton","PiCopy","MuiTooltip","Box","CircularProgress","useApiConfig","useAppLocation","useRecceInstanceInfo","syncState","isStateSyncing","cacheKeys","IconButton","IconSync","MuiDialog","DialogTitle","IoClose","DialogContent","Typography","RadioGroup","Stack","FormControlLabel","Radio","PiInfo","DialogActions","Button","Box","cacheKeys","listChecks","useLineageGraphContext","useRecceInstanceContext","useRecceServerFlag","MuiTabs","Tab","NextLink"],"sources":["../recce-source/js/src/components/ui/mui-provider.tsx","../recce-source/js/src/components/errorboundary/ErrorBoundary.tsx","../recce-source/js/src/components/split/Split.tsx","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/util.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/clone-pseudos.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/mimes.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/dataurl.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/clone-node.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/embed-resources.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/embed-images.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/apply-style.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/embed-webfonts.js","../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/lib/index.js","../recce-source/js/src/lib/hooks/ScreenShot.tsx","../recce-source/js/src/lib/hooks/useRun.tsx","../recce-source/js/src/lib/hooks/useThemeColors.ts","../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/components/lineage/LineageViewContextMenu.tsx","../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/components/onboarding-guide/Notification.tsx","../recce-source/js/src/components/schema/SchemaView.tsx","../recce-source/js/src/components/editor/CodeEditor.tsx","../recce-source/js/src/components/editor/DiffEditor.tsx","../recce-source/js/src/components/lineage/NodeSqlView.tsx","../recce-source/js/src/lib/hooks/useFeedbackCollectionToast.tsx","../recce-source/js/src/lib/hooks/useGuideToast.tsx","../recce-source/js/src/components/app/EnvInfo.tsx","../recce-source/js/src/utils/DropdownValuesInput.tsx","../recce-source/js/src/components/query/QueryForm.tsx","../recce-source/js/src/components/AuthModal/AuthModal.tsx","../recce-source/js/src/components/query/SqlEditor.tsx","../recce-source/js/src/components/run/RunStatusAndDate.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/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/components/check/CheckList.tsx","../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/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/check/CheckEmptyState.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","../recce-source/js/src/components/app/AvatarDropdown.tsx","../recce-source/js/src/components/timeout/IdleTimeoutBadge.tsx","../recce-source/js/app/(mainComponents)/DisplayModeToggle.tsx","../recce-source/js/app/(mainComponents)/RecceVersionBadge.tsx","../recce-source/js/app/(mainComponents)/TopBar.tsx","../recce-source/js/src/components/app/Filename.tsx","../recce-source/js/src/components/app/StateExporter.tsx","../recce-source/js/src/components/app/StateSharing.tsx","../recce-source/js/src/components/app/StateSynchronizer.tsx","../recce-source/js/app/(mainComponents)/NavBar.tsx"],"sourcesContent":["\"use client\";\n\nimport CssBaseline from \"@mui/material/CssBaseline\";\nimport { ThemeProvider as MuiThemeProvider } from \"@mui/material/styles\";\nimport { useTheme } from \"next-themes\";\nimport { type ReactNode, useEffect, useMemo, useState } from \"react\";\nimport { darkTheme, lightTheme } from \"./mui-theme\";\n\ninterface MuiProviderProps {\n children: ReactNode;\n /**\n * Force a specific theme mode. If not provided, follows system/user preference.\n */\n forcedTheme?: \"light\" | \"dark\";\n /**\n * Whether to include MUI's CssBaseline for consistent baseline styles.\n * Disabled by default to avoid conflicts with Chakra/Tailwind during migration.\n */\n enableCssBaseline?: boolean;\n}\n\n/**\n * MUI Theme Provider for Recce\n *\n * This provider integrates MUI theming with the existing next-themes\n * color mode system used by Chakra UI. During the migration period,\n * both Chakra and MUI components will share the same theme mode.\n *\n * Usage:\n * ```tsx\n * <MuiProvider>\n * <MuiButton>Click me</MuiButton>\n * </MuiProvider>\n * ```\n */\nexport function MuiProvider({\n children,\n forcedTheme,\n enableCssBaseline = false,\n}: MuiProviderProps) {\n const { resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n // Avoid hydration mismatch - next-themes resolvedTheme is undefined on server\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Determine which theme to use\n // Use light theme during SSR/hydration to match server render\n const theme = useMemo(() => {\n if (!mounted) {\n return lightTheme;\n }\n const mode = forcedTheme ?? resolvedTheme;\n return mode === \"dark\" ? darkTheme : lightTheme;\n }, [forcedTheme, resolvedTheme, mounted]);\n\n return (\n <MuiThemeProvider theme={theme}>\n {enableCssBaseline && <CssBaseline />}\n {children}\n </MuiThemeProvider>\n );\n}\n\nexport default MuiProvider;\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Typography from \"@mui/material/Typography\";\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 <Box\n sx={{\n height: \"100%\",\n bgcolor: \"grey.50\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Box\n sx={{\n p: 4,\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"flex-start\",\n bgcolor: \"background.paper\",\n border: \"solid 1px\",\n borderColor: \"divider\",\n minHeight: \"200px\",\n }}\n >\n <Typography variant=\"h6\" sx={{ width: \"800px\" }}>\n You have encountered an error\n </Typography>\n\n <Box sx={{ flex: 1, fontSize: \"10pt\" }}>{String(errorData.error)}</Box>\n\n <Button\n sx={{\n justifySelf: \"center\",\n alignSelf: \"center\",\n mt: \"20px\",\n }}\n color=\"iochmara\"\n variant=\"contained\"\n size=\"small\"\n onClick={() => {\n errorData.resetError();\n }}\n >\n Reset\n </Button>\n </Box>\n </Box>\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 sx={{ position: \"absolute\", zIndex: 1 }}\n onClick={() => {\n setA(undefined);\n }}\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 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","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isInstanceOfElement = exports.nodeToDataURL = exports.svgToDataURL = exports.createImage = exports.canvasToBlob = exports.checkCanvasDimensions = exports.getPixelRatio = exports.getImageSize = exports.getStyleProperties = exports.toArray = exports.delay = exports.uuid = exports.resolveUrl = void 0;\nfunction resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n var doc = document.implementation.createHTMLDocument();\n var base = doc.createElement('base');\n var a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexports.resolveUrl = resolveUrl;\nexports.uuid = (function () {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n var counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n var random = function () {\n // eslint-disable-next-line no-bitwise\n return \"0000\".concat(((Math.random() * Math.pow(36, 4)) << 0).toString(36)).slice(-4);\n };\n return function () {\n counter += 1;\n return \"u\".concat(random()).concat(counter);\n };\n})();\nfunction delay(ms) {\n return function (args) {\n return new Promise(function (resolve) {\n setTimeout(function () { return resolve(args); }, ms);\n });\n };\n}\nexports.delay = delay;\nfunction toArray(arrayLike) {\n var arr = [];\n for (var i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nexports.toArray = toArray;\nvar styleProps = null;\nfunction getStyleProperties(options) {\n if (options === void 0) { options = {}; }\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nexports.getStyleProperties = getStyleProperties;\nfunction px(node, styleProperty) {\n var win = node.ownerDocument.defaultView || window;\n var val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n var leftBorder = px(node, 'border-left-width');\n var rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n var topBorder = px(node, 'border-top-width');\n var bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nfunction getImageSize(targetNode, options) {\n if (options === void 0) { options = {}; }\n var width = options.width || getNodeWidth(targetNode);\n var height = options.height || getNodeHeight(targetNode);\n return { width: width, height: height };\n}\nexports.getImageSize = getImageSize;\nfunction getPixelRatio() {\n var ratio;\n var FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n var val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\nexports.getPixelRatio = getPixelRatio;\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nvar canvasDimensionLimit = 16384;\nfunction checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexports.checkCanvasDimensions = checkCanvasDimensions;\nfunction canvasToBlob(canvas, options) {\n if (options === void 0) { options = {}; }\n if (canvas.toBlob) {\n return new Promise(function (resolve) {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise(function (resolve) {\n var binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n var len = binaryString.length;\n var binaryArray = new Uint8Array(len);\n for (var i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexports.canvasToBlob = canvasToBlob;\nfunction createImage(url) {\n return new Promise(function (resolve, reject) {\n var img = new Image();\n img.onload = function () {\n img.decode().then(function () {\n requestAnimationFrame(function () { return resolve(img); });\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexports.createImage = createImage;\nfunction svgToDataURL(svg) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, Promise.resolve()\n .then(function () { return new XMLSerializer().serializeToString(svg); })\n .then(encodeURIComponent)\n .then(function (html) { return \"data:image/svg+xml;charset=utf-8,\".concat(html); })];\n });\n });\n}\nexports.svgToDataURL = svgToDataURL;\nfunction nodeToDataURL(node, width, height) {\n return __awaiter(this, void 0, void 0, function () {\n var xmlns, svg, foreignObject;\n return __generator(this, function (_a) {\n xmlns = 'http://www.w3.org/2000/svg';\n svg = document.createElementNS(xmlns, 'svg');\n foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', \"\".concat(width));\n svg.setAttribute('height', \"\".concat(height));\n svg.setAttribute('viewBox', \"0 0 \".concat(width, \" \").concat(height));\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return [2 /*return*/, svgToDataURL(svg)];\n });\n });\n}\nexports.nodeToDataURL = nodeToDataURL;\nvar isInstanceOfElement = function (node, instance) {\n if (node instanceof instance)\n return true;\n var nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n (0, exports.isInstanceOfElement)(nodePrototype, instance));\n};\nexports.isInstanceOfElement = isInstanceOfElement;\n//# sourceMappingURL=util.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.clonePseudoElements = void 0;\nvar util_1 = require(\"./util\");\nfunction formatCSSText(style) {\n var content = style.getPropertyValue('content');\n return \"\".concat(style.cssText, \" content: '\").concat(content.replace(/'|\"/g, ''), \"';\");\n}\nfunction formatCSSProperties(style, options) {\n return (0, util_1.getStyleProperties)(options)\n .map(function (name) {\n var value = style.getPropertyValue(name);\n var priority = style.getPropertyPriority(name);\n return \"\".concat(name, \": \").concat(value).concat(priority ? ' !important' : '', \";\");\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n var selector = \".\".concat(className, \":\").concat(pseudo);\n var cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(\"\".concat(selector, \"{\").concat(cssText, \"}\"));\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n var style = window.getComputedStyle(nativeNode, pseudo);\n var content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n var className = (0, util_1.uuid)();\n try {\n clonedNode.className = \"\".concat(clonedNode.className, \" \").concat(className);\n }\n catch (err) {\n return;\n }\n var styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nfunction clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\nexports.clonePseudoElements = clonePseudoElements;\n//# sourceMappingURL=clone-pseudos.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getMimeType = void 0;\nvar WOFF = 'application/font-woff';\nvar JPEG = 'image/jpeg';\nvar mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n var match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nfunction getMimeType(url) {\n var extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\nexports.getMimeType = getMimeType;\n//# sourceMappingURL=mimes.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.resourceToDataURL = exports.fetchAsDataURL = exports.makeDataUrl = exports.isDataUrl = void 0;\nfunction getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nfunction isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexports.isDataUrl = isDataUrl;\nfunction makeDataUrl(content, mimeType) {\n return \"data:\".concat(mimeType, \";base64,\").concat(content);\n}\nexports.makeDataUrl = makeDataUrl;\nfunction fetchAsDataURL(url, init, process) {\n return __awaiter(this, void 0, void 0, function () {\n var res, blob;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, fetch(url, init)];\n case 1:\n res = _a.sent();\n if (res.status === 404) {\n throw new Error(\"Resource \\\"\".concat(res.url, \"\\\" not found\"));\n }\n return [4 /*yield*/, res.blob()];\n case 2:\n blob = _a.sent();\n return [2 /*return*/, new Promise(function (resolve, reject) {\n var reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = function () {\n try {\n resolve(process({ res: res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n })];\n }\n });\n });\n}\nexports.fetchAsDataURL = fetchAsDataURL;\nvar cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n var key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? \"[\".concat(contentType, \"]\").concat(key) : key;\n}\nfunction resourceToDataURL(resourceUrl, contentType, options) {\n return __awaiter(this, void 0, void 0, function () {\n var cacheKey, dataURL, content, error_1, msg;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return [2 /*return*/, cache[cacheKey]];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n _a.label = 1;\n case 1:\n _a.trys.push([1, 3, , 4]);\n return [4 /*yield*/, fetchAsDataURL(resourceUrl, options.fetchRequestInit, function (_a) {\n var res = _a.res, result = _a.result;\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n })];\n case 2:\n content = _a.sent();\n dataURL = makeDataUrl(content, contentType);\n return [3 /*break*/, 4];\n case 3:\n error_1 = _a.sent();\n dataURL = options.imagePlaceholder || '';\n msg = \"Failed to fetch resource: \".concat(resourceUrl);\n if (error_1) {\n msg = typeof error_1 === 'string' ? error_1 : error_1.message;\n }\n if (msg) {\n console.warn(msg);\n }\n return [3 /*break*/, 4];\n case 4:\n cache[cacheKey] = dataURL;\n return [2 /*return*/, dataURL];\n }\n });\n });\n}\nexports.resourceToDataURL = resourceToDataURL;\n//# sourceMappingURL=dataurl.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.cloneNode = void 0;\nvar clone_pseudos_1 = require(\"./clone-pseudos\");\nvar util_1 = require(\"./util\");\nvar mimes_1 = require(\"./mimes\");\nvar dataurl_1 = require(\"./dataurl\");\nfunction cloneCanvasElement(canvas) {\n return __awaiter(this, void 0, void 0, function () {\n var dataURL;\n return __generator(this, function (_a) {\n dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return [2 /*return*/, canvas.cloneNode(false)];\n }\n return [2 /*return*/, (0, util_1.createImage)(dataURL)];\n });\n });\n}\nfunction cloneVideoElement(video, options) {\n return __awaiter(this, void 0, void 0, function () {\n var canvas, ctx, dataURL_1, poster, contentType, dataURL;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (video.currentSrc) {\n canvas = document.createElement('canvas');\n ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n dataURL_1 = canvas.toDataURL();\n return [2 /*return*/, (0, util_1.createImage)(dataURL_1)];\n }\n poster = video.poster;\n contentType = (0, mimes_1.getMimeType)(poster);\n return [4 /*yield*/, (0, dataurl_1.resourceToDataURL)(poster, contentType, options)];\n case 1:\n dataURL = _a.sent();\n return [2 /*return*/, (0, util_1.createImage)(dataURL)];\n }\n });\n });\n}\nfunction cloneIFrameElement(iframe, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var _b;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n _c.trys.push([0, 3, , 4]);\n if (!((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) return [3 /*break*/, 2];\n return [4 /*yield*/, cloneNode(iframe.contentDocument.body, options, true)];\n case 1: return [2 /*return*/, (_c.sent())];\n case 2: return [3 /*break*/, 4];\n case 3:\n _b = _c.sent();\n return [3 /*break*/, 4];\n case 4: return [2 /*return*/, iframe.cloneNode(false)];\n }\n });\n });\n}\nfunction cloneSingleNode(node, options) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if ((0, util_1.isInstanceOfElement)(node, HTMLCanvasElement)) {\n return [2 /*return*/, cloneCanvasElement(node)];\n }\n if ((0, util_1.isInstanceOfElement)(node, HTMLVideoElement)) {\n return [2 /*return*/, cloneVideoElement(node, options)];\n }\n if ((0, util_1.isInstanceOfElement)(node, HTMLIFrameElement)) {\n return [2 /*return*/, cloneIFrameElement(node, options)];\n }\n return [2 /*return*/, node.cloneNode(isSVGElement(node))];\n });\n });\n}\nvar isSlotElement = function (node) {\n return node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\n};\nvar isSVGElement = function (node) {\n return node.tagName != null && node.tagName.toUpperCase() === 'SVG';\n};\nfunction cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n return __awaiter(this, void 0, void 0, function () {\n var children;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n if (isSVGElement(clonedNode)) {\n return [2 /*return*/, clonedNode];\n }\n children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = (0, util_1.toArray)(nativeNode.assignedNodes());\n }\n else if ((0, util_1.isInstanceOfElement)(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = (0, util_1.toArray)(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = (0, util_1.toArray)(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n (0, util_1.isInstanceOfElement)(nativeNode, HTMLVideoElement)) {\n return [2 /*return*/, clonedNode];\n }\n return [4 /*yield*/, children.reduce(function (deferred, child) {\n return deferred\n .then(function () { return cloneNode(child, options); })\n .then(function (clonedChild) {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n });\n }, Promise.resolve())];\n case 1:\n _c.sent();\n return [2 /*return*/, clonedNode];\n }\n });\n });\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n var targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n var sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n (0, util_1.getStyleProperties)(options).forEach(function (name) {\n var value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n var reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = \"\".concat(reducedFont, \"px\");\n }\n if ((0, util_1.isInstanceOfElement)(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = \"path(\".concat(clonedNode.getAttribute('d'), \")\");\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if ((0, util_1.isInstanceOfElement)(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if ((0, util_1.isInstanceOfElement)(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if ((0, util_1.isInstanceOfElement)(nativeNode, HTMLSelectElement)) {\n var clonedSelect = clonedNode;\n var selectedOption = Array.from(clonedSelect.children).find(function (child) { return nativeNode.value === child.getAttribute('value'); });\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if ((0, util_1.isInstanceOfElement)(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n (0, clone_pseudos_1.clonePseudoElements)(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nfunction ensureSVGSymbols(clone, options) {\n return __awaiter(this, void 0, void 0, function () {\n var uses, processedDefs, i, use, id, exist, definition, _a, _b, nodes, ns, svg, defs, i;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return [2 /*return*/, clone];\n }\n processedDefs = {};\n i = 0;\n _c.label = 1;\n case 1:\n if (!(i < uses.length)) return [3 /*break*/, 4];\n use = uses[i];\n id = use.getAttribute('xlink:href');\n if (!id) return [3 /*break*/, 3];\n exist = clone.querySelector(id);\n definition = document.querySelector(id);\n if (!(!exist && definition && !processedDefs[id])) return [3 /*break*/, 3];\n // eslint-disable-next-line no-await-in-loop\n _a = processedDefs;\n _b = id;\n return [4 /*yield*/, cloneNode(definition, options, true)];\n case 2:\n // eslint-disable-next-line no-await-in-loop\n _a[_b] = (_c.sent());\n _c.label = 3;\n case 3:\n i++;\n return [3 /*break*/, 1];\n case 4:\n nodes = Object.values(processedDefs);\n if (nodes.length) {\n ns = 'http://www.w3.org/1999/xhtml';\n svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return [2 /*return*/, clone];\n }\n });\n });\n}\nfunction cloneNode(node, options, isRoot) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return [2 /*return*/, null];\n }\n return [2 /*return*/, Promise.resolve(node)\n .then(function (clonedNode) { return cloneSingleNode(clonedNode, options); })\n .then(function (clonedNode) { return cloneChildren(node, clonedNode, options); })\n .then(function (clonedNode) { return decorate(node, clonedNode, options); })\n .then(function (clonedNode) { return ensureSVGSymbols(clonedNode, options); })];\n });\n });\n}\nexports.cloneNode = cloneNode;\n//# sourceMappingURL=clone-node.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.embedResources = exports.shouldEmbed = exports.embed = exports.parseURLs = void 0;\nvar util_1 = require(\"./util\");\nvar mimes_1 = require(\"./mimes\");\nvar dataurl_1 = require(\"./dataurl\");\nvar URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nvar URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nvar FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n var escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(\"(url\\\\(['\\\"]?)(\".concat(escaped, \")(['\\\"]?\\\\))\"), 'g');\n}\nfunction parseURLs(cssText) {\n var urls = [];\n cssText.replace(URL_REGEX, function (raw, quotation, url) {\n urls.push(url);\n return raw;\n });\n return urls.filter(function (url) { return !(0, dataurl_1.isDataUrl)(url); });\n}\nexports.parseURLs = parseURLs;\nfunction embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n return __awaiter(this, void 0, void 0, function () {\n var resolvedURL, contentType, dataURL, content, error_1;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n _a.trys.push([0, 5, , 6]);\n resolvedURL = baseURL ? (0, util_1.resolveUrl)(resourceURL, baseURL) : resourceURL;\n contentType = (0, mimes_1.getMimeType)(resourceURL);\n dataURL = void 0;\n if (!getContentFromUrl) return [3 /*break*/, 2];\n return [4 /*yield*/, getContentFromUrl(resolvedURL)];\n case 1:\n content = _a.sent();\n dataURL = (0, dataurl_1.makeDataUrl)(content, contentType);\n return [3 /*break*/, 4];\n case 2: return [4 /*yield*/, (0, dataurl_1.resourceToDataURL)(resolvedURL, contentType, options)];\n case 3:\n dataURL = _a.sent();\n _a.label = 4;\n case 4: return [2 /*return*/, cssText.replace(toRegex(resourceURL), \"$1\".concat(dataURL, \"$3\"))];\n case 5:\n error_1 = _a.sent();\n return [3 /*break*/, 6];\n case 6: return [2 /*return*/, cssText];\n }\n });\n });\n}\nexports.embed = embed;\nfunction filterPreferredFontFormat(str, _a) {\n var preferredFontFormat = _a.preferredFontFormat;\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, function (match) {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n var _a = URL_WITH_FORMAT_REGEX.exec(match) || [], src = _a[0], format = _a[2];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return \"src: \".concat(src, \";\");\n }\n }\n });\n}\nfunction shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexports.shouldEmbed = shouldEmbed;\nfunction embedResources(cssText, baseUrl, options) {\n return __awaiter(this, void 0, void 0, function () {\n var filteredCSSText, urls;\n return __generator(this, function (_a) {\n if (!shouldEmbed(cssText)) {\n return [2 /*return*/, cssText];\n }\n filteredCSSText = filterPreferredFontFormat(cssText, options);\n urls = parseURLs(filteredCSSText);\n return [2 /*return*/, urls.reduce(function (deferred, url) {\n return deferred.then(function (css) { return embed(css, url, baseUrl, options); });\n }, Promise.resolve(filteredCSSText))];\n });\n });\n}\nexports.embedResources = embedResources;\n//# sourceMappingURL=embed-resources.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.embedImages = void 0;\nvar embed_resources_1 = require(\"./embed-resources\");\nvar util_1 = require(\"./util\");\nvar dataurl_1 = require(\"./dataurl\");\nvar mimes_1 = require(\"./mimes\");\nfunction embedProp(propName, node, options) {\n var _a;\n return __awaiter(this, void 0, void 0, function () {\n var propValue, cssString;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (!propValue) return [3 /*break*/, 2];\n return [4 /*yield*/, (0, embed_resources_1.embedResources)(propValue, null, options)];\n case 1:\n cssString = _b.sent();\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return [2 /*return*/, true];\n case 2: return [2 /*return*/, false];\n }\n });\n });\n}\nfunction embedBackground(clonedNode, options) {\n return __awaiter(this, void 0, void 0, function () {\n var _a, _b, _c, _d;\n return __generator(this, function (_e) {\n switch (_e.label) {\n case 0:\n ;\n return [4 /*yield*/, embedProp('background', clonedNode, options)];\n case 1:\n _a = (_e.sent());\n if (_a) return [3 /*break*/, 3];\n return [4 /*yield*/, embedProp('background-image', clonedNode, options)];\n case 2:\n _a = (_e.sent());\n _e.label = 3;\n case 3:\n _a;\n return [4 /*yield*/, embedProp('mask', clonedNode, options)];\n case 4:\n _d = (_e.sent());\n if (_d) return [3 /*break*/, 6];\n return [4 /*yield*/, embedProp('-webkit-mask', clonedNode, options)];\n case 5:\n _d = (_e.sent());\n _e.label = 6;\n case 6:\n _c = _d;\n if (_c) return [3 /*break*/, 8];\n return [4 /*yield*/, embedProp('mask-image', clonedNode, options)];\n case 7:\n _c = (_e.sent());\n _e.label = 8;\n case 8:\n _b = _c;\n if (_b) return [3 /*break*/, 10];\n return [4 /*yield*/, embedProp('-webkit-mask-image', clonedNode, options)];\n case 9:\n _b = (_e.sent());\n _e.label = 10;\n case 10:\n _b;\n return [2 /*return*/];\n }\n });\n });\n}\nfunction embedImageNode(clonedNode, options) {\n return __awaiter(this, void 0, void 0, function () {\n var isImageElement, url, dataURL;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n isImageElement = (0, util_1.isInstanceOfElement)(clonedNode, HTMLImageElement);\n if (!(isImageElement && !(0, dataurl_1.isDataUrl)(clonedNode.src)) &&\n !((0, util_1.isInstanceOfElement)(clonedNode, SVGImageElement) &&\n !(0, dataurl_1.isDataUrl)(clonedNode.href.baseVal))) {\n return [2 /*return*/];\n }\n url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n return [4 /*yield*/, (0, dataurl_1.resourceToDataURL)(url, (0, mimes_1.getMimeType)(url), options)];\n case 1:\n dataURL = _a.sent();\n return [4 /*yield*/, new Promise(function (resolve, reject) {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? function () {\n var attributes = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n attributes[_i] = arguments[_i];\n }\n try {\n resolve(options.onImageErrorHandler.apply(options, attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n var image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n })];\n case 2:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n}\nfunction embedChildren(clonedNode, options) {\n return __awaiter(this, void 0, void 0, function () {\n var children, deferreds;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n children = (0, util_1.toArray)(clonedNode.childNodes);\n deferreds = children.map(function (child) { return embedImages(child, options); });\n return [4 /*yield*/, Promise.all(deferreds).then(function () { return clonedNode; })];\n case 1:\n _a.sent();\n return [2 /*return*/];\n }\n });\n });\n}\nfunction embedImages(clonedNode, options) {\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (!(0, util_1.isInstanceOfElement)(clonedNode, Element)) return [3 /*break*/, 4];\n return [4 /*yield*/, embedBackground(clonedNode, options)];\n case 1:\n _a.sent();\n return [4 /*yield*/, embedImageNode(clonedNode, options)];\n case 2:\n _a.sent();\n return [4 /*yield*/, embedChildren(clonedNode, options)];\n case 3:\n _a.sent();\n _a.label = 4;\n case 4: return [2 /*return*/];\n }\n });\n });\n}\nexports.embedImages = embedImages;\n//# sourceMappingURL=embed-images.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.applyStyle = void 0;\nfunction applyStyle(node, options) {\n var style = node.style;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = \"\".concat(options.width, \"px\");\n }\n if (options.height) {\n style.height = \"\".concat(options.height, \"px\");\n }\n var manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach(function (key) {\n style[key] = manual[key];\n });\n }\n return node;\n}\nexports.applyStyle = applyStyle;\n//# sourceMappingURL=apply-style.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.embedWebFonts = exports.getWebFontCSS = void 0;\nvar util_1 = require(\"./util\");\nvar dataurl_1 = require(\"./dataurl\");\nvar embed_resources_1 = require(\"./embed-resources\");\nvar cssFetchCache = {};\nfunction fetchCSS(url) {\n return __awaiter(this, void 0, void 0, function () {\n var cache, res, cssText;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n cache = cssFetchCache[url];\n if (cache != null) {\n return [2 /*return*/, cache];\n }\n return [4 /*yield*/, fetch(url)];\n case 1:\n res = _a.sent();\n return [4 /*yield*/, res.text()];\n case 2:\n cssText = _a.sent();\n cache = { url: url, cssText: cssText };\n cssFetchCache[url] = cache;\n return [2 /*return*/, cache];\n }\n });\n });\n}\nfunction embedFonts(data, options) {\n return __awaiter(this, void 0, void 0, function () {\n var cssText, regexUrl, fontLocs, loadFonts;\n var _this = this;\n return __generator(this, function (_a) {\n cssText = data.cssText;\n regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n loadFonts = fontLocs.map(function (loc) { return __awaiter(_this, void 0, void 0, function () {\n var url;\n return __generator(this, function (_a) {\n url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return [2 /*return*/, (0, dataurl_1.fetchAsDataURL)(url, options.fetchRequestInit, function (_a) {\n var result = _a.result;\n cssText = cssText.replace(loc, \"url(\".concat(result, \")\"));\n return [loc, result];\n })];\n });\n }); });\n return [2 /*return*/, Promise.all(loadFonts).then(function () { return cssText; })];\n });\n });\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n var result = [];\n var commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n var cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n var keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n var matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n var importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n var combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n var unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n var matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nfunction getCSSRules(styleSheets, options) {\n return __awaiter(this, void 0, void 0, function () {\n var ret, deferreds;\n return __generator(this, function (_a) {\n ret = [];\n deferreds = [];\n // First loop inlines imports\n styleSheets.forEach(function (sheet) {\n if ('cssRules' in sheet) {\n try {\n (0, util_1.toArray)(sheet.cssRules || []).forEach(function (item, index) {\n if (item.type === CSSRule.IMPORT_RULE) {\n var importIndex_1 = index + 1;\n var url = item.href;\n var deferred = fetchCSS(url)\n .then(function (metadata) { return embedFonts(metadata, options); })\n .then(function (cssText) {\n return parseCSS(cssText).forEach(function (rule) {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex_1 += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule: rule,\n error: error,\n });\n }\n });\n })\n .catch(function (e) {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n var inline_1 = styleSheets.find(function (a) { return a.href == null; }) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then(function (metadata) { return embedFonts(metadata, options); })\n .then(function (cssText) {\n return parseCSS(cssText).forEach(function (rule) {\n inline_1.insertRule(rule, inline_1.cssRules.length);\n });\n })\n .catch(function (err) {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return [2 /*return*/, Promise.all(deferreds).then(function () {\n // Second loop parses rules\n styleSheets.forEach(function (sheet) {\n if ('cssRules' in sheet) {\n try {\n (0, util_1.toArray)(sheet.cssRules || []).forEach(function (item) {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(\"Error while reading CSS rules from \".concat(sheet.href), e);\n }\n }\n });\n return ret;\n })];\n });\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter(function (rule) { return rule.type === CSSRule.FONT_FACE_RULE; })\n .filter(function (rule) { return (0, embed_resources_1.shouldEmbed)(rule.style.getPropertyValue('src')); });\n}\nfunction parseWebFontRules(node, options) {\n return __awaiter(this, void 0, void 0, function () {\n var styleSheets, cssRules;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0:\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n styleSheets = (0, util_1.toArray)(node.ownerDocument.styleSheets);\n return [4 /*yield*/, getCSSRules(styleSheets, options)];\n case 1:\n cssRules = _a.sent();\n return [2 /*return*/, getWebFontRules(cssRules)];\n }\n });\n });\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n var fonts = new Set();\n function traverse(node) {\n var fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach(function (font) {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach(function (child) {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nfunction getWebFontCSS(node, options) {\n return __awaiter(this, void 0, void 0, function () {\n var rules, usedFonts, cssTexts;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, parseWebFontRules(node, options)];\n case 1:\n rules = _a.sent();\n usedFonts = getUsedFonts(node);\n return [4 /*yield*/, Promise.all(rules\n .filter(function (rule) {\n return usedFonts.has(normalizeFontFamily(rule.style.fontFamily));\n })\n .map(function (rule) {\n var baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return (0, embed_resources_1.embedResources)(rule.cssText, baseUrl, options);\n }))];\n case 2:\n cssTexts = _a.sent();\n return [2 /*return*/, cssTexts.join('\\n')];\n }\n });\n });\n}\nexports.getWebFontCSS = getWebFontCSS;\nfunction embedWebFonts(clonedNode, options) {\n return __awaiter(this, void 0, void 0, function () {\n var cssText, _a, _b, styleNode, sytleContent;\n return __generator(this, function (_c) {\n switch (_c.label) {\n case 0:\n if (!(options.fontEmbedCSS != null)) return [3 /*break*/, 1];\n _a = options.fontEmbedCSS;\n return [3 /*break*/, 5];\n case 1:\n if (!options.skipFonts) return [3 /*break*/, 2];\n _b = null;\n return [3 /*break*/, 4];\n case 2: return [4 /*yield*/, getWebFontCSS(clonedNode, options)];\n case 3:\n _b = _c.sent();\n _c.label = 4;\n case 4:\n _a = _b;\n _c.label = 5;\n case 5:\n cssText = _a;\n if (cssText) {\n styleNode = document.createElement('style');\n sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n return [2 /*return*/];\n }\n });\n });\n}\nexports.embedWebFonts = embedWebFonts;\n//# sourceMappingURL=embed-webfonts.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getFontEmbedCSS = exports.toBlob = exports.toJpeg = exports.toPng = exports.toPixelData = exports.toCanvas = exports.toSvg = void 0;\nvar clone_node_1 = require(\"./clone-node\");\nvar embed_images_1 = require(\"./embed-images\");\nvar apply_style_1 = require(\"./apply-style\");\nvar embed_webfonts_1 = require(\"./embed-webfonts\");\nvar util_1 = require(\"./util\");\nfunction toSvg(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var _a, width, height, clonedNode, datauri;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = (0, util_1.getImageSize)(node, options), width = _a.width, height = _a.height;\n return [4 /*yield*/, (0, clone_node_1.cloneNode)(node, options, true)];\n case 1:\n clonedNode = (_b.sent());\n return [4 /*yield*/, (0, embed_webfonts_1.embedWebFonts)(clonedNode, options)];\n case 2:\n _b.sent();\n return [4 /*yield*/, (0, embed_images_1.embedImages)(clonedNode, options)];\n case 3:\n _b.sent();\n (0, apply_style_1.applyStyle)(clonedNode, options);\n return [4 /*yield*/, (0, util_1.nodeToDataURL)(clonedNode, width, height)];\n case 4:\n datauri = _b.sent();\n return [2 /*return*/, datauri];\n }\n });\n });\n}\nexports.toSvg = toSvg;\nfunction toCanvas(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var _a, width, height, svg, img, canvas, context, ratio, canvasWidth, canvasHeight;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = (0, util_1.getImageSize)(node, options), width = _a.width, height = _a.height;\n return [4 /*yield*/, toSvg(node, options)];\n case 1:\n svg = _b.sent();\n return [4 /*yield*/, (0, util_1.createImage)(svg)];\n case 2:\n img = _b.sent();\n canvas = document.createElement('canvas');\n context = canvas.getContext('2d');\n ratio = options.pixelRatio || (0, util_1.getPixelRatio)();\n canvasWidth = options.canvasWidth || width;\n canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n (0, util_1.checkCanvasDimensions)(canvas);\n }\n canvas.style.width = \"\".concat(canvasWidth);\n canvas.style.height = \"\".concat(canvasHeight);\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return [2 /*return*/, canvas];\n }\n });\n });\n}\nexports.toCanvas = toCanvas;\nfunction toPixelData(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var _a, width, height, canvas, ctx;\n return __generator(this, function (_b) {\n switch (_b.label) {\n case 0:\n _a = (0, util_1.getImageSize)(node, options), width = _a.width, height = _a.height;\n return [4 /*yield*/, toCanvas(node, options)];\n case 1:\n canvas = _b.sent();\n ctx = canvas.getContext('2d');\n return [2 /*return*/, ctx.getImageData(0, 0, width, height).data];\n }\n });\n });\n}\nexports.toPixelData = toPixelData;\nfunction toPng(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var canvas;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, toCanvas(node, options)];\n case 1:\n canvas = _a.sent();\n return [2 /*return*/, canvas.toDataURL()];\n }\n });\n });\n}\nexports.toPng = toPng;\nfunction toJpeg(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var canvas;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, toCanvas(node, options)];\n case 1:\n canvas = _a.sent();\n return [2 /*return*/, canvas.toDataURL('image/jpeg', options.quality || 1)];\n }\n });\n });\n}\nexports.toJpeg = toJpeg;\nfunction toBlob(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n var canvas, blob;\n return __generator(this, function (_a) {\n switch (_a.label) {\n case 0: return [4 /*yield*/, toCanvas(node, options)];\n case 1:\n canvas = _a.sent();\n return [4 /*yield*/, (0, util_1.canvasToBlob)(canvas)];\n case 2:\n blob = _a.sent();\n return [2 /*return*/, blob];\n }\n });\n });\n}\nexports.toBlob = toBlob;\nfunction getFontEmbedCSS(node, options) {\n if (options === void 0) { options = {}; }\n return __awaiter(this, void 0, void 0, function () {\n return __generator(this, function (_a) {\n return [2 /*return*/, (0, embed_webfonts_1.getWebFontCSS)(node, options)];\n });\n });\n}\nexports.getFontEmbedCSS = getFontEmbedCSS;\n//# sourceMappingURL=index.js.map","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { format } from \"date-fns\";\nimport saveAs from \"file-saver\";\nimport { toCanvas } from \"html-to-image\";\nimport React, {\n RefObject,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { PiCopy, PiInfo } from \"react-icons/pi\";\nimport { type DataGridHandle } from \"@/components/data-grid/ScreenshotDataGrid\";\nimport { colors } from \"@/components/ui/mui-theme\";\nimport { useClipBoardToast } from \"./useClipBoardToast\";\n\n// Dynamic import directly from ESM distribution file to work around Turbopack issues\n// Turbopack doesn't properly resolve the package's main entry point, so we import the ESM file directly\ntype Html2CanvasFn = (\n element: HTMLElement,\n options?: Record<string, unknown>,\n) => Promise<HTMLCanvasElement>;\n\nconst loadHtml2Canvas = async (): Promise<Html2CanvasFn> => {\n // @ts-expect-error - Direct path import for Turbopack compatibility\n const module = await import(\"html2canvas-pro/dist/html2canvas-pro.esm.js\");\n return module.default as Html2CanvasFn;\n};\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 = (\n refCurrent: DataGridRefType,\n): HTMLElement | undefined => {\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 ${colors.neutral[300]}`,\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 if (!nodeToUse) {\n console.error(\"Could not get HTMLElement from ref\");\n throw new Error(\"Could not get HTMLElement from ref\");\n }\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 is verified non-null before resetStyles is defined\n // Capture in local const to satisfy linter\n const node = nodeToUse;\n if (node) {\n node.style.overflow = overflow;\n node.style.border = border;\n node.style.borderRadius = radius;\n node.style.backgroundColor = background;\n node.style.height = heigh;\n }\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 ?? colors.neutral[100];\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 let canvas: HTMLCanvasElement;\n if (renderLibrary === \"html2canvas\") {\n const html2canvas = await loadHtml2Canvas();\n canvas = await html2canvas(nodeToUse, {\n logging: false,\n backgroundColor: backgroundColor ?? colors.neutral[100],\n ignoreElements: ignoreElements,\n });\n } else {\n canvas = await toCanvas(nodeToUse, {\n filter: filter,\n }); // Use html-to-image for copy reactflow graph\n }\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 ?? colors.neutral[100],\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 if (nodeToUse) {\n nodeToUse.style.boxShadow = highlightBoxShadow;\n nodeToUse.style.transition = \"box-shadow 0.5s ease-in-out\";\n }\n }\n }, [ref]);\n\n const onMouseLeave = useCallback(() => {\n if (ref.current) {\n const nodeToUse = getHTMLElementFromRef(ref.current);\n if (nodeToUse) {\n nodeToUse.style.boxShadow = \"\";\n }\n }\n }, [ref]);\n\n const onCopyToClipboard = useCallback(async () => {\n if (ref.current) {\n await copyToClipboard();\n const nodeToUse = getHTMLElementFromRef(ref.current);\n if (nodeToUse) {\n nodeToUse.style.boxShadow = \"\";\n }\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=\"small\"\n sx={{ position: \"absolute\", bottom: 16, right: 16 }}\n disabled={isLoading}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onClick={onCopyToClipboard}\n startIcon={<PiCopy />}\n >\n 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, setOpen] = useState(false);\n const [imgBlob, setImgBlob] = useState<Blob>();\n\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\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 <MuiDialog open={open} onClose={onClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Screenshot Preview</DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={onClose}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n <DialogContent>\n <Stack sx={{ px: \"10px\", gap: \"10px\" }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing=\"5px\">\n <Box component={PiInfo} sx={{ color: \"error.main\" }} />\n <Typography sx={{ fontWeight: 500, display: \"inline\" }}>\n Copy to the Clipboard\n </Typography>{\" \"}\n is not supported in the current browser\n </Stack>\n <Typography>Please download it directly</Typography>\n </Stack>\n <Box\n component=\"img\"\n src={base64Img}\n alt=\"screenshot\"\n sx={{ maxWidth: \"100%\" }}\n />\n </DialogContent>\n\n <DialogActions>\n <Button sx={{ mr: 1.5 }} onClick={onClose}>\n Close\n </Button>\n <Button color=\"iochmara\" variant=\"contained\" onClick={onDownload}>\n Download\n </Button>\n </DialogActions>\n </MuiDialog>\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 { useApiConfig } from \"./ApiConfigContext\";\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 { apiClient } = useApiConfig();\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, apiClient);\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, apiClient);\n return;\n }, [runId, apiClient]);\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","\"use client\";\n\nimport { useTheme as useMuiTheme } from \"@mui/material/styles\";\nimport { useTheme as useNextTheme } from \"next-themes\";\nimport { useEffect, useState } from \"react\";\nimport { colors } from \"@/components/ui/mui-theme\";\n\n/**\n * Theme-aware color utility hook\n *\n * Uses next-themes to determine dark/light mode, which is more reliable\n * when the host app uses MUI CSS variables mode with nested ThemeProviders.\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const { isDark, background, text, border } = useThemeColors();\n *\n * return (\n * <Box sx={{\n * bgcolor: background.paper,\n * color: text.primary,\n * borderColor: border.default,\n * }}>\n * Content\n * </Box>\n * );\n * }\n * ```\n */\nexport function useThemeColors() {\n const muiTheme = useMuiTheme();\n const { resolvedTheme } = useNextTheme();\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n // Use next-themes to determine dark mode (more reliable with CSS variables mode)\n const isDark = mounted ? resolvedTheme === \"dark\" : false;\n\n return {\n /** Whether the current theme is dark mode */\n isDark,\n\n /** MUI theme object for direct access when needed */\n theme: muiTheme,\n\n /** Background colors */\n background: {\n /** Default page background */\n default: isDark ? colors.neutral[900] : colors.white,\n /** Paper/card background */\n paper: isDark ? colors.neutral[800] : colors.white,\n /** Subtle background for slight elevation (e.g., hover states, inputs) */\n subtle: isDark ? colors.neutral[800] : colors.neutral[50],\n /** Emphasized background for higher contrast areas */\n emphasized: isDark ? colors.neutral[700] : colors.neutral[100],\n },\n\n /** Text colors */\n text: {\n /** Primary text color */\n primary: isDark ? colors.neutral[50] : colors.neutral[900],\n /** Secondary/muted text color */\n secondary: isDark ? colors.neutral[400] : colors.neutral[600],\n /** Disabled text color */\n disabled: isDark ? colors.neutral[500] : colors.neutral[400],\n /** Inverted text (for use on dark backgrounds in light mode, etc.) */\n inverted: isDark ? colors.neutral[900] : colors.neutral[50],\n },\n\n /** Border colors */\n border: {\n /** Light border for subtle separations */\n light: isDark ? colors.neutral[700] : colors.neutral[200],\n /** Default border color */\n default: isDark ? colors.neutral[600] : colors.neutral[300],\n /** Strong border for emphasis */\n strong: isDark ? colors.neutral[500] : colors.neutral[400],\n },\n\n /** Status/semantic colors */\n status: {\n /** Added/success backgrounds */\n added: {\n bg: isDark ? colors.green[900] : colors.green[100],\n text: isDark ? colors.neutral[50] : colors.neutral[900],\n },\n /** Removed/error backgrounds */\n removed: {\n bg: isDark ? colors.red[950] : colors.red[200],\n text: isDark ? colors.neutral[50] : colors.neutral[900],\n },\n /** Modified/warning backgrounds */\n modified: {\n bg: isDark ? colors.yellow[900] : colors.amber[100],\n text: isDark ? colors.neutral[50] : colors.neutral[900],\n },\n },\n\n /** Interactive element colors */\n interactive: {\n /** Hover state background */\n hover: isDark ? colors.neutral[700] : colors.neutral[100],\n /** Active/pressed state background */\n active: isDark ? colors.neutral[600] : colors.neutral[200],\n /** Focus ring color */\n focus: colors.iochmara[500],\n },\n };\n}\n\nexport type ThemeColors = ReturnType<typeof useThemeColors>;\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\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 sx={{ bgcolor: \"background.paper\", borderRadius: 1, boxShadow: 6 }}>\n <Stack\n direction=\"row\"\n divider={<Divider orientation=\"vertical\" flexItem />}\n spacing={2}\n sx={{ p: \"5px 15px\", mt: 2 }}\n >\n <Box sx={{ 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=\"small\"\n variant=\"outlined\"\n onClick={cancel}\n disabled={actionState.status === \"canceling\"}\n >\n {actionState.status === \"canceling\" ? \"Canceling\" : \"Cancel\"}\n </Button>\n ) : (\n <Stack direction=\"row\">\n <Button size=\"small\" variant=\"outlined\" onClick={onClose}>\n Close\n </Button>\n </Stack>\n )}\n </Stack>\n </Box>\n );\n}\n","import React 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 { token } from \"@/components/ui/mui-theme\";\n\nexport const IconAdded = VscDiffAdded;\nexport const IconRemoved = VscDiffRemoved;\nexport const IconModified = VscDiffModified;\nexport const IconChanged = (props: React.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}\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 = (\n props: React.SVGProps<SVGSVGElement>,\n) => {\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}\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 isDark?: boolean,\n): {\n color: string;\n hexColor: string;\n backgroundColor: string;\n hexBackgroundColor: string;\n icon: typeof IconAdded | undefined;\n} {\n if (changeStatus === \"added\") {\n const color = String(token(\"colors.green.solid\"));\n const backgroundColor = isDark\n ? String(token(\"colors.green.muted\"))\n : String(token(\"colors.green.subtle\"));\n return {\n color,\n hexColor: color,\n backgroundColor,\n hexBackgroundColor: backgroundColor,\n icon: IconAdded,\n };\n } else if (changeStatus === \"removed\") {\n const color = String(token(\"colors.red.solid\"));\n const backgroundColor = isDark\n ? String(token(\"colors.red.muted\"))\n : String(token(\"colors.red.subtle\"));\n return {\n color,\n hexColor: color,\n backgroundColor,\n hexBackgroundColor: backgroundColor,\n icon: IconRemoved,\n };\n } else if (changeStatus === \"modified\") {\n const color = String(token(\"colors.amber.emphasized\"));\n const backgroundColor = isDark\n ? String(token(\"colors.amber.emphasized\"))\n : String(token(\"colors.amber.subtle\"));\n return {\n color,\n hexColor: color,\n backgroundColor,\n hexBackgroundColor: backgroundColor,\n icon: IconModified,\n };\n }\n\n const color = String(token(\"colors.gray.focusRing\"));\n // Use theme-aware background for default state\n const backgroundColor = isDark ? \"#404040\" : \"#ffffff\";\n return {\n color,\n hexColor: color,\n backgroundColor,\n hexBackgroundColor: backgroundColor,\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(token(\"colors.cyan.subtle\")),\n icon: FaCube,\n };\n } else if (resourceType === \"metric\") {\n return {\n color: String(token(\"colors.rose.subtle\")),\n icon: FaChartSimple,\n };\n } else if (resourceType === \"source\") {\n return {\n color: String(token(\"colors.green.muted\")),\n icon: FaDatabase,\n };\n } else if (resourceType === \"exposure\") {\n return {\n color: String(token(\"colors.rose.subtle\")),\n icon: FaGauge,\n };\n } else if (resourceType === \"semantic_model\") {\n return {\n color: String(token(\"colors.rose.focusRing\")),\n icon: FaCircleNodes,\n };\n } else if (resourceType === \"seed\") {\n return {\n color: String(token(\"colors.green.emphasized\")),\n icon: FaSeedling,\n };\n } else if (resourceType === \"snapshot\") {\n return {\n color: String(token(\"colors.green.emphasized\")),\n icon: FaCamera,\n };\n } else {\n return { color: \"inherit\", icon: undefined };\n }\n}\n","import Box from \"@mui/material/Box\";\nimport Tooltip from \"@mui/material/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 sx={{\n bgcolor: \"background.paper\",\n padding: \"12px\",\n border: \"1px solid\",\n borderColor: \"divider\",\n fontSize: \"0.875rem\",\n }}\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 title={tip} key={key} placement=\"right\">\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n mb: \"2px\",\n }}\n >\n {icon && <Box component={icon} sx={{ color }} />} {label}\n </Box>\n </Tooltip>\n );\n })}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport MuiPopover from \"@mui/material/Popover\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\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 { useLineageViewContextSafe } from \"./LineageViewContext\";\n\nconst _AnalyzeChangeHint = ({ ml }: { ml?: number }) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n return (\n <>\n <Box\n component=\"span\"\n sx={{\n fontSize: \"10px\",\n cursor: \"pointer\",\n ml: ml,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n onMouseEnter={(e: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(e.currentTarget);\n }}\n onMouseLeave={() => {\n setAnchorEl(null);\n }}\n >\n <PiInfo />\n </Box>\n <MuiPopover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n disableRestoreFocus\n sx={{ pointerEvents: \"none\" }}\n slotProps={{\n paper: {\n sx: { bgcolor: \"black\", color: \"white\", p: 1.5 },\n },\n }}\n >\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Breaking changes are determined by analyzing SQL for changes that may\n impact downstream models.{\" \"}\n <Link\n href=\"https://docs.datarecce.io/features/breaking-change-analysis/\"\n target=\"_blank\"\n sx={{ color: \"white\", textDecoration: \"underline\" }}\n >\n Learn more\n </Link>\n .\n </Typography>\n </MuiPopover>\n </>\n );\n};\n\nconst _CllHint = () => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n\n return (\n <>\n <Box\n component=\"span\"\n sx={{\n fontSize: \"10px\",\n color: \"white\",\n cursor: \"pointer\",\n ml: 0.5,\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n onMouseEnter={(e: React.MouseEvent<HTMLElement>) => {\n setAnchorEl(e.currentTarget);\n }}\n onMouseLeave={() => {\n setAnchorEl(null);\n }}\n >\n <PiInfo />\n </Box>\n <MuiPopover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n disableRestoreFocus\n sx={{ pointerEvents: \"none\" }}\n slotProps={{\n paper: {\n sx: { bgcolor: \"black\", color: \"white\", p: 1.5 },\n },\n }}\n >\n <Typography sx={{ fontSize: \"0.875rem\" }}>\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 sx={{ color: \"white\", textDecoration: \"underline\" }}\n >\n Learn more\n </Link>\n .\n </Typography>\n </MuiPopover>\n </>\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 (\n <Typography component=\"span\">\n Impact Radius for All Changed Models\n </Typography>\n );\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 <Typography component=\"span\" sx={{ mr: \"5px\" }}>\n Impact Radius for\n </Typography>\n <Box\n component=\"code\"\n onClick={() => {\n centerNode(nodeId);\n }}\n sx={(theme) => ({\n cursor: \"pointer\",\n fontFamily: \"monospace\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.700\" : \"grey.100\",\n px: 0.5,\n borderRadius: 0.5,\n })}\n >\n {nodeName}\n </Box>\n </>\n );\n } else {\n const nodeId = `${cllInput.node_id}_${cllInput.column}`;\n return (\n <>\n <Typography component=\"span\" sx={{ mr: \"5px\" }}>\n Column Lineage for{\" \"}\n </Typography>\n <Box\n component=\"code\"\n onClick={() => {\n centerNode(nodeId);\n }}\n sx={(theme) => ({\n cursor: \"pointer\",\n fontFamily: \"monospace\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.700\" : \"grey.100\",\n px: 0.5,\n borderRadius: 0.5,\n })}\n >\n {nodeName}.{cllInput.column}\n </Box>\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 <Stack direction=\"row\" spacing=\"5px\">\n {!singleEnv && (\n <Box sx={{ borderRadius: 1, boxShadow: 3 }}>\n <MuiTooltip\n enterDelay={50}\n title={\n noCatalogCurrent\n ? \"Please provide catalog.json to enable Impact Radius\"\n : \"\"\n }\n placement=\"top\"\n >\n <span>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"neutral\"\n sx={{\n whiteSpace: \"nowrap\",\n display: \"inline-flex\",\n bgcolor: \"background.paper\",\n }}\n disabled={!interactive || noCatalogCurrent}\n startIcon={<FaRegDotCircle />}\n onClick={() => {\n void showColumnLevelLineage({\n no_upstream: true,\n change_analysis: true,\n });\n }}\n >\n Impact Radius\n </Button>\n </span>\n </MuiTooltip>\n </Box>\n )}\n {viewOptions.column_level_lineage && (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{\n borderRadius: 1,\n boxShadow: 3,\n border: \"1px solid\",\n borderColor: \"divider\",\n bgcolor: \"background.paper\",\n fontSize: \"0.8rem\",\n p: \"0 0.625rem\",\n }}\n >\n <ModeMessage />\n {action.isError && (\n <MuiTooltip\n title={`Error: ${action.error.message}`}\n placement=\"bottom\"\n >\n <Typography\n component=\"span\"\n sx={{\n color: \"error.main\",\n ml: \"2px\",\n display: \"inline-flex\",\n alignItems: \"center\",\n }}\n >\n <Box\n component={PiInfo}\n sx={{ color: \"error.main\", fontSize: \"14px\" }}\n />\n </Typography>\n </MuiTooltip>\n )}\n\n {action.isPending ? (\n <CircularProgress size={12} sx={{ ml: \"2px\" }} />\n ) : (\n <IconButton\n size=\"small\"\n sx={{ ml: \"2px\" }}\n aria-label=\"Reset Column Level Lineage\"\n onClick={() => {\n void resetColumnLevelLineage();\n }}\n >\n <PiX size=\"10px\" />\n </IconButton>\n )}\n </Stack>\n )}\n </Stack>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport Chip from \"@mui/material/Chip\";\nimport { Handle, NodeProps, Position, useStore } from \"@xyflow/react\";\nimport React from \"react\";\nimport { VscKebabVertical } from \"react-icons/vsc\";\nimport { useThemeColors } from \"@/lib/hooks/useThemeColors\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\nimport { COLUMN_HEIGHT, LineageGraphColumnNode } from \"./lineage\";\nimport { getIconForChangeStatus } from \"./styles\";\n\nimport \"./styles.css\";\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 if (!IconChangeStatus) {\n return <></>;\n }\n\n return (\n <Box\n component={IconChangeStatus}\n sx={{\n fontSize: 14,\n display: \"inline-flex\",\n color: colorChangeStatus,\n }}\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: \"default\" | \"error\" | \"warning\" | \"info\" | \"success\" = \"error\";\n\n if (transformationType === \"passthrough\") {\n letter = \"P\";\n color = \"default\";\n } else if (transformationType === \"renamed\") {\n letter = \"R\";\n color = \"warning\";\n } else if (transformationType === \"derived\") {\n letter = \"D\";\n color = \"warning\";\n } else if (transformationType === \"source\") {\n letter = \"S\";\n color = \"info\";\n } else {\n letter = \"U\";\n color = \"error\";\n }\n\n if (!transformationType) {\n return <></>;\n }\n\n return (\n <Chip\n label={letter}\n size=\"small\"\n color={color}\n sx={{\n fontSize: \"8pt\",\n height: 18,\n minWidth: 18,\n \"& .MuiChip-label\": {\n px: 0.5,\n },\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 const { background, text, border } = useThemeColors();\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 <Box\n sx={{\n display: \"flex\",\n width: 280,\n padding: \"0px 10px\",\n border: \"1px solid\",\n borderColor: border.default,\n backgroundColor: isFocus ? background.subtle : \"inherit\",\n \"&:hover\": {\n backgroundColor: background.subtle,\n },\n filter: isHighlighted ? \"none\" : \"opacity(0.2) grayscale(50%)\",\n cursor: \"pointer\",\n }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n fontSize: \"11px\",\n color: text.primary,\n width: \"100%\",\n gap: \"3px\",\n alignItems: \"center\",\n height: `${COLUMN_HEIGHT - 1}px`,\n }}\n >\n {isShowingChangeAnalysis && changeStatus ? (\n <ChangeStatus changeStatus={changeStatus} />\n ) : (\n <TransformationType transformationType={transformationType} />\n )}\n <Box sx={{ height: `${COLUMN_HEIGHT + 1}px` }}>{column}</Box>\n <Box sx={{ flexGrow: 1 }} />\n\n {isHovered ? (\n <Box\n component={VscKebabVertical}\n sx={{\n fontSize: 14,\n display: \"inline-flex\",\n cursor: \"pointer\",\n \"&:hover\": { color: text.primary },\n }}\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n showContextMenu(\n e,\n nodeProps as unknown as LineageGraphColumnNode,\n );\n }}\n />\n ) : (\n <Box sx={{ height: `${COLUMN_HEIGHT + 1} px` }}>{type}</Box>\n )}\n </Box>\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 </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Tooltip from \"@mui/material/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 sx={{\n bgcolor: \"background.paper\",\n padding: \"12px\",\n border: \"1px solid\",\n borderColor: \"divider\",\n fontSize: \"0.875rem\",\n }}\n >\n {Object.entries(TRANSFORMATION_MSGS).map(([key, [label, tip]]) => {\n return (\n <Tooltip title={tip} key={key} placement=\"right\">\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n mb: \"2px\",\n }}\n >\n <TransformationType legend transformationType={key} /> {label}\n </Box>\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 from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport MuiPopover from \"@mui/material/Popover\";\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 anchorRef = useRef<HTMLDivElement | null>(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 <>\n <Box\n ref={anchorRef}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n sx={{ display: \"contents\" }}\n >\n {children}\n </Box>\n <MuiPopover\n open={hovered}\n anchorEl={anchorRef.current}\n onClose={() => setHovered(false)}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"left\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"left\",\n }}\n disableAutoFocus\n disableEnforceFocus\n sx={{ pointerEvents: \"none\" }}\n slotProps={{\n paper: {\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n sx: {\n bgcolor: \"grey.600\",\n color: \"white\",\n p: 1.5,\n pointerEvents: \"auto\",\n },\n },\n }}\n >\n Connect to a data warehouse to unlock Diff.{\" \"}\n <Link\n href={RECCE_SUPPORT_CALENDAR_URL}\n target=\"_blank\"\n sx={{ color: \"white\", textDecoration: \"underline\" }}\n >\n Learn more\n </Link>\n .\n </MuiPopover>\n </>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Skeleton from \"@mui/material/Skeleton\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\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 { 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\n// Reusable tag styles - theme-aware function\nconst tagRootSx = (theme: { palette: { mode: string } }) => ({\n display: \"inline-flex\",\n alignItems: \"center\",\n borderRadius: 16,\n px: 1,\n py: 0.25,\n fontSize: \"0.75rem\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.700\" : \"grey.100\",\n color: theme.palette.mode === \"dark\" ? \"grey.100\" : \"inherit\",\n});\n\nconst tagStartElementSx = {\n mr: 0.5,\n display: \"flex\",\n alignItems: \"center\",\n};\n\nexport function ResourceTypeTag({ node }: { node: LineageGraphNode }) {\n const { icon: ResourceTypeIcon } = getIconForResourceType(\n node.data.resourceType,\n );\n return (\n <MuiTooltip arrow title=\"Type of resource\">\n <Box component=\"span\" sx={tagRootSx}>\n {ResourceTypeIcon && (\n <Box component=\"span\" sx={tagStartElementSx}>\n <ResourceTypeIcon />\n </Box>\n )}\n {node.data.resourceType}\n </Box>\n </MuiTooltip>\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 <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {baseLabel}\n </Typography>\n <FiArrowRight />\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n </Stack>\n );\n } else if (base === current) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"grey.500\", display: \"flex\" }}>\n <RiSwapLine />\n </Box>\n <Typography variant=\"body2\" component=\"span\" sx={{ color: \"grey.500\" }}>\n No Change\n </Typography>\n </Stack>\n );\n } else if (base < current) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"success.main\", display: \"flex\" }}>\n <RiArrowUpSFill />\n </Box>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{ color: \"success.main\" }}\n >\n {deltaPercentageString(base, current)}\n </Typography>\n </Stack>\n );\n } else {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n {currentLabel}\n </Typography>\n <Box component=\"span\" sx={{ color: \"error.main\", display: \"flex\" }}>\n <RiArrowDownSFill />\n </Box>\n <Typography\n variant=\"body2\"\n component=\"span\"\n sx={{ color: \"error.main\" }}\n >\n {deltaPercentageString(base, current)}\n </Typography>\n </Stack>\n );\n }\n}\n\nexport function ModelRowCount({ rowCount }: ModelRowCountProps) {\n if (!rowCount) {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography variant=\"body2\" component=\"span\">\n Failed to load\n </Typography>\n <Box component=\"span\" sx={{ color: \"error.main\", display: \"flex\" }}>\n <FiFrown />\n </Box>\n </Stack>\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 <MuiTooltip arrow title={label}>\n <_RowCountByRate rowCount={rowCount} />\n </MuiTooltip>\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 <MuiTooltip title={label}>\n <SetupConnectionPopover display={featureToggles.mode === \"metadata only\"}>\n <Box\n component=\"span\"\n sx={(theme) => ({\n ...tagRootSx(theme),\n gap: 0.5,\n })}\n >\n <RunTypeIcon />\n {rowsToShow != null || isFetching ? (\n isFetching ? (\n <Skeleton width={30} height={16} />\n ) : rowsToShow != null ? (\n <_RowCountByRate rowCount={rowsToShow} />\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )}\n {onRefresh && (\n <IconButton\n aria-label=\"Query Row Count\"\n size=\"small\"\n onClick={onRefresh}\n disabled={featureToggles.disableDatabaseQuery}\n sx={{ p: 0, ml: 0.5 }}\n >\n <PiRepeat size={12} />\n </IconButton>\n )}\n </Box>\n </SetupConnectionPopover>\n </MuiTooltip>\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 <Box component=\"span\" sx={tagRootSx}>\n <Box component=\"span\" sx={tagStartElementSx}>\n <RunTypeIcon />\n </Box>\n {rowCount || isFetching ? (\n isFetching ? (\n <Skeleton width={30} height={16} />\n ) : (\n <Typography variant=\"caption\">{label}</Typography>\n )\n ) : (\n <Typography variant=\"caption\">row count</Typography>\n )}\n {onRefresh && (\n <IconButton\n aria-label=\"Query Row Count\"\n size=\"small\"\n onClick={onRefresh}\n disabled={node.data.from === \"base\"}\n sx={{ p: 0, ml: 0.5 }}\n >\n <PiRepeat size={12} />\n </IconButton>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Chip from \"@mui/material/Chip\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { PiInfo, PiWarning } from \"react-icons/pi\";\nimport { LineageGraphNode } from \"@/components/lineage/lineage\";\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 <CircularProgress size={16} />;\n }\n\n if (status === \"skipped\") {\n return (\n <Chip\n size=\"small\"\n label={\n <Stack\n direction=\"row\"\n sx={{\n fontSize: \"10pt\",\n color: \"grey.500\",\n alignItems: \"center\",\n gap: \"3px\",\n }}\n >\n <Box>Skipped</Box>\n {skipReason && (\n <MuiTooltip title={skipReason}>\n <Box component=\"span\" sx={{ display: \"flex\" }}>\n <PiInfo />\n </Box>\n </MuiTooltip>\n )}\n </Stack>\n }\n sx={{ bgcolor: \"grey.100\" }}\n />\n );\n }\n\n if (!run) {\n return <CircularProgress size={16} />;\n }\n\n const { error, run_id, progress } = run;\n\n if (status === \"running\") {\n if (progress?.percentage === undefined) {\n return <CircularProgress size={16} />;\n } else {\n return (\n <CircularProgress\n variant=\"determinate\"\n value={progress.percentage * 100}\n size={16}\n />\n );\n }\n }\n\n if (error) {\n return (\n <Stack\n direction=\"row\"\n sx={{ fontSize: \"10pt\", color: \"gray\", alignItems: \"center\" }}\n >\n <Box>Error</Box>\n {skipReason && (\n <MuiTooltip title={error}>\n <Box component=\"span\" sx={{ display: \"flex\" }}>\n <PiWarning />\n </Box>\n </MuiTooltip>\n )}\n </Stack>\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 <Chip\n size=\"small\"\n sx={{\n bgcolor: mismatched > 0 ? \"error.light\" : \"success.light\",\n }}\n label={\n <Stack\n direction=\"row\"\n sx={{\n fontSize: \"10pt\",\n color: mismatched > 0 ? \"error.main\" : \"success.main\",\n alignItems: \"center\",\n gap: \"3px\",\n }}\n >\n {mismatched > 0\n ? `${mismatched} columns mismatched`\n : \"All columns match\"}\n </Stack>\n }\n />\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 from \"@mui/material/Box\";\nimport Chip from \"@mui/material/Chip\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { Handle, NodeProps, Position, useStore } from \"@xyflow/react\";\nimport React, { useState } from \"react\";\nimport { FaCheckSquare, FaRegDotCircle, FaRegSquare } from \"react-icons/fa\";\nimport { VscKebabVertical } from \"react-icons/vsc\";\nimport { RowCountDiff } from \"@/lib/api/models\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useThemeColors } from \"@/lib/hooks/useThemeColors\";\nimport { deltaPercentageString } from \"../rowcount/delta\";\nimport { findByRunType } from \"../run/registry\";\nimport { isSchemaChanged } from \"../schema/schemaDiff\";\nimport { ActionTag } from \"./ActionTag\";\nimport { useLineageViewContextSafe } from \"./LineageViewContext\";\nimport { COLUMN_HEIGHT, LineageGraphNode } from \"./lineage\";\nimport { getIconForChangeStatus, getIconForResourceType } from \"./styles\";\n\nimport \"./styles.css\";\nimport { token } from \"@/components/ui/mui-theme\";\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 chipColor: \"default\" | \"success\" | \"error\" = \"default\";\n if (base === null && current === null) {\n tagLabel = \"Failed to load\";\n chipColor = \"default\";\n } else if (base === null || current === null) {\n tagLabel = `${baseLabel} -> ${currentLabel}`;\n chipColor = base === null ? \"success\" : \"error\";\n } else if (base === current) {\n tagLabel = \"=\";\n chipColor = \"default\";\n } else if (base !== current) {\n tagLabel = `${deltaPercentageString(base, current)} Rows`;\n chipColor = base < current ? \"success\" : \"error\";\n }\n\n const RowCountIcon = findByRunType(\"row_count_diff\").icon;\n\n return (\n <Chip\n size=\"small\"\n color={chipColor}\n icon={RowCountIcon ? <RowCountIcon /> : undefined}\n label={tagLabel}\n sx={{ height: 20, fontSize: \"0.7rem\" }}\n />\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 { text, isDark } = useThemeColors();\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 ? text.inverted\n : getIconForChangeStatus(\"modified\").color;\n const colorUnchanged = inverted\n ? text.secondary\n : isDark\n ? \"grey.700\"\n : \"grey.100\";\n\n const SchemaDiffIcon = findByRunType(\"schema_diff\").icon;\n\n return (\n <Box sx={{ display: \"flex\", flex: 1, alignItems: \"center\" }}>\n {schemaChanged !== undefined && (\n <MuiTooltip\n title={`Schema (${schemaChanged ? \"changed\" : \"no change\"})`}\n enterDelay={500}\n >\n <Box sx={{ height: 16 }}>\n {SchemaDiffIcon && (\n <Box\n component={SchemaDiffIcon}\n sx={{ color: schemaChanged ? colorChanged : colorUnchanged }}\n />\n )}\n </Box>\n </MuiTooltip>\n )}\n <Box sx={{ flexGrow: 1 }} />\n {runs?.row_count_diff && rowCountChanged !== undefined && (\n <MuiTooltip\n title={`Row count (${rowCountChanged ? \"changed\" : \"=\"})`}\n enterDelay={500}\n >\n <Box>\n <_RowCountDiffTag\n rowCount={runs.row_count_diff.result as RowCountDiff}\n />\n </Box>\n </MuiTooltip>\n )}\n </Box>\n );\n};\n\nconst GraphNodeCheckbox = ({\n checked,\n onClick,\n}: {\n checked: boolean;\n onClick?: React.MouseEventHandler;\n}) => {\n return (\n <Box\n onClick={onClick}\n sx={{\n alignSelf: \"center\",\n display: \"flex\",\n alignItems: \"center\",\n cursor: \"pointer\",\n }}\n >\n {checked ? (\n <Box component={FaCheckSquare} sx={{ fontSize: 20 }} />\n ) : (\n <Box component={FaRegSquare} sx={{ fontSize: 20 }} />\n )}\n </Box>\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 sx={{\n flex: 1,\n color,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n <MuiTooltip\n title={resourceType === \"model\" ? name : `${name} (${resourceType})`}\n placement=\"top\"\n >\n <span>{name}</span>\n </MuiTooltip>\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 const { background, text, isDark } = useThemeColors();\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, isDark)\n : {\n icon: undefined,\n color: String(token(\"colors.gray.400\")),\n backgroundColor: isDark\n ? String(token(\"colors.gray.700\"))\n : String(token(\"colors.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 : background.paper;\n } else if (selectMode === \"action_result\") {\n if (!action) {\n return background.paper;\n } else {\n return isFocused || isSelected || isHovered\n ? backgroundColorChangeStatus\n : colorChangeStatus;\n }\n } else {\n return isFocused || isSelected || isHovered\n ? backgroundColorChangeStatus\n : background.paper;\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 ? text.inverted : text.primary;\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? text.inverted : text.primary;\n } else {\n return text.primary;\n }\n })();\n const iconResourceColor = (function () {\n if (selectMode === \"selecting\") {\n return isSelected ? text.inverted : text.primary;\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? text.inverted : text.primary;\n } else {\n return text.primary;\n }\n })();\n const iconChangeStatusColor = (function () {\n if (selectMode === \"selecting\") {\n return isSelected ? text.inverted : colorChangeStatus;\n } else if (selectMode === \"action_result\") {\n return !!action && !isSelected ? text.inverted : text.primary;\n } else {\n return colorChangeStatus;\n }\n })();\n\n return (\n <Box\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n width: 300,\n cursor: selectMode === \"selecting\" ? \"pointer\" : \"inherit\",\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 }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n borderColor,\n borderWidth,\n borderStyle: \"solid\",\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: showColumns ? 0 : 8,\n borderBottomRightRadius: showColumns ? 0 : 8,\n backgroundColor: nodeBackgroundColor,\n height: 60,\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n bgcolor: colorChangeStatus,\n padding: interactive ? \"8px\" : \"2px\",\n borderRightWidth: borderWidth,\n borderRightStyle: \"solid\",\n borderColor: selectMode === \"selecting\" ? \"#00000020\" : borderColor,\n alignItems: \"top\",\n visibility: showContent ? \"inherit\" : \"hidden\",\n }}\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 </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flex: \"1 0 auto\",\n mx: 0.5,\n width: 100,\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n width: \"100%\",\n textAlign: \"left\",\n fontWeight: 600,\n flex: 1,\n p: 0.5,\n gap: \"5px\",\n alignItems: \"center\",\n visibility: showContent ? \"inherit\" : \"hidden\",\n }}\n >\n <GraphNodeTitle\n name={name}\n color={titleColor}\n resourceType={resourceType}\n />\n\n {isHovered ? (\n <>\n {changeStatus === \"modified\" && (\n <MuiTooltip\n title=\"Show Impact Radius\"\n placement=\"top\"\n enterDelay={500}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Box\n component={FaRegDotCircle}\n sx={{\n fontSize: 14,\n color: text.secondary,\n cursor: \"pointer\",\n \"&:hover\": { color: text.primary },\n }}\n onClick={(e: React.MouseEvent) => {\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 </Box>\n </MuiTooltip>\n )}\n <Box\n component={VscKebabVertical}\n sx={{\n color: text.secondary,\n cursor: \"pointer\",\n \"&:hover\": { color: text.primary },\n }}\n onClick={(e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n showContextMenu(\n e,\n nodeProps as unknown as LineageGraphNode,\n );\n }}\n />\n </>\n ) : (\n <>\n {ResourceIcon && (\n <Box\n component={ResourceIcon}\n sx={{ fontSize: 16, color: iconResourceColor }}\n />\n )}\n {changeStatus && IconChangeStatus && (\n <Box\n component={IconChangeStatus}\n sx={{ color: iconChangeStatusColor }}\n />\n )}\n </>\n )}\n </Box>\n\n <Box\n sx={{\n display: \"flex\",\n flex: \"1 0 auto\",\n mx: 0.5,\n flexDirection: \"column\",\n paddingBottom: 0.5,\n visibility: showContent ? \"inherit\" : \"hidden\",\n }}\n >\n <Stack direction=\"row\" spacing={1}>\n {action ? (\n <>\n <Box sx={{ flexGrow: 1 }} />\n <ActionTag\n node={data as unknown as LineageGraphNode}\n action={action}\n />\n </>\n ) : isShowingChangeAnalysis ? (\n <Box\n sx={{\n height: 20,\n color: text.secondary,\n fontSize: \"9pt\",\n margin: 0,\n fontWeight: 600,\n }}\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 </Stack>\n </Box>\n </Box>\n </Box>\n {showColumns && (\n <Box\n sx={{\n p: \"10px 10px\",\n borderColor,\n borderWidth,\n borderStyle: \"solid\",\n borderTopWidth: 0,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }}\n >\n <Box\n sx={{\n height: `${columnSet.size * COLUMN_HEIGHT}px`,\n overflow: \"auto\",\n }}\n />\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 </Box>\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 Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\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\n open={open}\n onClose={onClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={{ top: y, left: x }}\n slotProps={{\n paper: {\n sx: { fontSize: \"0.85rem\", width: \"250px\" },\n },\n }}\n >\n {menuItems.length === 0 ? (\n <MenuItem disabled key=\"no action\">\n No action available\n </MenuItem>\n ) : (\n menuItems.map(\n ({ isSeparator, label, isDisabled, action, itemIcon }) => {\n if (isSeparator) {\n return <Divider key={label} />;\n } else {\n const menuItem = (\n <MenuItem\n key={label}\n disabled={isDisabled}\n onClick={() => {\n if (action) {\n action();\n }\n onClose();\n }}\n >\n {itemIcon} {label}\n </MenuItem>\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>\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(\n (node?.data as LineageGraphNode | undefined)?.data.name,\n );\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: <Box component={run.icon} sx={{ display: \"inline-flex\" }} />,\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: (\n <Box component={run.icon} sx={{ display: \"inline-flex\" }} />\n ),\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: (\n <Box component={run.icon} sx={{ display: \"inline-flex\" }} />\n ),\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: (\n <Box\n component={rowCountAndRowCountRun.icon}\n sx={{ display: \"inline-flex\" }}\n />\n ),\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: (\n <Box\n component={profileAndProfileDiffRun.icon}\n sx={{ display: \"inline-flex\" }}\n />\n ),\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: (\n <Box component={valueDiffRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\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: <Box component={run.icon} sx={{ display: \"inline-flex\" }} />,\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: (\n <Box\n component={isHistogramDiffRun.icon}\n sx={{ display: \"inline-flex\" }}\n />\n ),\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: (\n <Box component={isTopKDiffRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\n action: handleTopkDiff,\n isDisabled: addedOrRemoved || isQueryDisabled,\n });\n\n const isValueDiffRun = findByRunType(\"value_diff\");\n menuItems.push({\n label: isValueDiffRun.title,\n itemIcon: (\n <Box component={isValueDiffRun.icon} sx={{ display: \"inline-flex\" }} />\n ),\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, setOpen] = useState(false);\n const onOpen = () => setOpen(true);\n const onClose = () => setOpen(false);\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","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport React, { useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\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: \"iochmara.light\",\n success: \"success.light\",\n warning: \"warning.light\",\n error: \"error.light\",\n }[type];\n\n return (\n <Box\n sx={{\n width: \"100%\",\n display: \"flex\",\n flexDirection: \"row\",\n p: \"5px 10px\",\n gap: \"5px\",\n alignItems: \"flex-start\",\n borderRadius: 1,\n boxShadow: 4,\n border: \"1px solid\",\n borderColor: \"neutral.light\",\n bgcolor: bgColor,\n }}\n >\n {notification}\n <Box sx={{ flex: 1 }} />\n <IconButton\n size=\"small\"\n onClick={() => {\n sessionStorage.setItem(notificationKey, \"true\");\n setVisible(false);\n }}\n >\n <IoClose />\n </IconButton>\n </Box>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\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 sx={{ fontSize: \"8pt\" }}>History</Box>\n\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<VscHistory />}\n onClick={() => {\n trackHistoryAction({ name: isHistoryOpen ? \"hide\" : \"show\" });\n showHistory();\n }}\n >\n Show\n </Button>\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport Divider from \"@mui/material/Divider\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n type CSSProperties,\n type MouseEvent,\n useEffect,\n useRef,\n useState,\n} 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 { 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 codeBlockSx = (theme: { palette: { mode: string } }) => ({\n fontSize: \"8pt\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.700\" : \"grey.100\",\n px: 0.5,\n borderRadius: 1,\n});\n\nconst SelectFilterTooltip = () => {\n return (\n <Stack alignItems=\"flex-start\" spacing={0}>\n <Typography fontSize=\"10pt\" color=\"text.secondary\" pb={1}>\n Select nodes by dbt node selector syntax\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model_name\n </Box>{\" \"}\n Select a node\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model_name+\n </Box>{\" \"}\n Select downstream nodes\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n +model_name\n </Box>{\" \"}\n Select upstream nodes\n </Typography>\n <Typography fontSize=\"8pt\">\n <Box component=\"code\" sx={codeBlockSx}>\n model*\n </Box>{\" \"}\n Select by wildcard\n </Typography>\n </Stack>\n );\n};\n\nconst ViewModeSelectMenu = ({ isDisabled }: { isDisabled: boolean }) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\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 handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const handleSelect = (newViewMode: LineageDiffViewOptions[\"view_mode\"]) => {\n onViewOptionsChanged({\n ...viewOptions,\n view_mode: newViewMode,\n });\n handleClose();\n };\n\n const ModelIcon = getIconForResourceType(\"model\").icon;\n\n return (\n <>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n onClick={handleClick}\n disabled={isDisabled}\n startIcon={ModelIcon && <ModelIcon />}\n endIcon={<PiCaretDown />}\n sx={{ minWidth: 100, textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n {label}\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>\n <ListSubheader sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}>\n mode\n </ListSubheader>\n <RadioGroup value={viewMode}>\n <MenuItem onClick={() => handleSelect(\"changed_models\")}>\n <FormControlLabel\n value=\"changed_models\"\n control={<Radio size=\"small\" sx={{ py: 0 }} />}\n label=\"Changed Models\"\n sx={{ m: 0 }}\n />\n </MenuItem>\n <MenuItem onClick={() => handleSelect(\"all\")}>\n <FormControlLabel\n value=\"all\"\n control={<Radio size=\"small\" sx={{ py: 0 }} />}\n label=\"All\"\n sx={{ m: 0 }}\n />\n </MenuItem>\n </RadioGroup>\n </Menu>\n </>\n );\n};\n\nconst PackageSelectMenu = ({ isDisabled }: { isDisabled: boolean }) => {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\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 handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\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 <>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n onClick={handleClick}\n disabled={isDisabled}\n startIcon={<FiPackage />}\n endIcon={<PiCaretDown />}\n sx={{ minWidth: 100, textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n {label}\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>\n <ListSubheader sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}>\n Select Packages\n </ListSubheader>\n <MenuItem onClick={handleSelectAll}>\n <Checkbox\n checked={isSelectAll}\n indeterminate={!isSelectAll && !isSelectNone}\n size=\"small\"\n sx={{ py: 0 }}\n />\n <ListItemText>Select All</ListItemText>\n </MenuItem>\n\n <Divider />\n\n {Array.from(available).map((pkg) => (\n <MenuItem key={pkg} onClick={() => handleSelect(pkg)}>\n <Checkbox checked={selected.has(pkg)} size=\"small\" sx={{ py: 0 }} />\n <ListItemText className=\"no-track-pii-safe\">{pkg}</ListItemText>\n </MenuItem>\n ))}\n </Menu>\n </>\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 <MuiTooltip\n title={flags?.single_env_onboarding ? props.tooltipComponent : \"\"}\n placement=\"bottom-start\"\n slotProps={{\n tooltip: {\n sx: {\n width: \"18.75rem\",\n p: 2,\n boxShadow: 3,\n border: 1,\n borderRadius: 1,\n color: \"text.primary\",\n bgcolor: \"background.paper\",\n },\n },\n }}\n >\n <TextField\n inputRef={inputRef}\n size=\"small\"\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 sx={{\n \"& .MuiInputBase-root\": {\n width: \"18.75rem\",\n height: 24,\n fontSize: \"0.75rem\",\n },\n \"& .MuiInputBase-input\": {\n py: 0.5,\n px: 1,\n },\n }}\n />\n </MuiTooltip>\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} sx={{ maxWidth: 300 }}>\n <Typography fontSize=\"8pt\">\n {(props.label ?? \"\").trim() || <> </>}\n </Typography>\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 [actionsAnchorEl, setActionsAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n const actionsOpen = Boolean(actionsAnchorEl);\n\n const isSingleSelect = !!focusedNode;\n const isMultiSelect = selectedNodes.length > 0;\n const isNoSelect = !isSingleSelect && !isMultiSelect;\n const isFilterDisabled = isMultiSelect;\n\n const handleActionsClick = (event: MouseEvent<HTMLButtonElement>) => {\n setActionsAnchorEl(event.currentTarget);\n };\n\n const handleActionsClose = () => {\n setActionsAnchorEl(null);\n };\n\n // Get icons\n const RowCountDiffIcon = findByRunType(\"row_count_diff\").icon;\n const ValueDiffIcon = findByRunType(\"value_diff\").icon;\n const LineageDiffIcon = findByRunType(\"lineage_diff\").icon;\n const SchemaDiffIcon = findByRunType(\"schema_diff\").icon;\n\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n borderBottom={1}\n borderColor=\"neutral.light\"\n sx={{ width: \"100%\", p: \"4pt 8pt\", gap: \"0.5rem\" }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ flex: 1, gap: \"0.5rem\" }}\n >\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={{ flexShrink: 1 }}>\n <SelectFilter isDisabled={isFilterDisabled} />\n </ControlItem>\n <ControlItem label=\"Exclude\" style={{ flexShrink: 1 }}>\n <ExcludeFilter isDisabled={isFilterDisabled} />\n </ControlItem>\n <Box sx={{ flexGrow: 1 }} />\n {isMultiSelect && (\n <>\n <ControlItem label=\"\" style={{ flexShrink: 0 }}>\n <Typography fontSize=\"9pt\" color=\"text.secondary\">\n {selectedNodes.length > 1\n ? `${selectedNodes.length} nodes selected`\n : `${selectedNodes.length} node selected`}\n </Typography>\n </ControlItem>\n\n <ControlItem label=\"\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"xsmall\"\n onClick={() => {\n deselect();\n }}\n sx={{ textTransform: \"none\", fontSize: \"9pt\" }}\n >\n Deselect\n </Button>\n </ControlItem>\n {isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <Box sx={{ display: \"inline-flex\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n onClick={handleActionsClick}\n endIcon={<PiCaretDown />}\n sx={{ textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n Actions\n </Button>\n <Menu\n anchorEl={actionsAnchorEl}\n open={actionsOpen}\n onClose={handleActionsClose}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runRowCount();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <RowCountDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Row Count</ListItemText>\n </MenuItem>\n </Menu>\n </Box>\n </ControlItem>\n )}\n </>\n )}\n {!isSingleEnvOnboarding && (\n <ControlItem label=\"Explore\">\n <Box sx={{ display: \"inline-flex\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n disabled={featureToggles.disableViewActionDropdown}\n onClick={handleActionsClick}\n endIcon={<PiCaretDown />}\n sx={{ textTransform: \"none\", fontSize: \"0.75rem\" }}\n >\n Actions\n </Button>\n <Menu\n anchorEl={actionsAnchorEl}\n open={actionsOpen}\n onClose={handleActionsClose}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n >\n <ListSubheader\n sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}\n >\n Diff\n </ListSubheader>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runRowCountDiff();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <RowCountDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Row Count Diff</ListItemText>\n </MenuItem>\n </SetupConnectionPopover>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <MenuItem\n disabled={featureToggles.disableDatabaseQuery}\n onClick={async () => {\n await lineageViewContext.runValueDiff();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <ValueDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Value Diff</ListItemText>\n </MenuItem>\n </SetupConnectionPopover>\n\n <Divider />\n\n <ListSubheader\n sx={{ lineHeight: \"32px\", bgcolor: \"transparent\" }}\n >\n Add to Checklist\n </ListSubheader>\n <MenuItem\n disabled={\n !(isNoSelect || (isMultiSelect && selectedNodes.length > 1))\n }\n onClick={() => {\n lineageViewContext.addLineageDiffCheck(\n lineageViewContext.viewOptions.view_mode,\n );\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <LineageDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Lineage Diff</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n lineageViewContext.addSchemaDiffCheck();\n handleActionsClose();\n }}\n >\n <ListItemIcon>\n <SchemaDiffIcon fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText>Schema Diff</ListItemText>\n </MenuItem>\n </Menu>\n </Box>\n </ControlItem>\n )}\n </Stack>\n </Stack>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiLink from \"@mui/material/Link\";\nimport { PropsWithChildren } from \"react\";\nimport { FiInfo } from \"react-icons/fi\";\nimport { IoClose } from \"react-icons/io5\";\nimport { LuExternalLink } from \"react-icons/lu\";\n\nexport const RecceNotification = (\n props: PropsWithChildren<{\n onClose: () => void;\n align?: string;\n }>,\n) => {\n return (\n <Box\n sx={{\n display: \"flex\",\n flex: 1,\n minHeight: \"48px\",\n m: \"4px\",\n px: \"16px\",\n py: \"12px\",\n bgcolor: \"primary.50\",\n border: \"1px solid\",\n borderRadius: \"4px\",\n borderColor: \"primary.400\",\n alignItems: props.align ?? \"center\",\n gap: \"12px\",\n }}\n >\n <Box\n component={FiInfo}\n sx={{ width: \"20px\", height: \"20px\", color: \"primary.900\" }}\n />\n {props.children}\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={props.onClose}>\n <IoClose />\n </IconButton>\n </Box>\n );\n};\n\nexport const LearnHowLink = () => {\n return (\n <MuiLink\n href=\"https://docs.datarecce.io/get-started/#prepare-dbt-artifacts\"\n target=\"_blank\"\n sx={{\n color: \"primary.main\",\n fontWeight: \"bold\",\n textDecoration: \"underline\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.5,\n }}\n >\n Learn how <LuExternalLink />\n </MuiLink>\n );\n};\n","import MuiAlert from \"@mui/material/Alert\";\nimport Box from \"@mui/material/Box\";\nimport type {\n CellClickedEvent,\n GridApi,\n GridReadyEvent,\n RowClassParams,\n} from \"ag-grid-community\";\nimport {\n forwardRef,\n Ref,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\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 type DataGridHandle,\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 [gridApi, setGridApi] = useState<GridApi<SchemaRow> | null>(null);\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 getRowId = useCallback(\n (params: { data: SchemaRow }) => {\n const modelId = current?.id;\n return `${modelId}-${params.data.name}`;\n },\n [current?.id],\n );\n\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRowId = cll ? `${cll.node_id}-${cll.column}` : null;\n\n // Update row selection when cll changes\n useEffect(() => {\n if (!gridApi) return;\n gridApi.deselectAll();\n if (selectedRowId) {\n const rowNode = gridApi.getRowNode(selectedRowId);\n if (rowNode) {\n rowNode.setSelected(true);\n }\n }\n }, [gridApi, selectedRowId]);\n\n const handleGridReady = useCallback((event: GridReadyEvent<SchemaRow>) => {\n setGridApi(event.api);\n }, []);\n\n const getRowClass = (_params: RowClassParams<SchemaRow>) => {\n if (lineageViewContext !== undefined) {\n return \"row-normal row-selectable\";\n }\n return \"row-normal\";\n };\n\n const handleCellClicked = async (event: CellClickedEvent<SchemaRow>) => {\n // Skip if clicking on the menu button\n const target = event.event?.target as HTMLElement | undefined;\n if (target?.closest(\".row-context-menu\")) {\n return;\n }\n const row = event.data;\n if (row) {\n await handleViewCll(row.name);\n }\n };\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {catalogMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {catalogMissingMessage}\n </MuiAlert>\n ) : schemaMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {schemaMissingMessage}\n </MuiAlert>\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 ref={ref}\n getRowId={getRowId}\n getRowClass={getRowClass}\n onCellClicked={handleCellClicked}\n onGridReady={handleGridReady}\n rowSelection={{ mode: \"singleRow\" }}\n />\n )}\n </Box>\n );\n}\n\nexport function PrivateSchemaView(\n { base, current, showMenu = true }: SchemaViewProps,\n ref: Ref<DataGridHandle>,\n) {\n const lineageViewContext = useLineageViewContext();\n const [gridApi, setGridApi] = useState<GridApi<SchemaDiffRow> | null>(null);\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 (noSchemaCurrent) {\n schemaMissingMessage =\n \"catalog.json is outdated on current environment. 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 }\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 getRowId = useCallback(\n (params: { data: SchemaDiffRow }) => {\n const modelId = current?.id ?? base?.id;\n return `${modelId}-${params.data.name}`;\n },\n [current?.id, base?.id],\n );\n\n const cll = lineageViewContext?.viewOptions.column_level_lineage;\n const selectedRowId = cll ? `${cll.node_id}-${cll.column}` : null;\n\n // Update row selection when cll changes\n useEffect(() => {\n if (!gridApi) return;\n gridApi.deselectAll();\n if (selectedRowId) {\n const rowNode = gridApi.getRowNode(selectedRowId);\n if (rowNode) {\n rowNode.setSelected(true);\n }\n }\n }, [gridApi, selectedRowId]);\n\n const handleGridReady = useCallback(\n (event: GridReadyEvent<SchemaDiffRow>) => {\n setGridApi(event.api);\n },\n [],\n );\n\n const getRowClass = (params: RowClassParams<SchemaDiffRow>) => {\n const row = params.data;\n if (!row) return \"row-normal\";\n\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 const handleCellClicked = async (event: CellClickedEvent<SchemaDiffRow>) => {\n // Skip if clicking on the menu button\n const target = event.event?.target as HTMLElement | undefined;\n if (target?.closest(\".row-context-menu\")) {\n return;\n }\n const row = event.data;\n if (!row) return;\n // Removed columns aren't clickable\n if (row.baseIndex !== undefined && row.currentIndex === undefined) {\n return;\n }\n await handleViewCll(row.name);\n };\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {catalogMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {catalogMissingMessage}\n </MuiAlert>\n ) : schemaMissingMessage ? (\n <MuiAlert severity=\"warning\" sx={{ fontSize: \"12px\", p: 1 }}>\n {schemaMissingMessage}\n </MuiAlert>\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 getRowId={getRowId}\n getRowClass={getRowClass}\n onCellClicked={handleCellClicked}\n onGridReady={handleGridReady}\n rowSelection={{ mode: \"singleRow\" }}\n />\n )}\n </Box>\n );\n}\n\nexport const SchemaView = forwardRef(PrivateSchemaView);\nexport const SingleEnvSchemaView = forwardRef(PrivateSingleEnvSchemaView);\n","\"use client\";\n\nimport { PostgreSQL, sql } from \"@codemirror/lang-sql\";\nimport { yaml } from \"@codemirror/lang-yaml\";\nimport { Prec } from \"@codemirror/state\";\nimport { EditorView, keymap } from \"@codemirror/view\";\nimport { githubDark, githubLight } from \"@uiw/codemirror-theme-github\";\nimport CodeMirror from \"@uiw/react-codemirror\";\nimport { useMemo } from \"react\";\n\nexport type CodeEditorLanguage = \"sql\" | \"yaml\";\nexport type CodeEditorTheme = \"light\" | \"dark\";\n\nexport interface CodeEditorProps {\n value: string;\n onChange?: (value: string) => void;\n language?: CodeEditorLanguage;\n readOnly?: boolean;\n lineNumbers?: boolean;\n wordWrap?: boolean;\n fontSize?: number;\n height?: string;\n className?: string;\n /** Theme: \"light\" for githubLight, \"dark\" for githubDark */\n theme?: CodeEditorTheme;\n /** Custom keyboard shortcuts: { key: handler } */\n keyBindings?: Array<{ key: string; run: () => boolean }>;\n}\n\nconst getLanguageExtension = (language: CodeEditorLanguage) => {\n switch (language) {\n case \"sql\":\n return sql({ dialect: PostgreSQL });\n case \"yaml\":\n return yaml();\n default:\n return sql({ dialect: PostgreSQL });\n }\n};\n\nexport function CodeEditor({\n value,\n onChange,\n language = \"sql\",\n readOnly = false,\n lineNumbers = true,\n wordWrap = true,\n fontSize = 14,\n height = \"100%\",\n className = \"\",\n theme = \"light\",\n keyBindings = [],\n}: CodeEditorProps) {\n const extensions = useMemo(() => {\n const exts = [\n getLanguageExtension(language),\n EditorView.theme({\n \"&\": { fontSize: `${fontSize}px` },\n \".cm-content\": { fontFamily: \"monospace\" },\n \".cm-gutters\": { fontFamily: \"monospace\" },\n }),\n ];\n\n if (wordWrap) {\n exts.push(EditorView.lineWrapping);\n }\n\n // Use Prec.highest to ensure custom keybindings take precedence\n // over defaultKeymap bindings (e.g., Mod-Enter -> insertBlankLine)\n if (keyBindings.length > 0) {\n exts.push(Prec.highest(keymap.of(keyBindings)));\n }\n\n return exts;\n }, [language, fontSize, wordWrap, keyBindings]);\n\n const themeExtension = useMemo(() => {\n return theme === \"dark\" ? githubDark : githubLight;\n }, [theme]);\n\n const handleChange = (val: string) => {\n if (onChange) {\n onChange(val);\n }\n };\n\n return (\n <CodeMirror\n value={value}\n onChange={handleChange}\n extensions={extensions}\n readOnly={readOnly}\n basicSetup={{\n lineNumbers,\n foldGutter: true,\n highlightActiveLineGutter: !readOnly,\n highlightActiveLine: !readOnly,\n tabSize: 2,\n }}\n height={height}\n className={`${className} no-track-pii-safe`}\n theme={themeExtension}\n />\n );\n}\n\nexport default CodeEditor;\n","\"use client\";\n\nimport { PostgreSQL, sql } from \"@codemirror/lang-sql\";\nimport { yaml } from \"@codemirror/lang-yaml\";\nimport { MergeView, unifiedMergeView } from \"@codemirror/merge\";\nimport { EditorState, Extension, Text } from \"@codemirror/state\";\nimport {\n EditorView,\n lineNumbers as lineNumbersExtension,\n} from \"@codemirror/view\";\nimport { githubDark, githubLight } from \"@uiw/codemirror-theme-github\";\nimport { useEffect, useMemo, useRef } from \"react\";\n\nexport type DiffEditorLanguage = \"sql\" | \"yaml\";\nexport type DiffEditorTheme = \"light\" | \"dark\";\n\nexport interface DiffEditorProps {\n original: string;\n modified: string;\n language?: DiffEditorLanguage;\n readOnly?: boolean;\n lineNumbers?: boolean;\n sideBySide?: boolean;\n height?: string;\n className?: string;\n /** Theme: \"light\" for githubLight, \"dark\" for githubDark */\n theme?: DiffEditorTheme;\n /** Called when modified content changes (only if not readOnly) */\n onModifiedChange?: (value: string) => void;\n}\n\nconst getLanguageExtension = (language: DiffEditorLanguage) => {\n switch (language) {\n case \"sql\":\n return sql({ dialect: PostgreSQL });\n case \"yaml\":\n return yaml();\n default:\n return sql({ dialect: PostgreSQL });\n }\n};\n\nconst getThemeExtension = (theme: DiffEditorTheme): Extension => {\n return theme === \"dark\" ? githubDark : githubLight;\n};\n\nexport function DiffEditor({\n original,\n modified,\n language = \"sql\",\n readOnly = true,\n lineNumbers = true,\n sideBySide = true,\n height = \"100%\",\n className = \"\",\n theme = \"light\",\n onModifiedChange,\n}: DiffEditorProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewRef = useRef<MergeView | EditorView | null>(null);\n\n const extensions = useMemo(() => {\n const exts = [getLanguageExtension(language), getThemeExtension(theme)];\n\n if (lineNumbers) {\n exts.push(lineNumbersExtension());\n }\n\n return exts;\n }, [language, theme, lineNumbers]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n // Clean up previous instance\n if (viewRef.current) {\n viewRef.current.destroy();\n }\n\n if (sideBySide) {\n // Side-by-side mode using MergeView\n const mergeView = new MergeView({\n a: {\n doc: original,\n extensions: [\n ...extensions,\n EditorView.editable.of(false),\n EditorState.readOnly.of(true),\n ],\n },\n b: {\n doc: modified,\n extensions: [\n ...extensions,\n EditorView.editable.of(!readOnly),\n EditorState.readOnly.of(readOnly),\n EditorView.updateListener.of((update) => {\n if (update.docChanged && onModifiedChange) {\n onModifiedChange(update.state.doc.toString());\n }\n }),\n ],\n },\n parent: containerRef.current,\n revertControls: !readOnly ? \"a-to-b\" : undefined,\n highlightChanges: true,\n gutter: lineNumbers,\n });\n\n viewRef.current = mergeView;\n } else {\n // Unified/inline mode using unifiedMergeView\n const editorView = new EditorView({\n doc: modified,\n extensions: [\n ...extensions,\n unifiedMergeView({\n original: Text.of(original.split(\"\\n\")),\n allowInlineDiffs: true,\n highlightChanges: true,\n gutter: lineNumbers,\n mergeControls: false,\n }),\n EditorView.editable.of(!readOnly),\n EditorState.readOnly.of(readOnly),\n EditorView.updateListener.of((update) => {\n if (update.docChanged && onModifiedChange) {\n onModifiedChange(update.state.doc.toString());\n }\n }),\n ],\n parent: containerRef.current,\n });\n\n viewRef.current = editorView;\n }\n\n return () => {\n if (viewRef.current) {\n viewRef.current.destroy();\n }\n };\n }, [\n original,\n modified,\n extensions,\n readOnly,\n lineNumbers,\n sideBySide,\n onModifiedChange,\n ]);\n\n return (\n <div\n ref={containerRef}\n className={`${className} no-track-pii-safe`}\n style={{ height, overflow: \"auto\" }}\n />\n );\n}\n\nexport default DiffEditor;\n","import Box from \"@mui/material/Box\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport { useTheme } from \"@mui/material/styles\";\nimport React, { useState } from \"react\";\nimport { FaExpandArrowsAlt } from \"react-icons/fa\";\nimport { IoClose } from \"react-icons/io5\";\nimport { CodeEditor, DiffEditor } from \"@/components/editor\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\nimport { LineageGraphNode } from \"./lineage\";\n\ninterface NodeSqlViewProps {\n node: LineageGraphNode;\n}\n\nexport const NodeSqlView = ({ node }: NodeSqlViewProps) => {\n const [isOpen, setIsOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const { data: flags, isLoading } = useRecceServerFlag();\n const muiTheme = useTheme();\n const isDark = muiTheme.palette.mode === \"dark\";\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 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 sx={{ position: \"relative\", height: \"100%\" }}\n onMouseEnter={() => {\n setIsHovered(true);\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n }}\n >\n {isSingleEnvOnboarding ? (\n <CodeEditor\n language=\"sql\"\n value={original ?? \"\"}\n readOnly={true}\n lineNumbers={true}\n wordWrap={false}\n theme={isDark ? \"dark\" : \"light\"}\n />\n ) : (\n <DiffEditor\n original={original ?? \"\"}\n modified={modified ?? \"\"}\n language=\"sql\"\n readOnly={true}\n lineNumbers={true}\n sideBySide={false} // Inline diff mode\n theme={isDark ? \"dark\" : \"light\"}\n height=\"100%\"\n />\n )}\n <IconButton\n onClick={() => setIsOpen(true)}\n size=\"medium\"\n aria-label=\"Expand\"\n sx={{\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 <MuiDialog\n open={isOpen}\n onClose={() => setIsOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n slotProps={{\n paper: { sx: { height: \"75%\", overflowY: \"auto\" } },\n }}\n >\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n {isSingleEnvOnboarding ? (\n <>\n <code>{modelName}</code> Model Code\n </>\n ) : (\n <>\n <code>{modelName}</code> Model Code Diff\n </>\n )}\n <Box sx={{ flex: 1 }} />\n <IconButton size=\"small\" onClick={() => setIsOpen(false)}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n {isSingleEnvOnboarding ? (\n <CodeEditor\n language=\"sql\"\n value={original ?? \"\"}\n fontSize={16}\n readOnly={true}\n lineNumbers={true}\n wordWrap={false}\n theme={isDark ? \"dark\" : \"light\"}\n />\n ) : (\n <DiffEditor\n original={original ?? \"\"}\n modified={modified ?? \"\"}\n language=\"sql\"\n theme={isDark ? \"dark\" : \"light\"}\n className=\"text-base\"\n />\n )}\n </DialogContent>\n </MuiDialog>\n </Box>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport { 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 <Box\n sx={{\n display: \"flex\",\n gap: 4,\n justifyContent: \"center\",\n alignContent: \"center\",\n alignItems: \"center\",\n }}\n >\n {description}\n <IconButton\n aria-label=\"thumbs up\"\n onClick={onLike}\n sx={{ width: \"32px\", height: \"32px\" }}\n >\n <Box component=\"img\" src=\"/imgs/feedback/thumbs-up.png\" alt=\"like\" />\n </IconButton>\n <IconButton\n aria-label=\"thumbs down\"\n onClick={onDislike}\n sx={{ width: \"32px\", height: \"32px\" }}\n >\n <Box\n component=\"img\"\n src=\"/imgs/feedback/thumbs-down.png\"\n alt=\"dislike\"\n />\n </IconButton>\n {externalLink && externalLinkText && (\n <Link\n href={externalLink}\n target=\"_blank\"\n onClick={onClickLink}\n sx={{ textDecoration: \"underline\" }}\n >\n {externalLinkText} <LuExternalLink />\n </Link>\n )}\n </Box>\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 <Stack direction=\"row\">\n <ReactionFeedback\n description={description}\n onLike={() => {\n onFeedbackSubmit(\"like\");\n toaster.dismiss(feedbackId);\n localStorage.setItem(feedbackId, \"true\");\n }}\n onDislike={() => {\n onFeedbackSubmit(\"dislike\");\n toaster.dismiss(feedbackId);\n localStorage.setItem(feedbackId, \"true\");\n }}\n externalLink={externalLink}\n externalLinkText={externalLinkText}\n onClickLink={() => {\n onFeedbackSubmit(\"link\");\n }}\n />\n </Stack>\n ),\n }),\n );\n }\n\n return {\n feedbackToast: feedBackCollectionToast,\n closeToast: () => {\n if (toastId) 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 if (toastId) toaster.dismiss(toastId);\n },\n };\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Table from \"@mui/material/Table\";\nimport TableBody from \"@mui/material/TableBody\";\nimport TableCell from \"@mui/material/TableCell\";\nimport TableContainer from \"@mui/material/TableContainer\";\nimport TableHead from \"@mui/material/TableHead\";\nimport TableRow from \"@mui/material/TableRow\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { format, formatDistance, parseISO } from \"date-fns\";\nimport { isEmpty } from \"lodash\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { LineageGraph } from \"@/components/lineage/lineage\";\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 <Box key={\"no info\"} sx={{ ml: \"10px\" }}>\n No information\n </Box>,\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 <li key={key} style={{ marginLeft: \"10px\" }}>\n {key}: {value}\n </li>\n ));\n}\n\nexport function EnvInfo() {\n const { envInfo, reviewMode, lineageGraph } = useLineageGraphContext();\n const [open, setOpen] = useState(false);\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 const handleOpen = () => setOpen(true);\n const handleClose = () => setOpen(false);\n\n return (\n <>\n <MuiTooltip title=\"Environment Info\" placement=\"bottom-end\">\n <div\n className=\"flex items-center hover:cursor-pointer hover:text-black\"\n onClick={handleOpen}\n >\n <div className=\"hidden text-sm lg:flex lg:flex-col\">\n <div className=\"flex gap-1\">\n <Typography\n component=\"span\"\n sx={{ color: \"warning.main\" }}\n className=\"no-track-pii-safe max-w-32 truncate\"\n >\n {Array.from(baseSchemas).join(\", \")}\n </Typography>{\" \"}\n ({baseRelativeTime})\n </div>\n <div className=\"flex gap-1\">\n <Typography\n component=\"span\"\n sx={{ color: \"primary.main\" }}\n className=\"no-track-pii-safe max-w-32 truncate\"\n >\n {Array.from(currentSchemas).join(\", \")}\n </Typography>{\" \"}\n ({currentRelativeTime})\n </div>\n </div>\n <IconButton size=\"small\" aria-label=\"Environment Info\">\n <Box\n component={IconInfo}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </div>\n </MuiTooltip>\n <MuiDialog open={open} onClose={handleClose} maxWidth=\"sm\" fullWidth>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Environment Information\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <Stack direction=\"column\" spacing={1}>\n {reviewMode ? (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n Review Information\n </Typography>\n <ul style={{ margin: 0, paddingLeft: \"20px\" }}>\n {reviewInfo.url && (\n <li style={{ marginLeft: \"10px\" }}>\n url:{\" \"}\n <Link\n href={reviewInfo.url}\n target=\"_blank\"\n sx={{ color: \"primary.main\" }}\n >\n {reviewInfo.url} <LuExternalLink />\n </Link>\n </li>\n )}\n {!isEmpty(reviewInfo) && renderInfoEntries(reviewInfo)}\n </ul>\n </Stack>\n ) : (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n Dev Information\n </Typography>\n <ul style={{ margin: 0, paddingLeft: \"20px\" }}>\n {git && renderInfoEntries(git)}\n </ul>\n </Stack>\n )}\n <Divider />\n {envInfo?.adapterType === \"dbt\" && (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n DBT\n </Typography>\n <TableContainer\n sx={{ border: 1, borderColor: \"divider\", maxHeight: \"30rem\" }}\n >\n <Table size=\"small\" stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell>base</TableCell>\n <TableCell>current</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>schema</TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {Array.from(baseSchemas).map((item) => (\n <MuiTooltip\n key={item}\n title={item}\n placement=\"bottom\"\n >\n <div className=\"max-w-72 truncate\">{item}</div>\n </MuiTooltip>\n ))}\n </TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {Array.from(currentSchemas).map((item) => (\n <MuiTooltip\n key={item}\n title={item}\n placement=\"bottom\"\n >\n <div className=\"max-w-72 truncate\">{item}</div>\n </MuiTooltip>\n ))}\n </TableCell>\n </TableRow>\n <TableRow>\n <TableCell>version</TableCell>\n <TableCell>{dbtBase?.dbt_version}</TableCell>\n <TableCell>{dbtCurrent?.dbt_version}</TableCell>\n </TableRow>\n <TableRow>\n <TableCell>timestamp</TableCell>\n <TableCell>{baseTime}</TableCell>\n <TableCell>{currentTime}</TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </TableContainer>\n </Stack>\n )}\n {envInfo?.adapterType === \"sqlmesh\" && (\n <Stack direction=\"column\" spacing={0.5}>\n <Typography variant=\"h6\" sx={{ fontSize: \"1rem\" }}>\n SQLMesh\n </Typography>\n <TableContainer\n sx={{ border: 1, borderColor: \"divider\", maxHeight: \"30rem\" }}\n >\n <Table stickyHeader>\n <TableHead>\n <TableRow>\n <TableCell />\n <TableCell>base</TableCell>\n <TableCell>current</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n <TableRow>\n <TableCell>Environment</TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.base_env}\n </TableCell>\n <TableCell className=\"no-track-pii-safe\">\n {envInfo.sqlmesh?.current_env}\n </TableCell>\n </TableRow>\n </TableBody>\n </Table>\n </TableContainer>\n </Stack>\n )}\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button color=\"iochmara\" onClick={handleClose}>\n Close\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Chip from \"@mui/material/Chip\";\nimport Divider from \"@mui/material/Divider\";\nimport InputBase from \"@mui/material/InputBase\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport _ from \"lodash\";\nimport React, { type MouseEvent, useRef, useState } from \"react\";\n\nexport interface DropdownValuesInputProps {\n unitName: string;\n suggestionList?: string[];\n defaultValues?: string[];\n onValuesChange: (values: string[]) => void;\n className?: string;\n size?: \"2xs\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\n width?: string | number;\n placeholder?: string;\n disabled?: boolean;\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 [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const open = Boolean(anchorEl);\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 handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n // Focus input after menu opens\n setTimeout(() => inputRef.current?.focus(), 100);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n setIsTyping(false);\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 const handleRemoveValue = (value: string) => {\n setValues(values.filter((v) => v !== value));\n onValuesChange(values.filter((v) => v !== value));\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 // Size mapping for font sizes\n const getFontSize = () => {\n switch (props.size) {\n case \"2xs\":\n return \"0.625rem\";\n case \"xs\":\n return \"0.75rem\";\n case \"sm\":\n return \"0.875rem\";\n default:\n return \"0.875rem\";\n }\n };\n\n const getHeight = () => {\n switch (props.size) {\n case \"2xs\":\n return 24;\n case \"xs\":\n return 28;\n case \"sm\":\n return 32;\n default:\n return 36;\n }\n };\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: props.width,\n }}\n className={className}\n >\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"small\"\n onClick={handleClick}\n disabled={props.disabled}\n sx={{\n width: \"100%\",\n height: getHeight(),\n justifyContent: \"space-between\",\n textTransform: \"none\",\n fontSize: getFontSize(),\n fontWeight: \"normal\",\n px: 1,\n }}\n >\n <Typography\n component=\"span\"\n sx={{\n fontSize: getFontSize(),\n color: values.length > 0 ? \"text.primary\" : \"text.secondary\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {showNumberOfValuesSelected(values) || props.placeholder || \"\"}\n </Typography>\n {values.length > 0 && (\n <Typography\n component=\"span\"\n onClick={(e) => {\n e.stopPropagation();\n handleClear();\n }}\n sx={{\n fontSize: getFontSize(),\n color: \"primary.main\",\n cursor: \"pointer\",\n ml: 1,\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n Clear\n </Typography>\n )}\n </Button>\n\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n slotProps={{\n paper: {\n sx: {\n width: props.width,\n fontSize: getFontSize(),\n },\n },\n }}\n >\n {/* Input Filter & Show Tags */}\n <Box sx={{ px: 0.5, py: 0.5 }}>\n <Box\n sx={{\n border: \"1px solid\",\n borderColor: \"divider\",\n borderRadius: 1,\n p: 0.5,\n display: \"flex\",\n flexWrap: \"wrap\",\n gap: 0.5,\n alignItems: \"center\",\n }}\n className=\"no-track-pii-safe\"\n >\n {values.map((value) => (\n <Chip\n key={value}\n label={value}\n size=\"small\"\n onDelete={() => handleRemoveValue(value)}\n sx={{ height: 22, fontSize: getFontSize() }}\n />\n ))}\n <InputBase\n inputRef={inputRef}\n placeholder=\"Filter or add custom keys\"\n value={filter}\n onChange={(e) => {\n setFilter(e.target.value);\n setIsTyping(true);\n }}\n onKeyDown={(e) => {\n // Stop propagation to prevent MUI Menu's typeahead navigation\n // from intercepting key presses (except Escape to close menu)\n if (e.key !== \"Escape\") {\n e.stopPropagation();\n }\n\n const target = e.target as HTMLInputElement;\n const newText = target.value.trim().replace(\",\", \"\");\n switch (e.key) {\n case \",\":\n case \"Enter\":\n e.preventDefault();\n if (newText) {\n handleSelect(newText);\n setFilter(\"\");\n }\n break;\n case \"Backspace\":\n if (target.value === \"\" && values.length > 0) {\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 sx={{\n flex: 1,\n minWidth: 120,\n fontSize: getFontSize(),\n \"& input\": {\n p: 0.5,\n },\n }}\n />\n </Box>\n </Box>\n\n <Divider />\n\n {/* Suggestion List */}\n {filter !== \"\" && !suggestionList?.includes(filter) && (\n <MenuItem\n onClick={() => {\n handleSelect(filter);\n setIsTyping(false);\n }}\n sx={{ fontSize: getFontSize() }}\n >\n Add '{filter}' to the list\n </MenuItem>\n )}\n {filteredList.slice(0, limit).map((value, cid) => (\n <MenuItem\n key={_.uniqueId(`option-${cid}`)}\n onClick={() => {\n handleSelect(value);\n }}\n sx={{ fontSize: getFontSize() }}\n >\n {value}\n </MenuItem>\n ))}\n {filteredList.length > limit && (\n <MuiTooltip\n title=\"Please use filter to find more items\"\n placement=\"top\"\n >\n <Box px={1.5} py={0.5} color=\"text.secondary\" fontSize=\"8pt\">\n and {filteredList.length - limit} more items...\n </Box>\n </MuiTooltip>\n )}\n </Menu>\n </Box>\n );\n};\n","import Box, { type BoxProps } from \"@mui/material/Box\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMemo } from \"react\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { NodeColumnData } from \"@/lib/api/info\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { DropdownValuesInput } from \"@/utils/DropdownValuesInput\";\n\ninterface QueryFormProps extends BoxProps {\n defaultPrimaryKeys: string[] | undefined;\n onPrimaryKeysChange: (primaryKeys: string[]) => void;\n}\n\nexport const QueryForm = ({\n defaultPrimaryKeys,\n onPrimaryKeysChange,\n ...props\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 <Box sx={{ display: \"flex\" }} {...props}>\n <Stack spacing={0} sx={{ m: \"0 0.5rem\" }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={0.5}>\n <Typography\n component=\"label\"\n sx={{ fontSize: \"0.625rem\", color: \"text.secondary\" }}\n >\n Diff with Primary Key(s) (suggested)\n </Typography>\n <MuiTooltip title={labelInfo} placement=\"bottom-end\">\n <Box\n component=\"span\"\n sx={{ display: \"flex\", color: \"grey.600\", cursor: \"help\" }}\n >\n <PiInfo fontSize=\"0.75rem\" />\n </Box>\n </MuiTooltip>\n </Stack>\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 </Stack>\n </Box>\n );\n};\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport Cookies from \"js-cookie\";\nimport { Dispatch, ReactNode, SetStateAction, useState } from \"react\";\nimport { LuExternalLink } from \"react-icons/lu\";\nimport { connectToCloud } from \"@/lib/api/connectToCloud\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 { apiClient } = useApiConfig();\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 const handleClose = () => {\n setOpen(false);\n if (handleParentClose) {\n handleParentClose(false);\n }\n };\n\n return (\n <MuiDialog\n open={open}\n onClose={handleClose}\n maxWidth=\"sm\"\n fullWidth\n slotProps={{\n paper: { sx: { borderRadius: \"1rem\" } },\n }}\n >\n {authState !== \"authenticating\" && (\n <DialogTitle sx={{ textAlign: \"center\", fontSize: \"1.5rem\" }}>\n {content.title}\n </DialogTitle>\n )}\n {authState !== \"authenticating\" ? (\n <>\n <DialogContent className=\"space-y-2 font-light\">\n <Typography>\n To enable sharing, get your token from Recce Cloud and launch your\n local instance with it.\n </Typography>\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 sharing.\n </li>\n {variant === \"auth\" && (\n <li>This step is recommended but optional.</li>\n )}\n </ul>\n <Box sx={{ display: \"flex\", gap: 1 }}>\n More directions\n <Link\n underline=\"always\"\n sx={{\n color: \"primary.main\",\n \"&:focus\": { outline: \"none\" },\n }}\n href=\"https://cloud.datarecce.io/connect-to-cloud\"\n target=\"_blank\"\n >\n here <LuExternalLink style={{ display: \"inline\" }} />\n </Link>\n </Box>\n </DialogContent>\n <DialogActions sx={{ flexDirection: \"column\", gap: 1, px: 3, pb: 3 }}>\n <Button\n fullWidth\n color=\"brand\"\n variant=\"contained\"\n sx={{ borderRadius: 2, fontWeight: 500 }}\n onClick={async () => {\n setAuthState(\"authenticating\");\n const { connection_url } = await connectToCloud(apiClient);\n // Open the connection URL in a new tab\n window.open(connection_url, \"_blank\");\n }}\n >\n {content.action} <LuExternalLink style={{ marginLeft: 4 }} />\n </Button>\n <Button\n fullWidth\n color=\"neutral\"\n variant=\"text\"\n size=\"small\"\n sx={{ borderRadius: 2, fontWeight: 500 }}\n onClick={handleClose}\n >\n {variant === \"auth\" ? \"Skip\" : \"Cancel\"}\n </Button>\n {variant === \"auth\" && (\n <Button\n fullWidth\n variant=\"text\"\n size=\"small\"\n sx={{ borderRadius: 2, fontWeight: 500, color: \"text.primary\" }}\n onClick={() => {\n Cookies.set(\"authState\", \"ignored\", {\n expires: 30,\n });\n setAuthState(\"ignored\");\n handleClose();\n }}\n >\n Snooze for 30 days\n </Button>\n )}\n </DialogActions>\n </>\n ) : (\n <>\n <DialogContent className=\"space-y-2 self-center font-light\">\n <Stack spacing={2} alignItems=\"center\" sx={{ pt: \"1rem\" }}>\n <Box\n component=\"img\"\n sx={{ height: \"6rem\", objectFit: \"contain\", mx: \"auto\", mb: 1 }}\n src=\"/imgs/reload-image.svg\"\n alt=\"Reload\"\n />\n <Typography sx={{ fontSize: \"1.5rem\", fontWeight: 500 }}>\n Reload to Finish\n </Typography>\n <Typography>\n Reload to complete connection to Recce Cloud\n </Typography>\n </Stack>\n </DialogContent>\n <DialogActions sx={{ px: 3, pb: 3 }}>\n <Button\n fullWidth\n color=\"brand\"\n variant=\"contained\"\n onClick={() => {\n window.location.reload();\n }}\n >\n Reload\n </Button>\n </DialogActions>\n </>\n )}\n </MuiDialog>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport React, { useMemo } from \"react\";\nimport { FaPlay } from \"react-icons/fa6\";\nimport { extractSchemas, formatTimeToNow } from \"@/components/app/EnvInfo\";\nimport { CodeEditor } from \"@/components/editor\";\nimport { colors } from \"@/components/ui/mui-theme\";\nimport { ManifestMetadata } from \"@/lib/api/info\";\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?: {\n readOnly?: boolean;\n fontSize?: number;\n lineNumbers?: \"on\" | \"off\";\n wordWrap?: \"on\" | \"off\";\n };\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 muiTheme = useTheme();\n const isDark = muiTheme.palette.mode === \"dark\";\n\n const handleEditorChange = (value: string) => {\n if (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 // Convert keyboard shortcuts to CodeMirror format\n const keyBindings = useMemo(() => {\n const bindings = [];\n\n if (onRun) {\n bindings.push({\n key: \"Mod-Enter\", // Ctrl/Cmd + Enter\n run: () => {\n onRun();\n return true;\n },\n });\n }\n\n if (onRunBase) {\n bindings.push({\n key: \"Alt-Enter\",\n run: () => {\n onRunBase();\n return true;\n },\n });\n }\n\n if (onRunDiff) {\n bindings.push({\n key: \"Mod-Shift-Enter\", // Ctrl/Cmd + Shift + Enter\n run: () => {\n onRunDiff();\n return true;\n },\n });\n }\n\n return bindings;\n }, [onRun, onRunBase, onRunDiff]);\n\n // ... header rendering stays the same ...\n\n return (\n <>\n {(label ?? onRun ?? onRunBase) && (\n <Stack\n direction=\"row\"\n sx={{\n bgcolor: isDark\n ? alpha(colors.neutral[700], 0.5)\n : alpha(colors.neutral[100], 0.5),\n height: \"40px\",\n minHeight: \"40px\",\n fontSize: \"14px\",\n alignItems: \"center\",\n m: 0,\n p: \"0px 16px\",\n flex: \"0 0 40px\",\n }}\n >\n <Typography\n component=\"strong\"\n sx={{ fontWeight: \"bold\" }}\n className=\"no-track-pii-safe\"\n >\n {label ? label.toUpperCase() : \"\"}\n </Typography>\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 <Box sx={{ flexGrow: 1 }} />\n {(onRun ?? onRunBase) && (\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n onClick={onRun ?? onRunBase}\n sx={{ bgcolor: \"background.paper\", p: \"6px 12px\" }}\n disabled={featureToggles.disableDatabaseQuery}\n startIcon={<FaPlay />}\n >\n Run Query\n </Button>\n )}\n </Stack>\n )}\n {CustomEditor ?? (\n <CodeEditor\n value={value}\n onChange={handleEditorChange}\n language=\"sql\"\n readOnly={options.readOnly ?? false}\n lineNumbers={options.lineNumbers !== \"off\"}\n wordWrap={options.wordWrap !== \"off\"}\n fontSize={options.fontSize ?? 16}\n keyBindings={keyBindings}\n theme={isDark ? \"dark\" : \"light\"}\n className=\"no-track-pii-safe max-h-dvh h-full\"\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 <Stack direction=\"row\" sx={{ height: \"100%\", gap: 0 }}>\n <Stack\n sx={{\n height: \"100%\",\n width: \"50%\",\n gap: 0,\n borderRight: \"1px solid\",\n borderRightColor: \"divider\",\n }}\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 sx={{ 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 </Stack>\n </>\n );\n}\n\nexport default SqlEditor;\n","import Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Typography from \"@mui/material/Typography\";\nimport { format } from \"date-fns\";\nimport { token } from \"@/components/ui/mui-theme\";\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 <Box\n sx={{\n display: \"flex\",\n justifyContent: \"start\",\n fontSize: \"11pt\",\n color: \"grey.500\",\n gap: \"3px\",\n alignItems: \"center\",\n overflow: \"hidden\",\n }}\n >\n {isRunning && <CircularProgress size={12} color=\"primary\" />}\n <Typography\n component=\"span\"\n sx={{ fontWeight: 500, color: token(`colors.${color}.400`) }}\n >\n {message}\n </Typography>\n <Typography component=\"span\">•</Typography>\n <Typography\n component=\"span\"\n sx={{\n textOverflow: \"ellipsis\",\n overflow: \"hidden\",\n whiteSpace: \"nowrap\",\n }}\n >\n {dateTime}\n </Typography>\n </Box>\n );\n};\n","import MuiAlert from \"@mui/material/Alert\";\nimport { FallbackRender } from \"@sentry/react\";\nimport * as React from \"react\";\n\nconst ResultErrorFallback: FallbackRender = (errorData) => {\n return <MuiAlert severity=\"error\">{String(errorData.error)}</MuiAlert>;\n};\n\nexport default ResultErrorFallback;\n","import MuiAlert from \"@mui/material/Alert\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\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 theme = useTheme();\n const errorMessage =\n (error as ApiError | undefined)?.response?.data?.detail ?? run?.error;\n\n if (errorMessage) {\n return (\n <MuiAlert severity=\"error\">\n Error: <span className=\"no-track-pii-safe\">{errorMessage}</span>\n </MuiAlert>\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 const progressValue =\n progress?.percentage != null ? progress.percentage * 100 : undefined;\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n p: \"1rem\",\n height: \"100%\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.900\" : \"grey.50\",\n }}\n >\n <Stack spacing={2} alignItems=\"center\">\n <Stack direction=\"row\" alignItems=\"center\" spacing={1}>\n {progressValue == null ? (\n <CircularProgress size={32} />\n ) : (\n <Box sx={{ position: \"relative\", display: \"inline-flex\" }}>\n <CircularProgress\n variant=\"determinate\"\n value={progressValue}\n size={32}\n />\n <Box\n sx={{\n top: 0,\n left: 0,\n bottom: 0,\n right: 0,\n position: \"absolute\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Typography\n variant=\"caption\"\n component=\"div\"\n sx={{ fontSize: \"0.6rem\" }}\n >\n {`${Math.round(progressValue)}%`}\n </Typography>\n </Box>\n </Box>\n )}\n\n {isAborting ? (\n <Typography>Aborting...</Typography>\n ) : (\n <Typography className=\"no-track-pii-safe\">\n {loadingMessage}\n </Typography>\n )}\n </Stack>\n {!isAborting && (\n <Button variant=\"contained\" onClick={onCancel} size=\"small\">\n Cancel\n </Button>\n )}\n </Stack>\n </Box>\n );\n }\n\n if (!run) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: theme.palette.mode === \"dark\" ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n <CircularProgress size={32} />\n </Box>\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 sx={{\n height: \"100%\",\n contain: \"layout\",\n overflow: \"auto\",\n }}\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Divider from \"@mui/material/Divider\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Tab from \"@mui/material/Tab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { type MouseEvent, ReactNode, Ref, useCallback, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\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 { CodeEditor } from \"@/components/editor\";\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 muiTheme = useTheme();\n const isDark = muiTheme.palette.mode === \"dark\";\n const yaml = YAML.stringify(data, null, 2);\n return (\n <CodeEditor\n value={yaml}\n language=\"yaml\"\n readOnly={true}\n lineNumbers={false}\n wordWrap={true}\n fontSize={14}\n height=\"100%\"\n theme={isDark ? \"dark\" : \"light\"}\n className=\"no-track-pii-safe\"\n />\n );\n};\n\nconst SingleEnvironmentSetupNotification = ({\n runType,\n}: {\n runType?: string;\n}) => {\n const [open, setOpen] = useState(true);\n\n if (!open) {\n return <></>;\n }\n\n const handleClose = () => setOpen(false);\n switch (runType) {\n case \"row_count\":\n return (\n <RecceNotification onClose={handleClose}>\n <Typography>\n Enable row count diffing, and other Recce features, by configuring a\n base dbt environment to compare against. <LearnHowLink />\n </Typography>\n </RecceNotification>\n );\n case \"profile\":\n return (\n <RecceNotification onClose={handleClose}>\n <Typography>\n Enable data-profile diffing, and other Recce features, by\n configuring a base dbt environment to compare against.{\" \"}\n <LearnHowLink />\n </Typography>\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 const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n return (\n <>\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"neutral\"\n onClick={handleClick}\n endIcon={<PiCaretDown />}\n sx={{ textTransform: \"none\" }}\n >\n Share\n </Button>\n <Menu anchorEl={anchorEl} open={open} onClose={handleClose}>\n <MenuItem\n onClick={async () => {\n await onCopyToClipboard();\n handleClose();\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n disabled={disableCopyToClipboard}\n >\n <ListItemIcon>\n <PiCopy />\n </ListItemIcon>\n <ListItemText>Copy to Clipboard</ListItemText>\n </MenuItem>\n <Divider />\n {authed ? (\n <MenuItem\n onClick={async () => {\n await handleShareClick();\n trackShareState({ name: \"create\" });\n handleClose();\n }}\n >\n <ListItemIcon>\n <TbCloudUpload />\n </ListItemIcon>\n <ListItemText>Share to Cloud</ListItemText>\n </MenuItem>\n ) : (\n <MenuItem\n onClick={() => {\n setShowModal(true);\n handleClose();\n }}\n >\n <ListItemIcon>\n <TbCloudUpload />\n </ListItemIcon>\n <ListItemText>Share</ListItemText>\n </MenuItem>\n )}\n </Menu>\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 <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n {showSingleEnvironmentSetupNotification && (\n <SingleEnvironmentSetupNotification runType={run?.type} />\n )}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n borderBottom: 1,\n borderColor: \"divider\",\n mb: \"1px\",\n }}\n >\n <Tabs\n value={tabValue}\n onChange={(_, newValue) => setTabValue(newValue as TabValueItems)}\n >\n <Tab label=\"Result\" value=\"result\" />\n <Tab label=\"Params\" value=\"params\" />\n {isQuery && <Tab label=\"Query\" value=\"query\" />}\n </Tabs>\n <Box sx={{ flexGrow: 1 }} />\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ overflow: \"hidden\", pr: 1 }}\n alignItems=\"center\"\n >\n {run && <RunStatusAndDate run={run} />}\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n disabled={\n !runId || isRunning || featureToggles.disableDatabaseQuery\n }\n size=\"small\"\n onClick={handleRerun}\n startIcon={<PiRepeat />}\n sx={{ textTransform: \"none\" }}\n >\n Rerun\n </Button>\n {featureToggles.disableShare ? (\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n disabled={\n !runId || !run?.result || !!error || tabValue !== \"result\"\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n size=\"small\"\n onClick={onCopyToClipboard}\n startIcon={<PiCopy />}\n sx={{ textTransform: \"none\" }}\n >\n 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 <IconButton\n size=\"small\"\n onClick={() => {\n if (onClose) {\n onClose();\n }\n }}\n >\n <IoClose />\n </IconButton>\n </Stack>\n </Box>\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 </Box>\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 const { apiClient } = useApiConfig();\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, apiClient);\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(`/checks/?id=${check.check_id}`);\n }, [runId, setLocation, queryClient, viewOptions, apiClient]);\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=\"small\"\n variant=\"contained\"\n onClick={handleGoToCheck}\n startIcon={<PiCheck />}\n sx={{ textTransform: \"none\" }}\n >\n Go to Check\n </Button>\n );\n }\n return (\n <Button\n disabled={!runId || !run?.result || !!error}\n size=\"small\"\n variant=\"contained\"\n onClick={handleAddToChecklist}\n startIcon={<PiCheck />}\n sx={{ textTransform: \"none\" }}\n >\n Add to Checklist\n </Button>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Chip from \"@mui/material/Chip\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport React, { useState } from \"react\";\nimport { AiOutlineExperiment } from \"react-icons/ai\";\nimport { IoClose } from \"react-icons/io5\";\nimport { VscFeedback } from \"react-icons/vsc\";\nimport { DiffEditor } from \"@/components/editor\";\nimport { colors } from \"@/components/ui/mui-theme\";\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 <Stack\n direction=\"row\"\n justifyContent=\"flex-end\"\n alignItems=\"center\"\n sx={{\n p: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderBottomColor: \"divider\",\n flex: \"0 0 54px\",\n }}\n >\n <Box>\n <Typography\n variant=\"h6\"\n component=\"h2\"\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"5px\" }}\n >\n <Box component={AiOutlineExperiment} sx={{ fontSize: \"1.2em\" }} />\n Sandbox\n </Typography>\n <Typography sx={{ fontSize: \"0.75rem\", color: \"grey.500\" }}>\n Compare the run results based on the modified SQL code of model{\" \"}\n <b>{current?.name}</b>\n </Typography>\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={setPrimaryKeys}\n />\n <MuiTooltip title=\"Run diff to see the changes\">\n <Button\n size=\"small\"\n sx={{ mt: \"16px\", fontSize: \"14px\" }}\n onClick={() => {\n onRunResultOpen();\n runQuery();\n }}\n color=\"iochmara\"\n variant=\"contained\"\n disabled={isPending}\n >\n {isPending ? \"Running...\" : \"Run Diff\"}\n </Button>\n </MuiTooltip>\n </Stack>\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 theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\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 <Stack\n direction=\"row\"\n sx={{\n gap: 0,\n height,\n flex,\n fontSize: \"14px\",\n alignItems: \"center\",\n m: 0,\n bgcolor: isDark\n ? alpha(colors.neutral[700], 0.5)\n : alpha(colors.neutral[100], 0.5),\n }}\n >\n <Stack sx={{ width: widthOfBar }}>\n <Typography sx={{ fontWeight: \"bold\", margin }}>\n ORIGINAL (Schema: {schema}, Last Updated: {latestUpdateDistanceToNow})\n </Typography>\n </Stack>\n <Stack sx={{ width: widthOfBar }}>\n <Typography sx={{ fontWeight: \"bold\", margin }}>\n SANDBOX EDITOR\n </Typography>\n </Stack>\n </Stack>\n );\n}\n\ninterface SqlPreviewProps {\n current?: NodeData;\n onChange: (value: string) => void;\n}\n\nfunction SqlPreview({ current, onChange }: SqlPreviewProps) {\n const muiTheme = useTheme();\n const isDark = muiTheme.palette.mode === \"dark\";\n return (\n <DiffEditor\n original={current?.raw_code ?? \"\"}\n modified={current?.raw_code ?? \"\"}\n language=\"sql\"\n readOnly={false}\n lineNumbers={true}\n sideBySide={true}\n theme={isDark ? \"dark\" : \"light\"}\n height=\"100%\"\n onModifiedChange={onChange}\n />\n );\n}\n\nexport function SandboxView({ isOpen, onClose, current }: SandboxViewProps) {\n const [isRunResultOpen, setIsRunResultOpen] = useState(false);\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 const { apiClient } = useApiConfig();\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, apiClient);\n\n showRunId(run_id);\n\n return await waitRun(run_id, undefined, apiClient);\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 const handleClose = () => {\n onClose();\n setIsRunResultOpen(false);\n clearRunResult();\n closeToast();\n closeGuideToast();\n trackPreviewChange({ action: \"close\", node: current?.name });\n };\n\n return (\n <MuiDialog\n open={isOpen}\n onClose={handleClose}\n maxWidth={false}\n fullWidth\n slotProps={{\n paper: {\n sx: {\n width: \"100%\",\n height: \"100%\",\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n m: 0,\n },\n },\n }}\n >\n <Box\n sx={{\n height: \"40px\",\n bgcolor: \"cyan.600\",\n px: 0,\n py: 2,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ height: \"100%\", gap: \"10px\" }}\n >\n <Box\n component=\"img\"\n sx={{ width: \"20px\", height: \"20px\", ml: \"18px\" }}\n src=\"/logo/recce-logo-white.png\"\n alt=\"recce-logo-white\"\n />\n <Typography\n variant=\"h6\"\n component=\"h1\"\n sx={{\n fontFamily: '\"Montserrat\", sans-serif',\n fontSize: \"1.125rem\",\n color: \"common.white\",\n }}\n >\n RECCE\n </Typography>\n <Chip\n label=\"Experiment\"\n size=\"small\"\n variant=\"outlined\"\n sx={{\n fontSize: \"0.875rem\",\n color: \"common.white\",\n borderColor: \"rgba(255,255,255,0.5)\",\n }}\n />\n </Stack>\n <IconButton\n aria-label=\"close\"\n onClick={handleClose}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 4,\n color: \"common.white\",\n }}\n >\n <IoClose />\n </IconButton>\n </Box>\n <DialogContent sx={{ 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 <Stack sx={{ height: \"100%\", m: 0, p: 0 }}>\n <SandboxTopBar\n current={current}\n primaryKeys={primaryKeys ?? []}\n setPrimaryKeys={setPrimaryKeys}\n onRunResultOpen={() => setIsRunResultOpen(true)}\n runQuery={runQuery}\n isPending={isPending}\n />\n <SandboxEditorLabels\n height=\"32px\"\n flex=\"0 0 auto\"\n currentModelID={current?.id ?? \"\"}\n />\n <SqlPreview current={current} onChange={setModifiedCode} />\n </Stack>\n {isRunResultOpen ? (\n <RunResultPane\n onClose={() => setIsRunResultOpen(false)}\n disableAddToChecklist\n />\n ) : (\n <Box></Box>\n )}\n </VSplit>\n </DialogContent>\n {/* Fixed position button */}\n <Box sx={{ position: \"fixed\", bottom: 16, right: 16, opacity: 0.5 }}>\n <MuiTooltip title=\"Give us feedback\">\n <IconButton\n aria-label=\"feedback\"\n size=\"medium\"\n onClick={() => {\n feedbackToast(true);\n }}\n >\n <VscFeedback />\n </IconButton>\n </MuiTooltip>\n </Box>\n </MuiDialog>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Tab from \"@mui/material/Tab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { type ReactElement, useCallback, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport SetupConnectionPopover from \"@/components/app/SetupConnectionPopover\";\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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\ninterface TabPanelProps {\n children?: React.ReactNode;\n index: number;\n value: number;\n}\n\nfunction TabPanel({ children, value, index }: TabPanelProps) {\n return value === index ? <>{children}</> : null;\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 [isSandboxOpen, setIsSandboxOpen] = useState(false);\n const [isNotificationOpen, setIsNotificationOpen] = useState(true);\n const [tabValue, setTabValue] = useState(0);\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\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\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 const isModelSeedOrSnapshot =\n node.data.resourceType === \"model\" ||\n node.data.resourceType === \"seed\" ||\n node.data.resourceType === \"snapshot\";\n\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"grid\",\n gridTemplateRows: \"auto auto auto 1fr\",\n }}\n >\n <Stack direction=\"row\" alignItems=\"center\">\n <Box sx={{ flex: \"0 1 20%\", p: 2 }}>\n <Typography\n variant=\"subtitle1\"\n fontWeight={600}\n className=\"no-track-pii-safe\"\n >\n {node.data.name}\n </Typography>\n </Box>\n <Box sx={{ flexGrow: 1 }} />\n {!isSingleEnvOnboarding && isModelSeedOrSnapshot && (\n <ExploreHeaderButtons\n node={node}\n onSandboxOpen={() => setIsSandboxOpen(true)}\n />\n )}\n <Box sx={{ flex: \"0 1 1%\" }}>\n <IconButton size=\"small\" onClick={onCloseNode}>\n <IoClose />\n </IconButton>\n </Box>\n </Stack>\n\n <Box sx={{ color: \"text.secondary\", pl: 2 }}>\n <Stack direction=\"row\" spacing={1}>\n <ResourceTypeTag node={node} />\n {isModelSeedOrSnapshot &&\n (isSingleEnvOnboarding ? (\n <RowCountTag node={node} onRefresh={refetchRowCount} />\n ) : (\n <RowCountDiffTag node={node} onRefresh={refetchRowCountDiff} />\n ))}\n </Stack>\n </Box>\n\n {isModelSeedOrSnapshot && (\n <Box sx={{ pl: 2, py: 1 }}>\n {isSingleEnvOnboarding ? (\n <SingleEnvActionButtons\n node={node}\n baseColumns={baseColumns}\n currentColumns={currentColumns}\n refetchRowCount={refetchRowCount}\n disableReason={disableReason}\n />\n ) : (\n <DiffActionButtons\n node={node}\n baseColumns={baseColumns}\n currentColumns={currentColumns}\n disableReason={disableReason}\n refetchRowCountDiff={refetchRowCountDiff}\n />\n )}\n </Box>\n )}\n\n {withColumns && (\n <Box\n sx={{ overflow: \"auto\", display: \"flex\", flexDirection: \"column\" }}\n >\n {isSingleEnvOnboarding && isNotificationOpen && (\n <Box sx={{ p: 1.5 }}>\n <RecceNotification\n onClose={() => setIsNotificationOpen(false)}\n align=\"flex-start\"\n >\n <Typography variant=\"body2\">\n Enable the Recce Checklist and start adding checks for better\n data validation and review.\n <br />\n <LearnHowLink />\n </Typography>\n </RecceNotification>\n </Box>\n )}\n <Tabs\n value={tabValue}\n onChange={(_, newValue) => setTabValue(newValue)}\n sx={{ borderBottom: 1, borderColor: \"divider\" }}\n >\n <Tab label=\"Columns\" />\n <Tab label=\"Code\" />\n </Tabs>\n <Box sx={{ overflow: \"auto\", height: \"calc(100% - 48px)\" }}>\n <TabPanel value={tabValue} index={0}>\n <Box sx={{ 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 </Box>\n </TabPanel>\n <TabPanel value={tabValue} index={1}>\n <Box sx={{ height: \"100%\" }}>\n <NodeSqlView node={node} />\n </Box>\n </TabPanel>\n </Box>\n </Box>\n )}\n\n <SandboxView\n isOpen={isSandboxOpen}\n onClose={() => setIsSandboxOpen(false)}\n current={node.data.data.current}\n />\n </Box>\n );\n}\n\ninterface SingleEnvActionButtonsProps {\n node: LineageGraphNode;\n baseColumns: string[];\n currentColumns: string[];\n refetchRowCount: () => void;\n disableReason: (isAddedOrRemoved: boolean, runType: string) => string;\n}\n\nfunction SingleEnvActionButtons({\n node,\n baseColumns,\n currentColumns,\n refetchRowCount,\n disableReason,\n}: SingleEnvActionButtonsProps) {\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\n const QueryIcon = findByRunType(\"query\").icon;\n const RowCountIcon = findByRunType(\"row_count\").icon;\n const ProfileIcon = findByRunType(\"profile\").icon;\n\n const handleQueryClick = () => {\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 const handleRowCountClick = () => {\n refetchRowCount();\n };\n\n const handleProfileClick = () => {\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 { model: node.data.name },\n { showForm: true, showLast: false },\n );\n };\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" flexWrap=\"wrap\" gap={1}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<QueryIcon fontSize=\"small\" />}\n onClick={handleQueryClick}\n sx={{ textTransform: \"none\" }}\n >\n Query\n </Button>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<RowCountIcon fontSize=\"small\" />}\n onClick={handleRowCountClick}\n sx={{ textTransform: \"none\" }}\n >\n Row Count\n </Button>\n <MuiTooltip\n title={disableReason(isAddedOrRemoved, \"profile\")}\n placement=\"top\"\n >\n <span>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ProfileIcon fontSize=\"small\" />}\n onClick={handleProfileClick}\n disabled={isAddedOrRemoved}\n sx={{ textTransform: \"none\" }}\n >\n Profile\n </Button>\n </span>\n </MuiTooltip>\n </Stack>\n );\n}\n\ninterface ExploreHeaderButtonsProps {\n node: LineageGraphNode;\n onSandboxOpen: () => void;\n}\n\nfunction ExploreHeaderButtons({\n node,\n onSandboxOpen,\n}: ExploreHeaderButtonsProps) {\n const [, setLocation] = useAppLocation();\n const { featureToggles } = useRecceInstanceContext();\n const { isActionAvailable } = useLineageGraphContext();\n const { setPrimaryKeys } = useRecceQueryContext();\n const { primaryKey } = useModelColumns(node.data.name);\n const { apiClient } = useApiConfig();\n\n const metadataOnly = featureToggles.mode === \"metadata only\";\n\n const addSchemaCheck = useCallback(async () => {\n const nodeId = node.id;\n const check = await createSchemaDiffCheck({ node_id: nodeId }, apiClient);\n setLocation(`/checks/?id=${check.check_id}`);\n }, [node, setLocation, apiClient]);\n\n const SchemaDiffIcon = findByRunType(\"schema_diff\").icon;\n const SandboxIcon = findByRunType(\"sandbox\").icon;\n\n const handleAddSchemaCheck = () => {\n void addSchemaCheck();\n };\n\n const handleSandboxOpen = () => {\n if (isActionAvailable(\"query_diff_with_primary_key\")) {\n setPrimaryKeys(primaryKey !== undefined ? [primaryKey] : undefined);\n }\n onSandboxOpen();\n trackPreviewChange({\n action: \"explore\",\n node: node.data.name,\n });\n };\n\n return (\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ mr: 1 }}\n flexWrap=\"wrap\"\n gap={1}\n >\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<SchemaDiffIcon fontSize=\"small\" />}\n onClick={handleAddSchemaCheck}\n sx={{ textTransform: \"none\" }}\n >\n Add schema diff to checklist\n </Button>\n <SetupConnectionPopover display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<SandboxIcon fontSize=\"small\" />}\n onClick={handleSandboxOpen}\n disabled={featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Sandbox\n </Button>\n </SetupConnectionPopover>\n </Stack>\n );\n}\n\ninterface DiffActionButtonsProps {\n node: LineageGraphNode;\n baseColumns: string[];\n currentColumns: string[];\n disableReason: (isAddedOrRemoved: boolean, runType: string) => string;\n refetchRowCountDiff: () => void;\n}\n\nfunction DiffActionButtons({\n node,\n baseColumns,\n currentColumns,\n disableReason,\n refetchRowCountDiff,\n}: DiffActionButtonsProps) {\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 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 QueryDiffIcon = findByRunType(\"query_diff\").icon;\n const RowCountDiffIcon = findByRunType(\"row_count_diff\").icon;\n const ProfileDiffIcon = findByRunType(\"profile_diff\").icon;\n const ValueDiffIcon = findByRunType(\"value_diff\").icon;\n const TopKDiffIcon = findByRunType(\"top_k_diff\").icon;\n const HistogramDiffIcon = findByRunType(\"histogram_diff\").icon;\n\n const wrapButton = (\n button: ReactElement<{\n ref?: React.Ref<HTMLElement>;\n [key: string]: unknown;\n }>,\n runType: string,\n ) => {\n if (metadataOnly) {\n return (\n <SetupConnectionPopover display={true}>{button}</SetupConnectionPopover>\n );\n }\n\n const tooltipContent = disableReason(isAddedOrRemoved, runType);\n return (\n <MuiTooltip title={tooltipContent} placement=\"top\">\n <span>{button}</span>\n </MuiTooltip>\n );\n };\n\n const handleRowCountClick = () => {\n refetchRowCountDiff();\n };\n\n const handleProfileClick = () => {\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 { model: node.data.name },\n { showForm: true, showLast: false },\n );\n };\n\n const handleValueClick = () => {\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 { model: node.data.name },\n { showForm: true, showLast: false },\n );\n };\n\n const handleTopKClick = () => {\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 const handleHistogramClick = () => {\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 { model: node.data.name, column_name: \"\", column_type: \"\" },\n { showForm: true },\n );\n };\n\n const handleQueryClick = () => {\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 setPrimaryKeys(primaryKey !== undefined ? [primaryKey] : undefined);\n }\n setLocation(\"/query\");\n };\n\n return (\n <Stack direction=\"row\" alignItems=\"center\" flexWrap=\"wrap\" gap={2}>\n <Typography variant=\"caption\" fontWeight=\"bold\">\n Diff\n </Typography>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n flexWrap=\"wrap\"\n gap={1}\n width=\"93%\"\n >\n <SetupConnectionPopover display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<RowCountDiffIcon fontSize=\"small\" />}\n onClick={handleRowCountClick}\n disabled={featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Row Count\n </Button>\n </SetupConnectionPopover>\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ProfileDiffIcon fontSize=\"small\" />}\n onClick={handleProfileClick}\n disabled={isAddedOrRemoved || featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Profile\n </Button>,\n \"profile_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<ValueDiffIcon fontSize=\"small\" />}\n onClick={handleValueClick}\n disabled={isAddedOrRemoved || featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Value\n </Button>,\n \"value_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<TopKDiffIcon fontSize=\"small\" />}\n onClick={handleTopKClick}\n disabled={isAddedOrRemoved || featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Top-K\n </Button>,\n \"top_k_diff\",\n )}\n {wrapButton(\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<HistogramDiffIcon fontSize=\"small\" />}\n onClick={handleHistogramClick}\n disabled={isAddedOrRemoved || featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Histogram\n </Button>,\n \"histogram_diff\",\n )}\n <SetupConnectionPopover display={metadataOnly}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<QueryDiffIcon fontSize=\"small\" />}\n onClick={handleQueryClick}\n disabled={featureToggles.disableDatabaseQuery}\n sx={{ textTransform: \"none\" }}\n >\n Query\n </Button>\n </SetupConnectionPopover>\n </Stack>\n </Stack>\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceInstanceInfo } from \"@/lib/hooks/useRecceInstanceInfo\";\nimport { getSettingsUrl } from \"@/lib/utils/urls\";\n\nexport default function SetupConnectionBanner() {\n const { featureToggles } = useRecceInstanceContext();\n const { data: instanceInfo } = useRecceInstanceInfo();\n\n if (featureToggles.mode !== \"metadata only\") {\n return null;\n }\n\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n width: \"100%\",\n px: 1,\n py: 0.25,\n bgcolor: \"cyan.50\",\n }}\n >\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ flex: 1, fontSize: \"0.875rem\", color: \"cyan.600\" }}\n spacing={1}\n >\n <Box component={PiInfo} />\n <Typography sx={{ fontSize: \"inherit\", color: \"inherit\" }}>\n Query functions disabled without a data warehouse connection.\n </Typography>\n <Button\n sx={{ bgcolor: \"iochmara.400\" }}\n size=\"small\"\n variant=\"contained\"\n onClick={() => {\n window.open(getSettingsUrl(instanceInfo), \"_blank\");\n }}\n >\n Connect to Data Warehouse\n </Button>\n </Stack>\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Link from \"@mui/material/Link\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { RiMindMap, RiTerminalBoxLine } from \"react-icons/ri\";\n\nexport function BaseEnvironmentSetupGuide() {\n return (\n <Stack\n sx={{\n flex: 1,\n height: \"100%\",\n minHeight: 0,\n m: 1,\n p: 2,\n bgcolor: \"iochmara.50\",\n borderRadius: 2,\n boxShadow: 2,\n justifyContent: \"center\",\n }}\n >\n <Stack\n sx={{ width: \"80%\", overflowY: \"auto\", gap: 3, px: 4, pb: 4 }}\n alignSelf=\"center\"\n >\n <Stack alignItems=\"center\" spacing={2}>\n <Box\n sx={{\n p: 1,\n bgcolor: \"background.paper\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: 2,\n }}\n >\n <Box\n component={RiTerminalBoxLine}\n sx={{ fontSize: 28, color: \"iochmara.500\" }}\n />\n </Box>\n <Typography variant=\"h5\" sx={{ mt: 2 }}>\n Wait, there's more!\n </Typography>\n <Typography sx={{ textAlign: \"center\" }}>\n Recce is currently running in{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n limited functionality mode\n </Typography>{\" \"}\n so you can run queries but{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n can't diff the results yet!\n </Typography>\n </Typography>\n </Stack>\n <Stack spacing={1}>\n <Typography>\n To unlock the full power of Recce, set up a base environment of dbt\n artifacts for comparison.\n </Typography>\n <Typography>Once configured, you'll be able to:</Typography>\n <List sx={{ listStyleType: \"disc\", pl: 2 }}>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Run statistical data diffs</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Run query diffs</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>Save checks to your Recce Checklist</Typography>\n </ListItem>\n <ListItem sx={{ display: \"list-item\", p: 0 }}>\n <Typography>...and more!</Typography>\n </ListItem>\n </List>\n <Typography>\n Take the next step toward better data impact assessment.\n </Typography>\n </Stack>\n <Stack sx={{ width: \"100%\", mt: 3 }}>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"large\"\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 </Stack>\n </Stack>\n </Stack>\n );\n}\n\nexport function BaseEnvironmentSetupNotification() {\n return (\n <Stack direction=\"row\" spacing=\"10px\" alignItems=\"flex-start\">\n <Box\n component={RiMindMap}\n sx={{ color: \"iochmara.main\", fontSize: 20 }}\n />\n <Stack spacing=\"5px\">\n <Typography sx={{ fontWeight: 700 }}>\n Single Environment Mode{\" \"}\n <Typography\n component=\"span\"\n sx={{ color: \"error.main\", fontWeight: 600 }}\n >\n Limited Functionality\n </Typography>\n </Typography>\n\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Single Environment Mode allows you to explore your dbt project but\n won't show data comparisons between environments.\n </Typography>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n To set up full environment comparison:\n </Typography>\n <List sx={{ pl: 2 }}>\n <ListItem sx={{ p: 0, display: \"list-item\" }}>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Run `recce debug` for setup assistance\n </Typography>\n </ListItem>\n <ListItem sx={{ p: 0, display: \"list-item\" }}>\n <Typography sx={{ fontSize: \"0.875rem\" }}>\n Visit{\" \"}\n <Link\n sx={{ color: \"primary.main\", fontWeight: 500 }}\n target=\"_blank\"\n href=\"https://docs.datarecce.io/configure-diff/\"\n >\n docs\n </Link>{\" \"}\n for configuration details\n </Typography>\n </ListItem>\n </List>\n </Stack>\n </Stack>\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 { apiClient } = useApiConfig();\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(\n type,\n params,\n { nowait: true },\n apiClient,\n );\n showRunId(run_id);\n actionState.currentRun = { run_id };\n actionState.total = 1;\n\n for (;;) {\n const run = await waitRun(run_id, 2, apiClient);\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(\n type,\n params,\n { nowait: true },\n apiClient,\n );\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, apiClient);\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 {\n node_ids: nodeIds,\n },\n apiClient,\n );\n };\n\n const addSchemaDiffCheck = async () => {\n let check;\n if (nodes.length === 1) {\n check = await createSchemaDiffCheck({ node_id: nodes[0].id }, apiClient);\n } else {\n const nodeIds = nodes.map((node) => node.id);\n check = await createSchemaDiffCheck({ node_id: nodeIds }, apiClient);\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, apiClient);\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport {\n Background,\n BackgroundVariant,\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 \"./styles.css\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { AxiosError } from \"axios\";\nimport { FiCopy } from \"react-icons/fi\";\nimport { colors } from \"@/components/ui/mui-theme\";\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 { useThemeColors } from \"@/lib/hooks/useThemeColors\";\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 : colors.neutral[400];\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 { isDark } = useThemeColors();\n const { apiClient } = useApiConfig();\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: isDark ? colors.neutral[900] : colors.neutral[50],\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: (input: CllInput) => getCll(input, apiClient),\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 {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\n );\n filteredNodeIds = result.nodes;\n } catch (_) {\n // fallback behavior\n newViewOptions.view_mode = \"all\";\n const result = await select(\n {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\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 {\n select: newViewOptions.select,\n exclude: newViewOptions.exclude,\n packages: newViewOptions.packages,\n view_mode: newViewOptions.view_mode,\n },\n apiClient,\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, apiClient);\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 {\n node_id: focusedNode.id,\n },\n apiClient,\n );\n trackMultiNodesAction({ type: \"schema_diff\", selected: \"single\" });\n } else {\n check = await createSchemaDiffCheck(\n {\n select: viewOptions.select,\n exclude: viewOptions.exclude,\n packages: viewOptions.packages,\n view_mode: viewOptions.view_mode,\n },\n apiClient,\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 <Box\n sx={{\n width: \"100%\",\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <CircularProgress size={48} />\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Stack alignItems=\"center\" spacing={1}>\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 color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n if (retchLineageGraph) {\n retchLineageGraph();\n }\n }}\n >\n Retry\n </Button>\n </Stack>\n </Box>\n );\n }\n\n if (!lineageGraph || nodes == initialNodes) {\n return <></>;\n }\n\n if (viewMode === \"changed_models\" && !lineageGraph.modifiedSet.length) {\n return (\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Stack alignItems=\"center\" spacing={1}>\n <>No change detected</>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={async () => {\n await handleViewOptionsChanged({\n ...viewOptions,\n view_mode: \"all\",\n });\n }}\n >\n Show all nodes\n </Button>\n </Stack>\n </Box>\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 <Stack\n ref={refResize}\n divider={<Divider sx={{ borderColor: \"grey.200\" }} />}\n spacing={0}\n sx={{ contain: \"strict\", 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 colorMode={isDark ? \"dark\" : \"light\"}\n >\n <Background\n id=\"lineage-bg\"\n variant={BackgroundVariant.Dots}\n color={isDark ? colors.neutral[700] : colors.neutral[300]}\n gap={20}\n size={2}\n />\n <Controls\n showInteractive={false}\n position=\"top-right\"\n className={IGNORE_SCREENSHOT_CLASS}\n style={{\n backgroundColor: isDark ? colors.neutral[700] : undefined,\n borderColor: isDark ? colors.neutral[600] : undefined,\n }}\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 style={{\n backgroundColor: isDark ? colors.neutral[700] : undefined,\n color: isDark ? colors.neutral[200] : undefined,\n }}\n >\n <Box component={FiCopy} />\n </ControlButton>\n </Controls>\n <ImageDownloadModal />\n <Panel position=\"bottom-left\">\n <Stack spacing=\"5px\">\n {isModelsChanged && <ChangeStatusLegend />}\n {viewOptions.column_level_lineage && (\n <ColumnLevelLineageLegend />\n )}\n </Stack>\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 <Stack spacing=\"5px\">\n <ColumnLevelLineageControl action={actionGetCll} />\n {nodes.length == 0 && (\n <Typography\n sx={{ fontSize: \"1.25rem\", color: \"grey\", opacity: 0.5 }}\n >\n No nodes\n </Typography>\n )}\n </Stack>\n </Panel>\n <MiniMap\n nodeColor={nodeColor}\n nodeStrokeWidth={3}\n zoomable\n pannable\n bgColor={isDark ? colors.neutral[800] : undefined}\n maskColor={\n isDark ? `${colors.neutral[900]}99` : `${colors.neutral[100]}99`\n }\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 </Stack>\n {focusedNode ? (\n <Box\n sx={{\n borderLeft: \"solid 1px\",\n borderColor: \"divider\",\n height: \"100%\",\n }}\n >\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { RiTerminalBoxLine } from \"react-icons/ri\";\nimport { useRecceInstanceInfo } from \"@/lib/hooks/useRecceInstanceInfo\";\nimport { getSettingsUrl } from \"@/lib/utils/urls\";\n\nexport default function SetupConnectionGuide() {\n const { data: instanceInfo } = useRecceInstanceInfo();\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 <Stack alignItems=\"center\" spacing={2}>\n <Box\n sx={{\n p: 1,\n bgcolor: \"background.paper\",\n borderRadius: \"50%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxShadow: 2,\n }}\n >\n <Box\n component={RiTerminalBoxLine}\n sx={{ fontSize: 28, color: \"iochmara.500\" }}\n />\n </Box>\n <Typography variant=\"h5\" sx={{ mt: 2 }}>\n Wait, there's more!\n </Typography>\n <Typography sx={{ fontSize: \"1rem\", textAlign: \"center\" }}>\n Query functions disabled without a{\" \"}\n <Typography component=\"span\" sx={{ fontWeight: \"bold\" }}>\n data warehouse connection\n </Typography>\n </Typography>\n </Stack>\n <Stack sx={{ width: \"50%\", mt: 3, mx: \"auto\" }}>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"large\"\n onClick={() => {\n window.open(getSettingsUrl(instanceInfo), \"_blank\");\n }}\n >\n Connect to Data Warehouse\n </Button>\n </Stack>\n </div>\n </div>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiSwitch from \"@mui/material/Switch\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\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 { 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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 <Stack\n direction=\"row\"\n spacing={0.5}\n alignItems=\"center\"\n fontSize=\"0.75rem\"\n >\n <Typography variant=\"body2\" sx={{ fontSize: \"0.75rem\" }}>\n Custom Queries\n </Typography>\n <MuiTooltip title={customQueriesDescription}>\n <Box component=\"span\" sx={{ display: \"flex\", color: \"grey.600\" }}>\n <PiInfoFill fontSize=\"1rem\" />\n </Box>\n </MuiTooltip>\n </Stack>\n <MuiSwitch\n size=\"small\"\n checked={isCustomQueries}\n onChange={handleToggle}\n color=\"primary\"\n />\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 { apiClient } = useApiConfig();\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, apiClient);\n\n showRunId(run_id);\n\n return await waitRun(run_id, undefined, apiClient);\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 <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"center\",\n padding: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n }}\n >\n <HistoryToggle />\n <Box sx={{ flexGrow: 1 }} />\n {singleEnv ? (\n <MuiTooltip\n title=\"Please configure the base environment before running the diff\"\n placement=\"left\"\n >\n <span>\n <Button\n variant=\"contained\"\n disabled\n size=\"small\"\n sx={{ fontSize: \"14px\", mt: \"16px\" }}\n >\n Run Diff\n </Button>\n </span>\n </MuiTooltip>\n ) : (\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n variant=\"contained\"\n disabled\n size=\"small\"\n sx={{ fontSize: \"14px\", mt: \"16px\" }}\n >\n Run Diff\n </Button>\n </SetupConnectionPopover>\n )}\n </Box>\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 </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"flex-end\",\n padding: \"4pt 8pt\",\n gap: \"5px\",\n height: \"54px\",\n borderBottom: \"1px solid\",\n borderColor: \"divider\",\n flex: \"0 0 54px\",\n }}\n >\n <HistoryToggle />\n <QueryModeToggle />\n <Box sx={{ flexGrow: 1 }} />\n <QueryForm\n defaultPrimaryKeys={primaryKeys}\n onPrimaryKeysChange={setPrimaryKeys}\n />\n <Button\n variant=\"contained\"\n onClick={() => {\n runQuery(\"query_diff\");\n }}\n disabled={isPending || featureToggles.disableDatabaseQuery}\n size=\"small\"\n >\n Run Diff\n </Button>\n </Box>\n\n <Box sx={{ 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 </Box>\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 {\n DragDropContext,\n Draggable,\n Droppable,\n DropResult,\n} from \"@hello-pangea/dnd\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport React, { useState } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { IoClose } from \"react-icons/io5\";\nimport { isDisabledByNoResult } from \"@/components/check/utils\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check, updateCheck } from \"@/lib/api/checks\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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: (checkId: string) => void;\n}) => {\n const theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const { featureToggles } = useRecceInstanceContext();\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const checkId = check.check_id;\n const { mutate } = useMutation({\n mutationFn: (check: Partial<Check>) =>\n updateCheck(checkId, check, apiClient),\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 <Box\n sx={{\n width: \"100%\",\n p: \"0.25rem 1.25rem\",\n cursor: \"pointer\",\n \"&:hover\": { bgcolor: isDark ? \"grey.800\" : \"Cornsilk\" },\n bgcolor: selected ? (isDark ? \"grey.900\" : \"Floralwhite\") : \"inherit\",\n borderBottom: \"1px solid\",\n borderBottomColor: isDark ? \"grey.700\" : \"divider\",\n borderLeft: \"3px solid\",\n borderLeftColor: selected ? \"orange\" : \"transparent\",\n display: \"flex\",\n alignItems: \"center\",\n gap: \"0.5rem\",\n }}\n onClick={() => {\n onSelect(check.check_id);\n }}\n >\n <Box component={icon} sx={{ fontSize: 20 }} />\n <Box\n sx={{\n flex: 1,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n }}\n className=\"no-track-pii-safe\"\n >\n {check.name}\n </Box>\n\n <MuiTooltip\n title={\n isNoResult ? \"Run the check first\" : \"Click to mark as approved\"\n }\n placement=\"top\"\n arrow\n >\n <Box>\n <Checkbox\n checked={check.is_checked}\n color=\"success\"\n size=\"small\"\n onChange={(e) => {\n if (!e.target.checked) {\n // If unchecking, just update the check\n mutate({ is_checked: e.target.checked });\n } else {\n // Show Mark as Approved warning modal\n onMarkAsApproved(checkId);\n }\n }}\n disabled={isMarkAsApprovedDisabled}\n onClick={(e) => e.stopPropagation()}\n sx={{\n borderColor: \"border.inverted\",\n bgcolor: isMarkAsApprovedDisabled\n ? isDark\n ? \"grey.700\"\n : \"grey.200\"\n : undefined,\n }}\n />\n </Box>\n </MuiTooltip>\n </Box>\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 [open, setOpen] = useState(false);\n const [pendingApprovalCheckId, setPendingApprovalCheckId] = useState<\n string | null\n >(null);\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const { mutate: markCheckedByID } = useMutation({\n mutationFn: (checkId: string) =>\n updateCheck(checkId, { is_checked: true }, apiClient),\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\n const handleOpen = () => setOpen(true);\n const handleClose = () => {\n setOpen(false);\n setPendingApprovalCheckId(null);\n };\n\n const { markedAsApprovedToast } = useCheckToast();\n const handleOnMarkAsApproved = (checkId: string) => {\n const bypassMarkAsApprovedWarning = localStorage.getItem(\n \"bypassMarkAsApprovedWarning\",\n );\n if (bypassMarkAsApprovedWarning === \"true\") {\n markCheckedByID(checkId);\n markedAsApprovedToast();\n } else {\n setPendingApprovalCheckId(checkId);\n handleOpen();\n }\n };\n\n const handleMarkAsApprovedConfirmed = () => {\n if (pendingApprovalCheckId) {\n markCheckedByID(pendingApprovalCheckId);\n if (bypassModal) {\n localStorage.setItem(\"bypassMarkAsApprovedWarning\", \"true\");\n }\n markedAsApprovedToast();\n handleClose();\n setPendingApprovalCheckId(null);\n }\n };\n\n return (\n <>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"checklist\">\n {(provided) => (\n <Stack\n {...provided.droppableProps}\n ref={provided.innerRef}\n className=\"no-track-pii-safe\"\n sx={{\n width: \"100%\",\n flex: 1,\n overflow: \"auto\",\n }}\n spacing={0}\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 // Create a new style object instead of mutating the read-only one\n let style = provided.draggableProps.style;\n if (snapshot.isDragging && style && \"left\" in style) {\n const offset = { x: 0, y: 80 };\n style = {\n ...style,\n left: (style.left as number) - offset.x,\n top: (style.top as number) - offset.y,\n };\n }\n\n return (\n <Box\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n style={style}\n sx={{ width: \"100%\" }}\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 </Box>\n );\n }}\n </Draggable>\n ))}\n {provided.placeholder}\n </Stack>\n )}\n </Droppable>\n </DragDropContext>\n <MuiDialog open={open} onClose={handleClose} maxWidth=\"xs\" fullWidth>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Mark as Approved?\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <Divider />\n <DialogContent sx={{ fontSize: \"0.875rem\" }}>\n <Typography>\n Please ensure you have reviewed the contents of this check before\n marking it as approved.\n </Typography>\n <FormControlLabel\n control={\n <Checkbox\n checked={bypassModal}\n onChange={(e) => {\n setBypassModal(e.target.checked);\n }}\n size=\"small\"\n />\n }\n label={\n <Typography sx={{ fontWeight: \"bold\", pt: \"8px\" }}>\n Don't show this again\n </Typography>\n }\n />\n </DialogContent>\n <Divider />\n <DialogActions sx={{ gap: 0 }}>\n <Button variant=\"outlined\" size=\"small\" onClick={handleClose}>\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n size=\"small\"\n onClick={handleMarkAsApprovedConfirmed}\n >\n Mark as approved\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\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 { AxiosInstance, 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 * @param client - Optional axios instance for API configuration\n * @returns Promise resolving to array of CheckEvent objects\n */\nexport async function listCheckEvents(\n checkId: string,\n client: AxiosInstance = axiosClient,\n): Promise<CheckEvent[]> {\n const response = await client.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 * @param client - Optional axios instance for API configuration\n * @returns Promise resolving to a CheckEvent object\n */\nexport async function getCheckEvent(\n checkId: string,\n eventId: string,\n client: AxiosInstance = axiosClient,\n): Promise<CheckEvent> {\n const response = await client.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 * @param client - Optional axios instance for API configuration\n * @returns Promise resolving to the created CheckEvent\n */\nexport async function createComment(\n checkId: string,\n content: string,\n client: AxiosInstance = axiosClient,\n): Promise<CheckEvent> {\n const response = await client.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 * @param client - Optional axios instance for API configuration\n * @returns Promise resolving to the updated CheckEvent\n */\nexport async function updateComment(\n checkId: string,\n eventId: string,\n content: string,\n client: AxiosInstance = axiosClient,\n): Promise<CheckEvent> {\n const response = await client.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 * @param client - Optional axios instance for API configuration\n * @returns Promise resolving when deletion is complete\n */\nexport async function deleteComment(\n checkId: string,\n eventId: string,\n client: AxiosInstance = axiosClient,\n): Promise<void> {\n await client.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\";\nimport { useApiConfig } from \"./ApiConfigContext\";\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 const { apiClient } = useApiConfig();\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, apiClient),\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, apiClient),\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, apiClient),\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, apiClient),\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 from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport TextField from \"@mui/material/TextField\";\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 theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\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<HTMLDivElement>) => {\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 <TextField\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n size=\"small\"\n multiline\n fullWidth\n minRows={3}\n disabled={isSubmitting}\n sx={{\n \"& .MuiOutlinedInput-root\": {\n bgcolor: \"background.paper\",\n \"&:hover .MuiOutlinedInput-notchedOutline\": {\n borderColor: isDark ? \"grey.500\" : \"grey.400\",\n },\n \"&.Mui-focused .MuiOutlinedInput-notchedOutline\": {\n borderColor: \"iochmara.400\",\n boxShadow: \"0 0 0 1px #4299E1\",\n },\n },\n \"& .MuiOutlinedInput-notchedOutline\": {\n borderColor: isDark ? \"grey.600\" : undefined,\n },\n }}\n />\n <Stack direction=\"row\" justifyContent=\"flex-end\" sx={{ mt: 2 }}>\n <Button\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleSubmit}\n disabled={!content.trim() || isSubmitting}\n >\n {isSubmitting ? \"Submitting...\" : \"Comment\"}\n </Button>\n </Stack>\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Typography from \"@mui/material/Typography\";\nimport { useRef } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\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 <MuiDialog\n open={isOpen}\n onClose={onCancel}\n maxWidth=\"sm\"\n fullWidth\n aria-labelledby=\"external-link-dialog-title\"\n >\n <DialogTitle\n id=\"external-link-dialog-title\"\n sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}\n >\n <Box component={PiWarning} sx={{ color: \"amber.500\", fontSize: 20 }} />\n External Link\n </DialogTitle>\n <IconButton\n aria-label=\"close\"\n onClick={onCancel}\n sx={{\n position: \"absolute\",\n right: 8,\n top: 8,\n color: \"grey.500\",\n }}\n >\n <IoClose />\n </IconButton>\n\n <DialogContent>\n <Typography sx={{ mb: 1.5 }}>\n This link will take you to an external website outside of Recce. Are\n you sure you want to continue?\n </Typography>\n <Box\n sx={{\n bgcolor: \"grey.50\",\n p: 1,\n borderRadius: 1,\n border: \"1px solid\",\n borderColor: \"grey.200\",\n }}\n >\n <Box\n component=\"code\"\n sx={{\n fontSize: \"0.875rem\",\n wordBreak: \"break-all\",\n whiteSpace: \"pre-wrap\",\n bgcolor: \"transparent\",\n fontFamily: \"monospace\",\n }}\n >\n {truncateUrl(url, 100)}\n </Box>\n </Box>\n </DialogContent>\n\n <DialogActions sx={{ gap: 1 }}>\n <Button ref={cancelRef} variant=\"outlined\" onClick={onCancel}>\n Cancel\n </Button>\n <Button color=\"iochmara\" variant=\"contained\" onClick={onConfirm}>\n Open Link\n </Button>\n </DialogActions>\n </MuiDialog>\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 from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\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 sx={{\n color: \"primary.main\",\n textDecoration: \"underline\",\n \"&:hover\": { color: \"iochmara.600\" },\n }}\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 isDark = false,\n}: {\n className?: string;\n children?: React.ReactNode;\n node?: unknown;\n isDark?: boolean;\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 <Box\n component=\"code\"\n sx={{\n bgcolor: isDark ? \"grey.800\" : \"grey.100\",\n color: isDark ? \"grey.200\" : \"inherit\",\n px: 1,\n py: 0.5,\n borderRadius: 0.5,\n fontSize: \"0.9em\",\n fontFamily: \"monospace\",\n }}\n >\n {children}\n </Box>\n );\n }\n\n return (\n <Box\n sx={{ my: 2, borderRadius: 1, overflow: \"hidden\", fontSize: \"0.875rem\" }}\n >\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 = \"0.875rem\",\n internalDomains = [],\n}: MarkdownContentProps) {\n const theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n\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: (props) => <CodeBlock {...props} isDark={isDark} />,\n\n // Paragraphs\n p: ({ children }) => (\n <Typography\n component=\"p\"\n sx={{ fontSize, mb: 2, \"&:last-child\": { mb: 0 } }}\n >\n {children}\n </Typography>\n ),\n\n // Headers\n h1: ({ children }) => (\n <Typography\n sx={{ fontSize: \"1.25rem\", fontWeight: \"bold\", mb: 2, mt: 3 }}\n >\n {children}\n </Typography>\n ),\n h2: ({ children }) => (\n <Typography\n sx={{ fontSize: \"1.125rem\", fontWeight: \"bold\", mb: 2, mt: 3 }}\n >\n {children}\n </Typography>\n ),\n h3: ({ children }) => (\n <Typography sx={{ fontSize: \"1rem\", fontWeight: 600, mb: 2, mt: 2 }}>\n {children}\n </Typography>\n ),\n\n // Lists\n ul: ({ children }) => (\n <Box component=\"ul\" sx={{ pl: 4, mb: 2, listStyleType: \"disc\" }}>\n {children}\n </Box>\n ),\n ol: ({ children }) => (\n <Box component=\"ol\" sx={{ pl: 4, mb: 2, listStyleType: \"decimal\" }}>\n {children}\n </Box>\n ),\n li: ({ children }) => (\n <Box component=\"li\" sx={{ fontSize, mb: 1 }}>\n {children}\n </Box>\n ),\n\n // Blockquotes\n blockquote: ({ children }) => (\n <Box\n sx={{\n borderLeft: \"3px solid\",\n borderLeftColor: isDark ? \"grey.600\" : \"grey.300\",\n pl: 3,\n py: 1,\n my: 2,\n color: isDark ? \"grey.400\" : \"grey.600\",\n fontStyle: \"italic\",\n }}\n >\n {children}\n </Box>\n ),\n\n // Tables\n table: ({ children }) => (\n <Box sx={{ overflowX: \"auto\", my: 2 }}>\n <Box\n component=\"table\"\n sx={{\n width: \"100%\",\n fontSize,\n border: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n borderRadius: 1,\n }}\n >\n {children}\n </Box>\n </Box>\n ),\n thead: ({ children }) => (\n <Box component=\"thead\" sx={{ bgcolor: isDark ? \"grey.800\" : \"grey.50\" }}>\n {children}\n </Box>\n ),\n tbody: ({ children }) => <Box component=\"tbody\">{children}</Box>,\n tr: ({ children }) => (\n <Box\n component=\"tr\"\n sx={{\n borderBottom: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n }}\n >\n {children}\n </Box>\n ),\n th: ({ children }) => (\n <Box\n component=\"th\"\n sx={{ px: 2, py: 1, fontWeight: 600, textAlign: \"left\" }}\n >\n {children}\n </Box>\n ),\n td: ({ children }) => (\n <Box component=\"td\" sx={{ px: 2, py: 1 }}>\n {children}\n </Box>\n ),\n\n // Horizontal rule\n hr: () => (\n <Box\n component=\"hr\"\n sx={{ my: 3, borderColor: isDark ? \"grey.700\" : \"grey.200\" }}\n />\n ),\n\n // Strong/Bold\n strong: ({ children }) => (\n <Typography component=\"strong\" sx={{ fontWeight: 600 }}>\n {children}\n </Typography>\n ),\n\n // Emphasis/Italic\n em: ({ children }) => (\n <Typography component=\"em\" sx={{ fontStyle: \"italic\" }}>\n {children}\n </Typography>\n ),\n\n // Strikethrough\n del: ({ children }) => (\n <Typography\n component=\"del\"\n sx={{ textDecoration: \"line-through\", color: \"grey.500\" }}\n >\n {children}\n </Typography>\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 MuiAvatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Popover from \"@mui/material/Popover\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { type MouseEvent, 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 { 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: Record<string, string> = {\n create: \"primary.main\",\n comment: \"grey.500\",\n approve: \"success.main\",\n unapprove: \"grey.400\",\n edit: \"warning.main\",\n preset: \"secondary.main\",\n };\n\n const IconComponent = iconMap[iconType];\n const color = colorMap[iconType];\n\n return <Box component={IconComponent} sx={{ color, fontSize: 16 }} />;\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 <MuiAvatar\n src={avatarUrl || undefined}\n sx={{ width: 24, height: 24, fontSize: \"0.75rem\" }}\n >\n {initials}\n </MuiAvatar>\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 <Box sx={{ display: \"flex\", gap: 1, alignItems: \"flex-start\", py: 1 }}>\n <Box sx={{ pt: \"2px\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ flex: 1 }}>\n <Stack\n direction=\"row\"\n spacing={0.5}\n flexWrap=\"wrap\"\n alignItems=\"center\"\n >\n <UserAvatar event={event} />\n <Typography variant=\"body2\" fontWeight=\"500\">\n {actorName}\n </Typography>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {message}\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\">\n {relativeTime}\n </Typography>\n </Stack>\n </Box>\n </Box>\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 theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\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 [deleteAnchorEl, setDeleteAnchorEl] = useState<HTMLElement | null>(\n null,\n );\n const isDeletePopoverOpen = Boolean(deleteAnchorEl);\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<HTMLDivElement>) => {\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 handleDeleteClick = (event: MouseEvent<HTMLButtonElement>) => {\n setDeleteAnchorEl(event.currentTarget);\n };\n\n const handleDeleteClose = () => {\n setDeleteAnchorEl(null);\n };\n\n const handleDelete = async () => {\n if (onDelete) {\n setIsDeleting(true);\n try {\n await onDelete(event.id);\n handleDeleteClose();\n } finally {\n setIsDeleting(false);\n }\n }\n };\n\n if (event.is_deleted) {\n return (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"center\", py: 1 }}>\n <Box sx={{ pt: \"2px\", display: \"flex\", alignItems: \"center\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ display: \"flex\", flex: 1, alignItems: \"center\" }}>\n <Typography variant=\"body2\" color=\"text.disabled\" fontStyle=\"italic\">\n Comment deleted\n </Typography>\n </Box>\n </Box>\n );\n }\n\n return (\n <Box sx={{ display: \"flex\", gap: 1, alignItems: \"flex-start\", py: 1 }}>\n <Box sx={{ pt: \"2px\" }}>\n <EventIcon event={event} />\n </Box>\n <Box sx={{ flex: 1 }}>\n <Stack\n direction=\"row\"\n spacing={0.5}\n sx={{ mb: 0.5 }}\n flexWrap=\"wrap\"\n alignItems=\"center\"\n >\n <UserAvatar event={event} />\n <Typography variant=\"body2\" fontWeight=\"500\">\n {actorName}\n {isAuthor && (\n <Typography\n component=\"span\"\n variant=\"body2\"\n color=\"text.secondary\"\n >\n {\" \"}\n (Author)\n </Typography>\n )}\n </Typography>\n <Typography variant=\"caption\" color=\"text.disabled\">\n {relativeTime}\n </Typography>\n {event.is_edited && (\n <Typography variant=\"caption\" color=\"text.disabled\">\n (edited)\n </Typography>\n )}\n </Stack>\n\n {isEditing ? (\n // Edit mode\n <Box>\n <TextField\n value={editContent}\n onChange={(e) => setEditContent(e.target.value)}\n onKeyDown={handleKeyDown}\n size=\"small\"\n multiline\n minRows={3}\n fullWidth\n disabled={isSubmitting}\n autoFocus\n sx={{\n \"& .MuiOutlinedInput-root\": {\n bgcolor: \"background.paper\",\n \"&:focus-within\": {\n borderColor: \"primary.main\",\n },\n },\n }}\n />\n <Stack\n direction=\"row\"\n spacing={1}\n sx={{ mt: 1 }}\n justifyContent=\"flex-end\"\n >\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={handleCancelEdit}\n disabled={isSubmitting}\n >\n Cancel\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={handleSaveEdit}\n disabled={!editContent.trim() || isSubmitting}\n >\n {isSubmitting ? \"Saving...\" : \"Save\"}\n </Button>\n </Stack>\n </Box>\n ) : (\n // View mode\n <Box\n sx={{\n bgcolor: isDark ? \"grey.800\" : \"grey.50\",\n borderRadius: 1,\n p: 1,\n border: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n position: \"relative\",\n \"&:hover .comment-actions\": {\n opacity: 1,\n },\n }}\n >\n <MarkdownContent content={event.content || \"\"} fontSize=\"sm\" />\n\n {/* Edit/Delete buttons - only visible to author on hover */}\n {isAuthor && (onEdit || onDelete) && (\n <Stack\n className=\"comment-actions\"\n direction=\"row\"\n spacing={0}\n sx={{\n position: \"absolute\",\n top: 4,\n right: 4,\n opacity: 0,\n transition: \"opacity 0.2s\",\n }}\n >\n {onEdit && (\n <MuiTooltip title=\"Edit comment\">\n <IconButton\n aria-label=\"Edit comment\"\n size=\"small\"\n onClick={handleStartEdit}\n >\n <PiPencilSimple />\n </IconButton>\n </MuiTooltip>\n )}\n {onDelete && (\n <>\n <MuiTooltip title=\"Delete comment\">\n <IconButton\n aria-label=\"Delete comment\"\n size=\"small\"\n color=\"error\"\n onClick={handleDeleteClick}\n >\n <PiTrashSimple />\n </IconButton>\n </MuiTooltip>\n <Popover\n open={isDeletePopoverOpen}\n anchorEl={deleteAnchorEl}\n onClose={handleDeleteClose}\n anchorOrigin={{\n vertical: \"bottom\",\n horizontal: \"center\",\n }}\n transformOrigin={{\n vertical: \"top\",\n horizontal: \"center\",\n }}\n >\n <Box sx={{ p: 2 }}>\n <Typography variant=\"body2\" sx={{ mb: 2 }}>\n Delete this comment?\n </Typography>\n <Stack\n direction=\"row\"\n spacing={1}\n justifyContent=\"flex-end\"\n >\n <Button\n size=\"small\"\n variant=\"text\"\n onClick={handleDeleteClose}\n disabled={isDeleting}\n >\n Cancel\n </Button>\n <Button\n size=\"small\"\n variant=\"contained\"\n color=\"error\"\n onClick={handleDelete}\n disabled={isDeleting}\n >\n {isDeleting ? \"Deleting...\" : \"Delete\"}\n </Button>\n </Stack>\n </Box>\n </Popover>\n </>\n )}\n </Stack>\n )}\n </Box>\n )}\n </Box>\n </Box>\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 Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { fetchUser } from \"@/lib/api/user\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const { apiClient } = useApiConfig();\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(apiClient),\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 <Box\n sx={{\n height: \"100%\",\n p: 4,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <CircularProgress size={20} />\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box\n sx={{\n height: \"100%\",\n p: 4,\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n }}\n >\n <Typography sx={{ fontSize: \"0.875rem\", color: \"error.main\" }}>\n Failed to load timeline\n </Typography>\n </Box>\n );\n }\n\n return (\n <Stack\n sx={{\n height: \"100%\",\n alignItems: \"stretch\",\n borderLeft: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n }}\n spacing={0}\n >\n {/* Header */}\n <Box\n sx={{\n px: 3,\n py: 2,\n borderBottom: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n }}\n >\n <Typography variant=\"subtitle2\" sx={{ fontWeight: 500 }}>\n Activity\n </Typography>\n </Box>\n\n {/* Events List - Scrollable */}\n <Box sx={{ flex: 1, overflowY: \"auto\", px: 3, py: 2 }}>\n {events.length === 0 ? (\n <Typography sx={{ fontSize: \"0.875rem\", color: \"grey.500\" }}>\n No activity yet\n </Typography>\n ) : (\n <Stack sx={{ alignItems: \"stretch\" }} spacing={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 <Divider\n sx={{ borderColor: isDark ? \"grey.700\" : \"grey.100\" }}\n />\n )}\n </Box>\n ))}\n </Stack>\n )}\n </Box>\n\n {/* Comment Input - Fixed at bottom */}\n <Box\n sx={{\n px: 3,\n py: 3,\n borderTop: \"1px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.200\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n }}\n >\n <CommentInput\n onSubmit={handleCreateComment}\n isSubmitting={isCreatingComment}\n />\n </Box>\n </Stack>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport TextField from \"@mui/material/TextField\";\nimport { ChangeEvent, useCallback, useEffect, useRef, useState } 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 <Box\n sx={{\n flex: \"2\",\n fontSize: \"1rem\",\n fontWeight: 500,\n overflow: \"hidden\",\n color: \"text.primary\",\n cursor: \"pointer\",\n }}\n className=\"no-track-pii-safe\"\n >\n {isEditing ? (\n <TextField\n inputRef={editInputRef}\n value={editValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n size=\"small\"\n sx={{ width: \"100%\" }}\n variant=\"outlined\"\n />\n ) : (\n <Box\n sx={{\n flex: \"0 1 auto\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n }}\n onClick={handleClick}\n >\n {name}\n </Box>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport Typography from \"@mui/material/Typography\";\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 <Stack\n direction=\"column\"\n alignItems=\"flex-end\"\n spacing={1}\n sx={{ height: \"100%\" }}\n className=\"no-track-pii-safe\"\n >\n <TextField\n value={tempValue}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n inputRef={textareaRef}\n multiline\n fullWidth\n sx={{ flex: 1 }}\n slotProps={{\n input: {\n sx: { height: \"100%\", alignItems: \"flex-start\" },\n },\n }}\n />\n <Stack direction=\"row\" spacing={4} alignItems=\"center\">\n <Link\n onClick={handleCancel}\n sx={{ color: \"primary.main\", cursor: \"pointer\" }}\n >\n cancel\n </Link>\n <Button\n sx={{ mt: \"8px\" }}\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleUpdate}\n >\n Update\n </Button>\n </Stack>\n </Stack>\n );\n }\n\n return (\n <Typography\n className=\"no-track-pii-safe\"\n sx={{\n height: \"100%\",\n overflow: \"auto\",\n fontSize: \"11pt\",\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n color: !value ? \"lightgray\" : \"inherit\",\n cursor: !featureToggles.disableUpdateChecklist ? \"pointer\" : \"default\",\n }}\n onClick={!featureToggles.disableUpdateChecklist ? handleEdit : undefined}\n >\n {(value ?? \"\").trim() || \"Add description here\"}\n </Typography>\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 Box from \"@mui/material/Box\";\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 <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <ReactFlowProvider>\n <LineageView viewOptions={viewOptions} interactive={false} ref={ref} />\n </ReactFlowProvider>\n </Box>\n );\n}\n\nexport const LineageDiffView = forwardRef<LineageViewRef, LineageDiffViewProps>(\n _LineageDiffView,\n);\n","import { useTheme } from \"@mui/material/styles\";\nimport YAML from \"yaml\";\nimport { CodeEditor } from \"@/components/editor\";\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 const muiTheme = useTheme();\n const isDark = muiTheme.palette.mode === \"dark\";\n return (\n <CodeEditor\n value={yamlTemplate}\n language=\"yaml\"\n readOnly={true}\n lineNumbers={false}\n wordWrap={true}\n fontSize={14}\n theme={isDark ? \"dark\" : \"light\"}\n height=\"300px\"\n />\n );\n}\n","import Box from \"@mui/material/Box\";\nimport List from \"@mui/material/List\";\nimport ListItem from \"@mui/material/ListItem\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport React, { forwardRef, useMemo, useState } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check } from \"@/lib/api/checks\";\nimport { select } from \"@/lib/api/select\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { type DataGridHandle } from \"../data-grid/ScreenshotDataGrid\";\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 isDark,\n}: {\n node: LineageGraphNode;\n selected: boolean;\n onSelect: (nodeId: string) => void;\n schemaChanged: boolean;\n isDark: 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 <ListItem disablePadding>\n <Box\n sx={{\n display: \"flex\",\n width: \"100%\",\n fontSize: \"10pt\",\n p: \"5px 8px\",\n cursor: \"pointer\",\n \"&:hover\": { bgcolor: isDark ? \"grey.700\" : \"grey.200\" },\n bgcolor: selected ? (isDark ? \"grey.800\" : \"grey.100\") : \"inherit\",\n alignItems: \"center\",\n gap: \"5px\",\n }}\n onClick={() => {\n onSelect(node.id);\n }}\n >\n {icon && <Box component={icon} />}\n <Box\n sx={{\n flex: 1,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n }}\n >\n {node.data.name}\n </Box>\n\n {statusIcon && statusColor && (\n <Box component={statusIcon} sx={{ color: statusColor }} />\n )}\n </Box>\n </ListItem>\n );\n};\n\nexport function PrivateSchemaDiffView(\n { check }: SchemaDiffViewProps,\n ref: React.Ref<DataGridHandle>,\n) {\n const theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const { apiClient } = useApiConfig();\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 {\n select: params.select,\n exclude: params.exclude,\n packages: params.packages,\n view_mode: params.view_mode,\n },\n apiClient,\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 <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n Loading...\n </Box>\n );\n } else if (error) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n className=\"no-track-pii-safe\"\n >\n Error: {error.message}\n </Box>\n );\n } else if (nodes.length == 0) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n No nodes matched\n </Box>\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\n sx={{\n overflow: \"auto\",\n bgcolor: \"background.paper\",\n listStyle: \"none\",\n }}\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 isDark={isDark}\n onSelect={() => {\n setSelected(i);\n }}\n />\n ))}\n </List>\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport Divider from \"@mui/material/Divider\";\nimport Grid from \"@mui/material/Grid\";\nimport IconButton from \"@mui/material/IconButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Tab from \"@mui/material/Tab\";\nimport Tabs from \"@mui/material/Tabs\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport { stripIndents } from \"common-tags\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport React, {\n type MouseEvent,\n ReactNode,\n Ref,\n useCallback,\n useRef,\n useState,\n} from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FaBookmark } from \"react-icons/fa6\";\nimport { IoMdCodeWorking } from \"react-icons/io\";\nimport { IoBookmarksOutline, IoClose } 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 {\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 theme = useTheme();\n const isDark = theme.palette.mode === \"dark\";\n const { apiClient } = useApiConfig();\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 [isPresetCheckTemplateOpen, setIsPresetCheckTemplateOpen] =\n useState(false);\n const [menuAnchorEl, setMenuAnchorEl] = useState<HTMLElement | null>(null);\n const menuOpen = Boolean(menuAnchorEl);\n\n const {\n isLoading,\n error,\n data: check,\n } = useQuery({\n queryKey: cacheKeys.check(checkId),\n queryFn: async () => getCheck(checkId, apiClient),\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 let RunResultView: RegistryEntry[\"RunResultView\"] | undefined;\n if (runTypeEntry) {\n RunResultView =\n runTypeEntry.RunResultView as RegistryEntry[\"RunResultView\"];\n }\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>) =>\n updateCheck(checkId, check, apiClient),\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, apiClient),\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, apiClient);\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(\n checkId,\n { nowait: true },\n apiClient,\n );\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, apiClient]);\n\n const handleCancel = useCallback(async () => {\n setAborting(true);\n if (!trackedRunId) {\n return;\n }\n\n return await cancelRun(trackedRunId, apiClient);\n }, [trackedRunId, apiClient]);\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 handleMenuClick = (event: MouseEvent<HTMLButtonElement>) => {\n setMenuAnchorEl(event.currentTarget);\n };\n\n const handleMenuClose = () => {\n setMenuAnchorEl(null);\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 (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n Loading\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n height: \"100%\",\n }}\n >\n Error: <span className=\"no-track-pii-safe\">{error.message}</span>\n </Box>\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 sx={{ display: \"flex\", flexDirection: \"column\" }}\n >\n <Box\n sx={{\n display: \"flex\",\n p: \"0px 16px\",\n alignItems: \"center\",\n height: 40,\n }}\n >\n <CheckBreadcrumb\n name=\"Check not found\"\n setName={() => {\n // do nothing\n }}\n />\n </Box>\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 // Get the icon for the check type\n const checkTypeIcon: IconType | undefined = runTypeEntry?.icon;\n\n return (\n <Grid\n spacing={0}\n container\n sx={{\n height: \"100%\",\n width: \"100%\",\n }}\n >\n <Grid size={{ xs: 12, md: cloudMode ? 9 : 12 }} sx={{ height: \"100%\" }}>\n <VSplit\n minSize={100}\n sizes={[40, 60]}\n style={{ height: \"100%\", width: \"100%\", maxHeight: \"100%\" }}\n >\n <Box\n sx={{\n height: \"100%\",\n contain: \"strict\",\n display: \"flex\",\n flexDirection: \"row\",\n }}\n >\n {/* Main content area - takes remaining space */}\n <Box\n sx={{\n flex: 1,\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n overflow: \"hidden\",\n minWidth: 0,\n }}\n >\n {/* Title bar with icon, name, and actions */}\n <Box\n sx={{\n display: \"flex\",\n p: \"0px 16px\",\n alignItems: \"center\",\n height: 40,\n borderBottom: \"2px solid\",\n borderColor: isDark ? \"grey.700\" : \"grey.300\",\n }}\n >\n {/* Check type icon */}\n {checkTypeIcon && (\n <Box\n component={checkTypeIcon}\n sx={{ fontSize: 20, mr: 1, flexShrink: 0 }}\n />\n )}\n <CheckBreadcrumb\n name={check.name}\n setName={(name) => {\n mutate({ name });\n }}\n />\n <Box sx={{ flexGrow: 1 }} />\n <Stack direction=\"row\" spacing={2} sx={{ mr: \"10px\" }}>\n {relativeTime && (\n <Box\n sx={{\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n fontSize: \"0.75rem\",\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {relativeTime}\n </Box>\n )}\n\n {/* Preset label moved to the right */}\n {isPresetCheck && (\n <MuiTooltip title=\"This is a preset check\">\n <Box\n display=\"flex\"\n alignItems=\"center\"\n justifyContent=\"center\"\n >\n <FaBookmark\n size=\"1rem\"\n color={theme.palette.iochmara.dark}\n />\n </Box>\n </MuiTooltip>\n )}\n\n <IconButton size=\"small\" onClick={handleMenuClick}>\n <VscKebabVertical />\n </IconButton>\n <Menu\n anchorEl={menuAnchorEl}\n open={menuOpen}\n onClose={handleMenuClose}\n >\n {sessionId && (\n <MenuItem\n onClick={() => {\n handleMarkAsPresetCheck();\n handleMenuClose();\n }}\n disabled={isMarkingAsPreset || isPresetCheck}\n >\n <ListItemIcon>\n <IoBookmarksOutline />\n </ListItemIcon>\n <ListItemText>Mark as Preset Check</ListItemText>\n </MenuItem>\n )}\n <MenuItem\n onClick={() => {\n setIsPresetCheckTemplateOpen(true);\n handleMenuClose();\n }}\n >\n <ListItemIcon>\n <IoMdCodeWorking />\n </ListItemIcon>\n <ListItemText>Get Preset Check Template</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n handleCopy();\n handleMenuClose();\n }}\n >\n <ListItemIcon>\n <PiCopy />\n </ListItemIcon>\n <ListItemText>Copy Markdown</ListItemText>\n </MenuItem>\n <Divider />\n <MenuItem\n onClick={() => {\n handleDelete();\n handleMenuClose();\n }}\n disabled={featureToggles.disableUpdateChecklist}\n sx={{ color: \"error.main\" }}\n >\n <ListItemIcon sx={{ color: \"error.main\" }}>\n <PiTrashFill />\n </ListItemIcon>\n <ListItemText>Delete</ListItemText>\n </MenuItem>\n </Menu>\n\n <MuiTooltip\n title={\n isDisabledByNoResult(check.type, run)\n ? \"Run the check first\"\n : check.is_checked\n ? \"Remove approval\"\n : \"Mark as approved\"\n }\n placement=\"bottom-end\"\n >\n <Button\n size=\"small\"\n color={check.is_checked ? \"success\" : \"neutral\"}\n variant={check.is_checked ? \"contained\" : \"outlined\"}\n onClick={() => {\n handleApproveCheck();\n }}\n disabled={\n isDisabledByNoResult(check.type, run) ||\n featureToggles.disableUpdateChecklist\n }\n startIcon={\n check.is_checked ? (\n <PiCheckCircle />\n ) : (\n <VscCircleLarge\n style={{\n color: isDark\n ? theme.palette.grey[600]\n : theme.palette.grey[400],\n }}\n />\n )\n }\n sx={{ flex: \"0 0 auto\", textTransform: \"none\" }}\n >\n {check.is_checked ? \"Approved\" : \"Pending\"}\n </Button>\n </MuiTooltip>\n </Stack>\n </Box>\n\n {/* Description area */}\n <Box sx={{ flex: 1, p: \"8px 16px\", minHeight: 100 }}>\n <CheckDescription\n key={check.check_id}\n value={check.description}\n onChange={handleUpdateDescription}\n />\n </Box>\n </Box>\n </Box>\n <Box style={{ contain: \"strict\" }}>\n <Box\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n borderBottom: 1,\n borderColor: \"divider\",\n height: 50,\n }}\n >\n <Tabs\n value={tabValue}\n onChange={(_, newValue) =>\n setTabValue(newValue as TabValueList)\n }\n >\n <Tab\n label=\"Result\"\n value=\"result\"\n sx={{ fontSize: \"0.75rem\", textTransform: \"none\" }}\n />\n {(check.type === \"query\" || check.type === \"query_diff\") && (\n <Tab\n label=\"Query\"\n value=\"query\"\n sx={{ fontSize: \"0.75rem\", textTransform: \"none\" }}\n />\n )}\n </Tabs>\n <Box sx={{ flexGrow: 1 }} />\n <Stack direction=\"row\" spacing={1} sx={{ mr: \"10px\" }}>\n {RunResultView && (\n <MuiTooltip title=\"Rerun\">\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n size=\"small\"\n onClick={() => handleRerun()}\n disabled={\n featureToggles.disableDatabaseQuery || isRunning\n }\n startIcon={<PiRepeat />}\n sx={{ textTransform: \"none\" }}\n >\n {isRunning ? \"Running...\" : \"Rerun\"}\n </Button>\n </MuiTooltip>\n )}\n <Button\n variant=\"outlined\"\n color=\"neutral\"\n disabled={\n isDisabledByNoResult(check.type, run) ||\n tabValue !== \"result\"\n }\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n size=\"small\"\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 startIcon={<PiCopy />}\n sx={{ textTransform: \"none\" }}\n >\n Copy to Clipboard\n </Button>\n </Stack>\n </Box>\n <Box sx={{ flex: 1, contain: \"strict\" }}>\n {tabValue === \"result\" && (\n <Box sx={{ 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={RunResultView}\n viewOptions={check.view_options as ViewOptionTypes}\n onViewOptionsChanged={handelUpdateViewOptions}\n onCancel={handleCancel}\n onExecuteRun={handleRerun}\n />\n ) : (\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n bgcolor: isDark ? \"grey.900\" : \"grey.50\",\n height: \"100%\",\n }}\n >\n <Stack spacing={2} alignItems=\"center\">\n <Box>\n This action is part of the initial preset and has\n not been performed yet. Once performed, the result\n will be shown here.\n </Box>\n <SetupConnectionPopover\n display={featureToggles.mode === \"metadata only\"}\n >\n <Button\n onClick={handleRerun}\n variant=\"contained\"\n size=\"small\"\n disabled={featureToggles.disableDatabaseQuery}\n >\n Run Query\n </Button>\n </SetupConnectionPopover>\n </Stack>\n </Box>\n ))}\n {check.type === \"schema_diff\" && (\n <SchemaDiffView\n key={check.check_id}\n check={check}\n ref={ref}\n />\n )}\n {check.type === \"lineage_diff\" && (\n <LineageDiffView\n key={check.check_id}\n check={check}\n ref={lineageViewRef}\n />\n )}\n </Box>\n )}\n {tabValue === \"query\" &&\n (check.type === \"query\" ||\n check.type === \"query_diff\" ||\n check.type === \"query_base\") && (\n <Box sx={{ height: \"100%\", width: \"100%\" }}>\n {(check.params as QueryParams).base_sql_template ? (\n <DualSqlEditor\n value={\n (check.params as QueryDiffParams).sql_template || \"\"\n }\n baseValue={\n (check.params as QueryDiffParams)\n .base_sql_template ?? \"\"\n }\n options={{ readOnly: true }}\n />\n ) : (\n <SqlEditor\n value={\n (check.params as QueryRunParams).sql_template || \"\"\n }\n options={{ readOnly: true }}\n />\n )}\n </Box>\n )}\n </Box>\n </Box>\n </Box>\n <MuiDialog\n open={isPresetCheckTemplateOpen}\n onClose={() => setIsPresetCheckTemplateOpen(false)}\n maxWidth=\"md\"\n fullWidth\n >\n <DialogTitle>Preset Check Template</DialogTitle>\n <DialogContent>\n <Typography variant=\"subtitle2\" fontWeight=\"bold\" sx={{ mb: 2 }}>\n Please{\" \"}\n <Typography\n component=\"span\"\n sx={{\n cursor: \"pointer\",\n \"&:hover\": { textDecoration: \"underline\" },\n color: \"primary.main\",\n }}\n onClick={async () => {\n await navigator.clipboard.writeText(presetCheckTemplate);\n successToast(\"Copied the template to the clipboard\");\n }}\n >\n copy\n </Typography>{\" \"}\n the following template and paste it into the{\" \"}\n <Box\n component=\"span\"\n sx={{ px: 0.5, bgcolor: \"error.light\", borderRadius: 0.5 }}\n >\n recce.yml\n </Box>{\" \"}\n file.\n </Typography>\n <PresetCheckTemplateView yamlTemplate={presetCheckTemplate} />\n </DialogContent>\n <DialogActions>\n <IconButton\n size=\"small\"\n onClick={() => setIsPresetCheckTemplateOpen(false)}\n sx={{ position: \"absolute\", top: 8, right: 8 }}\n >\n <IoClose />\n </IconButton>\n </DialogActions>\n </MuiDialog>\n </VSplit>\n </Grid>\n {/* Timeline/Activity panel - fixed 20% width, hidden on mobile */}\n {cloudMode && (\n <Grid\n size={3}\n sx={{\n height: \"100%\",\n overflow: \"hidden\",\n flexShrink: 0,\n display: { xs: \"none\", md: \"block\" },\n }}\n >\n <CheckTimeline checkId={checkId} />\n </Grid>\n )}\n </Grid>\n );\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 Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport React from \"react\";\nimport { TbChecklist, TbPlus } from \"react-icons/tb\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check } from \"@/lib/api/checks\";\nimport { createSchemaDiffCheck } from \"@/lib/api/schemacheck\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\n\nexport const CheckEmptyState = () => {\n const queryClient = useQueryClient();\n const [, setLocation] = useAppLocation();\n const { apiClient } = useApiConfig();\n\n const { mutate: createSchemaCheck, isPending } = useMutation({\n mutationFn: () =>\n createSchemaDiffCheck({ select: \"state:modified\" }, apiClient),\n onSuccess: async (check: Check) => {\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(`/checks/?id=${check.check_id}`);\n },\n });\n\n const handleCreateSchemaCheck = () => {\n createSchemaCheck();\n };\n\n return (\n <Box\n sx={{\n height: \"100%\",\n width: \"100%\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n }}\n >\n <Stack\n spacing={3}\n sx={{ textAlign: \"center\", maxWidth: \"400px\", alignItems: \"center\" }}\n >\n <Box component={TbChecklist} sx={{ fontSize: 64, color: \"grey.400\" }} />\n\n <Stack spacing={1}>\n <Typography variant=\"h5\" sx={{ color: \"grey.600\" }}>\n No checks yet\n </Typography>\n <Typography sx={{ color: \"grey.500\" }}>\n Checks help you validate data quality and catch issues.\n </Typography>\n </Stack>\n\n <Stack spacing={1.5} sx={{ width: \"100%\" }}>\n <Typography\n sx={{ fontSize: \"0.875rem\", color: \"grey.600\", fontWeight: 500 }}\n >\n Get started with your first check:\n </Typography>\n\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={handleCreateSchemaCheck}\n disabled={isPending}\n size=\"large\"\n fullWidth\n startIcon={<TbPlus />}\n >\n Create Schema Diff Check\n </Button>\n\n <Typography sx={{ fontSize: \"0.75rem\", color: \"grey.400\", mt: 0.5 }}>\n The schema checks compare modified models between environments to\n detect changes, additions, or removals.\n </Typography>\n </Stack>\n </Stack>\n </Box>\n );\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { waitRun } from \"@/lib/api/runs\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\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 { apiClient } = useApiConfig();\n const { error, data: run } = useQuery({\n queryKey: cacheKeys.run(runId),\n queryFn: async () => waitRun(runId, undefined, apiClient),\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 Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\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 { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useRecceActionContext } from \"@/lib/hooks/RecceActionContext\";\nimport { findByRunType } from \"../run/registry\";\nimport \"simplebar/dist/simplebar.min.css\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { PiX } from \"react-icons/pi\";\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 { apiClient } = useApiConfig();\n const { data: fetchedRun } = useQuery({\n queryKey: cacheKeys.run(run.run_id),\n queryFn: async () => {\n return await waitRun(run.run_id, undefined, apiClient);\n },\n enabled: run.status === \"running\",\n retry: false,\n });\n\n const IconComponent: IconType = findByRunType(run.type).icon;\n const checkId = run.check_id;\n const hideAddToChecklist = featureToggles.disableUpdateChecklist;\n\n return (\n <Box\n sx={(theme) => ({\n minWidth: \"200px\",\n display: \"flex\",\n flexDirection: \"column\",\n width: \"100%\",\n p: \"5px 20px\",\n cursor: \"pointer\",\n borderBottom: \"solid 1px\",\n borderBottomColor: \"divider\",\n borderLeft: \"4px solid\",\n borderLeftColor: isSelected ? \"amber.400\" : \"transparent\",\n backgroundColor: isSelected\n ? theme.palette.mode === \"dark\"\n ? \"amber.900\"\n : \"amber.50\"\n : \"transparent\",\n \"&:hover\": {\n bgcolor: isSelected\n ? theme.palette.mode === \"dark\"\n ? \"amber.800\"\n : \"orange.50\"\n : theme.palette.mode === \"dark\"\n ? \"grey.800\"\n : \"grey.200\",\n },\n })}\n onClick={() => {\n onSelectRun(run.run_id);\n }}\n >\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"12px\" }}\n onClick={() => {\n return void 0;\n }}\n >\n <IconComponent />\n <Box\n className=\"no-track-pii-safe\"\n sx={{\n flex: 1,\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n color: run.name ? \"inherit\" : \"grey.500\",\n fontSize: \"11pt\",\n fontWeight: 500,\n }}\n >\n {(run.name ?? \"\").trim() || \"<no name>\"}\n </Box>\n {checkId ? (\n <MuiTooltip title=\"Go to Check\">\n <Typography\n component=\"span\"\n aria-label=\"Go to Check\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onGoToCheck(checkId);\n }}\n >\n <FaCheckCircle color=\"green\" />\n </Typography>\n </MuiTooltip>\n ) : !hideAddToChecklist ? (\n <MuiTooltip title=\"Add to Checklist\">\n <Typography\n component=\"span\"\n aria-label=\"Add to Checklist\"\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n trackHistoryAction({ name: \"add_to_checklist\" });\n onAddToChecklist(run.run_id);\n }}\n >\n <FaRegCheckCircle />\n </Typography>\n </MuiTooltip>\n ) : null}\n </Box>\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"start\",\n fontSize: \"11pt\",\n color: \"grey.500\",\n gap: \"3px\",\n alignItems: \"center\",\n }}\n >\n <RunStatusAndDate run={fetchedRun ?? run} />\n </Box>\n </Box>\n );\n};\n\nconst DateSegmentItem = ({ runAt }: { runAt?: string }) => {\n const dateTime = runAt ? formatRunDate(new Date(runAt)) : null;\n\n return (\n <Box\n sx={{\n minWidth: \"200px\",\n width: \"100%\",\n p: \"5px 20px\",\n borderBottom: \"solid 1px\",\n borderBottomColor: \"divider\",\n color: \"grey.500\",\n fontSize: \"11pt\",\n }}\n >\n {dateTime}\n </Box>\n );\n};\n\nexport const RunList = () => {\n const { closeHistory } = useRecceActionContext();\n const { apiClient } = useApiConfig();\n const { data: runs, isLoading } = useQuery({\n queryKey: cacheKeys.runs(),\n queryFn: async () => {\n return await listRuns(apiClient);\n },\n retry: false,\n });\n\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", height: \"100%\" }}>\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{\n width: \"100%\",\n flex: \"0 0 54px\",\n px: \"24px 8px\",\n borderBottom: \"solid 1px\",\n borderBottomColor: \"divider\",\n }}\n >\n <Typography variant=\"h6\">History</Typography>\n <Box sx={{ flex: 1 }} />\n <IconButton\n aria-label=\"Close History\"\n onClick={() => {\n trackHistoryAction({ name: \"hide\" });\n closeHistory();\n }}\n >\n <PiX />\n </IconButton>\n </Stack>\n <Box sx={{ flex: \"1 1 auto\" }}>\n {isLoading ? (\n \"Loading...\"\n ) : runs?.length === 0 ? (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n height: \"100%\",\n color: \"grey.400\",\n }}\n >\n No runs\n </Box>\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 </Box>\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 { apiClient } = useApiConfig();\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(\n async (clickedRunId: string) => {\n const check = await createCheckByRun(clickedRunId, undefined, apiClient);\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n setLocation(`/checks/?id=${check.check_id}`);\n },\n [setLocation, queryClient, apiClient],\n );\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 from \"@mui/material/Box\";\nimport Grid from \"@mui/material/Grid\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { ReactNode } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FiInfo } from \"react-icons/fi\";\nimport { token } from \"@/components/ui/mui-theme\";\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;\n} {\n const greenColor = String(token(\"colors.green.solid\"));\n const redColor = String(token(\"colors.red.solid\"));\n const amberColor = String(token(\"colors.amber.emphasized\"));\n\n if (changeStatus === \"added\") {\n return { color: greenColor, icon: IconAdded };\n } else if (changeStatus === \"removed\") {\n return { color: redColor, icon: IconRemoved };\n } else if (changeStatus === \"modified\") {\n return { color: amberColor, icon: IconModified };\n } else if (changeStatus === \"col_added\") {\n return { color: greenColor, icon: IconAdded };\n } else if (changeStatus === \"col_removed\") {\n return { color: redColor, icon: IconRemoved };\n } else if (changeStatus === \"col_changed\") {\n return { color: amberColor, icon: IconModified };\n } else if (changeStatus === \"folder_changed\") {\n return { color: amberColor, 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 <Stack alignItems=\"stretch\">\n <Typography sx={{ fontSize: \"0.875rem\", color: \"grey.600\" }}>\n {name}\n {tip && (\n <MuiTooltip title={tip}>\n <Box sx={{ display: \"inline-block\" }}>\n <Box\n component={FiInfo}\n sx={{ mx: \"2px\", fontSize: 12, verticalAlign: \"middle\" }}\n />\n </Box>\n </MuiTooltip>\n )}\n </Typography>\n {value}\n </Stack>\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 <Stack alignItems=\"stretch\">\n <Stack\n direction=\"row\"\n alignItems=\"center\"\n sx={{ fontSize: \"0.875rem\", color: \"grey.600\" }}\n >\n {icon && (\n <Box component={icon} sx={{ mr: \"5px\", color, fontSize: \"1rem\" }} />\n )}\n {label}\n </Stack>\n <Typography sx={{ fontSize: \"0.875rem\" }}>{value}</Typography>\n </Stack>\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 container\n sx={{\n mb: \"10px\",\n borderTop: \"1px solid\",\n borderColor: \"divider\",\n p: \"2.5vw\",\n }}\n >\n <Grid size={6} sx={{ borderColor: \"divider\" }}>\n <SummaryText\n name=\"Code Changes\"\n value={\n <Grid container sx={{ width: \"100%\" }}>\n <Grid size={4}>\n <ChangeStatusCountLabel changeStatus=\"added\" value={adds} />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"removed\"\n value={removes}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"modified\"\n value={modifies}\n />\n </Grid>\n </Grid>\n }\n />\n </Grid>\n <Grid\n size={6}\n sx={{ borderLeft: \"1px solid\", borderLeftColor: \"divider\", pl: \"12px\" }}\n >\n <SummaryText\n name=\"Column Changes\"\n value={\n <Grid container sx={{ width: \"100%\" }}>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_added\"\n value={col_added}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_removed\"\n value={col_removed}\n />\n </Grid>\n <Grid size={4}>\n <ChangeStatusCountLabel\n changeStatus=\"col_changed\"\n value={col_changed}\n />\n </Grid>\n </Grid>\n }\n />\n </Grid>\n </Grid>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Card from \"@mui/material/Card\";\nimport CardContent from \"@mui/material/CardContent\";\nimport CardHeader from \"@mui/material/CardHeader\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\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 sx={{ maxWidth: 500 }}>\n <CardHeader\n title={\n <Typography sx={{ fontSize: 18, fontWeight: \"bold\" }}>\n {props.title}\n </Typography>\n }\n subheader={\n <Stack direction=\"row\" spacing=\"8px\" sx={{ p: \"16px\" }}>\n <ResourceTypeTag node={node} />\n {node.data.resourceType === \"model\" && (\n <RowCountDiffTag node={node} />\n )}\n </Stack>\n }\n />\n <CardContent>\n <Box sx={{ display: \"flex\" }}>\n <SchemaView\n base={node.data.data.base}\n current={node.data.data.current}\n />\n </Box>\n </CardContent>\n </Card>\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 <Box\n sx={{\n width: \"100%\",\n pb: \"10px\",\n mb: \"20px\",\n mt: \"20px\",\n }}\n >\n <Typography variant=\"h5\" sx={{ fontSize: 24 }}>\n Schema Summary\n </Typography>\n </Box>\n <Box sx={{ width: \"100%\", pb: \"10px\", mb: \"20px\" }}>\n {changedNodes.length === 0 ? (\n <Typography sx={{ fontSize: 18, color: \"grey.600\" }}>\n No schema changes detected.\n </Typography>\n ) : (\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(auto-fill, minmax(400px, 1fr))\",\n gap: \"2vw\",\n p: \"2.5vw\",\n width: \"100%\",\n bgcolor: \"lightgray\",\n }}\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 </Box>\n )}\n </Box>\n </>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Divider from \"@mui/material/Divider\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\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 <Stack sx={{ width: \"100%\", minHeight: \"650px\" }}>\n <Box sx={{ width: \"100%\", pb: \"10px\", mb: \"20px\" }}>\n <Typography variant=\"h5\" sx={{ fontSize: 24 }}>\n Change Summary\n </Typography>\n </Box>\n {lineageGraph && (\n <>\n <ChangeSummary lineageGraph={lineageGraph} />\n <Divider />\n <SchemaSummary lineageGraph={lineageGraph} />\n </>\n )}\n </Stack>\n </>\n );\n}\n","import MuiAvatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport Divider from \"@mui/material/Divider\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Menu from \"@mui/material/Menu\";\nimport MenuItem from \"@mui/material/MenuItem\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { type MouseEvent, useState } from \"react\";\nimport { FaCloud, FaUser } from \"react-icons/fa\";\nimport { RECCE_SUPPORT_CALENDAR_URL } from \"@/constants/urls\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { fetchGitHubAvatar, fetchUser } from \"@/lib/api/user\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\n\nexport default function AvatarDropdown() {\n const { apiClient } = useApiConfig();\n const {\n data: user,\n isLoading,\n error,\n } = useQuery({\n queryKey: cacheKeys.user(),\n queryFn: () => fetchUser(apiClient),\n retry: false,\n });\n\n const { data: avatarUrl } = useQuery({\n queryKey: [\"github-avatar\", user?.id],\n queryFn: () => (user ? fetchGitHubAvatar(user.id) : Promise.resolve(null)),\n enabled: !!user?.id && user.login_type === \"github\",\n retry: false,\n staleTime: 5 * 60 * 1000, // Cache for 5 minutes\n });\n\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n\n const handleClick = (event: MouseEvent<HTMLElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const handleClose = () => {\n setAnchorEl(null);\n };\n\n const showUserInfo = !isLoading && !error && user;\n\n // Get initials for avatar fallback\n const getInitials = (name?: string) => {\n if (!name) return \"U\";\n return name.charAt(0).toUpperCase();\n };\n\n return (\n <>\n {isLoading ? (\n <Box\n onClick={handleClick}\n sx={{\n width: 32,\n height: 32,\n borderRadius: \"50%\",\n bgcolor: \"background.paper\",\n color: \"primary.main\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n cursor: \"pointer\",\n }}\n >\n <CircularProgress size={16} />\n </Box>\n ) : (\n <MuiAvatar\n onClick={handleClick}\n src={avatarUrl || undefined}\n sx={{\n width: 28,\n height: 28,\n cursor: \"pointer\",\n outline: \"1px solid white\",\n fontSize: \"0.875rem\",\n }}\n >\n {getInitials(user?.login)}\n </MuiAvatar>\n )}\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={handleClose}\n slotProps={{\n paper: {\n sx: {\n bgcolor: \"background.paper\",\n borderColor: \"divider\",\n boxShadow: 3,\n minWidth: 180,\n },\n },\n }}\n >\n <Box sx={{ px: 2, py: 1.5 }}>\n {isLoading && (\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1 }}>\n <Typography variant=\"body2\" color=\"text.primary\">\n Loading...\n </Typography>\n <CircularProgress size={16} />\n </Box>\n )}\n {error && (\n <Typography variant=\"caption\" color=\"error\">\n Failed to load user information\n </Typography>\n )}\n {showUserInfo && (\n <>\n <Typography variant=\"body2\" fontWeight=\"600\" color=\"text.primary\">\n {user.login}\n </Typography>\n {user.email && (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {user.email}\n </Typography>\n )}\n </>\n )}\n </Box>\n <Divider />\n <MenuItem\n onClick={() => {\n window.open(\"https://cloud.datarecce.io/\", \"_blank\");\n handleClose();\n }}\n >\n <ListItemIcon>\n <FaCloud />\n </ListItemIcon>\n <ListItemText>Recce Cloud</ListItemText>\n </MenuItem>\n <MenuItem\n onClick={() => {\n window.open(RECCE_SUPPORT_CALENDAR_URL, \"_blank\");\n handleClose();\n }}\n >\n <ListItemIcon>\n <FaUser />\n </ListItemIcon>\n <ListItemText>Get live support</ListItemText>\n </MenuItem>\n </Menu>\n </>\n );\n}\n","\"use client\";\n\nimport Badge from \"@mui/material/Badge\";\nimport Box from \"@mui/material/Box\";\nimport { IoWarning } from \"react-icons/io5\";\nimport { useIdleTimeout } from \"@/lib/hooks/IdleTimeoutContext\";\nimport { formatDuration } from \"@/lib/utils/formatTime\";\n\n/**\n * Warning threshold in seconds - badge appears when remaining time is below this\n */\nconst WARNING_THRESHOLD_SECONDS = 60;\n\n/**\n * Badge component that displays idle timeout warning countdown\n * Only shows when remaining time is below the warning threshold\n * Styled as a warning indicator to draw user attention\n */\nexport function IdleTimeoutBadge() {\n const { remainingSeconds, isEnabled } = useIdleTimeout();\n\n // Don't render if idle timeout is not configured\n if (!isEnabled || remainingSeconds === null) {\n return null;\n }\n\n // Only show when below warning threshold\n if (remainingSeconds > WARNING_THRESHOLD_SECONDS) {\n return null;\n }\n\n return (\n <Badge\n color=\"warning\"\n variant=\"standard\"\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 1,\n fontSize: \"0.75rem\",\n mr: 2,\n }}\n >\n <Box component={IoWarning} sx={{ display: \"inline-flex\" }} />\n Idle timeout: {formatDuration(remainingSeconds, \"compact\")}\n </Badge>\n );\n}\n","\"use client\";\n\nimport IconButton from \"@mui/material/IconButton\";\nimport Tooltip from \"@mui/material/Tooltip\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useState } from \"react\";\nimport { PiMoon, PiSun } from \"react-icons/pi\";\n\n/**\n * Display Mode Toggle - switches between light and dark themes\n *\n * Uses next-themes to persist the user's preference.\n * Default is light theme, with future support for system preference.\n */\nexport default function DisplayModeToggle() {\n const { setTheme, resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n // Avoid hydration mismatch by only rendering after mount\n useEffect(() => {\n setMounted(true);\n }, []);\n\n const toggleTheme = () => {\n setTheme(resolvedTheme === \"dark\" ? \"light\" : \"dark\");\n };\n\n // Don't render anything until mounted to avoid hydration mismatch\n if (!mounted) {\n return (\n <IconButton\n size=\"small\"\n sx={{\n color: \"rgba(255, 255, 255, 0.8)\",\n \"&:hover\": { bgcolor: \"rgba(255, 255, 255, 0.1)\" },\n }}\n disabled\n >\n <PiSun style={{ width: 18, height: 18 }} />\n </IconButton>\n );\n }\n\n const isDark = resolvedTheme === \"dark\";\n\n return (\n <Tooltip title={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}>\n <IconButton\n size=\"small\"\n onClick={toggleTheme}\n sx={{\n color: \"rgba(255, 255, 255, 0.8)\",\n \"&:hover\": { bgcolor: \"rgba(255, 255, 255, 0.1)\" },\n }}\n aria-label={isDark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n >\n {isDark ? (\n <PiSun style={{ width: 18, height: 18 }} />\n ) : (\n <PiMoon style={{ width: 18, height: 18 }} />\n )}\n </IconButton>\n </Tooltip>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Typography from \"@mui/material/Typography\";\nimport React, { useEffect, useMemo } from \"react\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { useVersionNumber } from \"@/lib/api/version\";\n\nexport default function RecceVersionBadge() {\n const { version, latestVersion } = useVersionNumber();\n const versionFormatRegex = useMemo(\n () => new RegExp(\"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\"),\n [],\n );\n\n useEffect(() => {\n if (versionFormatRegex.test(version) && version !== latestVersion) {\n const storageKey = \"recce-update-toast-shown\";\n const hasShownForThisVersion = sessionStorage.getItem(storageKey);\n if (hasShownForThisVersion) {\n return;\n }\n // Defer toast creation to next tick to avoid React's flushSync error\n // This prevents \"flushSync called from inside lifecycle method\" when\n // the toast library tries to immediately update DOM during render cycle\n setTimeout(() => {\n toaster.create({\n id: \"recce-update-available\", // Fixed ID prevents duplicates\n title: \"Update available\",\n description: (\n <span>\n A new version of Recce (v{latestVersion}) is available.\n <br />\n Please run{\" \"}\n <Box\n component=\"code\"\n sx={{\n bgcolor: \"grey.200\",\n px: 0.5,\n py: 0.25,\n borderRadius: 0.5,\n fontFamily: \"monospace\",\n fontSize: \"0.875em\",\n }}\n >\n pip install --upgrade recce\n </Box>{\" \"}\n to update Recce.\n <br />\n <Link\n sx={{\n color: \"primary.main\",\n fontWeight: \"bold\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n href={`https://github.com/DataRecce/recce/releases/tag/v${latestVersion}`}\n target=\"_blank\"\n >\n Click here to view the detail of latest release\n </Link>\n </span>\n ),\n duration: 60 * 1000,\n closable: true,\n });\n sessionStorage.setItem(storageKey, \"true\");\n }, 0);\n }\n }, [version, latestVersion, versionFormatRegex]);\n\n if (!versionFormatRegex.test(version)) {\n // If the version is not in the format of x.y.z, don't apply\n return (\n <Typography\n component=\"span\"\n sx={{\n fontSize: \"sm\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n }}\n >\n {version}\n </Typography>\n );\n }\n\n // Link to the release page on GitHub if the version is in the format of x.y.z\n return (\n <Link\n href={`https://github.com/DataRecce/recce/releases/tag/v${version}`}\n sx={{\n \"&:hover\": { textDecoration: \"none\" },\n fontSize: \"sm\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n }}\n target=\"_blank\"\n >\n {version}\n </Link>\n );\n}\n","import Badge from \"@mui/material/Badge\";\nimport Box from \"@mui/material/Box\";\nimport Link from \"@mui/material/Link\";\nimport Stack from \"@mui/material/Stack\";\nimport { useTheme } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport React, { useState } from \"react\";\nimport { IconType } from \"react-icons\";\nimport { FaGithub, FaQuestionCircle, FaSlack } from \"react-icons/fa\";\nimport { VscGitPullRequest } from \"react-icons/vsc\";\nimport AuthModal from \"@/components/AuthModal/AuthModal\";\nimport AvatarDropdown from \"@/components/app/AvatarDropdown\";\nimport { IdleTimeoutBadge } from \"@/components/timeout/IdleTimeoutBadge\";\nimport { colors } from \"@/components/ui/mui-theme\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport DisplayModeToggle from \"./DisplayModeToggle\";\nimport RecceVersionBadge from \"./RecceVersionBadge\";\n\ninterface LinkIconProps {\n icon: IconType;\n href: string;\n sx?: object;\n}\n\nfunction LinkIcon({ icon: IconComponent, href, sx, ...props }: LinkIconProps) {\n const theme = useTheme();\n return (\n <Link\n sx={{ height: \"20px\", color: \"common.white\", ...sx }}\n href={href}\n target=\"_blank\"\n {...props}\n >\n <IconComponent\n style={{ color: theme.palette.common.white, width: 20, height: 20 }}\n />\n </Link>\n );\n}\n\nexport default function TopBar() {\n const { reviewMode, isDemoSite, envInfo, cloudMode } =\n useLineageGraphContext();\n const { featureToggles, authed } = useRecceInstanceContext();\n const { url: prURL, id: prID } = envInfo?.pullRequest ?? {};\n const demoPrId = prURL ? prURL.split(\"/\").pop() : null;\n const brandLink =\n cloudMode || authed\n ? \"https://cloud.datarecce.io/\"\n : \"https://reccehq.com/\";\n const [showModal, setShowModal] = useState(false);\n\n return (\n <Box\n sx={{\n display: \"flex\",\n gap: \"10px\",\n minHeight: \"40px\",\n alignItems: \"center\",\n bgcolor: colors.brand[400],\n }}\n >\n <Link\n href={brandLink}\n target=\"_blank\"\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n >\n <Box sx={{ display: \"flex\", gap: \"10px\", alignItems: \"center\" }}>\n <Box\n component=\"img\"\n sx={{ width: 20, height: 20, ml: \"18px\" }}\n src=\"/logo/recce-logo-white.png\"\n alt=\"recce-logo-white\"\n />\n <Typography\n variant=\"h4\"\n sx={{\n fontFamily: '\"Montserrat\", sans-serif',\n color: \"common.white\",\n fontSize: \"1.25rem\",\n }}\n >\n RECCE\n </Typography>\n </Box>\n </Link>\n <DisplayModeToggle />\n <RecceVersionBadge />\n {(featureToggles.mode ?? reviewMode) && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n {featureToggles.mode ?? \"review mode\"}\n </Badge>\n )}\n {cloudMode && prID && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box>cloud mode</Box>\n <Box\n sx={{\n borderLeft: \"1px solid rgba(255,255,255,0.8)\",\n pl: \"8px\",\n }}\n >\n <Link\n href={prURL}\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n target=\"_blank\"\n >\n <VscGitPullRequest\n style={{\n color: \"rgba(255,255,255,0.8)\",\n width: 12,\n height: 12,\n marginRight: 2,\n display: \"inline\",\n verticalAlign: \"middle\",\n }}\n />\n <Typography\n component=\"span\"\n sx={{ color: \"rgba(255,255,255,0.8)\", display: \"inline\" }}\n >{`#${String(prID)}`}</Typography>\n </Link>\n </Box>\n </Stack>\n </Badge>\n )}\n {isDemoSite && prURL && demoPrId && (\n <Badge\n sx={{\n fontSize: \"0.875rem\",\n color: \"rgba(255,255,255,0.8)\",\n textTransform: \"uppercase\",\n borderWidth: 1,\n px: 1,\n borderRadius: 0.75,\n borderColor: \"rgba(255,255,255,0.8)\",\n }}\n >\n <Stack direction=\"row\" spacing={1} alignItems=\"center\">\n <Box>demo mode</Box>\n <Box\n sx={{\n borderLeft: \"1px solid rgba(255,255,255,0.8)\",\n pl: \"8px\",\n }}\n >\n <Link\n href={prURL}\n sx={{ \"&:hover\": { textDecoration: \"none\" } }}\n target=\"_blank\"\n >\n <VscGitPullRequest\n style={{\n color: \"rgba(255,255,255,0.8)\",\n width: 12,\n height: 12,\n marginRight: 2,\n display: \"inline\",\n verticalAlign: \"middle\",\n }}\n />\n <Typography\n component=\"span\"\n sx={{ color: \"rgba(255,255,255,0.8)\", display: \"inline\" }}\n >{`#${demoPrId}`}</Typography>\n </Link>\n </Box>\n </Stack>\n </Badge>\n )}\n <Box sx={{ flex: 1 }} />\n\n {(isDemoSite || featureToggles.mode === \"read only\") && (\n <>\n <LinkIcon icon={FaGithub} href=\"https://github.com/DataRecce/recce\" />\n <LinkIcon\n icon={FaSlack}\n href=\"https://getdbt.slack.com/archives/C05C28V7CPP\"\n />\n <LinkIcon\n sx={{ mr: 2 }}\n icon={FaQuestionCircle}\n href=\"https://docs.datarecce.io\"\n />\n </>\n )}\n {!isDemoSite && featureToggles.mode !== \"read only\" && (\n <>\n <IdleTimeoutBadge />\n {authed || cloudMode ? (\n <Box sx={{ mr: 2 }}>\n <AvatarDropdown />\n </Box>\n ) : (\n <>\n <Box\n component=\"button\"\n sx={{\n color: \"common.white\",\n fontSize: \"0.875rem\",\n fontWeight: 600,\n bgcolor: \"brand.700\",\n borderRadius: 1,\n px: 3,\n py: 1,\n mr: 2,\n cursor: \"pointer\",\n border: \"none\",\n }}\n onClick={() => {\n setShowModal(true);\n }}\n >\n Connect to Cloud\n </Box>\n {showModal && (\n <AuthModal\n parentOpen={showModal}\n handleParentClose={setShowModal}\n ignoreCookie\n variant=\"user-profile\"\n />\n )}\n </>\n )}\n </>\n )}\n </Box>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport Checkbox from \"@mui/material/Checkbox\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport TextField from \"@mui/material/TextField\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { AxiosError } from \"axios\";\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { useChecks } from \"@/lib/api/checks\";\nimport { localStorageKeys } from \"@/lib/api/localStorageKeys\";\nimport { rename, saveAs } from \"@/lib/api/state\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { IconEdit, IconSave } from \"../icons\";\nimport { formatRunDateTime } from \"../run/RunStatusAndDate\";\n\nconst useRecceToast = () => {\n const toastSuccess = (message: string) => {\n toaster.create({\n description: message,\n type: \"success\",\n duration: 5000,\n closable: true,\n });\n };\n\n const toastError = (message: string, error?: Error) => {\n let errorMessage = message;\n if (error != null) {\n if (error instanceof AxiosError) {\n errorMessage = `${message}. ${String((error as AxiosError<{ detail: string } | undefined, unknown>).response?.data?.detail)}`;\n } else {\n errorMessage = `${message}. ${error}`;\n }\n }\n\n toaster.create({\n description: errorMessage,\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n };\n\n return { toastSuccess, toastError };\n};\n\nconst useClosePrompt = (prompt: boolean) => {\n useEffect(() => {\n const handleBeforeUnload = (e: BeforeUnloadEvent) => {\n e.preventDefault();\n };\n\n if (prompt) {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n }\n\n return () => {\n if (prompt) {\n window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }\n };\n }, [prompt]);\n};\n\ninterface FilenameState {\n newFileName: string;\n errorMessage?: string;\n modified?: boolean;\n overwriteWithMethod?: \"save\" | \"rename\";\n bypass?: boolean;\n}\n\nexport const Filename = () => {\n const { featureToggles } = useRecceInstanceContext();\n const { fileName, cloudMode, isDemoSite, envInfo } = useLineageGraphContext();\n const { apiClient } = useApiConfig();\n const [modalOpen, setModalOpen] = useState(false);\n const [overwriteOpen, setOverwriteOpen] = useState(false);\n const isStateless = !fileName && !cloudMode && !isDemoSite;\n const { data: checks } = useChecks(isStateless);\n const hasNonPresetChecks =\n checks != undefined &&\n checks.filter((check) => !check.is_preset).length > 0;\n useClosePrompt(isStateless && hasNonPresetChecks);\n\n const [\n { newFileName, errorMessage, modified, overwriteWithMethod, bypass },\n setState,\n ] = useState<FilenameState>({\n newFileName: fileName ?? \"recce_state.json\",\n });\n\n const inputRef = useRef<HTMLInputElement>(null);\n const { toastSuccess, toastError } = useRecceToast();\n const queryClient = useQueryClient();\n\n const handleOpen = () => {\n setState({\n newFileName: fileName ?? \"recce_state.json\",\n modified: !fileName,\n });\n\n setModalOpen(true);\n };\n\n const handleModalClose = () => setModalOpen(false);\n const handleOverwriteClose = () => setOverwriteOpen(false);\n\n const handleAction = async (\n method: \"save\" | \"rename\",\n overwrite?: boolean,\n ) => {\n if (!newFileName) {\n return;\n }\n\n const bypassOverwrite =\n localStorage.getItem(localStorageKeys.bypassSaveOverwrite) === \"true\";\n\n try {\n if (method === \"save\") {\n await saveAs(\n {\n filename: newFileName,\n overwrite: overwrite ?? bypassOverwrite,\n },\n apiClient,\n );\n } else {\n await rename(\n {\n filename: newFileName,\n overwrite: overwrite ?? bypassOverwrite,\n },\n apiClient,\n );\n }\n toastSuccess(\n method === \"save\"\n ? \"Save file successfully\"\n : \"Rename file successfully\",\n );\n await queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n if (bypass) {\n localStorage.setItem(localStorageKeys.bypassSaveOverwrite, \"true\");\n }\n } catch (error: unknown) {\n if (error instanceof AxiosError) {\n if (error.response?.status === 409) {\n setState((s) => ({\n ...s,\n overwriteWithMethod: method,\n }));\n\n setOverwriteOpen(true);\n return;\n }\n }\n toastError(\n method === \"save\" ? \"Save file failed\" : \"Rename file failed\",\n error as Error,\n );\n } finally {\n handleModalClose();\n }\n };\n\n const handleOvewriteBack = () => {\n handleOverwriteClose();\n setModalOpen(true);\n setState((s) => {\n return {\n ...s,\n overwriteWithMethod: undefined,\n };\n });\n };\n\n if (cloudMode || isDemoSite) {\n return <></>;\n }\n\n const titleNewInstance =\n \"New Instance\" + (hasNonPresetChecks ? \" (unsaved)\" : \"\");\n let titleReadOnlyState;\n if (featureToggles.disableSaveToFile && fileName) {\n const generatedAt = envInfo?.stateMetadata?.generated_at;\n const formattedDate = generatedAt\n ? formatRunDateTime(new Date(generatedAt))\n : null;\n titleReadOnlyState = formattedDate\n ? `${fileName} (${formattedDate})`\n : null;\n }\n\n return (\n <>\n <Stack direction=\"row\" alignItems=\"center\" justifyContent=\"center\">\n <Box sx={{ fontWeight: 600 }}>\n {titleReadOnlyState ?? fileName ?? titleNewInstance}\n </Box>\n {!featureToggles.disableSaveToFile && (\n <MuiTooltip\n title={fileName ? \"Change Filename\" : \"Save\"}\n enterDelay={1000}\n >\n <IconButton\n onClick={handleOpen}\n aria-label={fileName ? \"Change Filename\" : \"Save\"}\n size=\"small\"\n >\n <Box\n component={fileName ? IconEdit : IconSave}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </MuiTooltip>\n )}\n </Stack>\n <MuiDialog open={modalOpen} onClose={handleModalClose}>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n {fileName ? \"Change Filename\" : \"Save File\"}\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleModalClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <TextField\n inputRef={inputRef}\n value={newFileName}\n label=\"File name\"\n placeholder=\"Enter filename\"\n error={!!errorMessage}\n helperText={errorMessage}\n fullWidth\n size=\"small\"\n sx={{ mt: 1 }}\n onChange={(e) => {\n const value = e.target.value;\n let newErrorMessage: string | undefined = undefined;\n\n if (!value) {\n newErrorMessage = \"Filename cannot be empty.\";\n } else if (!value.endsWith(\".json\")) {\n newErrorMessage = \"Filename must end with .json.\";\n } else if (!/^[a-zA-Z0-9 _-]+\\.json$/.test(value)) {\n newErrorMessage =\n \"Invalid filename. Only alphanumeric, space, _ and - are allowed.\";\n } else if (fileName && value === fileName) {\n newErrorMessage = \"Filename is the same as the current one.\";\n }\n\n setState((s) => {\n return {\n ...s,\n modified: true,\n newFileName: value,\n errorMessage: newErrorMessage,\n };\n });\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n if (errorMessage) {\n return;\n }\n\n if (!fileName) {\n void handleAction(\"save\");\n } else {\n void handleAction(\"rename\");\n }\n } else if (e.key === \"Escape\") {\n handleModalClose();\n }\n }}\n />\n </DialogContent>\n <DialogActions sx={{ gap: \"5px\" }}>\n <Button\n size=\"small\"\n color={fileName ? \"inherit\" : \"iochmara\"}\n variant=\"contained\"\n onClick={async () => {\n await handleAction(\"save\");\n }}\n disabled={!newFileName || !!errorMessage || !modified}\n >\n {fileName ? \"Save as New File\" : \"Confirm\"}\n </Button>\n {fileName && (\n <Button\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={async () => {\n await handleAction(\"rename\");\n }}\n disabled={!newFileName || !!errorMessage || !modified}\n >\n Rename\n </Button>\n )}\n </DialogActions>\n </MuiDialog>\n <MuiDialog open={overwriteOpen} onClose={handleOverwriteClose}>\n <DialogTitle sx={{ display: \"flex\", alignItems: \"center\" }}>\n Overwrite File?\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleOverwriteClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent\n sx={{\n borderTop: \"solid 1px\",\n borderBottom: \"solid 1px\",\n borderColor: \"divider\",\n }}\n onKeyDown={(e) => {\n e.stopPropagation();\n }}\n >\n <Typography sx={{ fontSize: \"12pt\" }}>\n {overwriteWithMethod === \"save\"\n ? \"Saving a file with this name will overwrite the existing file. Are you sure you wish to continue?\"\n : \"Renaming the file with this name will overwrite the existing file. Are you sure you wish to continue?\"}\n </Typography>\n\n <FormControlLabel\n control={\n <Checkbox\n size=\"small\"\n checked={bypass}\n onChange={(e) => {\n setState((s) => ({ ...s, bypass: e.target.checked }));\n }}\n />\n }\n label={\n <Typography sx={{ fontWeight: \"bold\", pt: \"8px\" }}>\n Don't show this again\n </Typography>\n }\n />\n </DialogContent>\n <DialogActions sx={{ gap: \"5px\" }}>\n <Button variant=\"outlined\" onClick={handleOvewriteBack} size=\"small\">\n Back\n </Button>\n <Button\n size=\"small\"\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => {\n if (!overwriteWithMethod) {\n return;\n }\n\n void handleAction(overwriteWithMethod, true);\n handleOverwriteClose();\n }}\n >\n Overwrite\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n};\n","import Box from \"@mui/material/Box\";\nimport IconButton from \"@mui/material/IconButton\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport { format } from \"date-fns\";\nimport saveAs from \"file-saver\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { exportState } from \"@/lib/api/state\";\nimport { trackStateAction } from \"@/lib/api/track\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { IconExport } from \"../icons\";\n\nexport function StateExporter() {\n const { featureToggles } = useRecceInstanceContext();\n const { apiClient } = useApiConfig();\n\n const handleExport = async () => {\n try {\n const jsonData = await exportState(apiClient);\n const jsonString = JSON.stringify(jsonData, null, 2);\n const blob = new Blob([jsonString], { type: \"application/json\" });\n\n const now = new Date();\n const fileName = `recce-state-${format(now, \"yyyy-MM-dd-HH-mm-ss\")}.json`;\n\n saveAs(blob, fileName);\n } catch (error) {\n console.error(\"Export failed\", error);\n toaster.create({\n title: \"Export failed\",\n description: String(error),\n type: \"error\",\n duration: 5000,\n closable: true,\n });\n }\n };\n\n return (\n <MuiTooltip title=\"Export\">\n <IconButton\n size=\"small\"\n aria-label=\"Export state\"\n onClick={async () => {\n await handleExport();\n trackStateAction({ name: \"export\" });\n }}\n disabled={featureToggles.disableExportStateFile}\n >\n <Box\n component={IconExport}\n sx={{ verticalAlign: \"middle\", width: \"16px\", height: \"16px\" }}\n />\n </IconButton>\n </MuiTooltip>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Stack from \"@mui/material/Stack\";\nimport Typography from \"@mui/material/Typography\";\nimport { useEffect, useState } from \"react\";\nimport { PiCheckCircle, PiCopy } from \"react-icons/pi\";\nimport { TbCloudUpload } from \"react-icons/tb\";\nimport { useCopyToClipboard, useInterval } from \"usehooks-ts\";\nimport AuthModal from \"@/components/AuthModal/AuthModal\";\nimport { trackShareState } from \"@/lib/api/track\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceShareStateContext } from \"@/lib/hooks/RecceShareStateContext\";\nimport { useClipBoardToast } from \"@/lib/hooks/useClipBoardToast\";\n\nconst LOADING_MESSAGES = [\n \"Processing...\", // 0-30s\n \"Still processing, please wait...\", // 30-60s\n \"Almost there, thanks for your patience...\", // 60s+\n];\n\nexport function TopLevelShare() {\n const { successToast, failToast } = useClipBoardToast();\n const [, copyToClipboard] = useCopyToClipboard();\n const { authed } = useRecceInstanceContext();\n const { shareUrl, isLoading, error, handleShareClick } =\n useRecceShareStateContext();\n const [showModal, setShowModal] = useState(false);\n const [messageIndex, setMessageIndex] = useState(0);\n const [prevIsLoading, setPrevIsLoading] = useState(isLoading);\n\n // Reset message index when loading starts (during render)\n if (isLoading !== prevIsLoading) {\n setPrevIsLoading(isLoading);\n if (isLoading) {\n // Loading just started, reset to 0\n setMessageIndex(0);\n }\n }\n\n // Increment message index every 30 seconds while loading\n useInterval(\n () => {\n setMessageIndex((prev) =>\n Math.min(prev + 1, LOADING_MESSAGES.length - 1),\n );\n },\n isLoading ? 30000 : null,\n );\n\n // Show error toast when sharing fails\n useEffect(() => {\n if (error) {\n failToast(\"Failed to share state\", error);\n }\n }, [error, failToast]);\n\n const handleCopy = async () => {\n try {\n await copyToClipboard(String(shareUrl));\n successToast(\"Copied the link to clipboard\");\n } catch (error) {\n failToast(\"Failed to copy the link\", error);\n }\n };\n\n if (!authed) {\n return (\n <Stack direction=\"row\" sx={{ flex: 1, alignItems: \"center\" }}>\n <Button\n size=\"xsmall\"\n color=\"neutral\"\n variant=\"outlined\"\n onClick={() => {\n setShowModal(true);\n }}\n startIcon={<TbCloudUpload />}\n >\n Share\n </Button>\n {showModal && (\n <AuthModal\n parentOpen={showModal}\n handleParentClose={setShowModal}\n ignoreCookie\n variant=\"enable-share\"\n />\n )}\n </Stack>\n );\n }\n\n return (\n <Stack direction=\"row\" sx={{ flex: 1, alignItems: \"center\", gap: \"5px\" }}>\n <Button\n size=\"xsmall\"\n variant=\"outlined\"\n color=\"neutral\"\n startIcon={<TbCloudUpload />}\n endIcon={\n shareUrl ? (\n <Box component={PiCheckCircle} sx={{ color: \"success.main\" }} />\n ) : undefined\n }\n onClick={async () => {\n await handleShareClick();\n trackShareState({ name: \"create\" });\n }}\n disabled={isLoading}\n >\n {isLoading ? \"Sharing...\" : \"Share\"}\n </Button>\n {isLoading && (\n <Typography sx={{ fontSize: 14, color: \"grey.500\" }}>\n {LOADING_MESSAGES[messageIndex]}\n </Typography>\n )}\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\">\n {shareUrl && (\n <>\n <Box\n sx={{\n overflowX: \"auto\",\n whiteSpace: \"nowrap\",\n maxWidth: \"350px\",\n }}\n >\n <Typography sx={{ fontSize: 14 }}>{shareUrl}</Typography>\n </Box>\n <IconButton\n size=\"small\"\n aria-label=\"Copy the share URL\"\n onClick={async () => {\n await handleCopy();\n trackShareState({ name: \"copy\" });\n }}\n >\n <PiCopy />\n </IconButton>\n </>\n )}\n </Stack>\n </Stack>\n );\n}\n","import Box from \"@mui/material/Box\";\nimport Button from \"@mui/material/Button\";\nimport CircularProgress from \"@mui/material/CircularProgress\";\nimport MuiDialog from \"@mui/material/Dialog\";\nimport DialogActions from \"@mui/material/DialogActions\";\nimport DialogContent from \"@mui/material/DialogContent\";\nimport DialogTitle from \"@mui/material/DialogTitle\";\nimport FormControlLabel from \"@mui/material/FormControlLabel\";\nimport IconButton from \"@mui/material/IconButton\";\nimport Radio from \"@mui/material/Radio\";\nimport RadioGroup from \"@mui/material/RadioGroup\";\nimport Stack from \"@mui/material/Stack\";\nimport MuiTooltip from \"@mui/material/Tooltip\";\nimport Typography from \"@mui/material/Typography\";\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport React, { useCallback, useState } from \"react\";\nimport { IoClose } from \"react-icons/io5\";\nimport { PiInfo } from \"react-icons/pi\";\nimport { toaster } from \"@/components/ui/toaster\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { isStateSyncing, SyncStateInput, syncState } from \"@/lib/api/state\";\nimport { useApiConfig } from \"@/lib/hooks/ApiConfigContext\";\nimport { useAppLocation } from \"@/lib/hooks/useAppRouter\";\nimport { useRecceInstanceInfo } from \"@/lib/hooks/useRecceInstanceInfo\";\nimport { IconSync } from \"../icons\";\n\nfunction isCheckDetailPage(href: string): boolean {\n const pattern =\n /^\\/checks\\/([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$/;\n return pattern.test(href);\n}\n\nexport function StateSpinner() {\n return (\n <MuiTooltip title=\"Syncing\">\n <Box sx={{ mx: \"10px\" }}>\n <CircularProgress size={20} />\n </Box>\n </MuiTooltip>\n );\n}\n\nexport function StateSynchronizer() {\n const [isSyncing, setSyncing] = useState(false);\n const queryClient = useQueryClient();\n const { apiClient } = useApiConfig();\n const [location, setLocation] = useAppLocation();\n const [open, setOpen] = useState(false);\n const [syncOption, setSyncOption] = useState<\n \"overwrite\" | \"revert\" | \"merge\" | \"\"\n >(\"\");\n const { data: instanceInfo } = useRecceInstanceInfo();\n\n const handleClose = () => setOpen(false);\n\n const handleSync = useCallback(\n async (input: SyncStateInput) => {\n setOpen(false);\n setSyncing(true);\n\n const response = await syncState(input, apiClient);\n if (response.status === \"conflict\") {\n setOpen(true);\n setSyncing(false);\n return;\n }\n\n while (await isStateSyncing(apiClient)) {\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n toaster.create({\n description: \"Sync Completed\",\n type: \"success\",\n duration: 5000,\n closable: true,\n });\n\n setSyncing(false);\n setSyncOption(\"\");\n\n await queryClient.invalidateQueries({ queryKey: cacheKeys.lineage() });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.checks() });\n await queryClient.invalidateQueries({ queryKey: cacheKeys.runs() });\n\n if (isCheckDetailPage(location)) {\n setLocation(\"/checks\");\n }\n },\n [queryClient, location, setLocation, apiClient],\n );\n\n if (isSyncing) return <StateSpinner />;\n return (\n <>\n <MuiTooltip title=\"Sync with Cloud\">\n <IconButton\n size=\"small\"\n aria-label=\"Sync state\"\n onClick={() =>\n handleSync(instanceInfo?.session_id ? { method: \"merge\" } : {})\n }\n >\n <Box\n component={IconSync}\n sx={{ fontSize: 16, verticalAlign: \"middle\" }}\n />\n </IconButton>\n </MuiTooltip>\n <MuiDialog open={open} onClose={handleClose}>\n <DialogTitle\n sx={{ display: \"flex\", alignItems: \"center\", fontWeight: \"bold\" }}\n >\n Sync with Cloud\n <Box sx={{ flexGrow: 1 }} />\n <IconButton size=\"small\" onClick={handleClose}>\n <IoClose />\n </IconButton>\n </DialogTitle>\n <DialogContent>\n <Typography>\n New changes have been detected in the cloud. Please choose a method\n to sync your state\n </Typography>\n <Box sx={{ mt: \"5px\" }}>\n <RadioGroup\n value={syncOption}\n onChange={(e) => {\n setSyncOption(\n e.target.value as \"merge\" | \"overwrite\" | \"revert\",\n );\n }}\n >\n <Stack direction=\"column\">\n {/* Merge */}\n <FormControlLabel\n value=\"merge\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Merge\n <MuiTooltip title=\"This will merge the local and remote states.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n\n {/* Overwrite */}\n <FormControlLabel\n value=\"overwrite\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Overwrite\n <MuiTooltip title=\"This will overwrite the remote state file with the local state.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n\n {/* Revert */}\n <FormControlLabel\n value=\"revert\"\n control={<Radio />}\n label={\n <Stack direction=\"row\" alignItems=\"center\">\n Revert\n <MuiTooltip title=\"This will discard local changes and revert to the cloud state.\">\n <Box\n component={PiInfo}\n sx={{ ml: 2, cursor: \"pointer\" }}\n />\n </MuiTooltip>\n </Stack>\n }\n />\n </Stack>\n </RadioGroup>\n </Box>\n </DialogContent>\n <DialogActions>\n <Button onClick={handleClose} sx={{ mr: 1 }}>\n Cancel\n </Button>\n <Button\n color=\"iochmara\"\n variant=\"contained\"\n onClick={() => handleSync({ method: syncOption || undefined })}\n disabled={!syncOption}\n >\n Sync\n </Button>\n </DialogActions>\n </MuiDialog>\n </>\n );\n}\n","\"use client\";\n\nimport Box from \"@mui/material/Box\";\nimport Tab from \"@mui/material/Tab\";\nimport MuiTabs from \"@mui/material/Tabs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport NextLink from \"next/link\";\nimport { usePathname } from \"next/navigation\";\nimport React, { type ReactNode, useEffect, useMemo, useRef } from \"react\";\nimport { EnvInfo } from \"@/components/app/EnvInfo\";\nimport { Filename } from \"@/components/app/Filename\";\nimport { StateExporter } from \"@/components/app/StateExporter\";\nimport { TopLevelShare } from \"@/components/app/StateSharing\";\nimport { StateSynchronizer } from \"@/components/app/StateSynchronizer\";\nimport { cacheKeys } from \"@/lib/api/cacheKeys\";\nimport { Check, listChecks } from \"@/lib/api/checks\";\nimport { trackNavigation } from \"@/lib/api/track\";\nimport { useLineageGraphContext } from \"@/lib/hooks/LineageGraphContext\";\nimport { useRecceInstanceContext } from \"@/lib/hooks/RecceInstanceContext\";\nimport { useRecceServerFlag } from \"@/lib/hooks/useRecceServerFlag\";\n\n/**\n * Route configuration for tabs\n */\nconst ROUTE_CONFIG = [\n { path: \"/lineage\", name: \"Lineage\" },\n { path: \"/query\", name: \"Query\" },\n { path: \"/checks\", name: \"Checklist\" },\n] as const;\n\ninterface TabBadgeProps<T> {\n queryKey: string[];\n fetchCallback: () => Promise<T>;\n selectCallback?: (data: T) => number;\n}\n\nfunction TabBadge<T>({\n queryKey,\n fetchCallback,\n selectCallback,\n}: TabBadgeProps<T>): ReactNode {\n const {\n data: count,\n isLoading,\n error,\n } = useQuery({\n queryKey: queryKey,\n queryFn: fetchCallback,\n select: selectCallback,\n });\n\n if (isLoading || error || count === 0) {\n return <></>;\n }\n\n return (\n <Box\n bgcolor=\"brand.main\"\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n p={1}\n borderRadius=\"100%\"\n color=\"white\"\n fontWeight={700}\n fontSize=\"0.75rem\"\n >\n <span>{count}</span>\n </Box>\n );\n}\n\nfunction ChecklistBadge(): ReactNode {\n return (\n <TabBadge<Check[]>\n queryKey={cacheKeys.checks()}\n fetchCallback={listChecks}\n selectCallback={(checks: Check[]) => {\n return checks.filter((check) => !check.is_checked).length;\n }}\n />\n );\n}\n\n// NavBar component with Next.js Link navigation\nexport default function NavBar() {\n const pathname = usePathname();\n const { isDemoSite, isLoading, cloudMode } = useLineageGraphContext();\n const { featureToggles } = useRecceInstanceContext();\n const { data: flag, isLoading: isFlagLoading } = useRecceServerFlag();\n\n // Track navigation changes with previous pathname\n const prevPathnameRef = useRef<string | null>(null);\n useEffect(() => {\n if (prevPathnameRef.current && prevPathnameRef.current !== pathname) {\n trackNavigation({ from: prevPathnameRef.current, to: pathname });\n }\n prevPathnameRef.current = pathname;\n }, [pathname]);\n\n // Get current tab value from pathname\n const currentTab = useMemo(() => {\n if (pathname.startsWith(\"/checks\")) return \"/checks\";\n if (pathname.startsWith(\"/query\")) return \"/query\";\n if (pathname.startsWith(\"/runs\")) return \"/runs\";\n return \"/lineage\";\n }, [pathname]);\n\n return (\n <Box sx={{ borderBottom: \"1px solid lightgray\", px: \"12px\" }}>\n {/* Grid layout outside Tabs so MUI Tabs can find tab children */}\n <Box\n sx={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto 1fr\",\n width: \"100%\",\n alignItems: \"center\",\n }}\n >\n {/* Left section: Tabs */}\n <MuiTabs\n value={currentTab}\n sx={{ borderBottom: \"none\", minHeight: \"auto\" }}\n >\n {ROUTE_CONFIG.map(({ path, name }) => {\n const disable = name === \"Query\" && flag?.single_env_onboarding;\n\n // Don't render hidden tabs\n if (disable) {\n return null;\n }\n\n if (name === \"Checklist\" && ChecklistBadge) {\n return (\n <Tab\n key={path}\n value={path}\n disabled={isLoading || isFlagLoading}\n sx={{\n p: 0,\n }}\n label={\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}\n >\n <NextLink\n href={path}\n style={{\n textDecoration: \"none\",\n color: \"inherit\",\n padding: \"0.875rem 1.1875rem\",\n display: \"flex\",\n gap: 3,\n alignItems: \"center\",\n }}\n >\n {name} <ChecklistBadge />\n </NextLink>\n </Box>\n }\n />\n );\n }\n\n return (\n <Tab\n key={path}\n value={path}\n disabled={isLoading || isFlagLoading}\n sx={{\n p: 0,\n }}\n label={\n <Box\n sx={{ display: \"flex\", alignItems: \"center\", gap: \"4px\" }}\n >\n <NextLink\n href={path}\n style={{\n textDecoration: \"none\",\n color: \"inherit\",\n padding: \"0.875rem 1.1875rem\",\n }}\n >\n {name}\n </NextLink>\n </Box>\n }\n />\n );\n })}\n </MuiTabs>\n\n {/* Center section: Filename and TopLevelShare */}\n <Box\n sx={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"12px\",\n justifyContent: \"center\",\n }}\n >\n {!isLoading && !isDemoSite && <Filename />}\n {!isLoading &&\n !isDemoSite &&\n !flag?.single_env_onboarding &&\n !featureToggles.disableShare && <TopLevelShare />}\n </Box>\n\n {/* Right section: EnvInfo, StateSynchronizer, StateExporter */}\n {!isLoading && (\n <Box\n sx={{\n display: \"flex\",\n justifyContent: \"right\",\n alignItems: \"center\",\n mr: \"8px\",\n }}\n >\n <EnvInfo />\n {cloudMode && <StateSynchronizer />}\n <StateExporter />\n </Box>\n )}\n </Box>\n </Box>\n );\n}\n"],"x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12],"mappings":"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"}
|