1+ import { useLocation , useNavigate } from "@tanstack/react-router" ;
12import { useEffect , useState } from "react" ;
23
34import { useValidationIssueNavigation } from "@/components/Editor/hooks/useValidationIssueNavigation" ;
4- import TooltipButton from "@/components/shared/Buttons/TooltipButton" ;
55import { CodeViewer } from "@/components/shared/CodeViewer" ;
6- import { ActionBlock } from "@/components/shared/ContextPanel/Blocks/ActionBlock" ;
6+ import {
7+ type Action ,
8+ ActionBlock ,
9+ } from "@/components/shared/ContextPanel/Blocks/ActionBlock" ;
710import { ContentBlock } from "@/components/shared/ContextPanel/Blocks/ContentBlock" ;
811import { ListBlock } from "@/components/shared/ContextPanel/Blocks/ListBlock" ;
912import { TextBlock } from "@/components/shared/ContextPanel/Blocks/TextBlock" ;
1013import { CopyText } from "@/components/shared/CopyText/CopyText" ;
11- import { Icon } from "@/components/ui/icon " ;
14+ import { PipelineNameDialog } from "@/components/shared/Dialogs " ;
1215import { BlockStack } from "@/components/ui/layout" ;
1316import useToastNotification from "@/hooks/useToastNotification" ;
1417import { useComponentSpec } from "@/providers/ComponentSpecProvider" ;
15- import { getComponentFileFromList } from "@/utils/componentStore" ;
18+ import { APP_ROUTES } from "@/routes/router" ;
19+ import {
20+ getComponentFileFromList ,
21+ renameComponentFileInList ,
22+ } from "@/utils/componentStore" ;
1623import { USER_PIPELINES_LIST_NAME } from "@/utils/constants" ;
1724import { componentSpecToText } from "@/utils/yaml" ;
1825
1926import PipelineIO from "../../shared/Execution/PipelineIO" ;
2027import { PipelineValidationList } from "./PipelineValidationList" ;
21- import RenamePipeline from "./RenamePipeline" ;
2228
2329const PipelineDetails = ( ) => {
2430 const notify = useToastNotification ( ) ;
@@ -27,12 +33,22 @@ const PipelineDetails = () => {
2733 digest,
2834 isComponentTreeValid,
2935 globalValidationIssues,
36+ saveComponentSpec,
3037 } = useComponentSpec ( ) ;
3138
39+ const notify = useToastNotification ( ) ;
40+ const navigate = useNavigate ( ) ;
41+
42+ const location = useLocation ( ) ;
43+ const pathname = location . pathname ;
44+
45+ const title = componentSpec ?. name ;
46+
3247 const { handleIssueClick, groupedIssues } = useValidationIssueNavigation (
3348 globalValidationIssues ,
3449 ) ;
3550
51+ const [ isRenameDialogOpen , setIsRenameDialogOpen ] = useState ( false ) ;
3652 const [ isYamlFullscreen , setIsYamlFullscreen ] = useState ( false ) ;
3753
3854 // State for file metadata
@@ -42,6 +58,31 @@ const PipelineDetails = () => {
4258 createdBy ?: string ;
4359 } > ( { } ) ;
4460
61+ const isSubmitDisabled = ( name : string ) => {
62+ return name === title ;
63+ } ;
64+
65+ const handleTitleUpdate = async ( name : string ) => {
66+ if ( ! componentSpec ) {
67+ notify ( "Update failed: ComponentSpec not found" , "error" ) ;
68+ return ;
69+ }
70+
71+ await renameComponentFileInList (
72+ USER_PIPELINES_LIST_NAME ,
73+ title ?? "" ,
74+ name ,
75+ pathname ,
76+ ) ;
77+
78+ await saveComponentSpec ( name ) ;
79+
80+ const urlName = encodeURIComponent ( name ) ;
81+ const url = APP_ROUTES . PIPELINE_EDITOR . replace ( "$name" , urlName ) ;
82+
83+ navigate ( { to : url } ) ;
84+ } ;
85+
4586 // Fetch file metadata on mount or when componentSpec.name changes
4687 useEffect ( ( ) => {
4788 const fetchMeta = async ( ) => {
@@ -86,16 +127,17 @@ const PipelineDetails = () => {
86127 componentSpec . metadata ?. annotations || { } ,
87128 ) . map ( ( [ key , value ] ) => ( { label : key , value : String ( value ) } ) ) ;
88129
89- const actions = [
90- < RenamePipeline key = "rename-pipeline-action" /> ,
91- < TooltipButton
92- variant = "outline"
93- tooltip = "View YAML"
94- onClick = { ( ) => setIsYamlFullscreen ( true ) }
95- key = "view-yaml-action"
96- >
97- < Icon name = "FileCodeCorner" />
98- </ TooltipButton > ,
130+ const actions : Action [ ] = [
131+ {
132+ label : "Rename Pipeline" ,
133+ icon : "PencilLine" ,
134+ onClick : ( ) => setIsRenameDialogOpen ( true ) ,
135+ } ,
136+ {
137+ label : "View YAML" ,
138+ icon : "FileCodeCorner" ,
139+ onClick : ( ) => setIsYamlFullscreen ( true ) ,
140+ } ,
99141 ] ;
100142
101143 return (
@@ -151,6 +193,16 @@ const PipelineDetails = () => {
151193 onClose = { ( ) => setIsYamlFullscreen ( false ) }
152194 />
153195 ) }
196+ < PipelineNameDialog
197+ open = { isRenameDialogOpen }
198+ onOpenChange = { setIsRenameDialogOpen }
199+ title = "Name Pipeline"
200+ description = "Unsaved pipeline changes will be lost."
201+ initialName = { title ?? "" }
202+ onSubmit = { handleTitleUpdate }
203+ submitButtonText = "Update Title"
204+ isSubmitDisabled = { isSubmitDisabled }
205+ />
154206 </ >
155207 ) ;
156208} ;
0 commit comments