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" ;
16+ import useToastNotification from "@/hooks/useToastNotification" ;
1317import { useComponentSpec } from "@/providers/ComponentSpecProvider" ;
14- import { getComponentFileFromList } from "@/utils/componentStore" ;
18+ import { APP_ROUTES } from "@/routes/router" ;
19+ import {
20+ getComponentFileFromList ,
21+ renameComponentFileInList ,
22+ } from "@/utils/componentStore" ;
1523import { USER_PIPELINES_LIST_NAME } from "@/utils/constants" ;
1624import { componentSpecToText } from "@/utils/yaml" ;
1725
1826import PipelineIO from "../../shared/Execution/PipelineIO" ;
1927import { PipelineValidationList } from "./PipelineValidationList" ;
20- import RenamePipeline from "./RenamePipeline" ;
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,16 +120,17 @@ 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- key = "view-yaml-action"
88- >
89- < Icon name = "FileCodeCorner" />
90- </ 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 : ( ) => setIsYamlFullscreen ( true ) ,
133+ } ,
91134 ] ;
92135
93136 return (
@@ -143,6 +186,16 @@ const PipelineDetails = () => {
143186 onClose = { ( ) => setIsYamlFullscreen ( false ) }
144187 />
145188 ) }
189+ < PipelineNameDialog
190+ open = { isRenameDialogOpen }
191+ onOpenChange = { setIsRenameDialogOpen }
192+ title = "Name Pipeline"
193+ description = "Unsaved pipeline changes will be lost."
194+ initialName = { title ?? "" }
195+ onSubmit = { handleTitleUpdate }
196+ submitButtonText = "Update Title"
197+ isSubmitDisabled = { isSubmitDisabled }
198+ />
146199 </ >
147200 ) ;
148201} ;
0 commit comments