@@ -5,17 +5,29 @@ import {
55 CollapsibleContent ,
66 CollapsibleHeader ,
77 CollapsiblePanel ,
8- CollapsibleTrigger
8+ CollapsibleTrigger ,
9+ Tooltip ,
10+ TooltipContent ,
11+ TooltipProvider ,
12+ TooltipTrigger
913} from "@zenml-io/react-component-library" ;
1014import { useState } from "react" ;
1115
1216type Props = {
1317 run : PipelineRun ;
1418} ;
1519
20+ const PYTHON_PACKAGES_KEY = "python_packages" ;
21+
1622export function EnvironmentCollapsible ( { run } : Props ) {
1723 const [ open , setOpen ] = useState ( true ) ;
1824
25+ const executionEnvironment = run . metadata ?. orchestrator_environment ;
26+ const clientEnvironment = run . metadata ?. client_environment ;
27+
28+ const normalizedExecutionEnvironment = normalizePythonPackages ( executionEnvironment ?? { } ) ;
29+ const normalizedClientEnvironment = normalizePythonPackages ( clientEnvironment ?? { } ) ;
30+
1931 return (
2032 < CollapsiblePanel open = { open } onOpenChange = { setOpen } >
2133 < CollapsibleHeader intent = "primary" className = "flex items-center gap-[10px]" >
@@ -32,16 +44,65 @@ export function EnvironmentCollapsible({ run }: Props) {
3244 < NestedCollapsible
3345 isInitialOpen
3446 intent = "secondary"
35- title = "Client Environment"
36- data = { run . metadata ?. client_environment }
47+ title = {
48+ < TooltipProvider >
49+ < Tooltip >
50+ < TooltipTrigger asChild >
51+ < span > Client Environment</ span >
52+ </ TooltipTrigger >
53+ < TooltipContent className = "max-w-[200px] whitespace-normal xl:max-w-[300px]" >
54+ Environment where you start your pipeline run by calling the pipeline function.{ " " }
55+ < a
56+ rel = "noopener noreferrer"
57+ className = "link"
58+ href = "https://docs.zenml.io/user-guides/best-practices/configure-python-environments#client-environment-or-the-runner-environment"
59+ target = "_blank"
60+ >
61+ Learn more about client environments
62+ </ a >
63+ </ TooltipContent >
64+ </ Tooltip >
65+ </ TooltipProvider >
66+ }
67+ data = { normalizedClientEnvironment }
3768 />
3869 < NestedCollapsible
3970 isInitialOpen
4071 intent = "secondary"
41- title = "Orchestrator Environment"
42- data = { run . metadata ?. orchestrator_environment }
72+ title = {
73+ < TooltipProvider >
74+ < Tooltip >
75+ < TooltipTrigger asChild >
76+ < span > Execution Environment</ span >
77+ </ TooltipTrigger >
78+ < TooltipContent className = "max-w-[200px] whitespace-normal xl:max-w-[300px]" >
79+ Environment where your ZenML steps get executed.{ " " }
80+ < a
81+ rel = "noopener noreferrer"
82+ className = "link"
83+ href = "https://docs.zenml.io/user-guides/best-practices/configure-python-environments#execution-environments"
84+ target = "_blank"
85+ >
86+ Learn more about exectuion environments
87+ </ a >
88+ </ TooltipContent >
89+ </ Tooltip >
90+ </ TooltipProvider >
91+ }
92+ data = { normalizedExecutionEnvironment }
4393 />
4494 </ CollapsibleContent >
4595 </ CollapsiblePanel >
4696 ) ;
4797}
98+
99+ function normalizePythonPackages ( env : Record < string , unknown > ) {
100+ const pythonPackages = env [ PYTHON_PACKAGES_KEY ] ;
101+ if ( typeof pythonPackages === "string" ) {
102+ return {
103+ ...env ,
104+ [ PYTHON_PACKAGES_KEY ] : pythonPackages . split ( "\n" ) . map ( ( pkg ) => pkg . trim ( ) )
105+ } ;
106+ }
107+ return env ;
108+ }
0 commit comments