11import { useEffect , useState } from "react" ;
22
33import { useValidationIssueNavigation } from "@/components/Editor/hooks/useValidationIssueNavigation" ;
4- import { ActionBlock } from "@/components/shared/ContextPanel/Blocks/ActionBlock" ;
4+ import {
5+ ActionBlock ,
6+ type Action ,
7+ } from "@/components/shared/ContextPanel/Blocks/ActionBlock" ;
58import { ContentBlock } from "@/components/shared/ContextPanel/Blocks/ContentBlock" ;
69import { ListBlock } from "@/components/shared/ContextPanel/Blocks/ListBlock" ;
710import { TextBlock } from "@/components/shared/ContextPanel/Blocks/TextBlock" ;
811import { CopyText } from "@/components/shared/CopyText/CopyText" ;
912import { BlockStack } from "@/components/ui/layout" ;
1013import { useComponentSpec } from "@/providers/ComponentSpecProvider" ;
11- import { getComponentFileFromList } from "@/utils/componentStore" ;
14+ import {
15+ getComponentFileFromList ,
16+ renameComponentFileInList ,
17+ } from "@/utils/componentStore" ;
1218import { USER_PIPELINES_LIST_NAME } from "@/utils/constants" ;
1319
1420import PipelineIO from "../../shared/Execution/PipelineIO" ;
1521import { PipelineValidationList } from "./PipelineValidationList" ;
16- import RenamePipeline from "./RenamePipeline" ;
17- import TooltipButton from "@/components/shared/Buttons/TooltipButton" ;
18- import { Icon } from "@/components/ui/icon" ;
1922import { componentSpecToText } from "@/utils/yaml" ;
2023import { CodeViewer } from "@/components/shared/CodeViewer" ;
24+ import { PipelineNameDialog } from "@/components/shared/Dialogs" ;
25+ import { APP_ROUTES } from "@/routes/router" ;
26+ import useToastNotification from "@/hooks/useToastNotification" ;
27+ import { useLocation , useNavigate } from "@tanstack/react-router" ;
2128
2229const PipelineDetails = ( ) => {
2330 const {
2431 componentSpec,
2532 digest,
2633 isComponentTreeValid,
2734 globalValidationIssues,
35+ saveComponentSpec,
2836 } = useComponentSpec ( ) ;
2937
38+ const notify = useToastNotification ( ) ;
39+ const navigate = useNavigate ( ) ;
40+
41+ const location = useLocation ( ) ;
42+ const pathname = location . pathname ;
43+
44+ const title = componentSpec ?. name ;
45+
3046 const { handleIssueClick, groupedIssues } = useValidationIssueNavigation (
3147 globalValidationIssues ,
3248 ) ;
3349
50+ const [ isRenameDialogOpen , setIsRenameDialogOpen ] = useState ( false ) ;
3451 const [ isYamlFullscreen , setIsYamlFullscreen ] = useState ( false ) ;
3552
3653 // State for file metadata
@@ -40,6 +57,31 @@ const PipelineDetails = () => {
4057 createdBy ?: string ;
4158 } > ( { } ) ;
4259
60+ const isSubmitDisabled = ( name : string ) => {
61+ return name === title ;
62+ } ;
63+
64+ const handleTitleUpdate = async ( name : string ) => {
65+ if ( ! componentSpec ) {
66+ notify ( "Update failed: ComponentSpec not found" , "error" ) ;
67+ return ;
68+ }
69+
70+ await renameComponentFileInList (
71+ USER_PIPELINES_LIST_NAME ,
72+ title ?? "" ,
73+ name ,
74+ pathname ,
75+ ) ;
76+
77+ await saveComponentSpec ( name ) ;
78+
79+ const urlName = encodeURIComponent ( name ) ;
80+ const url = APP_ROUTES . PIPELINE_EDITOR . replace ( "$name" , urlName ) ;
81+
82+ navigate ( { to : url } ) ;
83+ } ;
84+
4385 // Fetch file metadata on mount or when componentSpec.name changes
4486 useEffect ( ( ) => {
4587 const fetchMeta = async ( ) => {
@@ -78,15 +120,19 @@ const PipelineDetails = () => {
78120 componentSpec . metadata ?. annotations || { } ,
79121 ) . map ( ( [ key , value ] ) => ( { label : key , value : String ( value ) } ) ) ;
80122
81- const actions = [
82- < RenamePipeline key = "rename-pipeline-action" /> ,
83- < TooltipButton
84- variant = "outline"
85- tooltip = "View YAML"
86- onClick = { ( ) => setIsYamlFullscreen ( true ) }
87- >
88- < Icon name = "FileCodeCorner" />
89- </ TooltipButton > ,
123+ const actions : Action [ ] = [
124+ {
125+ label : "Rename Pipeline" ,
126+ icon : "PencilLine" ,
127+ onClick : ( ) => setIsRenameDialogOpen ( true ) ,
128+ } ,
129+ {
130+ label : "View YAML" ,
131+ icon : "FileCodeCorner" ,
132+ onClick : ( ) => {
133+ setIsYamlFullscreen ( true ) ;
134+ } ,
135+ } ,
90136 ] ;
91137
92138 return (
@@ -142,6 +188,16 @@ const PipelineDetails = () => {
142188 onClose = { ( ) => setIsYamlFullscreen ( false ) }
143189 />
144190 ) }
191+ < PipelineNameDialog
192+ open = { isRenameDialogOpen }
193+ onOpenChange = { setIsRenameDialogOpen }
194+ title = "Name Pipeline"
195+ description = "Unsaved pipeline changes will be lost."
196+ initialName = { title ?? "" }
197+ onSubmit = { handleTitleUpdate }
198+ submitButtonText = "Update Title"
199+ isSubmitDisabled = { isSubmitDisabled }
200+ />
145201 </ >
146202 ) ;
147203} ;
0 commit comments